Derive separate keys for each direction.

This commit is contained in:
akwizgran
2011-08-14 12:18:16 +02:00
parent 254da2da27
commit 4497774311
10 changed files with 115 additions and 23 deletions

View File

@@ -68,9 +68,13 @@ class CryptoComponentImpl implements CryptoComponent {
}
}
public SecretKey deriveMacKey(byte[] secret) {
public SecretKey deriveIncomingMacKey(byte[] secret) {
SharedSecret s = new SharedSecret(secret);
if(s.getAlice()) return deriveKey("MACA", s.getIv(), s.getCiphertext());
return deriveMacKey(s, !s.getAlice());
}
private SecretKey deriveMacKey(SharedSecret s, boolean alice) {
if(alice) return deriveKey("MACA", s.getIv(), s.getCiphertext());
else return deriveKey("MACB", s.getIv(), s.getCiphertext());
}
@@ -110,18 +114,41 @@ class CryptoComponentImpl implements CryptoComponent {
}
}
public SecretKey derivePacketKey(byte[] secret) {
public SecretKey deriveIncomingPacketKey(byte[] secret) {
SharedSecret s = new SharedSecret(secret);
if(s.getAlice()) return deriveKey("PKTA", s.getIv(), s.getCiphertext());
return derivePacketKey(s, !s.getAlice());
}
private SecretKey derivePacketKey(SharedSecret s, boolean alice) {
if(alice) return deriveKey("PKTA", s.getIv(), s.getCiphertext());
else return deriveKey("PKTB", s.getIv(), s.getCiphertext());
}
public SecretKey deriveTagKey(byte[] secret) {
public SecretKey deriveIncomingTagKey(byte[] secret) {
SharedSecret s = new SharedSecret(secret);
if(s.getAlice()) return deriveKey("TAGA", s.getIv(), s.getCiphertext());
return deriveTagKey(s, !s.getAlice());
}
private SecretKey deriveTagKey(SharedSecret s, boolean alice) {
if(alice) return deriveKey("TAGA", s.getIv(), s.getCiphertext());
else return deriveKey("TAGB", s.getIv(), s.getCiphertext());
}
public SecretKey deriveOutgoingMacKey(byte[] secret) {
SharedSecret s = new SharedSecret(secret);
return deriveMacKey(s, s.getAlice());
}
public SecretKey deriveOutgoingPacketKey(byte[] secret) {
SharedSecret s = new SharedSecret(secret);
return derivePacketKey(s, s.getAlice());
}
public SecretKey deriveOutgoingTagKey(byte[] secret) {
SharedSecret s = new SharedSecret(secret);
return deriveTagKey(s, s.getAlice());
}
public KeyPair generateKeyPair() {
return keyPairGenerator.generateKeyPair();
}

View File

@@ -50,7 +50,8 @@ DatabaseListener {
for(ContactId c : db.getContacts()) {
try {
// Initialise and store the contact's tag cipher
SecretKey tagKey = crypto.deriveTagKey(db.getSharedSecret(c));
byte[] secret = db.getSharedSecret(c);
SecretKey tagKey = crypto.deriveIncomingTagKey(secret);
Cipher cipher = crypto.getTagCipher();
try {
cipher.init(Cipher.ENCRYPT_MODE, tagKey);

View File

@@ -24,9 +24,9 @@ class PacketReaderFactoryImpl implements PacketReaderFactory {
public PacketReader createPacketReader(byte[] firstTag, InputStream in,
int transportId, long connection, byte[] secret) {
SecretKey macKey = crypto.deriveMacKey(secret);
SecretKey tagKey = crypto.deriveTagKey(secret);
SecretKey packetKey = crypto.derivePacketKey(secret);
SecretKey macKey = crypto.deriveIncomingMacKey(secret);
SecretKey tagKey = crypto.deriveIncomingTagKey(secret);
SecretKey packetKey = crypto.deriveIncomingPacketKey(secret);
Cipher tagCipher = crypto.getTagCipher();
Cipher packetCipher = crypto.getPacketCipher();
Mac mac = crypto.getMac();

View File

@@ -24,9 +24,9 @@ class PacketWriterFactoryImpl implements PacketWriterFactory {
public PacketWriter createPacketWriter(OutputStream out, int transportId,
long connection, byte[] secret) {
SecretKey macKey = crypto.deriveMacKey(secret);
SecretKey tagKey = crypto.deriveTagKey(secret);
SecretKey packetKey = crypto.derivePacketKey(secret);
SecretKey macKey = crypto.deriveOutgoingMacKey(secret);
SecretKey tagKey = crypto.deriveOutgoingTagKey(secret);
SecretKey packetKey = crypto.deriveOutgoingPacketKey(secret);
Cipher tagCipher = crypto.getTagCipher();
Cipher packetCipher = crypto.getPacketCipher();
Mac mac = crypto.getMac();