diff --git a/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/Aes256Cryptor.java b/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/Aes256Cryptor.java index 06f6a5541..66e8d11da 100644 --- a/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/Aes256Cryptor.java +++ b/main/crypto-aes/src/main/java/org/cryptomator/crypto/aes256/Aes256Cryptor.java @@ -19,7 +19,6 @@ import java.nio.file.DirectoryStream.Filter; import java.nio.file.Path; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; -import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; @@ -37,6 +36,7 @@ import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; @@ -291,12 +291,16 @@ public class Aes256Cryptor extends AbstractCryptor implements AesCryptographicCo return crc32.getValue(); } - private byte[] sha256(byte[] data) { + private byte[] hmacSha256(byte[] key, byte[] data) { try { - final MessageDigest md = MessageDigest.getInstance("SHA-256"); - return md.digest(data); + final SecretKeySpec secretKey = new SecretKeySpec(key, "HmacSHA256"); + final Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(secretKey); + return mac.doFinal(data); } catch (NoSuchAlgorithmException e) { - throw new AssertionError("Every implementation of the Java platform is required to support SHA-256.", e); + throw new AssertionError("Every implementation of the Java platform is required to support HmacSHA256.", e); + } catch (InvalidKeyException e) { + throw new IllegalArgumentException("Invalid key", e); } } @@ -332,7 +336,7 @@ public class Aes256Cryptor extends AbstractCryptor implements AesCryptographicCo * {@link FileNamingConventions#LONG_NAME_FILE_EXT}. */ private String encryptPathComponent(final String cleartext, final SecretKey key, CryptorIOSupport ioSupport) throws IllegalBlockSizeException, BadPaddingException, IOException { - final byte[] mac = sha256(ArrayUtils.addAll(secondaryKey, cleartext.getBytes())); + final byte[] mac = hmacSha256(secondaryKey, cleartext.getBytes()); final byte[] partialIv = ArrayUtils.subarray(mac, 0, 10); final ByteBuffer iv = ByteBuffer.allocate(AES_BLOCK_LENGTH); iv.put(partialIv);