diff --git a/library/src/org/whispersystems/textsecure/crypto/protocol/EncryptedMessage.java b/library/src/org/whispersystems/textsecure/crypto/MessageCipher.java similarity index 90% rename from library/src/org/whispersystems/textsecure/crypto/protocol/EncryptedMessage.java rename to library/src/org/whispersystems/textsecure/crypto/MessageCipher.java index 9383a373b..49fa4f57f 100644 --- a/library/src/org/whispersystems/textsecure/crypto/protocol/EncryptedMessage.java +++ b/library/src/org/whispersystems/textsecure/crypto/MessageCipher.java @@ -14,23 +14,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.whispersystems.textsecure.crypto.protocol; +package org.whispersystems.textsecure.crypto; import android.content.Context; -import android.util.Log; -import org.whispersystems.textsecure.crypto.IdentityKeyPair; -import org.whispersystems.textsecure.crypto.InvalidKeyException; -import org.whispersystems.textsecure.crypto.InvalidMessageException; -import org.whispersystems.textsecure.crypto.MasterSecret; -import org.whispersystems.textsecure.crypto.MessageMac; -import org.whispersystems.textsecure.crypto.PublicKey; -import org.whispersystems.textsecure.crypto.SessionCipher; import org.whispersystems.textsecure.crypto.SessionCipher.SessionCipherContext; -import org.whispersystems.textsecure.crypto.TransportDetails; import org.whispersystems.textsecure.storage.CanonicalRecipientAddress; import org.whispersystems.textsecure.util.Conversions; -import org.whispersystems.textsecure.util.Hex; import java.io.IOException; import java.nio.ByteBuffer; @@ -41,7 +31,7 @@ import java.nio.ByteBuffer; * @author Moxie Marlinspike */ -public class EncryptedMessage { +public class MessageCipher { public static final int SUPPORTED_VERSION = 2; public static final int CRADLE_AGREEMENT_VERSION = 2; @@ -65,9 +55,9 @@ public class EncryptedMessage { private final IdentityKeyPair localIdentityKey; private final TransportDetails transportDetails; - public EncryptedMessage(Context context, MasterSecret masterSecret, - IdentityKeyPair localIdentityKey, - TransportDetails transportDetails) + public MessageCipher(Context context, MasterSecret masterSecret, + IdentityKeyPair localIdentityKey, + TransportDetails transportDetails) { this.context = context.getApplicationContext(); this.masterSecret = masterSecret; diff --git a/library/src/org/whispersystems/textsecure/crypto/SessionCipher.java b/library/src/org/whispersystems/textsecure/crypto/SessionCipher.java index 24fdfa247..b4ba36101 100644 --- a/library/src/org/whispersystems/textsecure/crypto/SessionCipher.java +++ b/library/src/org/whispersystems/textsecure/crypto/SessionCipher.java @@ -19,10 +19,7 @@ package org.whispersystems.textsecure.crypto; import android.content.Context; import android.util.Log; -import org.spongycastle.crypto.AsymmetricCipherKeyPair; -import org.spongycastle.crypto.agreement.ECDHBasicAgreement; import org.spongycastle.crypto.params.ECPublicKeyParameters; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import org.whispersystems.textsecure.storage.CanonicalRecipientAddress; import org.whispersystems.textsecure.storage.InvalidKeyIdException; import org.whispersystems.textsecure.storage.LocalKeyRecord; @@ -59,7 +56,7 @@ public class SessionCipher { public static final int CIPHER_KEY_LENGTH = 16; public static final int MAC_KEY_LENGTH = 20; - public static final int ENCRYPTED_MESSAGE_OVERHEAD = EncryptedMessage.HEADER_LENGTH + MessageMac.MAC_LENGTH; + public static final int ENCRYPTED_MESSAGE_OVERHEAD = MessageCipher.HEADER_LENGTH + MessageMac.MAC_LENGTH; public SessionCipherContext getEncryptionContext(Context context, MasterSecret masterSecret, @@ -309,7 +306,7 @@ public class SessionCipher { IdentityKey remoteIdentityKey = records.getSessionRecord().getIdentityKey(); if (isInitiallyExchangedKeys(records, localKeyId, remoteKeyId) && - messageVersion >= EncryptedMessage.CRADLE_AGREEMENT_VERSION) + messageVersion >= MessageCipher.CRADLE_AGREEMENT_VERSION) { return SharedSecretCalculator.calculateSharedSecret(localKeyPair, localIdentityKey, remoteKey, remoteIdentityKey); diff --git a/library/src/org/whispersystems/textsecure/crypto/protocol/PreKeyBundleMessage.java b/library/src/org/whispersystems/textsecure/crypto/protocol/PreKeyBundleMessage.java index e59091f3b..02641c1cf 100644 --- a/library/src/org/whispersystems/textsecure/crypto/protocol/PreKeyBundleMessage.java +++ b/library/src/org/whispersystems/textsecure/crypto/protocol/PreKeyBundleMessage.java @@ -16,6 +16,7 @@ */ package org.whispersystems.textsecure.crypto.protocol; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.whispersystems.textsecure.crypto.IdentityKey; import org.whispersystems.textsecure.crypto.InvalidKeyException; import org.whispersystems.textsecure.crypto.InvalidVersionException; @@ -34,14 +35,14 @@ import java.io.IOException; */ public class PreKeyBundleMessage { - private static final int VERSION_LENGTH = EncryptedMessage.VERSION_LENGTH; + private static final int VERSION_LENGTH = MessageCipher.VERSION_LENGTH; private static final int IDENTITY_KEY_LENGTH = IdentityKey.SIZE; - public static final int HEADER_LENGTH = IDENTITY_KEY_LENGTH + EncryptedMessage.HEADER_LENGTH; + public static final int HEADER_LENGTH = IDENTITY_KEY_LENGTH + MessageCipher.HEADER_LENGTH; - private static final int VERSION_OFFSET = EncryptedMessage.VERSION_OFFSET; - private static final int IDENTITY_KEY_OFFSET = VERSION_OFFSET + EncryptedMessage.VERSION_LENGTH; - private static final int PUBLIC_KEY_OFFSET = IDENTITY_KEY_LENGTH + EncryptedMessage.NEXT_KEY_OFFSET; - private static final int PREKEY_ID_OFFSET = IDENTITY_KEY_LENGTH + EncryptedMessage.RECEIVER_KEY_ID_OFFSET; + private static final int VERSION_OFFSET = MessageCipher.VERSION_OFFSET; + private static final int IDENTITY_KEY_OFFSET = VERSION_OFFSET + MessageCipher.VERSION_LENGTH; + private static final int PUBLIC_KEY_OFFSET = IDENTITY_KEY_LENGTH + MessageCipher.NEXT_KEY_OFFSET; + private static final int PREKEY_ID_OFFSET = IDENTITY_KEY_LENGTH + MessageCipher.RECEIVER_KEY_ID_OFFSET; private final byte[] messageBytes; @@ -57,9 +58,9 @@ public class PreKeyBundleMessage { this.messageBytes = Base64.decodeWithoutPadding(message); this.messageVersion = Conversions.highBitsToInt(this.messageBytes[VERSION_OFFSET]); - if (messageVersion > EncryptedMessage.SUPPORTED_VERSION) + if (messageVersion > MessageCipher.SUPPORTED_VERSION) throw new InvalidVersionException("Key exchange with version: " + messageVersion + - " but we only support: " + EncryptedMessage.SUPPORTED_VERSION); + " but we only support: " + MessageCipher.SUPPORTED_VERSION); this.supportedVersion = Conversions.lowBitsToInt(messageBytes[VERSION_OFFSET]); this.publicKey = new PublicKey(messageBytes, PUBLIC_KEY_OFFSET); @@ -77,11 +78,11 @@ public class PreKeyBundleMessage { public PreKeyBundleMessage(IdentityKey identityKey, byte[] bundledMessage) { try { - this.supportedVersion = EncryptedMessage.SUPPORTED_VERSION; - this.messageVersion = EncryptedMessage.SUPPORTED_VERSION; + this.supportedVersion = MessageCipher.SUPPORTED_VERSION; + this.messageVersion = MessageCipher.SUPPORTED_VERSION; this.identityKey = identityKey; - this.publicKey = new PublicKey(bundledMessage, EncryptedMessage.NEXT_KEY_OFFSET); - this.preKeyId = Conversions.byteArrayToMedium(bundledMessage, EncryptedMessage.RECEIVER_KEY_ID_OFFSET); + this.publicKey = new PublicKey(bundledMessage, MessageCipher.NEXT_KEY_OFFSET); + this.preKeyId = Conversions.byteArrayToMedium(bundledMessage, MessageCipher.RECEIVER_KEY_ID_OFFSET); this.bundledMessage = bundledMessage; this.messageBytes = new byte[IDENTITY_KEY_LENGTH + bundledMessage.length]; diff --git a/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java b/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java index 738eced2c..0be4d8a76 100644 --- a/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java +++ b/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java @@ -34,13 +34,12 @@ import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.RecipientFormattingException; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.sms.SmsTransportDetails; -import org.whispersystems.textsecure.crypto.IdentityKey; import org.whispersystems.textsecure.crypto.IdentityKeyPair; import org.whispersystems.textsecure.crypto.InvalidKeyException; import org.whispersystems.textsecure.crypto.InvalidMessageException; import org.whispersystems.textsecure.crypto.InvalidVersionException; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.whispersystems.textsecure.crypto.SessionCipher; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import org.whispersystems.textsecure.util.Hex; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.WorkerThread; @@ -198,8 +197,8 @@ public class DecryptingQueue { synchronized (SessionCipher.CIPHER_LOCK) { Log.w("DecryptingQueue", "Decrypting: " + Hex.toString(ciphertextPduBytes)); - IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); - EncryptedMessage message = new EncryptedMessage(context, masterSecret, identityKey, new TextTransport()); + IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); + MessageCipher message = new MessageCipher(context, masterSecret, identityKey, new TextTransport()); try { plaintextPduBytes = message.decrypt(recipient, ciphertextPduBytes); @@ -279,8 +278,8 @@ public class DecryptingQueue { return; } - IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); - EncryptedMessage message = new EncryptedMessage(context, masterSecret, identityKey, new SmsTransportDetails()); + IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); + MessageCipher message = new MessageCipher(context, masterSecret, identityKey, new SmsTransportDetails()); plaintextBody = new String(message.decrypt(recipient, body.getBytes())); } catch (InvalidMessageException e) { diff --git a/src/org/thoughtcrime/securesms/crypto/KeyExchangeProcessor.java b/src/org/thoughtcrime/securesms/crypto/KeyExchangeProcessor.java index 9352712bf..36f4a0d3a 100644 --- a/src/org/thoughtcrime/securesms/crypto/KeyExchangeProcessor.java +++ b/src/org/thoughtcrime/securesms/crypto/KeyExchangeProcessor.java @@ -26,9 +26,9 @@ import org.whispersystems.textsecure.crypto.IdentityKey; import org.whispersystems.textsecure.crypto.KeyPair; import org.whispersystems.textsecure.crypto.KeyUtil; import org.whispersystems.textsecure.crypto.MasterSecret; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.whispersystems.textsecure.crypto.PublicKey; import org.whispersystems.textsecure.crypto.protocol.PreKeyBundleMessage; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import org.whispersystems.textsecure.push.PreKeyEntity; import org.whispersystems.textsecure.storage.InvalidKeyIdException; import org.whispersystems.textsecure.storage.LocalKeyRecord; @@ -125,7 +125,7 @@ public class KeyExchangeProcessor { sessionRecord.setSessionId(localKeyRecord.getCurrentKeyPair().getPublicKey().getFingerprintBytes(), remoteKeyRecord.getCurrentRemoteKey().getFingerprintBytes()); sessionRecord.setIdentityKey(remoteIdentity); - sessionRecord.setSessionVersion(Math.min(message.getSupportedVersion(), EncryptedMessage.SUPPORTED_VERSION)); + sessionRecord.setSessionVersion(Math.min(message.getSupportedVersion(), MessageCipher.SUPPORTED_VERSION)); localKeyRecord.save(); @@ -149,7 +149,7 @@ public class KeyExchangeProcessor { sessionRecord.setSessionId(localKeyRecord.getCurrentKeyPair().getPublicKey().getFingerprintBytes(), remoteKeyRecord.getCurrentRemoteKey().getFingerprintBytes()); sessionRecord.setIdentityKey(message.getIdentityKey()); - sessionRecord.setSessionVersion(EncryptedMessage.SUPPORTED_VERSION); + sessionRecord.setSessionVersion(MessageCipher.SUPPORTED_VERSION); sessionRecord.save(); DatabaseFactory.getIdentityDatabase(context) @@ -162,7 +162,7 @@ public class KeyExchangeProcessor { if (needsResponseFromUs()) { localKeyRecord = KeyUtil.initializeRecordFor(recipient, context, masterSecret); - KeyExchangeMessage ourMessage = new KeyExchangeMessage(context, masterSecret, Math.min(EncryptedMessage.SUPPORTED_VERSION, message.getMaxVersion()), localKeyRecord, initiateKeyId); + KeyExchangeMessage ourMessage = new KeyExchangeMessage(context, masterSecret, Math.min(MessageCipher.SUPPORTED_VERSION, message.getMaxVersion()), localKeyRecord, initiateKeyId); OutgoingKeyExchangeMessage textMessage = new OutgoingKeyExchangeMessage(recipient, ourMessage.serialize()); Log.w("KeyExchangeProcessor", "Responding with key exchange message fingerprint: " + ourMessage.getPublicKey().getFingerprint()); Log.w("KeyExchangeProcessor", "Which has a local key record fingerprint: " + localKeyRecord.getCurrentKeyPair().getPublicKey().getFingerprint()); @@ -176,9 +176,9 @@ public class KeyExchangeProcessor { sessionRecord.setSessionId(localKeyRecord.getCurrentKeyPair().getPublicKey().getFingerprintBytes(), remoteKeyRecord.getCurrentRemoteKey().getFingerprintBytes()); sessionRecord.setIdentityKey(message.getIdentityKey()); - sessionRecord.setSessionVersion(Math.min(EncryptedMessage.SUPPORTED_VERSION, message.getMaxVersion())); + sessionRecord.setSessionVersion(Math.min(MessageCipher.SUPPORTED_VERSION, message.getMaxVersion())); - Log.w("KeyExchangeUtil", "Setting session version: " + Math.min(EncryptedMessage.SUPPORTED_VERSION, message.getMaxVersion())); + Log.w("KeyExchangeUtil", "Setting session version: " + Math.min(MessageCipher.SUPPORTED_VERSION, message.getMaxVersion())); sessionRecord.save(); diff --git a/src/org/thoughtcrime/securesms/crypto/protocol/KeyExchangeMessage.java b/src/org/thoughtcrime/securesms/crypto/protocol/KeyExchangeMessage.java index 6cf784020..9d0e6143f 100644 --- a/src/org/thoughtcrime/securesms/crypto/protocol/KeyExchangeMessage.java +++ b/src/org/thoughtcrime/securesms/crypto/protocol/KeyExchangeMessage.java @@ -24,8 +24,8 @@ import org.whispersystems.textsecure.crypto.InvalidVersionException; import org.whispersystems.textsecure.crypto.IdentityKey; import org.whispersystems.textsecure.crypto.InvalidKeyException; import org.whispersystems.textsecure.crypto.MasterSecret; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.whispersystems.textsecure.crypto.PublicKey; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import org.whispersystems.textsecure.storage.LocalKeyRecord; import org.whispersystems.textsecure.util.Base64; import org.whispersystems.textsecure.util.Conversions; @@ -67,7 +67,7 @@ public class KeyExchangeMessage { public KeyExchangeMessage(Context context, MasterSecret masterSecret, int messageVersion, LocalKeyRecord record, int highIdBits) { this.publicKey = new PublicKey(record.getCurrentKeyPair().getPublicKey()); this.messageVersion = messageVersion; - this.supportedVersion = EncryptedMessage.SUPPORTED_VERSION; + this.supportedVersion = MessageCipher.SUPPORTED_VERSION; publicKey.setId(publicKey.getId() | (highIdBits << 12)); @@ -93,9 +93,9 @@ public class KeyExchangeMessage { this.supportedVersion = Conversions.lowBitsToInt(keyBytes[0]); this.serialized = messageBody; - if (messageVersion > EncryptedMessage.SUPPORTED_VERSION) + if (messageVersion > MessageCipher.SUPPORTED_VERSION) throw new InvalidVersionException("Key exchange with version: " + messageVersion + - " but we only support: " + EncryptedMessage.SUPPORTED_VERSION); + " but we only support: " + MessageCipher.SUPPORTED_VERSION); if (messageVersion >= 1) keyBytes = Base64.decodeWithoutPadding(messageBody); diff --git a/src/org/thoughtcrime/securesms/transport/MmsTransport.java b/src/org/thoughtcrime/securesms/transport/MmsTransport.java index fd7790e38..5c7d7e222 100644 --- a/src/org/thoughtcrime/securesms/transport/MmsTransport.java +++ b/src/org/thoughtcrime/securesms/transport/MmsTransport.java @@ -6,10 +6,9 @@ import android.util.Log; import android.util.Pair; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; -import org.whispersystems.textsecure.crypto.IdentityKey; import org.whispersystems.textsecure.crypto.IdentityKeyPair; import org.whispersystems.textsecure.crypto.MasterSecret; -import org.whispersystems.textsecure.crypto.SessionCipher; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.mms.MmsRadio; import org.thoughtcrime.securesms.mms.MmsRadioException; @@ -17,7 +16,6 @@ import org.thoughtcrime.securesms.mms.MmsSendHelper; import org.thoughtcrime.securesms.mms.TextTransport; import org.thoughtcrime.securesms.protocol.WirePrefix; import org.thoughtcrime.securesms.recipients.Recipient; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import org.whispersystems.textsecure.util.Hex; import java.io.IOException; @@ -138,7 +136,7 @@ public class MmsTransport { private byte[] getEncryptedPdu(MasterSecret masterSecret, String recipient, byte[] pduBytes) { IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); - EncryptedMessage message = new EncryptedMessage(context, masterSecret, identityKey, new TextTransport()); + MessageCipher message = new MessageCipher(context, masterSecret, identityKey, new TextTransport()); return message.encrypt(new Recipient(null, recipient, null, null), pduBytes); } diff --git a/src/org/thoughtcrime/securesms/transport/PushTransport.java b/src/org/thoughtcrime/securesms/transport/PushTransport.java index 9c27c3968..b7f5aadb9 100644 --- a/src/org/thoughtcrime/securesms/transport/PushTransport.java +++ b/src/org/thoughtcrime/securesms/transport/PushTransport.java @@ -14,10 +14,9 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.textsecure.crypto.IdentityKey; import org.whispersystems.textsecure.crypto.IdentityKeyPair; -import org.whispersystems.textsecure.crypto.InvalidKeyException; import org.whispersystems.textsecure.crypto.MasterSecret; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.whispersystems.textsecure.crypto.protocol.PreKeyBundleMessage; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import org.whispersystems.textsecure.push.PreKeyEntity; import org.whispersystems.textsecure.push.PushAttachmentData; import org.whispersystems.textsecure.push.PushServiceSocket; @@ -120,7 +119,7 @@ public class PushTransport extends BaseTransport { processor.processKeyExchangeMessage(preKey); - EncryptedMessage message = new EncryptedMessage(context, masterSecret, identityKeyPair, new RawTransportDetails()); + MessageCipher message = new MessageCipher(context, masterSecret, identityKeyPair, new RawTransportDetails()); byte[] bundledMessage = message.encrypt(recipient, plaintext.getBytes()); PreKeyBundleMessage preKeyBundleMessage = new PreKeyBundleMessage(identityKey, bundledMessage); @@ -131,7 +130,7 @@ public class PushTransport extends BaseTransport { throws IOException { IdentityKeyPair identityKeyPair = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); - EncryptedMessage message = new EncryptedMessage(context, masterSecret, identityKeyPair, new TextTransport()); + MessageCipher message = new MessageCipher(context, masterSecret, identityKeyPair, new TextTransport()); return message.encrypt(recipient, plaintext.getBytes()); } diff --git a/src/org/thoughtcrime/securesms/transport/SmsTransport.java b/src/org/thoughtcrime/securesms/transport/SmsTransport.java index 69e245adc..51d0687ee 100644 --- a/src/org/thoughtcrime/securesms/transport/SmsTransport.java +++ b/src/org/thoughtcrime/securesms/transport/SmsTransport.java @@ -8,7 +8,7 @@ import android.util.Log; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; import org.whispersystems.textsecure.crypto.IdentityKeyPair; import org.whispersystems.textsecure.crypto.MasterSecret; -import org.whispersystems.textsecure.crypto.SessionCipher; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.thoughtcrime.securesms.database.model.SmsMessageRecord; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.service.SendReceiveService; @@ -17,7 +17,6 @@ import org.thoughtcrime.securesms.sms.MultipartSmsMessageHandler; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.sms.SmsTransportDetails; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.whispersystems.textsecure.crypto.protocol.EncryptedMessage; import java.util.ArrayList; @@ -142,7 +141,7 @@ public class SmsTransport extends BaseTransport { private String getAsymmetricEncrypt(MasterSecret masterSecret, String body, Recipient recipient) { IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context, masterSecret); - EncryptedMessage message = new EncryptedMessage(context, masterSecret, identityKey, new SmsTransportDetails()); + MessageCipher message = new MessageCipher(context, masterSecret, identityKey, new SmsTransportDetails()); return new String(message.encrypt(recipient, body.getBytes())); } }