- Add decryptMessageJni() to olm_session.cpp API

- review comments header
- refactor utility functions
This commit is contained in:
pedroGitt 2016-10-07 17:35:27 +02:00
parent 655c841cc3
commit 67f7939470
7 changed files with 264 additions and 133 deletions

View file

@ -131,7 +131,8 @@ public class OlmAccount {
/** /**
* Generate a number of new one time keys.<br> If total number of keys stored * Generate a number of new one time keys.<br> If total number of keys stored
* by this account exceeds {@link #maxOneTimeKeys()}, the old keys are discarded. * by this account exceeds {@link #maxOneTimeKeys()}, the old keys are discarded.<br>
* The corresponding keys are retrieved by {@link #oneTimeKeys()}.
* @param aNumberOfKeys number of keys to generate * @param aNumberOfKeys number of keys to generate
* @return 0 if operation succeed, -1 otherwise * @return 0 if operation succeed, -1 otherwise
*/ */
@ -141,15 +142,16 @@ public class OlmAccount {
* Get the public parts of the unpublished "one time keys" for the account.<br> * Get the public parts of the unpublished "one time keys" for the account.<br>
* The returned data is a JSON-formatted object with the single property * The returned data is a JSON-formatted object with the single property
* <tt>curve25519</tt>, which is itself an object mapping key id to * <tt>curve25519</tt>, which is itself an object mapping key id to
* base64-encoded Curve25519 key. * base64-encoded Curve25519 key.<br>
* These keys must be published on the server.
* @return byte array containing the one time keys if operation succeed, null otherwise * @return byte array containing the one time keys if operation succeed, null otherwise
*/ */
private native byte[] oneTimeKeysJni(); private native byte[] oneTimeKeysJni();
/** /**
* Return the "one time keys" in a JSON array.<br> * Return the "one time keys" in a JSON array.<br>
* Public API for {@link #oneTimeKeysJni()}. * The number of "one time keys", is specified by {@link #generateOneTimeKeys(int)}<br>
* Public API for {@link #oneTimeKeysJni()}.<br>
* Note: these keys are to be published on the server.
* @return one time keys in JSON array format if operation succeed, null otherwise * @return one time keys in JSON array format if operation succeed, null otherwise
*/ */
public JSONObject oneTimeKeys() { public JSONObject oneTimeKeys() {

View file

@ -137,7 +137,7 @@ JNIEXPORT jbyteArray JNICALL Java_org_matrix_olm_OlmAccount_identityKeysJni(JNIE
else else
{ // identity keys allocation { // identity keys allocation
identityKeysLength = olm_account_identity_keys_length(accountPtr); identityKeysLength = olm_account_identity_keys_length(accountPtr);
if(NULL == (identityKeysBytesPtr=(uint8_t *)malloc(identityKeysLength*sizeof(std::uint8_t)))) if(NULL == (identityKeysBytesPtr=(uint8_t*)malloc(identityKeysLength*sizeof(uint8_t))))
{ {
LOGE("## identityKeys(): failure - identity keys array OOM"); LOGE("## identityKeys(): failure - identity keys array OOM");
} }
@ -245,7 +245,7 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmAccount_generateOneTimeKeys(JNIEnv
} }
/** /**
* Get "one time keys". * Get "one time keys".<br>
* Return the public parts of the unpublished "one time keys" for the account * Return the public parts of the unpublished "one time keys" for the account
* @return a valid byte array if operation succeed, null otherwise * @return a valid byte array if operation succeed, null otherwise
**/ **/
@ -372,15 +372,16 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmAccount_markOneTimeKeysAsPublished
} }
/** /**
* Sign a message with the ed25519 key (fingerprint) for this account. * Sign a message with the ed25519 key (fingerprint) for this account.<br>
* The signed message is returned by the function.
* @param aMessage message to sign * @param aMessage message to sign
* @return the corresponding signed message, null otherwise * @return the signed message, null otherwise
**/ **/
JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmAccount_signMessage(JNIEnv *env, jobject thiz, jstring aMessage) JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmAccount_signMessage(JNIEnv *env, jobject thiz, jstring aMessage)
{ {
OlmAccount* accountPtr = NULL; OlmAccount* accountPtr = NULL;
size_t signatureLength; size_t signatureLength;
void* signaturePtr; void* signedMsgPtr;
size_t resultSign; size_t resultSign;
jstring signedMsgRetValue = NULL; jstring signedMsgRetValue = NULL;
@ -406,13 +407,13 @@ JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmAccount_signMessage(JNIEnv *env
// signature memory allocation // signature memory allocation
signatureLength = olm_account_signature_length(accountPtr); signatureLength = olm_account_signature_length(accountPtr);
if(NULL == (signaturePtr=(void *)malloc(signatureLength*sizeof(void*)))) if(NULL == (signedMsgPtr = (void*)malloc(signatureLength*sizeof(uint8_t))))
{ {
LOGE("## signMessage(): failure - signature allocation OOM"); LOGE("## signMessage(): failure - signature allocation OOM");
} }
else else
{ // sign message { // sign message
resultSign = olm_account_sign(accountPtr, (void*)messageToSign, messageLength, signaturePtr, signatureLength); resultSign = olm_account_sign(accountPtr, (void*)messageToSign, messageLength, signedMsgPtr, signatureLength);
if(resultSign == olm_error()) if(resultSign == olm_error())
{ {
const char *errorMsgPtr = olm_account_last_error(accountPtr); const char *errorMsgPtr = olm_account_last_error(accountPtr);
@ -422,11 +423,11 @@ JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmAccount_signMessage(JNIEnv *env
{ // convert to jstring { // convert to jstring
// TODO check how UTF conversion can impact the content? // TODO check how UTF conversion can impact the content?
// why not consider return jbyteArray? and convert in JAVA side.. // why not consider return jbyteArray? and convert in JAVA side..
signedMsgRetValue = env->NewStringUTF((const char*)signaturePtr); // UTF8 signedMsgRetValue = env->NewStringUTF((const char*)signedMsgPtr); // UTF8
LOGD("## signMessage(): success - retCode=%ld",resultSign); LOGD("## signMessage(): success - retCode=%ld",resultSign);
} }
free(signaturePtr); free(signedMsgPtr);
} }
// release messageToSign // release messageToSign
@ -454,40 +455,3 @@ JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmManager_getOlmLibVersion(JNIEnv
} }
/**
* Read the account instance ID of the calling object.
* @return the instance ID if read succeed, -1 otherwise.
**/
jlong getAccountInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
{
jlong instanceId=-1;
jfieldID instanceIdField;
jclass loaderClass;
if(NULL!=aJniEnv)
{
if(0 != (loaderClass=aJniEnv->GetObjectClass(aJavaObject)))
{
if(0 != (instanceIdField=aJniEnv->GetFieldID(loaderClass, "mNativeOlmAccountId", "J")))
{
instanceId = aJniEnv->GetLongField(aJavaObject, instanceIdField);
aJniEnv->DeleteLocalRef(loaderClass);
LOGD("## getAccountInstanceId(): read from java instanceId=%lld",instanceId);
}
else
{
LOGD("## getAccountInstanceId() ERROR! GetFieldID=null");
}
}
else
{
LOGD("## getAccountInstanceId() ERROR! GetObjectClass=null");
}
}
else
{
LOGD("## getAccountInstanceId() ERROR! aJniEnv=NULL");
}
LOGD("## getAccountInstanceId() success - instanceId=%lld",instanceId);
return instanceId;
}

View file

@ -7,7 +7,6 @@
extern "C" { extern "C" {
#endif #endif
jlong getAccountInstanceId(JNIEnv* aJniEnv, jobject aJavaObject);
JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmManager_getOlmLibVersion(JNIEnv *env, jobject thiz); JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmManager_getOlmLibVersion(JNIEnv *env, jobject thiz);
// account creation/destruction // account creation/destruction

View file

@ -19,7 +19,8 @@
/** /**
* Init memory allocation for session creation. * Init memory allocation for a session creation.<br>
* Make sure releaseSessionJni() is called when one is done with the session instance.
* @return valid memory allocation, NULL otherwise * @return valid memory allocation, NULL otherwise
**/ **/
OlmSession* initializeSessionMemory() OlmSession* initializeSessionMemory()
@ -192,6 +193,7 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_initInboundSessionJni(JNIE
jint retCode = ERROR_CODE_KO; jint retCode = ERROR_CODE_KO;
OlmSession *sessionPtr = NULL; OlmSession *sessionPtr = NULL;
OlmAccount *accountPtr = NULL; OlmAccount *accountPtr = NULL;
const char *messagePtr = NULL;
size_t sessionResult; size_t sessionResult;
if(NULL == (sessionPtr = (OlmSession*)getSessionInstanceId(env,thiz))) if(NULL == (sessionPtr = (OlmSession*)getSessionInstanceId(env,thiz)))
@ -208,7 +210,6 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_initInboundSessionJni(JNIE
} }
else else
{ // convert message to C strings { // convert message to C strings
const char *messagePtr = NULL;
if(NULL == (messagePtr = env->GetStringUTFChars(aOneTimeKeyMsg, 0))) if(NULL == (messagePtr = env->GetStringUTFChars(aOneTimeKeyMsg, 0)))
{ {
LOGE("## initInboundSessionJni(): failure - message JNI allocation OOM"); LOGE("## initInboundSessionJni(): failure - message JNI allocation OOM");
@ -426,11 +427,10 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_matchesInboundSessionFromI
/** /**
* Encrypt a message using the session. to a base64 ciphertext.<br> * Encrypt a message using the session.<br>
* This API may be used to process a "m.room.encrypted" event when type = 1 (PRE_KEY). * @param aClearMsg clear text message
* @param aTheirIdentityKey the identity key of the sender * @param [out] aEncryptedMsg ciphered message
* @param aOneTimeKeyMsg PRE KEY message * @return ERROR_CODE_OK if encrypt operation succeed, ERROR_CODE_KO otherwise
* @return ERROR_CODE_OK if match, ERROR_CODE_KO otherwise
*/ */
JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *env, jobject thiz, jstring aClearMsg, jobject aEncryptedMsg) JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *env, jobject thiz, jstring aClearMsg, jobject aEncryptedMsg)
{ {
@ -439,11 +439,10 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *
const char *clearMsgPtr = NULL; const char *clearMsgPtr = NULL;
uint8_t *randomBuffPtr = NULL; uint8_t *randomBuffPtr = NULL;
void *encryptedMsgPtr = NULL; void *encryptedMsgPtr = NULL;
jclass encryptedMsgJClass; jclass encryptedMsgJClass = 0;
jfieldID encryptedMsgFieldId; jfieldID encryptedMsgFieldId;
jfieldID typeMsgFieldId; jfieldID typeMsgFieldId;
if(NULL == (sessionPtr = (OlmSession*)getSessionInstanceId(env,thiz))) if(NULL == (sessionPtr = (OlmSession*)getSessionInstanceId(env,thiz)))
{ {
LOGE("## encryptMessageJni(): failure - invalid Session ptr=NULL"); LOGE("## encryptMessageJni(): failure - invalid Session ptr=NULL");
@ -485,35 +484,38 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *
// alloc buffer for encrypted message // alloc buffer for encrypted message
size_t clearMsgLength = env->GetStringUTFLength(aClearMsg); size_t clearMsgLength = env->GetStringUTFLength(aClearMsg);
size_t encryptedMsgLength = olm_encrypt_message_length(sessionPtr, clearMsgLength); size_t encryptedMsgLength = olm_encrypt_message_length(sessionPtr, clearMsgLength);
if(NULL == (encryptedMsgPtr = (void*)malloc(encryptedMsgLength*sizeof(void*)))) if(NULL == (encryptedMsgPtr = (void*)malloc(encryptedMsgLength*sizeof(uint8_t))))
{ {
LOGE("## encryptMessageJni(): failure - random buffer OOM"); LOGE("## encryptMessageJni(): failure - random buffer OOM");
} }
size_t result = olm_encrypt(sessionPtr,
(void const *)clearMsgPtr,
clearMsgLength,
randomBuffPtr,
randomLength,
encryptedMsgPtr,
encryptedMsgLength);
if(result == olm_error())
{
const char *errorMsgPtr = olm_session_last_error(sessionPtr);
LOGE("## encryptMessageJni(): failure - Msg=%s",errorMsgPtr);
}
else else
{ { // encrypt message
// update type: PRE KEY message or normal message size_t result = olm_encrypt(sessionPtr,
size_t messageType = olm_encrypt_message_type(sessionPtr); (void const *)clearMsgPtr,
env->SetLongField(aEncryptedMsg, typeMsgFieldId, (jlong)messageType); clearMsgLength,
randomBuffPtr,
randomLength,
encryptedMsgPtr,
encryptedMsgLength);
if(result == olm_error())
{
const char *errorMsgPtr = olm_session_last_error(sessionPtr);
LOGE("## encryptMessageJni(): failure - Msg=%s",errorMsgPtr);
}
else
{
// update message type: PRE KEY or normal
size_t messageType = olm_encrypt_message_type(sessionPtr);
env->SetLongField(aEncryptedMsg, typeMsgFieldId, (jlong)messageType);
// update message // update message: encryptedMsgPtr => encryptedJstring
jstring encryptedStr = env->NewStringUTF((const char*)encryptedMsgPtr); jstring encryptedJstring = env->NewStringUTF((const char*)encryptedMsgPtr);
env->SetObjectField(aEncryptedMsg, encryptedMsgFieldId, (jobject)encryptedStr); env->SetObjectField(aEncryptedMsg, encryptedMsgFieldId, (jobject)encryptedJstring);
// TODO mem leak: check if free(encryptedMsgPtr); does not interfer with line above
retCode = ERROR_CODE_OK; retCode = ERROR_CODE_OK;
LOGD("## encryptMessageJni(): success - result=%lu Type=%lu encryptedMsg=%s", result, messageType, (const char*)encryptedMsgPtr); LOGD("## encryptMessageJni(): success - result=%lu Type=%lu encryptedMsg=%s", result, messageType, (const char*)encryptedMsgPtr);
}
} }
} }
} }
@ -529,9 +531,134 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *
free(randomBuffPtr); free(randomBuffPtr);
} }
if(NULL != encryptedMsgPtr)
{
free(encryptedMsgPtr);
}
return retCode; return retCode;
} }
/**
* Decrypt a message using the session. to a base64 ciphertext.<br>
* @param aEncryptedMsg message to decrypt
* @return decrypted message if operation succeed, null otherwise
*/
JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmSession_decryptMessageJni(JNIEnv *env, jobject thiz, jobject aEncryptedMsg)
{
jstring decryptedMsgRetValue = 0;
jclass encryptedMsgJclass = 0;
jstring encryptedMsgJstring = 0; // <= obtained from encryptedMsgFieldId
// field IDs
jfieldID encryptedMsgFieldId;
jfieldID typeMsgFieldId;
// ptrs
OlmSession *sessionPtr = NULL;
const char *encryptedMsgPtr = NULL; // <= obtained from encryptedMsgJstring
void *decryptedMsgPtr = NULL;
char *tempEncryptedPtr = NULL;
if(NULL == (sessionPtr = (OlmSession*)getSessionInstanceId(env,thiz)))
{
LOGE("## decryptMessageJni(): failure - invalid Session ptr=NULL");
}
else if(0 == aEncryptedMsg)
{
LOGE("## decryptMessageJni(): failure - invalid clear message");
}
else if(0 == (encryptedMsgJclass = env->GetObjectClass(aEncryptedMsg)))
{
LOGE("## decryptMessageJni(): failure - unable to get crypted message class");
}
else if(0 == (encryptedMsgFieldId = env->GetFieldID(encryptedMsgJclass,"mCipherText","Ljava/lang/String;")))
{
LOGE("## decryptMessageJni(): failure - unable to get message field");
}
else if(0 == (typeMsgFieldId = env->GetFieldID(encryptedMsgJclass,"mType","I")))
{
LOGE("## decryptMessageJni(): failure - unable to get message type field");
}
else if(0 == (encryptedMsgJstring = (jstring)env->GetObjectField(aEncryptedMsg, encryptedMsgFieldId)))
{
LOGE("## decryptMessageJni(): failure - JNI encrypted object ");
}
else if(0 == (encryptedMsgPtr = env->GetStringUTFChars(encryptedMsgJstring, 0)))
{
LOGE("## decryptMessageJni(): failure - encrypted message JNI allocation OOM");
}
else
{
// get message type
jlong encryptedMsgType = env->GetLongField(aEncryptedMsg, typeMsgFieldId);
// get encrypted message length
size_t encryptedMsgLength = env->GetStringUTFLength(encryptedMsgJstring);
// create a dedicated temp buffer to be used in next Olm API calls
tempEncryptedPtr = (char*)malloc(encryptedMsgLength*sizeof(uint8_t));
memcpy(tempEncryptedPtr, encryptedMsgPtr, encryptedMsgLength);
LOGD("## decryptMessageJni(): encryptedMsgType=%lld encryptedMsgLength=%lu encryptedMsg=%s",encryptedMsgType,encryptedMsgLength,encryptedMsgPtr);
// get max plaintext length
size_t maxPlaintextLength = olm_decrypt_max_plaintext_length(sessionPtr,
encryptedMsgType,
(void*)tempEncryptedPtr,
encryptedMsgLength);
// Note: tempEncryptedPtr was destroyed by olm_decrypt_max_plaintext_length()
if(maxPlaintextLength == olm_error())
{
const char *errorMsgPtr = olm_session_last_error(sessionPtr);
LOGE("## decryptMessageJni(): failure - olm_decrypt_max_plaintext_length Msg=%s",errorMsgPtr);
}
else
{
// allocate output decrypted message
decryptedMsgPtr = (void*)malloc(maxPlaintextLength*sizeof(uint8_t));
// decrypt but before reload encrypted buffer (previous one was destroyed)
memcpy(tempEncryptedPtr, encryptedMsgPtr, encryptedMsgLength);
size_t plaintextLength = olm_decrypt(sessionPtr,
encryptedMsgType,
(void*)encryptedMsgPtr,
encryptedMsgLength,
(void*)decryptedMsgPtr,
maxPlaintextLength);
if(plaintextLength == olm_error())
{
const char *errorMsgPtr = olm_session_last_error(sessionPtr);
LOGE("## decryptMessageJni(): failure - olm_decrypt Msg=%s",errorMsgPtr);
}
else
{
decryptedMsgRetValue = env->NewStringUTF((const char*)decryptedMsgPtr);
}
}
}
// free alloc
if(NULL != encryptedMsgPtr)
{
env->ReleaseStringUTFChars(encryptedMsgJstring, encryptedMsgPtr);
}
if(NULL != tempEncryptedPtr)
{
free(tempEncryptedPtr);
}
if(NULL != decryptedMsgPtr)
{
free(decryptedMsgPtr);
}
return decryptedMsgRetValue;
}
/** /**
* Get the session identifier for this session. * Get the session identifier for this session.
* @return the session identifier if operation succeed, null otherwise * @return the session identifier if operation succeed, null otherwise
@ -549,7 +676,7 @@ JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmSession_getSessionIdentifierJni
{ {
LOGE("## getSessionIdentifierJni(): failure - invalid Session ptr=NULL"); LOGE("## getSessionIdentifierJni(): failure - invalid Session ptr=NULL");
} }
else if(NULL == (sessionIdPtr = (void*)malloc(lengthSessId*sizeof(void*)))) else if(NULL == (sessionIdPtr = (void*)malloc(lengthSessId*sizeof(uint8_t))))
{ {
LOGE("## getSessionIdentifierJni(): failure - identifier allocation OOM"); LOGE("## getSessionIdentifierJni(): failure - identifier allocation OOM");
} }
@ -571,42 +698,3 @@ JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmSession_getSessionIdentifierJni
return returnValueStr; return returnValueStr;
} }
/**
* Read the account instance ID of the calling object (aJavaObject) passed in parameter.
* @param aJniEnv pointer pointing on the JNI function table
* @param aJavaObject reference to the object on which the method is invoked
* @return the instance ID if read succeed, -1 otherwise.
**/
jlong getSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
{
jlong instanceId=-1;
jfieldID instanceIdField;
jclass loaderClass;
if(NULL!=aJniEnv)
{
if(0 != (loaderClass=aJniEnv->GetObjectClass(aJavaObject)))
{
if(0 != (instanceIdField=aJniEnv->GetFieldID(loaderClass, "mNativeOlmSessionId", "J")))
{
instanceId = aJniEnv->GetIntField(aJavaObject, instanceIdField);
aJniEnv->DeleteLocalRef(loaderClass);
}
else
{
LOGD("## getSessionInstanceId() ERROR! GetFieldID=null");
}
}
else
{
LOGD("## getSessionInstanceId() ERROR! GetObjectClass=null");
}
}
else
{
LOGD("## getSessionInstanceId() ERROR! aJniEnv=NULL");
}
LOGD("## getSessionInstanceId() success - instanceId=%lld",instanceId);
return instanceId;
}

View file

@ -7,8 +7,6 @@
extern "C" { extern "C" {
#endif #endif
jlong getSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject);
// session creation/destruction // session creation/destruction
JNIEXPORT void JNICALL Java_org_matrix_olm_OlmSession_releaseSessionJni(JNIEnv *env, jobject thiz); JNIEXPORT void JNICALL Java_org_matrix_olm_OlmSession_releaseSessionJni(JNIEnv *env, jobject thiz);
JNIEXPORT jlong JNICALL Java_org_matrix_olm_OlmSession_initNewSessionJni(JNIEnv *env, jobject thiz); JNIEXPORT jlong JNICALL Java_org_matrix_olm_OlmSession_initNewSessionJni(JNIEnv *env, jobject thiz);
@ -24,15 +22,12 @@ JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_initInboundSessionFromIdKe
JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_matchesInboundSessionJni(JNIEnv *env, jobject thiz, jstring aOneTimeKeyMsg); JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_matchesInboundSessionJni(JNIEnv *env, jobject thiz, jstring aOneTimeKeyMsg);
JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_matchesInboundSessionFromIdKeyJni(JNIEnv *env, jobject thiz, jstring aTheirIdentityKey, jstring aOneTimeKeyMsg); JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_matchesInboundSessionFromIdKeyJni(JNIEnv *env, jobject thiz, jstring aTheirIdentityKey, jstring aOneTimeKeyMsg);
// encrypt/decrypt
JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *env, jobject thiz, jstring aClearMsg, jobject aEncryptedMsg); JNIEXPORT jint JNICALL Java_org_matrix_olm_OlmSession_encryptMessageJni(JNIEnv *env, jobject thiz, jstring aClearMsg, jobject aEncryptedMsg);
JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmSession_decryptMessageJni(JNIEnv *env, jobject thiz, jobject aEncryptedMsg);
JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmSession_getSessionIdentifierJni(JNIEnv *env, jobject thiz); JNIEXPORT jstring JNICALL Java_org_matrix_olm_OlmSession_getSessionIdentifierJni(JNIEnv *env, jobject thiz);
// signing
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -50,11 +50,92 @@ bool setRandomInBuffer(uint8_t **aBuffer2Ptr, size_t aRandomSize)
{ {
(*aBuffer2Ptr)[i] = (uint8_t)(rand()%ACCOUNT_CREATION_RANDOM_MODULO); (*aBuffer2Ptr)[i] = (uint8_t)(rand()%ACCOUNT_CREATION_RANDOM_MODULO);
// TODO debug purpose - remove asap // debug purpose
LOGD("## setRandomInBuffer(): randomBuffPtr[%ld]=%d",i, (*aBuffer2Ptr)[i]); //LOGD("## setRandomInBuffer(): randomBuffPtr[%ld]=%d",i, (*aBuffer2Ptr)[i]);
} }
retCode = true; retCode = true;
} }
return retCode; return retCode;
} }
/**
* Read the account instance ID of the calling object.
* @param aJniEnv pointer pointing on the JNI function table
* @param aJavaObject reference to the object on which the method is invoked
* @return the instance ID if operation succeed, -1 if instance ID was not found.
**/
jlong getAccountInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
{
jlong instanceId=-1;
jfieldID instanceIdField;
jclass loaderClass;
if(NULL!=aJniEnv)
{
if(0 != (loaderClass=aJniEnv->GetObjectClass(aJavaObject)))
{
if(0 != (instanceIdField=aJniEnv->GetFieldID(loaderClass, "mNativeOlmAccountId", "J")))
{
instanceId = aJniEnv->GetLongField(aJavaObject, instanceIdField);
aJniEnv->DeleteLocalRef(loaderClass);
LOGD("## getAccountInstanceId(): read from java instanceId=%lld",instanceId);
}
else
{
LOGD("## getAccountInstanceId() ERROR! GetFieldID=null");
}
}
else
{
LOGD("## getAccountInstanceId() ERROR! GetObjectClass=null");
}
}
else
{
LOGD("## getAccountInstanceId() ERROR! aJniEnv=NULL");
}
LOGD("## getAccountInstanceId() success - instanceId=%lld",instanceId);
return instanceId;
}
/**
* Read the account instance ID of the calling object (aJavaObject).<br>
* @param aJniEnv pointer pointing on the JNI function table
* @param aJavaObject reference to the object on which the method is invoked
* @return the instance ID if read succeed, -1 otherwise.
**/
jlong getSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject)
{
jlong instanceId=-1;
jfieldID instanceIdField;
jclass loaderClass;
if(NULL!=aJniEnv)
{
if(0 != (loaderClass=aJniEnv->GetObjectClass(aJavaObject)))
{
if(0 != (instanceIdField=aJniEnv->GetFieldID(loaderClass, "mNativeOlmSessionId", "J")))
{
instanceId = aJniEnv->GetIntField(aJavaObject, instanceIdField);
aJniEnv->DeleteLocalRef(loaderClass);
}
else
{
LOGD("## getSessionInstanceId() ERROR! GetFieldID=null");
}
}
else
{
LOGD("## getSessionInstanceId() ERROR! GetObjectClass=null");
}
}
else
{
LOGD("## getSessionInstanceId() ERROR! aJniEnv=NULL");
}
LOGD("## getSessionInstanceId() success - instanceId=%lld",instanceId);
return instanceId;
}

View file

@ -7,6 +7,8 @@ extern "C" {
#endif #endif
bool setRandomInBuffer(uint8_t **aBuffer2Ptr, size_t aRandomSize); bool setRandomInBuffer(uint8_t **aBuffer2Ptr, size_t aRandomSize);
jlong getSessionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject);
jlong getAccountInstanceId(JNIEnv* aJniEnv, jobject aJavaObject);
#ifdef __cplusplus #ifdef __cplusplus
} }