diff --git a/api/net/sf/briar/api/crypto/CryptoComponent.java b/api/net/sf/briar/api/crypto/CryptoComponent.java
index 75c6b726f90b80bfea4b2844b78f62fc0949b233..a9322319896fd0491abef6f1f96c1e5ab2e6fe92 100644
--- a/api/net/sf/briar/api/crypto/CryptoComponent.java
+++ b/api/net/sf/briar/api/crypto/CryptoComponent.java
@@ -6,26 +6,23 @@ import java.security.Signature;
 
 import javax.crypto.Cipher;
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
 
 public interface CryptoComponent {
 
-	SecretKey deriveIncomingFrameKey(byte[] secret);
+	ErasableKey deriveIncomingFrameKey(byte[] secret);
 
-	SecretKey deriveIncomingIvKey(byte[] secret);
+	ErasableKey deriveIncomingIvKey(byte[] secret);
 
-	SecretKey deriveIncomingMacKey(byte[] secret);
+	ErasableKey deriveIncomingMacKey(byte[] secret);
 
-	SecretKey deriveOutgoingFrameKey(byte[] secret);
+	ErasableKey deriveOutgoingFrameKey(byte[] secret);
 
-	SecretKey deriveOutgoingIvKey(byte[] secret);
+	ErasableKey deriveOutgoingIvKey(byte[] secret);
 
-	SecretKey deriveOutgoingMacKey(byte[] secret);
+	ErasableKey deriveOutgoingMacKey(byte[] secret);
 
 	KeyPair generateKeyPair();
 
-	SecretKey generateSecretKey();
-
 	Cipher getFrameCipher();
 
 	Cipher getIvCipher();
@@ -39,4 +36,6 @@ public interface CryptoComponent {
 	SecureRandom getSecureRandom();
 
 	Signature getSignature();
+
+	ErasableKey generateTestKey();
 }
diff --git a/api/net/sf/briar/api/crypto/ErasableKey.java b/api/net/sf/briar/api/crypto/ErasableKey.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a46356c95f168670a74a69093e8a32e3d435e1e
--- /dev/null
+++ b/api/net/sf/briar/api/crypto/ErasableKey.java
@@ -0,0 +1,9 @@
+package net.sf.briar.api.crypto;
+
+import javax.crypto.SecretKey;
+
+public interface ErasableKey extends SecretKey {
+
+	/** Erases the key from memory. */
+	void erase();
+}
diff --git a/components/net/sf/briar/crypto/CryptoComponentImpl.java b/components/net/sf/briar/crypto/CryptoComponentImpl.java
index f0b3173dea8144e75c6a9f0d8ba5c3702817f82d..cd64e056554d7063185fef4aaa80082b9da32927 100644
--- a/components/net/sf/briar/crypto/CryptoComponentImpl.java
+++ b/components/net/sf/briar/crypto/CryptoComponentImpl.java
@@ -10,13 +10,11 @@ import java.security.Security;
 import java.security.Signature;
 
 import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
 import javax.crypto.Mac;
 import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
 
 import net.sf.briar.api.crypto.CryptoComponent;
+import net.sf.briar.api.crypto.ErasableKey;
 import net.sf.briar.api.crypto.KeyParser;
 import net.sf.briar.api.crypto.MessageDigest;
 
@@ -32,14 +30,13 @@ class CryptoComponentImpl implements CryptoComponent {
 	private static final int KEY_PAIR_BITS = 256;
 	private static final String FRAME_CIPHER_ALGO = "AES/CTR/NoPadding";
 	private static final String SECRET_KEY_ALGO = "AES";
-	private static final int SECRET_KEY_BITS = 256;
+	private static final int SECRET_KEY_BYTES = 32;
 	private static final String IV_CIPHER_ALGO = "AES/ECB/NoPadding";
 	private static final String MAC_ALGO = "HMacSHA256";
 	private static final String SIGNATURE_ALGO = "ECDSA";
 
 	private final KeyParser keyParser;
 	private final KeyPairGenerator keyPairGenerator;
-	private final KeyGenerator keyGenerator;
 
 	@Inject
 	CryptoComponentImpl() {
@@ -49,9 +46,6 @@ class CryptoComponentImpl implements CryptoComponent {
 			keyPairGenerator = KeyPairGenerator.getInstance(KEY_PAIR_ALGO,
 					PROVIDER);
 			keyPairGenerator.initialize(KEY_PAIR_BITS);
-			keyGenerator = KeyGenerator.getInstance(SECRET_KEY_ALGO,
-					PROVIDER);
-			keyGenerator.init(SECRET_KEY_BITS);
 		} catch(NoSuchAlgorithmException e) {
 			throw new RuntimeException(e);
 		} catch(NoSuchProviderException e) {
@@ -59,58 +53,59 @@ class CryptoComponentImpl implements CryptoComponent {
 		}
 	}
 
-	public SecretKey deriveIncomingFrameKey(byte[] secret) {
+	public ErasableKey deriveIncomingFrameKey(byte[] secret) {
 		SharedSecret s = new SharedSecret(secret);
 		return deriveFrameKey(s, !s.getAlice());
 	}
 
-	private SecretKey deriveFrameKey(SharedSecret s, boolean alice) {
+	private ErasableKey deriveFrameKey(SharedSecret s, boolean alice) {
 		if(alice) return deriveKey("F_A", s.getSecret());
 		else return deriveKey("F_B", s.getSecret());
 	}
 
-	private SecretKey deriveKey(String name, byte[] secret) {
+	private ErasableKey deriveKey(String name, byte[] secret) {
 		MessageDigest digest = getMessageDigest();
+		assert digest.getDigestLength() == SECRET_KEY_BYTES;
 		try {
 			digest.update(name.getBytes("UTF-8"));
 		} catch(UnsupportedEncodingException e) {
 			throw new RuntimeException(e);
 		}
 		digest.update(secret);
-		return new SecretKeySpec(digest.digest(), SECRET_KEY_ALGO);
+		return new ErasableKeyImpl(digest.digest(), SECRET_KEY_ALGO);
 	}
 
-	public SecretKey deriveIncomingIvKey(byte[] secret) {
+	public ErasableKey deriveIncomingIvKey(byte[] secret) {
 		SharedSecret s = new SharedSecret(secret);
 		return deriveIvKey(s, !s.getAlice());
 	}
 
-	private SecretKey deriveIvKey(SharedSecret s, boolean alice) {
+	private ErasableKey deriveIvKey(SharedSecret s, boolean alice) {
 		if(alice) return deriveKey("I_A", s.getSecret());
 		else return deriveKey("I_B", s.getSecret());
 	}
 
-	public SecretKey deriveIncomingMacKey(byte[] secret) {
+	public ErasableKey deriveIncomingMacKey(byte[] secret) {
 		SharedSecret s = new SharedSecret(secret);
 		return deriveMacKey(s, !s.getAlice());
 	}
 
-	private SecretKey deriveMacKey(SharedSecret s, boolean alice) {
+	private ErasableKey deriveMacKey(SharedSecret s, boolean alice) {
 		if(alice) return deriveKey("M_A", s.getSecret());
 		else return deriveKey("M_B", s.getSecret());
 	}
 
-	public SecretKey deriveOutgoingFrameKey(byte[] secret) {
+	public ErasableKey deriveOutgoingFrameKey(byte[] secret) {
 		SharedSecret s = new SharedSecret(secret);
 		return deriveFrameKey(s, s.getAlice());
 	}
 
-	public SecretKey deriveOutgoingIvKey(byte[] secret) {
+	public ErasableKey deriveOutgoingIvKey(byte[] secret) {
 		SharedSecret s = new SharedSecret(secret);
 		return deriveIvKey(s, s.getAlice());
 	}
 
-	public SecretKey deriveOutgoingMacKey(byte[] secret) {
+	public ErasableKey deriveOutgoingMacKey(byte[] secret) {
 		SharedSecret s = new SharedSecret(secret);
 		return deriveMacKey(s, s.getAlice());
 	}
@@ -119,10 +114,6 @@ class CryptoComponentImpl implements CryptoComponent {
 		return keyPairGenerator.generateKeyPair();
 	}
 
-	public SecretKey generateSecretKey() {
-		return keyGenerator.generateKey();
-	}
-
 	public Cipher getFrameCipher() {
 		try {
 			return Cipher.getInstance(FRAME_CIPHER_ALGO, PROVIDER);
@@ -186,4 +177,10 @@ class CryptoComponentImpl implements CryptoComponent {
 			throw new RuntimeException(e);
 		}
 	}
+
+	public ErasableKey generateTestKey() {
+		byte[] b = new byte[SECRET_KEY_BYTES];
+		getSecureRandom().nextBytes(b);
+		return new ErasableKeyImpl(b, SECRET_KEY_ALGO);
+	}
 }
diff --git a/components/net/sf/briar/crypto/ErasableKeyImpl.java b/components/net/sf/briar/crypto/ErasableKeyImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..209699a3c56525d2fbd33e8cbeed75d9cf4a3c59
--- /dev/null
+++ b/components/net/sf/briar/crypto/ErasableKeyImpl.java
@@ -0,0 +1,55 @@
+package net.sf.briar.crypto;
+
+import java.util.Arrays;
+
+import net.sf.briar.api.crypto.ErasableKey;
+
+class ErasableKeyImpl implements ErasableKey {
+
+	private static final long serialVersionUID = -4438380720846443120L;
+
+	private final byte[] key;
+	private final String algorithm;
+	private boolean erased = false;
+
+	ErasableKeyImpl(byte[] key, String algorithm) {
+		this.key = key;
+		this.algorithm = algorithm;
+	}
+
+	public String getAlgorithm() {
+		return algorithm;
+	}
+
+	public byte[] getEncoded() {
+		if(erased) throw new IllegalStateException();
+		byte[] b = new byte[key.length];
+		System.arraycopy(key, 0, b, 0, key.length);
+		return b;
+	}
+
+	public String getFormat() {
+		return "RAW";
+	}
+
+	public void erase() {
+		if(erased) throw new IllegalStateException();
+		for(int i = 0; i < key.length; i++) key[i] = 0;
+		erased = true;
+	}
+
+	@Override
+	public int hashCode() {
+		// Not good, but the array can't be used because it's mutable
+		return algorithm.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if(o instanceof ErasableKeyImpl) {
+			ErasableKeyImpl e = (ErasableKeyImpl) o;
+			return algorithm.equals(e.algorithm) && Arrays.equals(key, e.key);
+		}
+		return false;
+	}
+}
diff --git a/components/net/sf/briar/transport/ConnectionDecrypterImpl.java b/components/net/sf/briar/transport/ConnectionDecrypterImpl.java
index 99c1389910ed2a70a4f93f5ff88ca62d5018600b..3f6f426baa95681b357a159b86787fd73c91823f 100644
--- a/components/net/sf/briar/transport/ConnectionDecrypterImpl.java
+++ b/components/net/sf/briar/transport/ConnectionDecrypterImpl.java
@@ -13,7 +13,7 @@ import java.security.InvalidKeyException;
 import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 import javax.crypto.ShortBufferException;
 import javax.crypto.spec.IvParameterSpec;
 
@@ -21,7 +21,7 @@ class ConnectionDecrypterImpl extends FilterInputStream
 implements ConnectionDecrypter {
 
 	private final Cipher frameCipher;
-	private final SecretKey frameKey;
+	private final ErasableKey frameKey;
 	private final byte[] iv, buf;
 
 	private int bufOff = 0, bufLen = 0;
@@ -29,7 +29,7 @@ implements ConnectionDecrypter {
 	private boolean betweenFrames = true;
 
 	ConnectionDecrypterImpl(InputStream in, byte[] iv, Cipher frameCipher,
-			SecretKey frameKey) {
+			ErasableKey frameKey) {
 		super(in);
 		if(iv.length != IV_LENGTH) throw new IllegalArgumentException();
 		this.iv = iv;
diff --git a/components/net/sf/briar/transport/ConnectionEncrypterImpl.java b/components/net/sf/briar/transport/ConnectionEncrypterImpl.java
index 5c8c473ad4ed64f3483b836bf91a26e15584777d..5494b84bc1fbb1435389dd0188f381b3a1940614 100644
--- a/components/net/sf/briar/transport/ConnectionEncrypterImpl.java
+++ b/components/net/sf/briar/transport/ConnectionEncrypterImpl.java
@@ -12,22 +12,22 @@ import java.security.InvalidKeyException;
 import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 import javax.crypto.spec.IvParameterSpec;
 
 class ConnectionEncrypterImpl extends FilterOutputStream
 implements ConnectionEncrypter {
 
 	private final Cipher frameCipher;
-	private final SecretKey frameKey;
+	private final ErasableKey frameKey;
 	private final byte[] iv, encryptedIv;
 
 	private long capacity, frame = 0L;
 	private boolean ivWritten = false, betweenFrames = false;
 
 	ConnectionEncrypterImpl(OutputStream out, long capacity, byte[] iv,
-			Cipher ivCipher, Cipher frameCipher, SecretKey ivKey,
-			SecretKey frameKey) {
+			Cipher ivCipher, Cipher frameCipher, ErasableKey ivKey,
+			ErasableKey frameKey) {
 		super(out);
 		this.capacity = capacity;
 		this.iv = iv;
diff --git a/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java b/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java
index 588837758dfb3f87304aa75c11779b7c51a5e0fb..b48a564badfc33136bec625a8492eae10402b8e3 100644
--- a/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java
+++ b/components/net/sf/briar/transport/ConnectionReaderFactoryImpl.java
@@ -7,7 +7,7 @@ import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.protocol.TransportIndex;
@@ -29,7 +29,7 @@ class ConnectionReaderFactoryImpl implements ConnectionReaderFactory {
 			TransportIndex i, byte[] encryptedIv, byte[] secret) {
 		// Decrypt the IV
 		Cipher ivCipher = crypto.getIvCipher();
-		SecretKey ivKey = crypto.deriveIncomingIvKey(secret);
+		ErasableKey ivKey = crypto.deriveIncomingIvKey(secret);
 		byte[] iv;
 		try {
 			ivCipher.init(Cipher.DECRYPT_MODE, ivKey);
@@ -60,12 +60,12 @@ class ConnectionReaderFactoryImpl implements ConnectionReaderFactory {
 		byte[] iv = IvEncoder.encodeIv(initiator, i, connection);
 		// Create the decrypter
 		Cipher frameCipher = crypto.getFrameCipher();
-		SecretKey frameKey = crypto.deriveIncomingFrameKey(secret);
+		ErasableKey frameKey = crypto.deriveIncomingFrameKey(secret);
 		ConnectionDecrypter decrypter = new ConnectionDecrypterImpl(in, iv,
 				frameCipher, frameKey);
 		// Create the reader
 		Mac mac = crypto.getMac();
-		SecretKey macKey = crypto.deriveIncomingMacKey(secret);
+		ErasableKey macKey = crypto.deriveIncomingMacKey(secret);
 		return new ConnectionReaderImpl(decrypter, mac, macKey);
 	}
 }
diff --git a/components/net/sf/briar/transport/ConnectionReaderImpl.java b/components/net/sf/briar/transport/ConnectionReaderImpl.java
index a41559e8d3d9f50f69bc52b781552fc27f3002eb..c637458f14d8510bba7604d6f1d14aa148a1b3cd 100644
--- a/components/net/sf/briar/transport/ConnectionReaderImpl.java
+++ b/components/net/sf/briar/transport/ConnectionReaderImpl.java
@@ -11,7 +11,7 @@ import java.security.InvalidKeyException;
 import java.util.Arrays;
 
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import net.sf.briar.api.FormatException;
 import net.sf.briar.api.transport.ConnectionReader;
@@ -30,7 +30,7 @@ implements ConnectionReader {
 	private boolean betweenFrames = true;
 
 	ConnectionReaderImpl(ConnectionDecrypter decrypter, Mac mac,
-			SecretKey macKey) {
+			ErasableKey macKey) {
 		super(decrypter.getInputStream());
 		this.decrypter = decrypter;
 		this.mac = mac;
diff --git a/components/net/sf/briar/transport/ConnectionRecogniserImpl.java b/components/net/sf/briar/transport/ConnectionRecogniserImpl.java
index b82bbec12a7f4f5a1d161e8252db6ca00fa2089f..34bd3a2e1552f9d513193d0f8c0bd7f227d73a7c 100644
--- a/components/net/sf/briar/transport/ConnectionRecogniserImpl.java
+++ b/components/net/sf/briar/transport/ConnectionRecogniserImpl.java
@@ -14,7 +14,7 @@ import java.util.logging.Logger;
 import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import net.sf.briar.api.Bytes;
 import net.sf.briar.api.ContactId;
@@ -75,7 +75,7 @@ DatabaseListener {
 	}
 
 	private synchronized void calculateIvs(ContactId c) throws DbException {
-		SecretKey ivKey = crypto.deriveIncomingIvKey(db.getSharedSecret(c));
+		ErasableKey ivKey = crypto.deriveIncomingIvKey(db.getSharedSecret(c));
 		for(TransportId t : localTransportIds) {
 			TransportIndex i = db.getRemoteIndex(c, t);
 			if(i != null) {
@@ -86,7 +86,7 @@ DatabaseListener {
 	}
 
 	private synchronized void calculateIvs(ContactId c, TransportId t,
-			TransportIndex i, SecretKey ivKey, ConnectionWindow w)
+			TransportIndex i, ErasableKey ivKey, ConnectionWindow w)
 	throws DbException {
 		for(Long unseen : w.getUnseen()) {
 			Bytes iv = new Bytes(encryptIv(i, unseen, ivKey));
@@ -95,7 +95,7 @@ DatabaseListener {
 	}
 
 	private synchronized byte[] encryptIv(TransportIndex i, long connection,
-			SecretKey ivKey) {
+			ErasableKey ivKey) {
 		byte[] iv = IvEncoder.encodeIv(true, i, connection);
 		try {
 			ivCipher.init(Cipher.ENCRYPT_MODE, ivKey);
@@ -131,7 +131,7 @@ DatabaseListener {
 				TransportIndex i1 = ctx1.getTransportIndex();
 				if(c1.equals(c) && i1.equals(i)) it.remove();
 			}
-			SecretKey ivKey = crypto.deriveIncomingIvKey(db.getSharedSecret(c));
+			ErasableKey ivKey = crypto.deriveIncomingIvKey(db.getSharedSecret(c));
 			calculateIvs(c, ctx.getTransportId(), i, ivKey, w);
 		} catch(NoSuchContactException e) {
 			// The contact was removed - clean up when we get the event
@@ -182,7 +182,7 @@ DatabaseListener {
 		for(ContactId c : db.getContacts()) {
 			try {
 				byte[] secret = db.getSharedSecret(c);
-				SecretKey ivKey = crypto.deriveIncomingIvKey(secret);
+				ErasableKey ivKey = crypto.deriveIncomingIvKey(secret);
 				TransportIndex i = db.getRemoteIndex(c, t);
 				if(i != null) {
 					ConnectionWindow w = db.getConnectionWindow(c, i);
diff --git a/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java b/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
index cabf922762fd4d7c66e45aacd949f53465399d4e..822f6223b43b311ee6c00969b860350560777476 100644
--- a/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
+++ b/components/net/sf/briar/transport/ConnectionWriterFactoryImpl.java
@@ -7,7 +7,7 @@ import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.protocol.TransportIndex;
@@ -36,7 +36,7 @@ class ConnectionWriterFactoryImpl implements ConnectionWriterFactory {
 			byte[] secret) {
 		// Decrypt the IV
 		Cipher ivCipher = crypto.getIvCipher();
-		SecretKey ivKey = crypto.deriveIncomingIvKey(secret);
+		ErasableKey ivKey = crypto.deriveIncomingIvKey(secret);
 		byte[] iv;
 		try {
 			ivCipher.init(Cipher.DECRYPT_MODE, ivKey);
@@ -63,14 +63,14 @@ class ConnectionWriterFactoryImpl implements ConnectionWriterFactory {
 		// Create the encrypter
 		Cipher ivCipher = crypto.getIvCipher();
 		Cipher frameCipher = crypto.getFrameCipher();
-		SecretKey ivKey = crypto.deriveOutgoingIvKey(secret);
-		SecretKey frameKey = crypto.deriveOutgoingFrameKey(secret);
+		ErasableKey ivKey = crypto.deriveOutgoingIvKey(secret);
+		ErasableKey frameKey = crypto.deriveOutgoingFrameKey(secret);
 		byte[] iv = IvEncoder.encodeIv(initiator, i, connection);
 		ConnectionEncrypter encrypter = new ConnectionEncrypterImpl(out,
 				capacity, iv, ivCipher, frameCipher, ivKey, frameKey);
 		// Create the writer
 		Mac mac = crypto.getMac();
-		SecretKey macKey = crypto.deriveOutgoingMacKey(secret);
+		ErasableKey macKey = crypto.deriveOutgoingMacKey(secret);
 		return new ConnectionWriterImpl(encrypter, mac, macKey);
 	}
 }
diff --git a/components/net/sf/briar/transport/ConnectionWriterImpl.java b/components/net/sf/briar/transport/ConnectionWriterImpl.java
index 62dc17fcfa5d3c39b0cc81a9a7472e9d046af1d8..e66c373bc836608986039b0b5ff692ca515abd8a 100644
--- a/components/net/sf/briar/transport/ConnectionWriterImpl.java
+++ b/components/net/sf/briar/transport/ConnectionWriterImpl.java
@@ -10,7 +10,7 @@ import java.io.OutputStream;
 import java.security.InvalidKeyException;
 
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import net.sf.briar.api.transport.ConnectionWriter;
 import net.sf.briar.util.ByteUtils;
@@ -31,7 +31,7 @@ implements ConnectionWriter {
 	protected long frame = 0L;
 
 	ConnectionWriterImpl(ConnectionEncrypter encrypter, Mac mac,
-			SecretKey macKey) {
+			ErasableKey macKey) {
 		super(encrypter.getOutputStream());
 		this.encrypter = encrypter;
 		this.mac = mac;
diff --git a/components/net/sf/briar/transport/PaddedConnectionWriter.java b/components/net/sf/briar/transport/PaddedConnectionWriter.java
index d93a922c4fc183019c530c4a059b8f18aff82265..52e4430646df2c134fb4fa9870ffa0ebf7a3e8b7 100644
--- a/components/net/sf/briar/transport/PaddedConnectionWriter.java
+++ b/components/net/sf/briar/transport/PaddedConnectionWriter.java
@@ -5,7 +5,7 @@ import static net.sf.briar.util.ByteUtils.MAX_32_BIT_UNSIGNED;
 import java.io.IOException;
 
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import net.sf.briar.util.ByteUtils;
 
@@ -23,7 +23,7 @@ class PaddedConnectionWriter extends ConnectionWriterImpl {
 	private IOException exception = null;
 
 	PaddedConnectionWriter(ConnectionEncrypter encrypter, Mac mac,
-			SecretKey macKey) {
+			ErasableKey macKey) {
 		super(encrypter, mac, macKey);
 		padding = new byte[maxPayloadLength];
 	}
diff --git a/test/net/sf/briar/transport/ConnectionDecrypterImplTest.java b/test/net/sf/briar/transport/ConnectionDecrypterImplTest.java
index 369ad8c5e0c84daa4b93af3df3af0aceed66d0ac..6f609aeb27642be9b6a5aa51c0541e454c70b73e 100644
--- a/test/net/sf/briar/transport/ConnectionDecrypterImplTest.java
+++ b/test/net/sf/briar/transport/ConnectionDecrypterImplTest.java
@@ -6,7 +6,7 @@ import static org.junit.Assert.assertArrayEquals;
 import java.io.ByteArrayInputStream;
 
 import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 import javax.crypto.spec.IvParameterSpec;
 
 import junit.framework.TestCase;
@@ -26,7 +26,7 @@ public class ConnectionDecrypterImplTest extends TestCase {
 	private static final int MAC_LENGTH = 32;
 
 	private final Cipher ivCipher, frameCipher;
-	private final SecretKey ivKey, frameKey;
+	private final ErasableKey ivKey, frameKey;
 	private final TransportIndex transportIndex = new TransportIndex(13);
 	private final long connection = 12345L;
 
@@ -36,8 +36,8 @@ public class ConnectionDecrypterImplTest extends TestCase {
 		CryptoComponent crypto = i.getInstance(CryptoComponent.class);
 		ivCipher = crypto.getIvCipher();
 		frameCipher = crypto.getFrameCipher();
-		ivKey = crypto.generateSecretKey();
-		frameKey = crypto.generateSecretKey();
+		ivKey = crypto.generateTestKey();
+		frameKey = crypto.generateTestKey();
 	}
 
 	@Test
diff --git a/test/net/sf/briar/transport/ConnectionEncrypterImplTest.java b/test/net/sf/briar/transport/ConnectionEncrypterImplTest.java
index 9f191da7f2e67880f2bdb4002ed9de1ea04f2547..d6ad51a28c0549a436db6b264f164940b28b0087 100644
--- a/test/net/sf/briar/transport/ConnectionEncrypterImplTest.java
+++ b/test/net/sf/briar/transport/ConnectionEncrypterImplTest.java
@@ -6,7 +6,7 @@ import static org.junit.Assert.assertArrayEquals;
 import java.io.ByteArrayOutputStream;
 
 import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 import javax.crypto.spec.IvParameterSpec;
 
 import junit.framework.TestCase;
@@ -24,7 +24,7 @@ public class ConnectionEncrypterImplTest extends TestCase {
 	private static final int MAC_LENGTH = 32;
 
 	private final Cipher ivCipher, frameCipher;
-	private final SecretKey ivKey, frameKey;
+	private final ErasableKey ivKey, frameKey;
 	private final TransportIndex transportIndex = new TransportIndex(13);
 	private final long connection = 12345L;
 
@@ -34,8 +34,8 @@ public class ConnectionEncrypterImplTest extends TestCase {
 		CryptoComponent crypto = i.getInstance(CryptoComponent.class);
 		ivCipher = crypto.getIvCipher();
 		frameCipher = crypto.getFrameCipher();
-		ivKey = crypto.generateSecretKey();
-		frameKey = crypto.generateSecretKey();
+		ivKey = crypto.generateTestKey();
+		frameKey = crypto.generateTestKey();
 	}
 
 	@Test
diff --git a/test/net/sf/briar/transport/ConnectionRecogniserImplTest.java b/test/net/sf/briar/transport/ConnectionRecogniserImplTest.java
index e01d7e2518cebdbe41016a8bb4803cf31a4a076a..056e478c929aedf827aa51fa2a7adc1367900a77 100644
--- a/test/net/sf/briar/transport/ConnectionRecogniserImplTest.java
+++ b/test/net/sf/briar/transport/ConnectionRecogniserImplTest.java
@@ -6,7 +6,7 @@ import java.util.Collection;
 import java.util.Collections;
 
 import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import junit.framework.TestCase;
 import net.sf.briar.TestUtils;
@@ -79,7 +79,7 @@ public class ConnectionRecogniserImplTest extends TestCase {
 	@Test
 	public void testExpectedIv() throws Exception {
 		// Calculate the expected IV for connection number 3
-		SecretKey ivKey = crypto.deriveIncomingIvKey(secret);
+		ErasableKey ivKey = crypto.deriveIncomingIvKey(secret);
 		Cipher ivCipher = crypto.getIvCipher();
 		ivCipher.init(Cipher.ENCRYPT_MODE, ivKey);
 		byte[] iv = IvEncoder.encodeIv(true, remoteIndex, 3L);
diff --git a/test/net/sf/briar/transport/FrameReadWriteTest.java b/test/net/sf/briar/transport/FrameReadWriteTest.java
index 03d61462254b92cf84a359c2b6947c2b49d13849..aa002a2536b6e10f8e3714d69f78c45919887f9e 100644
--- a/test/net/sf/briar/transport/FrameReadWriteTest.java
+++ b/test/net/sf/briar/transport/FrameReadWriteTest.java
@@ -11,7 +11,7 @@ import java.util.Random;
 
 import javax.crypto.Cipher;
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import junit.framework.TestCase;
 import net.sf.briar.api.crypto.CryptoComponent;
@@ -29,7 +29,7 @@ public class FrameReadWriteTest extends TestCase {
 
 	private final CryptoComponent crypto;
 	private final Cipher ivCipher, frameCipher;
-	private final SecretKey ivKey, frameKey, macKey;
+	private final ErasableKey ivKey, frameKey, macKey;
 	private final Mac mac;
 	private final Random random;
 	private final byte[] secret = new byte[100];
diff --git a/test/net/sf/briar/transport/TransportTest.java b/test/net/sf/briar/transport/TransportTest.java
index 21e8ce23103849946f6a6869a6ab162b297236de..301ca4bd075a91062218d29a454eba526a9af545 100644
--- a/test/net/sf/briar/transport/TransportTest.java
+++ b/test/net/sf/briar/transport/TransportTest.java
@@ -3,7 +3,7 @@ package net.sf.briar.transport;
 import static net.sf.briar.api.transport.TransportConstants.MAX_FRAME_LENGTH;
 
 import javax.crypto.Mac;
-import javax.crypto.SecretKey;
+import net.sf.briar.api.crypto.ErasableKey;
 
 import junit.framework.TestCase;
 import net.sf.briar.api.crypto.CryptoComponent;
@@ -16,7 +16,7 @@ import com.google.inject.Injector;
 public abstract class TransportTest extends TestCase {
 
 	protected final Mac mac;
-	protected final SecretKey macKey;
+	protected final ErasableKey macKey;
 	protected final int headerLength = 4, macLength, maxPayloadLength;
 
 	public TransportTest() throws Exception {
@@ -24,7 +24,7 @@ public abstract class TransportTest extends TestCase {
 		Injector i = Guice.createInjector(new CryptoModule());
 		CryptoComponent crypto = i.getInstance(CryptoComponent.class);
 		mac = crypto.getMac();
-		macKey = crypto.generateSecretKey();
+		macKey = crypto.generateTestKey();
 		macLength = mac.getMacLength();
 		maxPayloadLength = MAX_FRAME_LENGTH - headerLength - macLength;
 	}