Skip to content

Commit

Permalink
Make sure senderkeys encrypt is correctly initialized.
Browse files Browse the repository at this point in the history
  • Loading branch information
moxie0 committed Oct 20, 2014
1 parent 9a0ed65 commit 5fcc135
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.whispersystems.libaxolotl.DuplicateMessageException;
import org.whispersystems.libaxolotl.InvalidMessageException;
import org.whispersystems.libaxolotl.LegacyMessageException;
import org.whispersystems.libaxolotl.NoSessionException;
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
import org.whispersystems.libaxolotl.groups.GroupCipher;
import org.whispersystems.libaxolotl.groups.GroupSessionBuilder;
Expand All @@ -21,7 +22,7 @@
public class GroupCipherTest extends AndroidTestCase {

public void testBasicEncryptDecrypt()
throws LegacyMessageException, DuplicateMessageException, InvalidMessageException
throws LegacyMessageException, DuplicateMessageException, InvalidMessageException, NoSessionException
{
InMemorySenderKeyStore aliceStore = new InMemorySenderKeyStore();
InMemorySenderKeyStore bobStore = new InMemorySenderKeyStore();
Expand Down Expand Up @@ -49,7 +50,7 @@ public void testBasicEncryptDecrypt()
}

public void testBasicRatchet()
throws LegacyMessageException, DuplicateMessageException, InvalidMessageException
throws LegacyMessageException, DuplicateMessageException, InvalidMessageException, NoSessionException
{
InMemorySenderKeyStore aliceStore = new InMemorySenderKeyStore();
InMemorySenderKeyStore bobStore = new InMemorySenderKeyStore();
Expand Down Expand Up @@ -92,7 +93,7 @@ public void testBasicRatchet()
}

public void testOutOfOrder()
throws LegacyMessageException, DuplicateMessageException, InvalidMessageException
throws LegacyMessageException, DuplicateMessageException, InvalidMessageException, NoSessionException
{
InMemorySenderKeyStore aliceStore = new InMemorySenderKeyStore();
InMemorySenderKeyStore bobStore = new InMemorySenderKeyStore();
Expand Down Expand Up @@ -129,6 +130,17 @@ public void testOutOfOrder()
}
}

public void testEncryptNoSession() {
InMemorySenderKeyStore aliceStore = new InMemorySenderKeyStore();
GroupCipher aliceGroupCipher = new GroupCipher(aliceStore, "groupWithBobInIt");
try {
aliceGroupCipher.encrypt("up the punks".getBytes());
throw new AssertionError("Should have failed!");
} catch (NoSessionException nse) {
// good
}
}

private int randomInt() {
try {
return SecureRandom.getInstance("SHA1PRNG").nextInt(Integer.MAX_VALUE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ public class NoSessionException extends Exception {
public NoSessionException(String s) {
super(s);
}

public NoSessionException(Exception nested) {
super(nested);
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
package org.whispersystems.libaxolotl.groups;

import android.util.Log;

import org.whispersystems.libaxolotl.DuplicateMessageException;
import org.whispersystems.libaxolotl.InvalidKeyIdException;
import org.whispersystems.libaxolotl.InvalidMessageException;
import org.whispersystems.libaxolotl.LegacyMessageException;
import org.whispersystems.libaxolotl.NoSessionException;
import org.whispersystems.libaxolotl.groups.ratchet.SenderChainKey;
import org.whispersystems.libaxolotl.groups.ratchet.SenderMessageKey;
import org.whispersystems.libaxolotl.groups.state.SenderKeyRecord;
import org.whispersystems.libaxolotl.groups.state.SenderKeyState;
import org.whispersystems.libaxolotl.protocol.SenderKeyMessage;
import org.whispersystems.libaxolotl.groups.state.SenderKeyStore;

import org.whispersystems.libaxolotl.protocol.SenderKeyMessage;

import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
Expand All @@ -36,23 +34,27 @@ public GroupCipher(SenderKeyStore senderKeyStore, String senderKeyId) {
this.senderKeyId = senderKeyId;
}

public byte[] encrypt(byte[] paddedPlaintext) {
public byte[] encrypt(byte[] paddedPlaintext) throws NoSessionException {
synchronized (LOCK) {
SenderKeyRecord record = senderKeyStore.loadSenderKey(senderKeyId);
SenderKeyState senderKeyState = record.getSenderKeyState();
SenderMessageKey senderKey = senderKeyState.getSenderChainKey().getSenderMessageKey();
byte[] ciphertext = getCipherText(senderKey.getIv(), senderKey.getCipherKey(), paddedPlaintext);
try {
SenderKeyRecord record = senderKeyStore.loadSenderKey(senderKeyId);
SenderKeyState senderKeyState = record.getSenderKeyState();
SenderMessageKey senderKey = senderKeyState.getSenderChainKey().getSenderMessageKey();
byte[] ciphertext = getCipherText(senderKey.getIv(), senderKey.getCipherKey(), paddedPlaintext);

SenderKeyMessage senderKeyMessage = new SenderKeyMessage(senderKeyState.getKeyId(),
senderKey.getIteration(),
ciphertext,
senderKeyState.getSigningKeyPrivate());
SenderKeyMessage senderKeyMessage = new SenderKeyMessage(senderKeyState.getKeyId(),
senderKey.getIteration(),
ciphertext,
senderKeyState.getSigningKeyPrivate());

senderKeyState.setSenderChainKey(senderKeyState.getSenderChainKey().getNext());
senderKeyState.setSenderChainKey(senderKeyState.getSenderChainKey().getNext());

senderKeyStore.storeSenderKey(senderKeyId, record);
senderKeyStore.storeSenderKey(senderKeyId, record);

return senderKeyMessage.serialize();
return senderKeyMessage.serialize();
} catch (InvalidKeyIdException e) {
throw new NoSessionException(e);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import org.whispersystems.libaxolotl.InvalidKeyIdException;
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
import org.whispersystems.libaxolotl.groups.state.SenderKeyState;
import org.whispersystems.libaxolotl.state.StorageProtos;

import java.io.IOException;
Expand All @@ -26,8 +25,12 @@ public SenderKeyRecord(byte[] serialized) throws IOException {
}
}

public SenderKeyState getSenderKeyState() {
return senderKeyStates.get(0);
public SenderKeyState getSenderKeyState() throws InvalidKeyIdException {
if (!senderKeyStates.isEmpty()) {
return senderKeyStates.get(0);
} else {
throw new InvalidKeyIdException("No key state in record!");
}
}

public SenderKeyState getSenderKeyState(int keyId) throws InvalidKeyIdException {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.whispersystems.libaxolotl.groups.state;

import android.util.Log;

import com.google.protobuf.ByteString;

import org.whispersystems.libaxolotl.InvalidKeyException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.whispersystems.libaxolotl.groups.state;

import org.whispersystems.libaxolotl.groups.state.SenderKeyRecord;

public interface SenderKeyStore {
public void storeSenderKey(String senderKeyId, SenderKeyRecord record);
public SenderKeyRecord loadSenderKey(String senderKeyId);
Expand Down

0 comments on commit 5fcc135

Please sign in to comment.