diff options
Diffstat (limited to 'java/android/OlmLibSdk/olm-sdk')
-rw-r--r-- | java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.cpp | 101 |
1 files changed, 51 insertions, 50 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) - { - LOGE("## signMessageJni(): failure - invalid aMessage param"); - } - else if(NULL == (accountPtr = (OlmAccount*)getAccountInstanceId(env,thiz))) + 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 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<jbyte*>(messageToSign)); - - // 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<char*>(signedMsgPtr))[signatureLength] = static_cast<char>('\0'); - // convert to jstring - signedMsgRetValue = env->NewStringUTF((const char*)signedMsgPtr); // UTF8 - LOGD("## signMessageJni(): success - retCode=%lu signatureLength=%lu", static_cast<long unsigned int>(resultSign), static_cast<long unsigned int>(signatureLength)); - } - - free(signedMsgPtr); - } - - // release messageToSign - free(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<char*>(signedMsgPtr))[signatureLength] = static_cast<char>('\0'); + // convert to jstring + signedMsgRetValue = env->NewStringUTF((const char*)signedMsgPtr); // UTF8 + LOGD("## signMessageJni(): success - retCode=%lu signatureLength=%lu", static_cast<long unsigned int>(resultSign), static_cast<long unsigned int>(signatureLength)); + } + + free(signedMsgPtr); + } + + // release messageToSign + if (messageToSign) + { + env->ReleaseByteArrayElements(aMessage, messageToSign, JNI_ABORT); } + } - return signedMsgRetValue; + return signedMsgRetValue; } - - - /** * Serialize and encrypt account instance into a base64 string.<br> * @param aKey key used to encrypt the serialized account data |