From e5353dc6d4853193dc8546a6851454a44b185539 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Thu, 16 Jan 2014 18:56:24 +0000
Subject: [PATCH] Replaced AuthenticatedCipher opmode with a boolean.

---
 .../api/crypto/AuthenticatedCipher.java       |  2 +-
 .../crypto/AuthenticatedCipherImpl.java       | 18 ++----------------
 .../crypto/CryptoComponentImpl.java           | 19 ++++++++-----------
 .../transport/IncomingEncryptionLayer.java    |  3 +--
 .../transport/OutgoingEncryptionLayer.java    |  3 +--
 .../IncomingEncryptionLayerTest.java          |  3 +--
 .../OutgoingEncryptionLayerTest.java          |  3 +--
 7 files changed, 15 insertions(+), 36 deletions(-)

diff --git a/briar-api/src/org/briarproject/api/crypto/AuthenticatedCipher.java b/briar-api/src/org/briarproject/api/crypto/AuthenticatedCipher.java
index 1b857b64e1..1a6d955229 100644
--- a/briar-api/src/org/briarproject/api/crypto/AuthenticatedCipher.java
+++ b/briar-api/src/org/briarproject/api/crypto/AuthenticatedCipher.java
@@ -9,7 +9,7 @@ public interface AuthenticatedCipher {
 	 * Initializes this cipher with a key, an initialisation vector (IV) and
 	 * additional authenticated data (AAD).
 	 */
-	void init(int opmode, SecretKey key, byte[] iv, byte[] aad)
+	void init(boolean encrypt, SecretKey key, byte[] iv, byte[] aad)
 			throws GeneralSecurityException;
 
 	/** Encrypts or decrypts data in a single-part operation. */
diff --git a/briar-core/src/org/briarproject/crypto/AuthenticatedCipherImpl.java b/briar-core/src/org/briarproject/crypto/AuthenticatedCipherImpl.java
index 34c1379bbe..93807087d2 100644
--- a/briar-core/src/org/briarproject/crypto/AuthenticatedCipherImpl.java
+++ b/briar-core/src/org/briarproject/crypto/AuthenticatedCipherImpl.java
@@ -2,11 +2,8 @@ package org.briarproject.crypto;
 
 import java.security.GeneralSecurityException;
 
-import javax.crypto.Cipher;
-
 import org.briarproject.api.crypto.AuthenticatedCipher;
 import org.briarproject.api.crypto.SecretKey;
-
 import org.spongycastle.crypto.DataLengthException;
 import org.spongycastle.crypto.InvalidCipherTextException;
 import org.spongycastle.crypto.modes.AEADBlockCipher;
@@ -39,23 +36,12 @@ class AuthenticatedCipherImpl implements AuthenticatedCipher {
 		}
 	}
 
-	public void init(int opmode, SecretKey key, byte[] iv, byte[] aad)
+	public void init(boolean encrypt, SecretKey key, byte[] iv, byte[] aad)
 			throws GeneralSecurityException {
 		KeyParameter k = new KeyParameter(key.getEncoded());
 		AEADParameters params = new AEADParameters(k, macLength * 8, iv, aad);
 		try {
-			switch(opmode) {
-			case Cipher.ENCRYPT_MODE:
-			case Cipher.WRAP_MODE:
-				cipher.init(true, params);
-				break;
-			case Cipher.DECRYPT_MODE:
-			case Cipher.UNWRAP_MODE:
-				cipher.init(false, params);
-				break;
-			default:
-				throw new IllegalArgumentException();
-			}
+			cipher.init(encrypt, params);
 		} catch(IllegalArgumentException e) {
 			throw new GeneralSecurityException(e.getMessage());
 		}
diff --git a/briar-core/src/org/briarproject/crypto/CryptoComponentImpl.java b/briar-core/src/org/briarproject/crypto/CryptoComponentImpl.java
index 53507da122..521a9cef07 100644
--- a/briar-core/src/org/briarproject/crypto/CryptoComponentImpl.java
+++ b/briar-core/src/org/briarproject/crypto/CryptoComponentImpl.java
@@ -1,8 +1,6 @@
 package org.briarproject.crypto;
 
 import static java.util.logging.Level.INFO;
-import static javax.crypto.Cipher.DECRYPT_MODE;
-import static javax.crypto.Cipher.ENCRYPT_MODE;
 import static org.briarproject.api.invitation.InvitationConstants.CODE_BITS;
 import static org.briarproject.api.transport.TransportConstants.TAG_LENGTH;
 import static org.briarproject.crypto.EllipticCurveConstants.P;
@@ -238,7 +236,6 @@ class CryptoComponentImpl implements CryptoComponent {
 		ECPublicKeyParameters ecPub = ((Sec1PublicKey) pub).getKey();
 		ECDHCBasicAgreement agreement = new ECDHCBasicAgreement();
 		agreement.init(ecPriv);
-		// FIXME: Should we use another format for the shared secret?
 		return agreement.calculateAgreement(ecPub).toByteArray();
 	}
 
@@ -305,8 +302,8 @@ class CryptoComponentImpl implements CryptoComponent {
 	}
 
 	public AuthenticatedCipher getFrameCipher() {
-		AEADBlockCipher cipher = new GCMBlockCipher(new AESLightEngine());
-		return new AuthenticatedCipherImpl(cipher, MAC_BYTES);
+		AEADBlockCipher a = new GCMBlockCipher(new AESLightEngine());
+		return new AuthenticatedCipherImpl(a, MAC_BYTES);
 	}
 
 	public void encodeTag(byte[] tag, SecretKey tagKey, long connection) {
@@ -343,10 +340,10 @@ class CryptoComponentImpl implements CryptoComponent {
 		System.arraycopy(iv, 0, output, salt.length + 4, iv.length);
 		// Initialise the cipher and encrypt the plaintext
 		try {
-			AEADBlockCipher c = new GCMBlockCipher(new AESLightEngine());
-			AuthenticatedCipher cipher = new AuthenticatedCipherImpl(c,
+			AEADBlockCipher a = new GCMBlockCipher(new AESLightEngine());
+			AuthenticatedCipher cipher = new AuthenticatedCipherImpl(a,
 					MAC_BYTES);
-			cipher.init(ENCRYPT_MODE, key, iv, null);
+			cipher.init(true, key, iv, null);
 			int outputOff = salt.length + 4 + iv.length;
 			cipher.doFinal(input, 0, input.length, output, outputOff);
 			return output;
@@ -374,9 +371,9 @@ class CryptoComponentImpl implements CryptoComponent {
 		// Initialise the cipher
 		AuthenticatedCipher cipher;
 		try {
-			AEADBlockCipher c = new GCMBlockCipher(new AESLightEngine());
-			cipher = new AuthenticatedCipherImpl(c, MAC_BYTES);
-			cipher.init(DECRYPT_MODE, key, iv, null);
+			AEADBlockCipher a = new GCMBlockCipher(new AESLightEngine());
+			cipher = new AuthenticatedCipherImpl(a, MAC_BYTES);
+			cipher.init(false, key, iv, null);
 		} catch(GeneralSecurityException e) {
 			key.erase();
 			throw new RuntimeException(e);
diff --git a/briar-core/src/org/briarproject/transport/IncomingEncryptionLayer.java b/briar-core/src/org/briarproject/transport/IncomingEncryptionLayer.java
index ba8ca63b91..e5e4381d8c 100644
--- a/briar-core/src/org/briarproject/transport/IncomingEncryptionLayer.java
+++ b/briar-core/src/org/briarproject/transport/IncomingEncryptionLayer.java
@@ -1,6 +1,5 @@
 package org.briarproject.transport;
 
-import static javax.crypto.Cipher.DECRYPT_MODE;
 import static org.briarproject.api.transport.TransportConstants.AAD_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.HEADER_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.IV_LENGTH;
@@ -60,7 +59,7 @@ class IncomingEncryptionLayer implements FrameReader {
 		FrameEncoder.encodeIv(iv, frameNumber);
 		FrameEncoder.encodeAad(aad, frameNumber, plaintextLength);
 		try {
-			frameCipher.init(DECRYPT_MODE, frameKey, iv, aad);
+			frameCipher.init(false, frameKey, iv, aad);
 			int decrypted = frameCipher.doFinal(ciphertext, 0, ciphertextLength,
 					frame, 0);
 			if(decrypted != plaintextLength) throw new RuntimeException();
diff --git a/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java b/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java
index 4a53790151..0a4552f38a 100644
--- a/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java
+++ b/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java
@@ -1,6 +1,5 @@
 package org.briarproject.transport;
 
-import static javax.crypto.Cipher.ENCRYPT_MODE;
 import static org.briarproject.api.transport.TransportConstants.AAD_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.HEADER_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.IV_LENGTH;
@@ -97,7 +96,7 @@ class OutgoingEncryptionLayer implements FrameWriter {
 		FrameEncoder.encodeIv(iv, frameNumber);
 		FrameEncoder.encodeAad(aad, frameNumber, plaintextLength);
 		try {
-			frameCipher.init(ENCRYPT_MODE, frameKey, iv, aad);
+			frameCipher.init(true, frameKey, iv, aad);
 			int encrypted = frameCipher.doFinal(frame, 0, plaintextLength,
 					ciphertext, 0);
 			if(encrypted != ciphertextLength) throw new RuntimeException();
diff --git a/briar-tests/src/org/briarproject/transport/IncomingEncryptionLayerTest.java b/briar-tests/src/org/briarproject/transport/IncomingEncryptionLayerTest.java
index cc1a38e1c0..8e17917856 100644
--- a/briar-tests/src/org/briarproject/transport/IncomingEncryptionLayerTest.java
+++ b/briar-tests/src/org/briarproject/transport/IncomingEncryptionLayerTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.transport;
 
-import static javax.crypto.Cipher.ENCRYPT_MODE;
 import static org.briarproject.api.transport.TransportConstants.AAD_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.HEADER_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.IV_LENGTH;
@@ -175,7 +174,7 @@ public class IncomingEncryptionLayerTest extends BriarTestCase {
 		byte[] ciphertext = new byte[frameLength];
 		FrameEncoder.encodeIv(iv, frameNumber);
 		FrameEncoder.encodeAad(aad, frameNumber, plaintext.length);
-		frameCipher.init(ENCRYPT_MODE, frameKey, iv, aad);
+		frameCipher.init(true, frameKey, iv, aad);
 		FrameEncoder.encodeHeader(plaintext, finalFrame, payloadLength);
 		if(badPadding) plaintext[HEADER_LENGTH + payloadLength] = 1;
 		frameCipher.doFinal(plaintext, 0, plaintext.length, ciphertext, 0);
diff --git a/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java b/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java
index 8a35ce732c..3a3598f3fa 100644
--- a/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java
+++ b/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.transport;
 
-import static javax.crypto.Cipher.ENCRYPT_MODE;
 import static org.briarproject.api.transport.TransportConstants.AAD_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.HEADER_LENGTH;
 import static org.briarproject.api.transport.TransportConstants.IV_LENGTH;
@@ -51,7 +50,7 @@ public class OutgoingEncryptionLayerTest extends BriarTestCase {
 		// Calculate the expected ciphertext
 		FrameEncoder.encodeIv(iv, 0);
 		FrameEncoder.encodeAad(aad, 0, plaintext.length);
-		frameCipher.init(ENCRYPT_MODE, frameKey, iv, aad);
+		frameCipher.init(true, frameKey, iv, aad);
 		FrameEncoder.encodeHeader(plaintext, false, payloadLength);
 		frameCipher.doFinal(plaintext, 0, plaintext.length, ciphertext, 0);
 		// Check that the actual tag and ciphertext match what's expected
-- 
GitLab