Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
O
Olm
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Nheko Reborn
Olm
Commits
47a52dcf
Commit
47a52dcf
authored
8 years ago
by
ylecollen
Browse files
Options
Downloads
Patches
Plain Diff
Use a 4 spaces tabulation
parent
8f3d5bed
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_jni_helper.cpp
+130
-157
130 additions, 157 deletions
...android/OlmLibSdk/olm-sdk/src/main/jni/olm_jni_helper.cpp
with
130 additions
and
157 deletions
java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_jni_helper.cpp
+
130
−
157
View file @
47a52dcf
...
...
@@ -29,99 +29,80 @@ using namespace AndroidOlmSdk;
**/
bool
setRandomInBuffer
(
JNIEnv
*
env
,
uint8_t
**
aBuffer2Ptr
,
size_t
aRandomSize
)
{
bool
retCode
=
false
;
int
bufferLen
=
aRandomSize
*
sizeof
(
uint8_t
);
bool
retCode
=
false
;
int
bufferLen
=
aRandomSize
*
sizeof
(
uint8_t
);
if
(
NULL
==
aBuffer2Ptr
)
{
LOGE
(
"## setRandomInBuffer(): failure - aBuffer=NULL"
);
}
else
if
(
0
==
aRandomSize
)
{
LOGE
(
"## setRandomInBuffer(): failure - random size=0"
);
}
else
if
(
NULL
==
(
*
aBuffer2Ptr
=
(
uint8_t
*
)
malloc
(
bufferLen
)))
{
LOGE
(
"## setRandomInBuffer(): failure - alloc mem OOM"
);
}
else
{
LOGD
(
"## setRandomInBuffer(): randomSize=%lu"
,
static_cast
<
long
unsigned
int
>
(
aRandomSize
));
bool
secureRandomSucceeds
=
false
;
// use the secureRandom class
jclass
cls
=
env
->
FindClass
(
"java/security/SecureRandom"
);
if
(
cls
)
if
(
!
aBuffer2Ptr
)
{
jobject
newObj
=
0
;
jmethodID
constructor
=
env
->
GetMethodID
(
cls
,
"<init>"
,
"()V"
);
jmethodID
nextByteMethod
=
env
->
GetMethodID
(
cls
,
"nextBytes"
,
"([B)V"
);
if
(
constructor
)
{
newObj
=
env
->
NewObject
(
cls
,
constructor
);
jbyteArray
tempByteArray
=
env
->
NewByteArray
(
bufferLen
);
if
(
newObj
&&
tempByteArray
)
{
env
->
CallVoidMethod
(
newObj
,
nextByteMethod
,
tempByteArray
);
jbyte
*
buffer
=
env
->
GetByteArrayElements
(
tempByteArray
,
NULL
);
if
(
buffer
)
{
memcpy
(
*
aBuffer2Ptr
,
buffer
,
bufferLen
);
secureRandomSucceeds
=
true
;
// clear tempByteArray to hide sensitive data.
memset
(
buffer
,
0
,
bufferLen
);
env
->
SetByteArrayRegion
(
tempByteArray
,
0
,
bufferLen
,
buffer
);
LOGE
(
"## setRandomInBuffer(): failure - aBuffer=NULL"
);
}
else
if
(
!
aRandomSize
)
{
LOGE
(
"## setRandomInBuffer(): failure - random size=0"
);
}
else
if
(
!
(
*
aBuffer2Ptr
=
(
uint8_t
*
)
malloc
(
bufferLen
)))
{
LOGE
(
"## setRandomInBuffer(): failure - alloc mem OOM"
);
}
else
{
LOGD
(
"## setRandomInBuffer(): randomSize=%lu"
,
static_cast
<
long
unsigned
int
>
(
aRandomSize
));
// ensure that the buffer is released
env
->
ReleaseByteArrayElements
(
tempByteArray
,
buffer
,
JNI_ABORT
);
}
}
// use the secureRandom class
jclass
cls
=
env
->
FindClass
(
"java/security/SecureRandom"
);
if
(
tempByteArray
)
if
(
cls
)
{
env
->
DeleteLocalRef
(
tempByteArray
);
jobject
newObj
=
0
;
jmethodID
constructor
=
env
->
GetMethodID
(
cls
,
"<init>"
,
"()V"
);
jmethodID
nextByteMethod
=
env
->
GetMethodID
(
cls
,
"nextBytes"
,
"([B)V"
);
if
(
constructor
)
{
newObj
=
env
->
NewObject
(
cls
,
constructor
);
jbyteArray
tempByteArray
=
env
->
NewByteArray
(
bufferLen
);
if
(
newObj
&&
tempByteArray
)
{
env
->
CallVoidMethod
(
newObj
,
nextByteMethod
,
tempByteArray
);
jbyte
*
buffer
=
env
->
GetByteArrayElements
(
tempByteArray
,
NULL
);
if
(
buffer
)
{
memcpy
(
*
aBuffer2Ptr
,
buffer
,
bufferLen
);
retCode
=
true
;
// clear tempByteArray to hide sensitive data.
memset
(
buffer
,
0
,
bufferLen
);
env
->
SetByteArrayRegion
(
tempByteArray
,
0
,
bufferLen
,
buffer
);
// ensure that the buffer is released
env
->
ReleaseByteArrayElements
(
tempByteArray
,
buffer
,
JNI_ABORT
);
}
}
if
(
tempByteArray
)
{
env
->
DeleteLocalRef
(
tempByteArray
);
}
if
(
newObj
)
{
env
->
DeleteLocalRef
(
newObj
);
}
}
}
if
(
newObj
)
// debug purpose
/*for(int i = 0; i < aRandomSize; i++)
{
env
->
DeleteLocalRef
(
newObj
);
}
}
LOGD("## setRandomInBuffer(): randomBuffPtr[%ld]=%d",i, (*aBuffer2Ptr)[i]);
}*/
}
if
(
!
secureRandomSucceeds
)
{
LOGE
(
"## setRandomInBuffer(): SecureRandom failed, use a fallback"
);
struct
timeval
timeValue
;
gettimeofday
(
&
timeValue
,
NULL
);
srand
(
timeValue
.
tv_usec
);
// init seed
for
(
size_t
i
=
0
;
i
<
aRandomSize
;
i
++
)
{
(
*
aBuffer2Ptr
)[
i
]
=
(
uint8_t
)(
rand
()
%
ACCOUNT_CREATION_RANDOM_MODULO
);
}
}
// debug purpose
/*for(int i = 0; i < aRandomSize; i++)
{
LOGD("## setRandomInBuffer(): randomBuffPtr[%ld]=%d",i, (*aBuffer2Ptr)[i]);
}*/
retCode
=
true
;
}
return
retCode
;
return
retCode
;
}
/**
* Read the instance ID of the calling object.
* @param aJniEnv pointer pointing on the JNI function table
...
...
@@ -131,49 +112,45 @@ bool setRandomInBuffer(JNIEnv *env, uint8_t **aBuffer2Ptr, size_t aRandomSize)
**/
jlong
getInstanceId
(
JNIEnv
*
aJniEnv
,
jobject
aJavaObject
,
const
char
*
aCallingClass
)
{
jlong
instanceId
=
0
;
jfieldID
instanceIdField
=
0
;
jclass
loaderClass
=
0
;
jclass
requiredClass
=
0
;
if
(
NULL
!=
aJniEnv
)
{
requiredClass
=
aJniEnv
->
FindClass
(
aCallingClass
);
if
((
0
!=
requiredClass
)
&&
(
JNI_TRUE
!=
aJniEnv
->
IsInstanceOf
(
aJavaObject
,
requiredClass
)))
{
LOGE
(
"## getAccountInstanceId() failure - invalid instance of"
);
}
else
if
(
0
!=
(
loaderClass
=
aJniEnv
->
GetObjectClass
(
aJavaObject
)))
jlong
instanceId
=
0
;
if
(
aJniEnv
)
{
if
(
0
!=
(
instanceIdField
=
aJniEnv
->
GetFieldID
(
loaderClass
,
"mNativeId"
,
"J"
)))
{
instanceId
=
aJniEnv
->
GetLongField
(
aJavaObject
,
instanceIdField
);
LOGD
(
"## getInstanceId(): read from java instanceId=%lld"
,
instanceId
);
}
else
{
LOGE
(
"## getInstanceId() ERROR! GetFieldID=null"
);
}
jclass
requiredClass
=
aJniEnv
->
FindClass
(
aCallingClass
);
jclass
loaderClass
=
0
;
if
(
requiredClass
&&
(
JNI_TRUE
!=
aJniEnv
->
IsInstanceOf
(
aJavaObject
,
requiredClass
)))
{
LOGE
(
"## getAccountInstanceId() failure - invalid instance of"
);
}
else
if
(
loaderClass
=
aJniEnv
->
GetObjectClass
(
aJavaObject
))
{
jfieldID
instanceIdField
=
aJniEnv
->
GetFieldID
(
loaderClass
,
"mNativeId"
,
"J"
);
if
(
instanceIdField
)
{
instanceId
=
aJniEnv
->
GetLongField
(
aJavaObject
,
instanceIdField
);
LOGD
(
"## getInstanceId(): read from java instanceId=%lld"
,
instanceId
);
}
else
{
LOGE
(
"## getInstanceId() ERROR! GetFieldID=null"
);
}
aJniEnv
->
DeleteLocalRef
(
loaderClass
);
}
else
{
LOGE
(
"## getInstanceId() ERROR! GetObjectClass=null"
);
}
}
else
{
LOGE
(
"## getInstanceId() ERROR!
GetObjectClass=null
"
);
LOGE
(
"## getInstanceId() ERROR!
aJniEnv=NULL
"
);
}
}
else
{
LOGE
(
"## getInstanceId() ERROR! aJniEnv=NULL"
);
}
LOGD
(
"## getInstanceId() success - instanceId=%p (jlong)(intptr_t)instanceId=%lld"
,(
void
*
)
instanceId
,
(
jlong
)(
intptr_t
)
instanceId
);
if
(
loaderClass
)
{
aJniEnv
->
DeleteLocalRef
(
loaderClass
);
}
LOGD
(
"## getInstanceId() success - instanceId=%p (jlong)(intptr_t)instanceId=%lld"
,(
void
*
)
instanceId
,
(
jlong
)(
intptr_t
)
instanceId
);
return
instanceId
;
return
instanceId
;
}
/**
...
...
@@ -184,12 +161,10 @@ jlong getInstanceId(JNIEnv* aJniEnv, jobject aJavaObject, const char *aCallingCl
**/
jlong
getAccountInstanceId
(
JNIEnv
*
aJniEnv
,
jobject
aJavaObject
)
{
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_ACCOUNT
);
return
instanceId
;
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_ACCOUNT
);
return
instanceId
;
}
/**
* Read the session instance ID of the calling object (aJavaObject).<br>
* @param aJniEnv pointer pointing on the JNI function table
...
...
@@ -198,8 +173,8 @@ jlong getAccountInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
**/
jlong
getSessionInstanceId
(
JNIEnv
*
aJniEnv
,
jobject
aJavaObject
)
{
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_SESSION
);
return
instanceId
;
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_SESSION
);
return
instanceId
;
}
/**
...
...
@@ -210,11 +185,10 @@ jlong getSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
**/
jlong
getInboundGroupSessionInstanceId
(
JNIEnv
*
aJniEnv
,
jobject
aJavaObject
)
{
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_INBOUND_GROUP_SESSION
);
return
instanceId
;
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_INBOUND_GROUP_SESSION
);
return
instanceId
;
}
/**
* Read the outbound group session instance ID of the calling object (aJavaObject).<br>
* @param aJniEnv pointer pointing on the JNI function table
...
...
@@ -223,8 +197,8 @@ jlong getInboundGroupSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
**/
jlong
getOutboundGroupSessionInstanceId
(
JNIEnv
*
aJniEnv
,
jobject
aJavaObject
)
{
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_OUTBOUND_GROUP_SESSION
);
return
instanceId
;
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_OUTBOUND_GROUP_SESSION
);
return
instanceId
;
}
/**
...
...
@@ -235,11 +209,10 @@ jlong getOutboundGroupSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
**/
jlong
getUtilityInstanceId
(
JNIEnv
*
aJniEnv
,
jobject
aJavaObject
)
{
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_UTILITY
);
return
instanceId
;
jlong
instanceId
=
getInstanceId
(
aJniEnv
,
aJavaObject
,
CLASS_OLM_UTILITY
);
return
instanceId
;
}
/**
* Convert a C string into a UTF-8 format string.
* The conversion is performed in JAVA side to workaround the issue in NewStringUTF().
...
...
@@ -247,37 +220,37 @@ jlong getUtilityInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
*/
jstring
javaCStringToUtf8
(
JNIEnv
*
env
,
uint8_t
*
aCStringMsgPtr
,
size_t
aMsgLength
)
{
jstring
convertedRetValue
=
0
;
jbyteArray
tempByteArray
=
NULL
;
if
((
NULL
==
aCStringMsgPtr
)
||
(
NULL
==
env
))
{
LOGE
(
"## javaCStringToUtf8(): failure - invalid parameters (null)"
);
}
else
if
(
NULL
==
(
tempByteArray
=
env
->
NewByteArray
(
aMsgLength
)))
{
LOGE
(
"## javaCStringToUtf8(): failure - return byte array OOM"
);
}
else
{
env
->
SetByteArrayRegion
(
tempByteArray
,
0
,
aMsgLength
,
(
const
jbyte
*
)
aCStringMsgPtr
);
jstring
convertedRetValue
=
0
;
jbyteArray
tempByteArray
=
NULL
;
// UTF-8 conversion from JAVA
jstring
strEncode
=
(
env
)
->
NewStringUTF
(
"UTF-8"
);
jclass
jClass
=
env
->
FindClass
(
"java/lang/String"
);
jmethodID
cstor
=
env
->
GetMethodID
(
jClass
,
"<init>"
,
"([BLjava/lang/String;)V"
);
if
((
0
!=
jClass
)
&&
(
0
!=
jClass
)
&&
(
0
!=
strEncode
))
if
(
!
aCStringMsgPtr
||
!
env
)
{
LOGE
(
"## javaCStringToUtf8(): failure - invalid parameters (null)"
);
}
else
if
(
!
(
tempByteArray
=
env
->
NewByteArray
(
aMsgLength
)))
{
convertedRetValue
=
(
jstring
)
env
->
NewObject
(
jClass
,
cstor
,
tempByteArray
,
strEncode
);
LOGD
(
" ## javaCStringToUtf8(): succeed"
);
env
->
DeleteLocalRef
(
tempByteArray
);
LOGE
(
"## javaCStringToUtf8(): failure - return byte array OOM"
);
}
else
{
LOGE
(
" ## javaCStringToUtf8(): failure - invalid Java references"
);
env
->
SetByteArrayRegion
(
tempByteArray
,
0
,
aMsgLength
,
(
const
jbyte
*
)
aCStringMsgPtr
);
// UTF-8 conversion from JAVA
jstring
strEncode
=
(
env
)
->
NewStringUTF
(
"UTF-8"
);
jclass
jClass
=
env
->
FindClass
(
"java/lang/String"
);
jmethodID
cstor
=
env
->
GetMethodID
(
jClass
,
"<init>"
,
"([BLjava/lang/String;)V"
);
if
(
jClass
&&
strEncode
)
{
convertedRetValue
=
(
jstring
)
env
->
NewObject
(
jClass
,
cstor
,
tempByteArray
,
strEncode
);
LOGD
(
" ## javaCStringToUtf8(): succeed"
);
env
->
DeleteLocalRef
(
tempByteArray
);
}
else
{
LOGE
(
" ## javaCStringToUtf8(): failure - invalid Java references"
);
}
}
}
return
convertedRetValue
;
return
convertedRetValue
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment