From b893b81c8242b9838700ec5c8cb1be088263d8d9 Mon Sep 17 00:00:00 2001 From: ylecollen Date: Mon, 2 Jan 2017 14:41:54 +0100 Subject: [PATCH] Simplify signMessageJni --- .../olm-sdk/src/main/jni/olm_account.cpp | 99 ++++++++++--------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.cpp b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.cpp index 121dccd..9c572e5 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.cpp +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.cpp @@ -396,65 +396,66 @@ JNIEXPORT jint OLM_ACCOUNT_FUNC_DEF(markOneTimeKeysAsPublishedJni)(JNIEnv *env, **/ JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(signMessageJni)(JNIEnv *env, jobject thiz, jbyteArray aMessage) { - OlmAccount* accountPtr = NULL; - size_t signatureLength; - void* signedMsgPtr; - size_t resultSign; - jstring signedMsgRetValue = NULL; + OlmAccount* accountPtr = NULL; + size_t signatureLength; + void* signedMsgPtr; + size_t resultSign; + jstring signedMsgRetValue = NULL; - if(NULL == aMessage) + if(NULL == aMessage) + { + LOGE("## signMessageJni(): failure - invalid aMessage param"); + } + else if(NULL == (accountPtr = (OlmAccount*)getAccountInstanceId(env,thiz))) + { + LOGE("## signMessageJni(): failure - invalid account ptr"); + } + else + { + int messageLength = env->GetArrayLength(aMessage); + jbyte* messageToSign = env->GetByteArrayElements(aMessage, NULL); + + // signature memory allocation + signatureLength = olm_account_signature_length(accountPtr); + + if(NULL == (signedMsgPtr = (void*)malloc((signatureLength+1)*sizeof(uint8_t)))) { - LOGE("## signMessageJni(): failure - invalid aMessage param"); - } - else if(NULL == (accountPtr = (OlmAccount*)getAccountInstanceId(env,thiz))) - { - LOGE("## signMessageJni(): failure - invalid account ptr"); + LOGE("## signMessageJni(): failure - signature allocation OOM"); } else { - int messageLength = env->GetArrayLength(aMessage); - unsigned char* messageToSign = new unsigned char[messageLength]; - env->GetByteArrayRegion(aMessage, 0, messageLength, reinterpret_cast(messageToSign)); + // sign message + resultSign = olm_account_sign(accountPtr, + (void*)messageToSign, + (size_t)messageLength, + signedMsgPtr, + signatureLength); + if(resultSign == olm_error()) + { + LOGE("## signMessageJni(): failure - error signing message Msg=%s",(const char *)olm_account_last_error(accountPtr)); + } + else + { + // info: signatureLength is always equal to resultSign + (static_cast(signedMsgPtr))[signatureLength] = static_cast('\0'); + // convert to jstring + signedMsgRetValue = env->NewStringUTF((const char*)signedMsgPtr); // UTF8 + LOGD("## signMessageJni(): success - retCode=%lu signatureLength=%lu", static_cast(resultSign), static_cast(signatureLength)); + } - // signature memory allocation - signatureLength = olm_account_signature_length(accountPtr); - if(NULL == (signedMsgPtr = (void*)malloc((signatureLength+1)*sizeof(uint8_t)))) - { - LOGE("## signMessageJni(): failure - signature allocation OOM"); - } - else - { // sign message - resultSign = olm_account_sign(accountPtr, - (void*)messageToSign, - (size_t)messageLength, - signedMsgPtr, - signatureLength); - if(resultSign == olm_error()) - { - LOGE("## signMessageJni(): failure - error signing message Msg=%s",(const char *)olm_account_last_error(accountPtr)); - } - else - { - // info: signatureLength is always equal to resultSign - (static_cast(signedMsgPtr))[signatureLength] = static_cast('\0'); - // convert to jstring - signedMsgRetValue = env->NewStringUTF((const char*)signedMsgPtr); // UTF8 - LOGD("## signMessageJni(): success - retCode=%lu signatureLength=%lu", static_cast(resultSign), static_cast(signatureLength)); - } - - free(signedMsgPtr); - } - - // release messageToSign - free(messageToSign); + free(signedMsgPtr); } - return signedMsgRetValue; + // release messageToSign + if (messageToSign) + { + env->ReleaseByteArrayElements(aMessage, messageToSign, JNI_ABORT); + } + } + + return signedMsgRetValue; } - - - /** * Serialize and encrypt account instance into a base64 string.
* @param aKey key used to encrypt the serialized account data