Loading android/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSasTest.java 0 → 100644 +99 −0 Original line number Diff line number Diff line /* * Copyright 2019 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.matrix.olm; import android.support.test.runner.AndroidJUnit4; import android.util.Log; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class OlmSasTest { private static OlmManager mOlmManager; //Enable the native lib @BeforeClass public static void setUpClass() { // load native librandomBytesOfLength mOlmManager = new OlmManager(); } @Test public void testSASCode() { OlmSAS aliceSas = null; OlmSAS bobSas = null; try { aliceSas = new OlmSAS(); bobSas = new OlmSAS(); String alicePKey = aliceSas.getPublicKey(); String bobPKey = bobSas.getPublicKey(); Log.e(OlmSasTest.class.getSimpleName(), "#### Alice pub Key is " + alicePKey); Log.e(OlmSasTest.class.getSimpleName(), "#### Bob pub Key is " + bobPKey); aliceSas.setTheirPublicKey(bobPKey); bobSas.setTheirPublicKey(alicePKey); int codeLength = 6; byte[] alice_sas = aliceSas.generateShortCode("SAS", codeLength); byte[] bob_sas = bobSas.generateShortCode("SAS", codeLength); Log.e(OlmSasTest.class.getSimpleName(), "#### Alice SAS is " + new String(alice_sas, "UTF-8")); Log.e(OlmSasTest.class.getSimpleName(), "#### Bob SAS is " + new String(bob_sas, "UTF-8")); assertEquals(codeLength, alice_sas.length); assertEquals(codeLength, bob_sas.length); assertArrayEquals(alice_sas, bob_sas); byte[] aliceMac = aliceSas.calculateMac("Hello world!", "SAS"); byte[] bobMac = bobSas.calculateMac("Hello world!", "SAS"); assertTrue(aliceMac.length > 0 && bobMac.length > 0); assertEquals(aliceMac.length, bobMac.length); assertArrayEquals(aliceMac, bobMac); Log.e(OlmSasTest.class.getSimpleName(), "#### Alice Mac is " + new String(aliceMac, "UTF-8")); Log.e(OlmSasTest.class.getSimpleName(), "#### Bob Mac is " + new String(bobMac, "UTF-8")); } catch (Exception e) { assertTrue("OlmSas init failed " + e.getMessage(), false); e.printStackTrace(); } finally { if (aliceSas != null) { aliceSas.releaseSas(); } if (bobSas != null) { bobSas.releaseSas(); } } } } android/olm-sdk/src/main/java/org/matrix/olm/OlmException.java +5 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,11 @@ public class OlmException extends IOException { public static final int EXCEPTION_CODE_PK_SIGNING_INIT_WITH_SEED = 802; public static final int EXCEPTION_CODE_PK_SIGNING_SIGN = 803; public static final int EXCEPTION_CODE_SAS_CREATION = 900; public static final int EXCEPTION_CODE_SAS_ERROR = 901; public static final int EXCEPTION_CODE_SAS_MISSING_THEIR_PKEY = 902; public static final int EXCEPTION_CODE_SAS_GENERATE_SHORT_CODE = 903; // exception human readable messages public static final String EXCEPTION_MSG_INVALID_PARAMS_DESERIALIZATION = "invalid de-serialized parameters"; Loading android/olm-sdk/src/main/java/org/matrix/olm/OlmSAS.java 0 → 100644 +140 −0 Original line number Diff line number Diff line /* * Copyright 2019 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.matrix.olm; import android.util.Log; import java.io.UnsupportedEncodingException; public class OlmSAS { private static final String LOG_TAG = OlmSAS.class.getName(); /** * Session Id returned by JNI. * This value uniquely identifies the native SAS instance. **/ private transient long mNativeId; private String theirPublicKey = null; public OlmSAS() throws OlmException { try { mNativeId = createNewSASJni(); } catch (Exception e) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_CREATION, e.getMessage()); } } /** * Gets the Public Key encoded in Base64 with no padding */ public String getPublicKey() throws OlmException { try { byte[] buffer = getPubKeyJni(); if (null != buffer) { return new String(buffer, "UTF-8"); } } catch (Exception e) { Log.e(LOG_TAG, "## sessionIdentifier(): " + e.getMessage()); throw new OlmException(OlmException.EXCEPTION_CODE_SAS_ERROR, e.getMessage()); } return null; } /** * Sets the public key of other user. * * @param otherPkey other user public key (base64 encoded with no padding) * @throws OlmException */ public void setTheirPublicKey(String otherPkey) throws OlmException { try { setTheirPubKey(otherPkey.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_ERROR, e.getMessage()); } this.theirPublicKey = otherPkey; } /** * Generate bytes to use for the short authentication string. * * @param info info extra information to mix in when generating the bytes, as * per the Matrix spec. * @param byteNumber The size of the short code to generate * @return The generated shortcode * @throws OlmException */ public byte[] generateShortCode(String info, int byteNumber) throws OlmException { if (theirPublicKey == null || theirPublicKey.isEmpty()) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_MISSING_THEIR_PKEY, "call setTheirPublicKey first"); } try { byte[] shortBuffer = generateShortCodeJni(info.getBytes("UTF-8"), byteNumber); return shortBuffer; } catch (Exception e) { Log.e(LOG_TAG, "## sessionIdentifier(): " + e.getMessage()); throw new OlmException(OlmException.EXCEPTION_CODE_SAS_GENERATE_SHORT_CODE, e.getMessage()); } } public byte[] calculateMac(String message, String info) throws OlmException { try { return calculateMacJni(message.getBytes("UTF-8"), info.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_ERROR, e.getMessage()); } } /** * Create an OLM session in native side.<br> * Do not forget to call {@link #releaseSASJni()} when JAVA side is done. * * @return native account instance identifier or throw an exception. */ private native long createNewSASJni(); /** * Destroy the corresponding OLM session native object.<br> * This method must ALWAYS be called when this JAVA instance * is destroyed (ie. garbage collected) to prevent memory leak in native side. * See {@link #createNewSASJni()}. */ private native void releaseSASJni(); private native byte[] getPubKeyJni(); private native void setTheirPubKey(byte[] pubKey); private native byte[] generateShortCodeJni(byte[] info, int byteNumber); private native byte[] calculateMacJni(byte[] message, byte[] info); /** * Release native session and invalid its JAVA reference counter part.<br> * Public API for {@link #releaseSASJni()}. */ public void releaseSas() { if (0 != mNativeId) { releaseSASJni(); } mNativeId = 0; } } android/olm-sdk/src/main/jni/Android.mk +3 −1 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ $(SRC_ROOT_DIR)/src/ratchet.cpp \ $(SRC_ROOT_DIR)/src/session.cpp \ $(SRC_ROOT_DIR)/src/utility.cpp \ $(SRC_ROOT_DIR)/src/pk.cpp \ $(SRC_ROOT_DIR)/src/sas.c \ $(SRC_ROOT_DIR)/src/ed25519.c \ $(SRC_ROOT_DIR)/src/error.c \ $(SRC_ROOT_DIR)/src/inbound_group_session.c \ Loading @@ -57,7 +58,8 @@ olm_inbound_group_session.cpp \ olm_outbound_group_session.cpp \ olm_utility.cpp \ olm_manager.cpp \ olm_pk.cpp olm_pk.cpp \ olm_sas.cpp LOCAL_LDLIBS := -llog Loading android/olm-sdk/src/main/jni/olm_jni.h +1 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ struct OlmUtility* getUtilityInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmPkDecryption* getPkDecryptionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmPkEncryption* getPkEncryptionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmPkSigning* getPkSigningInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmSAS* getOlmSasInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); #ifdef __cplusplus } Loading Loading
android/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSasTest.java 0 → 100644 +99 −0 Original line number Diff line number Diff line /* * Copyright 2019 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.matrix.olm; import android.support.test.runner.AndroidJUnit4; import android.util.Log; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class OlmSasTest { private static OlmManager mOlmManager; //Enable the native lib @BeforeClass public static void setUpClass() { // load native librandomBytesOfLength mOlmManager = new OlmManager(); } @Test public void testSASCode() { OlmSAS aliceSas = null; OlmSAS bobSas = null; try { aliceSas = new OlmSAS(); bobSas = new OlmSAS(); String alicePKey = aliceSas.getPublicKey(); String bobPKey = bobSas.getPublicKey(); Log.e(OlmSasTest.class.getSimpleName(), "#### Alice pub Key is " + alicePKey); Log.e(OlmSasTest.class.getSimpleName(), "#### Bob pub Key is " + bobPKey); aliceSas.setTheirPublicKey(bobPKey); bobSas.setTheirPublicKey(alicePKey); int codeLength = 6; byte[] alice_sas = aliceSas.generateShortCode("SAS", codeLength); byte[] bob_sas = bobSas.generateShortCode("SAS", codeLength); Log.e(OlmSasTest.class.getSimpleName(), "#### Alice SAS is " + new String(alice_sas, "UTF-8")); Log.e(OlmSasTest.class.getSimpleName(), "#### Bob SAS is " + new String(bob_sas, "UTF-8")); assertEquals(codeLength, alice_sas.length); assertEquals(codeLength, bob_sas.length); assertArrayEquals(alice_sas, bob_sas); byte[] aliceMac = aliceSas.calculateMac("Hello world!", "SAS"); byte[] bobMac = bobSas.calculateMac("Hello world!", "SAS"); assertTrue(aliceMac.length > 0 && bobMac.length > 0); assertEquals(aliceMac.length, bobMac.length); assertArrayEquals(aliceMac, bobMac); Log.e(OlmSasTest.class.getSimpleName(), "#### Alice Mac is " + new String(aliceMac, "UTF-8")); Log.e(OlmSasTest.class.getSimpleName(), "#### Bob Mac is " + new String(bobMac, "UTF-8")); } catch (Exception e) { assertTrue("OlmSas init failed " + e.getMessage(), false); e.printStackTrace(); } finally { if (aliceSas != null) { aliceSas.releaseSas(); } if (bobSas != null) { bobSas.releaseSas(); } } } }
android/olm-sdk/src/main/java/org/matrix/olm/OlmException.java +5 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,11 @@ public class OlmException extends IOException { public static final int EXCEPTION_CODE_PK_SIGNING_INIT_WITH_SEED = 802; public static final int EXCEPTION_CODE_PK_SIGNING_SIGN = 803; public static final int EXCEPTION_CODE_SAS_CREATION = 900; public static final int EXCEPTION_CODE_SAS_ERROR = 901; public static final int EXCEPTION_CODE_SAS_MISSING_THEIR_PKEY = 902; public static final int EXCEPTION_CODE_SAS_GENERATE_SHORT_CODE = 903; // exception human readable messages public static final String EXCEPTION_MSG_INVALID_PARAMS_DESERIALIZATION = "invalid de-serialized parameters"; Loading
android/olm-sdk/src/main/java/org/matrix/olm/OlmSAS.java 0 → 100644 +140 −0 Original line number Diff line number Diff line /* * Copyright 2019 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.matrix.olm; import android.util.Log; import java.io.UnsupportedEncodingException; public class OlmSAS { private static final String LOG_TAG = OlmSAS.class.getName(); /** * Session Id returned by JNI. * This value uniquely identifies the native SAS instance. **/ private transient long mNativeId; private String theirPublicKey = null; public OlmSAS() throws OlmException { try { mNativeId = createNewSASJni(); } catch (Exception e) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_CREATION, e.getMessage()); } } /** * Gets the Public Key encoded in Base64 with no padding */ public String getPublicKey() throws OlmException { try { byte[] buffer = getPubKeyJni(); if (null != buffer) { return new String(buffer, "UTF-8"); } } catch (Exception e) { Log.e(LOG_TAG, "## sessionIdentifier(): " + e.getMessage()); throw new OlmException(OlmException.EXCEPTION_CODE_SAS_ERROR, e.getMessage()); } return null; } /** * Sets the public key of other user. * * @param otherPkey other user public key (base64 encoded with no padding) * @throws OlmException */ public void setTheirPublicKey(String otherPkey) throws OlmException { try { setTheirPubKey(otherPkey.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_ERROR, e.getMessage()); } this.theirPublicKey = otherPkey; } /** * Generate bytes to use for the short authentication string. * * @param info info extra information to mix in when generating the bytes, as * per the Matrix spec. * @param byteNumber The size of the short code to generate * @return The generated shortcode * @throws OlmException */ public byte[] generateShortCode(String info, int byteNumber) throws OlmException { if (theirPublicKey == null || theirPublicKey.isEmpty()) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_MISSING_THEIR_PKEY, "call setTheirPublicKey first"); } try { byte[] shortBuffer = generateShortCodeJni(info.getBytes("UTF-8"), byteNumber); return shortBuffer; } catch (Exception e) { Log.e(LOG_TAG, "## sessionIdentifier(): " + e.getMessage()); throw new OlmException(OlmException.EXCEPTION_CODE_SAS_GENERATE_SHORT_CODE, e.getMessage()); } } public byte[] calculateMac(String message, String info) throws OlmException { try { return calculateMacJni(message.getBytes("UTF-8"), info.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { throw new OlmException(OlmException.EXCEPTION_CODE_SAS_ERROR, e.getMessage()); } } /** * Create an OLM session in native side.<br> * Do not forget to call {@link #releaseSASJni()} when JAVA side is done. * * @return native account instance identifier or throw an exception. */ private native long createNewSASJni(); /** * Destroy the corresponding OLM session native object.<br> * This method must ALWAYS be called when this JAVA instance * is destroyed (ie. garbage collected) to prevent memory leak in native side. * See {@link #createNewSASJni()}. */ private native void releaseSASJni(); private native byte[] getPubKeyJni(); private native void setTheirPubKey(byte[] pubKey); private native byte[] generateShortCodeJni(byte[] info, int byteNumber); private native byte[] calculateMacJni(byte[] message, byte[] info); /** * Release native session and invalid its JAVA reference counter part.<br> * Public API for {@link #releaseSASJni()}. */ public void releaseSas() { if (0 != mNativeId) { releaseSASJni(); } mNativeId = 0; } }
android/olm-sdk/src/main/jni/Android.mk +3 −1 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ $(SRC_ROOT_DIR)/src/ratchet.cpp \ $(SRC_ROOT_DIR)/src/session.cpp \ $(SRC_ROOT_DIR)/src/utility.cpp \ $(SRC_ROOT_DIR)/src/pk.cpp \ $(SRC_ROOT_DIR)/src/sas.c \ $(SRC_ROOT_DIR)/src/ed25519.c \ $(SRC_ROOT_DIR)/src/error.c \ $(SRC_ROOT_DIR)/src/inbound_group_session.c \ Loading @@ -57,7 +58,8 @@ olm_inbound_group_session.cpp \ olm_outbound_group_session.cpp \ olm_utility.cpp \ olm_manager.cpp \ olm_pk.cpp olm_pk.cpp \ olm_sas.cpp LOCAL_LDLIBS := -llog Loading
android/olm-sdk/src/main/jni/olm_jni.h +1 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ struct OlmUtility* getUtilityInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmPkDecryption* getPkDecryptionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmPkEncryption* getPkEncryptionInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmPkSigning* getPkSigningInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); struct OlmSAS* getOlmSasInstanceId(JNIEnv* aJniEnv, jobject aJavaObject); #ifdef __cplusplus } Loading