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 0f05b5a7d..76f3c2c44 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 @@ -26,6 +26,7 @@ import java.security.spec.KeySpec; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Random; import java.util.UUID; import java.util.zip.CRC32; @@ -102,11 +103,24 @@ public class Aes256Cryptor extends AbstractCryptor implements AesCryptographicCo } } + /** + * Creates a new Cryptor with a newly initialized PRNG. + */ public Aes256Cryptor() { SECURE_PRNG.setSeed(SECURE_PRNG.generateSeed(PRNG_SEED_LENGTH)); SECURE_PRNG.nextBytes(this.masterKey); } + /** + * Creates a new Cryptor with the given PRNG.
+ * DO NOT USE IN PRODUCTION. This constructor must only be used in in unit tests. Do not change method visibility. + * + * @param prng Fast, possibly insecure PRNG. + */ + Aes256Cryptor(Random prng) { + prng.nextBytes(this.masterKey); + } + /** * Encrypts the current masterKey with the given password and writes the result to the given output stream. */ diff --git a/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java b/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java index e6b01bf2b..750ab9a71 100644 --- a/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java +++ b/main/crypto-aes/src/test/java/org/cryptomator/crypto/aes256/Aes256CryptorTest.java @@ -19,6 +19,7 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.HashMap; import java.util.Map; +import java.util.Random; import org.apache.commons.io.FileUtils; import org.cryptomator.crypto.CryptorIOSupport; @@ -32,6 +33,8 @@ import org.junit.Test; public class Aes256CryptorTest { + private static final Random TEST_PRNG = new Random(); + private Path tmpDir; private Path masterKey; @@ -57,12 +60,12 @@ public class Aes256CryptorTest { @Test public void testCorrectPassword() throws IOException, WrongPasswordException, DecryptFailedException, UnsupportedKeyLengthException { final String pw = "asd"; - final Aes256Cryptor cryptor = new Aes256Cryptor(); + final Aes256Cryptor cryptor = new Aes256Cryptor(TEST_PRNG); final OutputStream out = Files.newOutputStream(masterKey, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); cryptor.encryptMasterKey(out, pw); cryptor.swipeSensitiveData(); - final Aes256Cryptor decryptor = new Aes256Cryptor(); + final Aes256Cryptor decryptor = new Aes256Cryptor(TEST_PRNG); final InputStream in = Files.newInputStream(masterKey, StandardOpenOption.READ); decryptor.decryptMasterKey(in, pw); } @@ -70,13 +73,13 @@ public class Aes256CryptorTest { @Test(expected = WrongPasswordException.class) public void testWrongPassword() throws IOException, DecryptFailedException, WrongPasswordException, UnsupportedKeyLengthException { final String pw = "asd"; - final Aes256Cryptor cryptor = new Aes256Cryptor(); + final Aes256Cryptor cryptor = new Aes256Cryptor(TEST_PRNG); final OutputStream out = Files.newOutputStream(masterKey, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); cryptor.encryptMasterKey(out, pw); cryptor.swipeSensitiveData(); final String wrongPw = "foo"; - final Aes256Cryptor decryptor = new Aes256Cryptor(); + final Aes256Cryptor decryptor = new Aes256Cryptor(TEST_PRNG); final InputStream in = Files.newInputStream(masterKey, StandardOpenOption.READ); decryptor.decryptMasterKey(in, wrongPw); } @@ -84,13 +87,13 @@ public class Aes256CryptorTest { @Test(expected = NoSuchFileException.class) public void testWrongLocation() throws IOException, DecryptFailedException, WrongPasswordException, UnsupportedKeyLengthException { final String pw = "asd"; - final Aes256Cryptor cryptor = new Aes256Cryptor(); + final Aes256Cryptor cryptor = new Aes256Cryptor(TEST_PRNG); final OutputStream out = Files.newOutputStream(masterKey, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); cryptor.encryptMasterKey(out, pw); cryptor.swipeSensitiveData(); final Path wrongMasterKey = tmpDir.resolve("notExistingMasterKey.json"); - final Aes256Cryptor decryptor = new Aes256Cryptor(); + final Aes256Cryptor decryptor = new Aes256Cryptor(TEST_PRNG); final InputStream in = Files.newInputStream(wrongMasterKey, StandardOpenOption.READ); decryptor.decryptMasterKey(in, pw); } @@ -98,7 +101,7 @@ public class Aes256CryptorTest { @Test(expected = FileAlreadyExistsException.class) public void testReInitialization() throws IOException { final String pw = "asd"; - final Aes256Cryptor cryptor = new Aes256Cryptor(); + final Aes256Cryptor cryptor = new Aes256Cryptor(TEST_PRNG); final OutputStream out = Files.newOutputStream(masterKey, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); cryptor.encryptMasterKey(out, pw); cryptor.swipeSensitiveData(); @@ -111,7 +114,7 @@ public class Aes256CryptorTest { @Test public void testEncryptionOfFilenames() throws IOException { final CryptorIOSupport ioSupportMock = new CryptoIOSupportMock(); - final Aes256Cryptor cryptor = new Aes256Cryptor(); + final Aes256Cryptor cryptor = new Aes256Cryptor(TEST_PRNG); // short path components final String originalPath1 = "foo/bar/baz"; diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/command/AsyncLineWriter.java b/main/ui/src/main/java/org/cryptomator/ui/util/command/AsyncLineWriter.java deleted file mode 100644 index 64a202ffb..000000000 --- a/main/ui/src/main/java/org/cryptomator/ui/util/command/AsyncLineWriter.java +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 Markus Kreusch - * This file is licensed under the terms of the MIT license. - * See the LICENSE.txt file for more info. - * - * Contributors: - * Markus Kreusch - ******************************************************************************/ -package org.cryptomator.ui.util.command; - -import java.io.IOException; -import java.io.OutputStream; - -final class AsyncLineWriter extends Thread { - - private final String[] lines; - private final OutputStream output; - - private IOException exception; - - public AsyncLineWriter(String[] lines, OutputStream output) { - this.lines = lines; - this.output = output; - start(); - } - - @Override - public void run() { - try (OutputStream outputToBeClosed = output) { - for (String line : lines) { - output.write(line.getBytes()); - output.write("\n".getBytes()); - output.flush(); - } - } catch (IOException e) { - exception = e; - } - } - - public void assertOk() throws IOException { - try { - join(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - if (exception != null) { - throw exception; - } - } - -}