From 3043aa29c257fab4d2fc00dccb385f69dc2093d8 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 1 Jan 2016 13:49:20 +0100 Subject: [PATCH] added enc/dec benchmark test --- .../engine/impl/FileContentCryptorTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorTest.java b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorTest.java index e6782faa8..c59ce7b4e 100644 --- a/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorTest.java +++ b/main/filesystem-crypto/src/test/java/org/cryptomator/crypto/engine/impl/FileContentCryptorTest.java @@ -8,7 +8,12 @@ *******************************************************************************/ package org.cryptomator.crypto.engine.impl; +import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; import java.security.SecureRandom; import java.util.Arrays; import java.util.Optional; @@ -22,9 +27,13 @@ import org.cryptomator.crypto.engine.FileContentEncryptor; import org.cryptomator.io.ByteBuffers; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class FileContentCryptorTest { + private static final Logger LOG = LoggerFactory.getLogger(FileContentCryptorTest.class); + private static final SecureRandom RANDOM_MOCK = new SecureRandom() { private static final long serialVersionUID = 1505563778398085504L; @@ -94,4 +103,58 @@ public class FileContentCryptorTest { plaintext.get(result); Assert.assertArrayEquals("cleartext message".getBytes(), result); } + + @Test + public void testEncryptionAndDecryptionSpeed() throws InterruptedException, IOException { + final byte[] keyBytes = new byte[32]; + final SecretKey encryptionKey = new SecretKeySpec(keyBytes, "AES"); + final SecretKey macKey = new SecretKeySpec(keyBytes, "HmacSHA256"); + final FileContentCryptor cryptor = new FileContentCryptorImpl(encryptionKey, macKey, RANDOM_MOCK); + final Path tmpFile = Files.createTempFile("encrypted", ".tmp"); + + final ByteBuffer header; + final long encStart = System.nanoTime(); + try (FileContentEncryptor encryptor = cryptor.createFileContentEncryptor(Optional.empty()); FileChannel fc = FileChannel.open(tmpFile, StandardOpenOption.WRITE)) { + final ByteBuffer cleartext = ByteBuffer.allocate(32768); // 32k + ByteBuffer ciphertext; + for (int i = 0; i < 4096; i++) { // 128M total + cleartext.rewind(); + encryptor.append(cleartext); + if (i > Runtime.getRuntime().availableProcessors()) { + ciphertext = encryptor.ciphertext(); + Assert.assertEquals(32 * 1024 + 32, ciphertext.remaining()); + fc.write(ciphertext); + } + } + encryptor.append(FileContentCryptor.EOF); + while ((ciphertext = encryptor.ciphertext()) != FileContentCryptor.EOF) { + fc.write(ciphertext); + } + header = encryptor.getHeader(); + } + final long encEnd = System.nanoTime(); + LOG.debug("Encryption of 128M took {}ms", (encEnd - encStart) / 1000 / 1000); + + final long decStart = System.nanoTime(); + try (FileContentDecryptor decryptor = cryptor.createFileContentDecryptor(header); FileChannel fc = FileChannel.open(tmpFile, StandardOpenOption.READ)) { + final ByteBuffer ciphertext = ByteBuffer.allocate(654321); + ByteBuffer cleartext; + for (int i = 0; fc.read(ciphertext) != -1; i++) { + ciphertext.flip(); + decryptor.append(ciphertext); + ciphertext.clear(); + if (i > Runtime.getRuntime().availableProcessors()) { + cleartext = decryptor.cleartext(); + Assert.assertTrue(cleartext.hasRemaining()); + } + } + decryptor.append(FileContentCryptor.EOF); + while (decryptor.cleartext() != FileContentCryptor.EOF) { + // no-op + } + } + final long decEnd = System.nanoTime(); + LOG.debug("Decryption of 128M took {}ms", (decEnd - decStart) / 1000 / 1000); + Files.delete(tmpFile); + } }