From 8335b0ef0333e0e7e7204182783fa05cc93dff7d Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Mon, 6 Apr 2015 12:28:16 -0700 Subject: Throw NoSessionException in GroupCipher decrypt() --- .../libaxolotl/groups/GroupCipher.java | 12 ++++++++--- .../libaxolotl/groups/GroupCipherTest.java | 24 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/java/src/main/java/org/whispersystems/libaxolotl/groups/GroupCipher.java b/java/src/main/java/org/whispersystems/libaxolotl/groups/GroupCipher.java index 55e261ac..cac2ccd8 100644 --- a/java/src/main/java/org/whispersystems/libaxolotl/groups/GroupCipher.java +++ b/java/src/main/java/org/whispersystems/libaxolotl/groups/GroupCipher.java @@ -102,7 +102,7 @@ public class GroupCipher { * @throws DuplicateMessageException */ public byte[] decrypt(byte[] senderKeyMessageBytes) - throws LegacyMessageException, DuplicateMessageException, InvalidMessageException + throws LegacyMessageException, DuplicateMessageException, InvalidMessageException, NoSessionException { return decrypt(senderKeyMessageBytes, new NullDecryptionCallback()); } @@ -123,11 +123,17 @@ public class GroupCipher { * @throws DuplicateMessageException */ public byte[] decrypt(byte[] senderKeyMessageBytes, DecryptionCallback callback) - throws LegacyMessageException, InvalidMessageException, DuplicateMessageException + throws LegacyMessageException, InvalidMessageException, DuplicateMessageException, + NoSessionException { synchronized (LOCK) { try { - SenderKeyRecord record = senderKeyStore.loadSenderKey(senderKeyId); + SenderKeyRecord record = senderKeyStore.loadSenderKey(senderKeyId); + + if (record.isEmpty()) { + throw new NoSessionException("No sender key for: " + senderKeyId); + } + SenderKeyMessage senderKeyMessage = new SenderKeyMessage(senderKeyMessageBytes); SenderKeyState senderKeyState = record.getSenderKeyState(senderKeyMessage.getKeyId()); diff --git a/tests/src/test/java/org/whispersystems/libaxolotl/groups/GroupCipherTest.java b/tests/src/test/java/org/whispersystems/libaxolotl/groups/GroupCipherTest.java index 32fcc652..aad8b083 100644 --- a/tests/src/test/java/org/whispersystems/libaxolotl/groups/GroupCipherTest.java +++ b/tests/src/test/java/org/whispersystems/libaxolotl/groups/GroupCipherTest.java @@ -18,6 +18,30 @@ public class GroupCipherTest extends TestCase { private static final AxolotlAddress SENDER_ADDRESS = new AxolotlAddress("+14150001111", 1); private static final SenderKeyName GROUP_SENDER = new SenderKeyName("nihilist history reading group", SENDER_ADDRESS); + public void testNoSession() throws InvalidMessageException, LegacyMessageException, NoSessionException, DuplicateMessageException { + InMemorySenderKeyStore aliceStore = new InMemorySenderKeyStore(); + InMemorySenderKeyStore bobStore = new InMemorySenderKeyStore(); + + GroupSessionBuilder aliceSessionBuilder = new GroupSessionBuilder(aliceStore); + GroupSessionBuilder bobSessionBuilder = new GroupSessionBuilder(bobStore); + + GroupCipher aliceGroupCipher = new GroupCipher(aliceStore, GROUP_SENDER); + GroupCipher bobGroupCipher = new GroupCipher(bobStore, GROUP_SENDER); + + SenderKeyDistributionMessage sentAliceDistributionMessage = aliceSessionBuilder.create(GROUP_SENDER); + SenderKeyDistributionMessage receivedAliceDistributionMessage = new SenderKeyDistributionMessage(sentAliceDistributionMessage.serialize()); + +// bobSessionBuilder.process(GROUP_SENDER, receivedAliceDistributionMessage); + + byte[] ciphertextFromAlice = aliceGroupCipher.encrypt("smert ze smert".getBytes()); + try { + byte[] plaintextFromAlice = bobGroupCipher.decrypt(ciphertextFromAlice); + throw new AssertionError("Should be no session!"); + } catch (NoSessionException e) { + // good + } + } + public void testBasicEncryptDecrypt() throws LegacyMessageException, DuplicateMessageException, InvalidMessageException, NoSessionException { -- cgit v1.2.3