diff options
6 files changed, 43 insertions, 11 deletions
diff --git a/java/android/OlmLibSdk/olm-sdk/build.gradle b/java/android/OlmLibSdk/olm-sdk/build.gradle index b02ca0c..188acb6 100644 --- a/java/android/OlmLibSdk/olm-sdk/build.gradle +++ b/java/android/OlmLibSdk/olm-sdk/build.gradle @@ -11,7 +11,7 @@ android { targetSdkVersion 21 versionCode 1 versionName "1.0" - version "0.3.0" + version "0.2.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java b/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java index 6e12463..7e0324b 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java +++ b/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java @@ -151,8 +151,10 @@ public class OlmGroupSessionTest { @Test public void test10InboundDecryptMessage() { // test decrypted message - mBobDecryptedMessage = mBobInboundGroupSession.decryptMessage(mAliceToBobMessage); + OlmInboundGroupSession.DecryptIndex index = new OlmInboundGroupSession.DecryptIndex(); + mBobDecryptedMessage = mBobInboundGroupSession.decryptMessage(mAliceToBobMessage, index); assertFalse(TextUtils.isEmpty(mBobDecryptedMessage)); + assertTrue(0==index.mIndex); } @Test @@ -435,8 +437,10 @@ public class OlmGroupSessionTest { assertTrue("Exception in test18TestBadCharacterCrashInDecrypt, Exception code=" + e.getExceptionCode(), false); } - String decryptedMessage = bobInboundGroupSession.decryptMessage(msgToDecryptWithEmoji); + OlmInboundGroupSession.DecryptIndex index = new OlmInboundGroupSession.DecryptIndex(); + String decryptedMessage = bobInboundGroupSession.decryptMessage(msgToDecryptWithEmoji, index); assertNotNull(decryptedMessage); + assertTrue(13==index.mIndex); } } diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java index fa4ca1d..664b22e 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java +++ b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java @@ -45,6 +45,14 @@ public class OlmInboundGroupSession extends CommonSerializeUtils implements Seri private transient long mNativeId; /** + * Wrapper class to be used in {@link #decryptMessage(String, DecryptIndex)} + */ + static public class DecryptIndex { + /** decrypt index **/ + public long mIndex; + } + + /** * Constructor.<br> * Create and save a new native session instance ID and start a new inbound group session. * The session key parameter is retrieved from an outbound group session @@ -136,13 +144,14 @@ public class OlmInboundGroupSession extends CommonSerializeUtils implements Seri /** * Decrypt the message passed in parameter. * @param aEncryptedMsg the message to be decrypted + * @param aDecryptIndex_out decrypted message index * @return the decrypted message if operation succeed, null otherwise. */ - public String decryptMessage(String aEncryptedMsg) { - String decryptedMessage = decryptMessageJni(aEncryptedMsg, OlmManager.ENABLE_STRING_UTF8_SPECIFIC_CONVERSION); + public String decryptMessage(String aEncryptedMsg, DecryptIndex aDecryptIndex_out) { + String decryptedMessage = decryptMessageJni(aEncryptedMsg, aDecryptIndex_out, OlmManager.ENABLE_STRING_UTF8_SPECIFIC_CONVERSION); return decryptedMessage; } - private native String decryptMessageJni(String aEncryptedMsg, boolean aIsUtf8ConversionRequired); + private native String decryptMessageJni(String aEncryptedMsg, DecryptIndex aDecryptIndex_out, boolean aIsUtf8ConversionRequired); /** diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk b/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk index 2d94676..2a7d216 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk @@ -2,8 +2,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := olm -MAJOR := 1 -MINOR := 3 +MAJOR := 2 +MINOR := 0 PATCH := 0 OLM_VERSION := $(MAJOR).$(MINOR).$(PATCH) SRC_ROOT_DIR := ../../../../../../.. diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp index a78c2cf..e450a4c 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp @@ -180,13 +180,16 @@ JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(sessionIdentifierJni)(JNIEn } -JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jboolean aIsUtf8ConversionRequired) +JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jobject aDecryptIndex, jboolean aIsUtf8ConversionRequired) { jstring decryptedMsgRetValue = 0; OlmInboundGroupSession *sessionPtr = NULL; const char *encryptedMsgPtr = NULL; uint8_t *plainTextMsgPtr = NULL; uint8_t *tempEncryptedPtr = NULL; + uint32_t messageIndex = 0; + jclass indexObjJClass = 0; + jfieldID indexMsgFieldId; LOGD("## decryptMessageJni(): inbound group session IN"); @@ -198,10 +201,22 @@ JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv * { LOGE(" ## decryptMessageJni(): failure - invalid encrypted message"); } + else if(0 == aDecryptIndex) + { + LOGE(" ## decryptMessageJni(): failure - invalid index object"); + } else if(0 == (encryptedMsgPtr = env->GetStringUTFChars(aEncryptedMsg, 0))) { LOGE(" ## decryptMessageJni(): failure - encrypted message JNI allocation OOM"); } + else if(0 == (indexObjJClass = env->GetObjectClass(aDecryptIndex))) + { + LOGE("## decryptMessageJni(): failure - unable to get index class"); + } + else if(0 == (indexMsgFieldId = env->GetFieldID(indexObjJClass,"mIndex","J"))) + { + LOGE("## decryptMessageJni(): failure - unable to get index type field"); + } else { // get encrypted message length @@ -238,13 +253,17 @@ JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv * tempEncryptedPtr, encryptedMsgLength, plainTextMsgPtr, - maxPlainTextLength); + maxPlainTextLength, + &messageIndex); if(plaintextLength == olm_error()) { LOGE(" ## decryptMessageJni(): failure - olm_group_decrypt Msg=%s",(const char *)olm_inbound_group_session_last_error(sessionPtr)); } else { + // update index + env->SetLongField(aDecryptIndex, indexMsgFieldId, (jlong)messageIndex); + // UTF-8 conversion workaround for issue on Android versions older than Marshmallow (23) if(aIsUtf8ConversionRequired) { diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h index ec402fd..7d6fb5e 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h @@ -33,7 +33,7 @@ JNIEXPORT jlong OLM_INBOUND_GROUP_SESSION_FUNC_DEF(createNewSessionJni)(JNIEnv * JNIEXPORT jint OLM_INBOUND_GROUP_SESSION_FUNC_DEF(initInboundGroupSessionWithSessionKeyJni)(JNIEnv *env, jobject thiz, jstring aSessionKey); JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(sessionIdentifierJni)(JNIEnv *env, jobject thiz); -JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jboolean aIsUtf8ConversionRequired); +JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jobject aDecryptIndex, jboolean aIsUtf8ConversionRequired); // serialization JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(serializeDataWithKeyJni)(JNIEnv *env, jobject thiz, jstring aKey, jobject aErrorMsg); |