public void testNoSession() { 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(Encoding.UTF8.GetBytes("smert ze smert")); try { byte[] plaintextFromAlice = bobGroupCipher.decrypt(ciphertextFromAlice); throw new Exception("Should be no session!"); } catch (NoSessionException e) { // good } }
/** * Construct a group session for receiving messages from senderKeyName. * * @param senderKeyName The (groupId, senderId, deviceId) tuple associated with the SenderKeyDistributionMessage. * @param senderKeyDistributionMessage A received SenderKeyDistributionMessage. */ public void process(SenderKeyName senderKeyName, SenderKeyDistributionMessage senderKeyDistributionMessage) { lock (GroupCipher.LOCK) { SenderKeyRecord senderKeyRecord = senderKeyStore.loadSenderKey(senderKeyName); senderKeyRecord.addSenderKeyState(senderKeyDistributionMessage.getId(), senderKeyDistributionMessage.getIteration(), senderKeyDistributionMessage.getChainKey(), senderKeyDistributionMessage.getSignatureKey()); senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); } }
public void testBasicEncryptDecrypt() { 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(Encoding.UTF8.GetBytes("smert ze smert")); byte[] plaintextFromAlice = bobGroupCipher.decrypt(ciphertextFromAlice); Assert.AreEqual("smert ze smert", Encoding.UTF8.GetString(plaintextFromAlice)); }
public void testLargeMessages() { 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[] plaintext = new byte[1024 * 1024]; new Random().NextBytes(plaintext); byte[] ciphertextFromAlice = aliceGroupCipher.encrypt(plaintext); byte[] plaintextFromAlice = bobGroupCipher.decrypt(ciphertextFromAlice); CollectionAssert.AreEqual(plaintext, plaintextFromAlice); }
public void testBasicRatchet() { InMemorySenderKeyStore aliceStore = new InMemorySenderKeyStore(); InMemorySenderKeyStore bobStore = new InMemorySenderKeyStore(); GroupSessionBuilder aliceSessionBuilder = new GroupSessionBuilder(aliceStore); GroupSessionBuilder bobSessionBuilder = new GroupSessionBuilder(bobStore); SenderKeyName aliceName = GROUP_SENDER; GroupCipher aliceGroupCipher = new GroupCipher(aliceStore, aliceName); GroupCipher bobGroupCipher = new GroupCipher(bobStore, aliceName); SenderKeyDistributionMessage sentAliceDistributionMessage = aliceSessionBuilder.create(aliceName); SenderKeyDistributionMessage receivedAliceDistributionMessage = new SenderKeyDistributionMessage(sentAliceDistributionMessage.serialize()); bobSessionBuilder.process(aliceName, receivedAliceDistributionMessage); byte[] ciphertextFromAlice = aliceGroupCipher.encrypt(Encoding.UTF8.GetBytes("smert ze smert")); byte[] ciphertextFromAlice2 = aliceGroupCipher.encrypt(Encoding.UTF8.GetBytes("smert ze smert2")); byte[] ciphertextFromAlice3 = aliceGroupCipher.encrypt(Encoding.UTF8.GetBytes("smert ze smert3")); byte[] plaintextFromAlice = bobGroupCipher.decrypt(ciphertextFromAlice); try { bobGroupCipher.decrypt(ciphertextFromAlice); throw new Exception("Should have ratcheted forward!"); } catch (DuplicateMessageException dme) { // good } byte[] plaintextFromAlice2 = bobGroupCipher.decrypt(ciphertextFromAlice2); byte[] plaintextFromAlice3 = bobGroupCipher.decrypt(ciphertextFromAlice3); Assert.AreEqual("smert ze smert", Encoding.UTF8.GetString(plaintextFromAlice)); Assert.AreEqual("smert ze smert2", Encoding.UTF8.GetString(plaintextFromAlice2)); Assert.AreEqual("smert ze smert3", Encoding.UTF8.GetString(plaintextFromAlice3)); }