diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java index b0b90cdbe..ef88c4a8d 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/CryptorImpl.java @@ -18,6 +18,7 @@ import java.security.SecureRandom; import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; +import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; @@ -81,14 +82,15 @@ class CryptorImpl implements Cryptor { @Override public void randomizeMasterkey() { - final byte[] randomBytes = new byte[KEYLENGTH_IN_BYTES]; try { - randomSource.nextBytes(randomBytes); - encryptionKey = new SecretKeySpec(randomBytes, ENCRYPTION_ALG); - randomSource.nextBytes(randomBytes); - macKey = new SecretKeySpec(randomBytes, MAC_ALG); - } finally { - Arrays.fill(randomBytes, (byte) 0x00); + KeyGenerator encKeyGen = KeyGenerator.getInstance(ENCRYPTION_ALG); + encKeyGen.init(KEYLENGTH_IN_BYTES * Byte.SIZE, randomSource); + encryptionKey = encKeyGen.generateKey(); + KeyGenerator macKeyGen = KeyGenerator.getInstance(MAC_ALG); + macKeyGen.init(KEYLENGTH_IN_BYTES * Byte.SIZE, randomSource); + macKey = macKeyGen.generateKey(); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("Hard-coded algorithm doesn't exist.", e); } } @@ -116,12 +118,12 @@ class CryptorImpl implements Cryptor { final SecretKey kek = new SecretKeySpec(kekBytes, ENCRYPTION_ALG); this.macKey = AesKeyWrap.unwrap(kek, keyFile.getMacMasterKey(), MAC_ALG); // future use (as soon as we need to prevent downgrade attacks): -// final Mac mac = new ThreadLocalMac(macKey, MAC_ALG).get(); -// final byte[] versionMac = mac.doFinal(ByteBuffer.allocate(Integer.BYTES).putInt(CURRENT_VAULT_VERSION).array()); -// if (!MessageDigest.isEqual(versionMac, keyFile.getVersionMac())) { -// destroyQuietly(macKey); -// throw new UnsupportedVaultFormatException(Integer.MAX_VALUE, CURRENT_VAULT_VERSION); -// } + // final Mac mac = new ThreadLocalMac(macKey, MAC_ALG).get(); + // final byte[] versionMac = mac.doFinal(ByteBuffer.allocate(Integer.BYTES).putInt(CURRENT_VAULT_VERSION).array()); + // if (!MessageDigest.isEqual(versionMac, keyFile.getVersionMac())) { + // destroyQuietly(macKey); + // throw new UnsupportedVaultFormatException(Integer.MAX_VALUE, CURRENT_VAULT_VERSION); + // } this.encryptionKey = AesKeyWrap.unwrap(kek, keyFile.getEncryptionMasterKey(), ENCRYPTION_ALG); } catch (InvalidKeyException e) { throw new InvalidPassphraseException(); diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileHeaderPayload.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileHeaderPayload.java index 229443e8c..2016dbfa1 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileHeaderPayload.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileHeaderPayload.java @@ -11,12 +11,14 @@ package org.cryptomator.crypto.engine.impl; import java.nio.ByteBuffer; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; +import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.ShortBufferException; import javax.crypto.spec.IvParameterSpec; @@ -36,13 +38,13 @@ class FileHeaderPayload implements Destroyable { private final SecretKey contentKey; public FileHeaderPayload(SecureRandom randomSource) { - filesize = 0; - final byte[] contentKey = new byte[CONTENT_KEY_LEN]; + this.filesize = 0; try { - randomSource.nextBytes(contentKey); - this.contentKey = new SecretKeySpec(contentKey, AES); - } finally { - Arrays.fill(contentKey, (byte) 0x00); + KeyGenerator keyGen = KeyGenerator.getInstance(AES); + keyGen.init(CONTENT_KEY_LEN * Byte.SIZE, randomSource); + this.contentKey = keyGen.generateKey(); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("Hard-coded algorithm doesn't exist.", e); } }