diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmAccount.java b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmAccount.java index 82533c2..984ef57 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmAccount.java +++ b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmAccount.java @@ -383,9 +383,25 @@ public class OlmAccount extends CommonSerializeUtils implements Serializable { * @return the signed message if operation succeed, null otherwise */ public String signMessage(String aMessage) { - return signMessageJni(aMessage); + if (null == aMessage) { + return null; + } + + byte[] utf8String = null; + + try { + utf8String = aMessage.getBytes("UTF-8"); + } catch (Exception e) { + Log.d(LOG_TAG,"## signMessage(): failed ="+e.getMessage()); + } + + if (null == utf8String) { + return null; + } + + return signMessageJni(utf8String); } - private native String signMessageJni(String aMessage); + private native String signMessageJni(byte[] aMessage); /** * Return the number of unreleased OlmAccount instances.
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 5d79ecb..6fc1227 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 @@ -393,7 +393,7 @@ JNIEXPORT jint OLM_ACCOUNT_FUNC_DEF(markOneTimeKeysAsPublishedJni)(JNIEnv *env, * @param aMessage message to sign * @return the signed message, null otherwise **/ -JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(signMessageJni)(JNIEnv *env, jobject thiz, jstring aMessage) +JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(signMessageJni)(JNIEnv *env, jobject thiz, jbyteArray aMessage) { OlmAccount* accountPtr = NULL; size_t signatureLength; @@ -411,48 +411,41 @@ JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(signMessageJni)(JNIEnv *env, jobject thiz } else { - // convert message from JAVA to C string - const char* messageToSign = env->GetStringUTFChars(aMessage, 0); - if(NULL == messageToSign) + int messageLength = env->GetArrayLength(aMessage); + unsigned char* messageToSign = new unsigned char[messageLength]; + env->GetByteArrayRegion(aMessage, 0, messageLength, reinterpret_cast(messageToSign)); + + // signature memory allocation + signatureLength = olm_account_signature_length(accountPtr); + if(NULL == (signedMsgPtr = (void*)malloc((signatureLength+1)*sizeof(uint8_t)))) { - LOGE("## signMessageJni(): failure - message JNI allocation OOM"); + LOGE("## signMessageJni(): failure - signature allocation OOM"); } else - { - int messageLength = env->GetStringUTFLength(aMessage); - - // signature memory allocation - signatureLength = olm_account_signature_length(accountPtr); - if(NULL == (signedMsgPtr = (void*)malloc((signatureLength+1)*sizeof(uint8_t)))) + { // sign message + resultSign = olm_account_sign(accountPtr, + (void*)messageToSign, + (size_t)messageLength, + signedMsgPtr, + signatureLength); + if(resultSign == olm_error()) { - LOGE("## signMessageJni(): failure - signature allocation OOM"); + LOGE("## signMessageJni(): failure - error signing message Msg=%s",(const char *)olm_account_last_error(accountPtr)); } 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); + { + // 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)); } - // release messageToSign - env->ReleaseStringUTFChars(aMessage, messageToSign); + free(signedMsgPtr); } + + // release messageToSign + free(messageToSign); } return signedMsgRetValue; diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.h b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.h index d57c7d9..04f3718 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.h +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_account.h @@ -43,7 +43,7 @@ JNIEXPORT jint OLM_ACCOUNT_FUNC_DEF(removeOneTimeKeysForSessionJni)(JNIEnv *env, JNIEXPORT jint OLM_ACCOUNT_FUNC_DEF(markOneTimeKeysAsPublishedJni)(JNIEnv *env, jobject thiz); // signing -JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(signMessageJni)(JNIEnv *env, jobject thiz, jstring aMessage); +JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(signMessageJni)(JNIEnv *env, jobject thiz, jbyteArray aMessage); // serialization JNIEXPORT jstring OLM_ACCOUNT_FUNC_DEF(serializeDataWithKeyJni)(JNIEnv *env, jobject thiz, jstring aKey, jobject aErrorMsg);