From c03bdd84256c7dc09efa8ca312160a2bfa4e5fb0 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 22 Feb 2016 23:06:02 +0100 Subject: [PATCH] - decrypt whole file, don't stop if enough data has been read from underlying fs - write "length = 0" into file header until everything is encrypted (tested on windows, everything is fine here) --- .../crypto/engine/impl/FileContentDecryptorImpl.java | 8 +------- .../cryptomator/filesystem/crypto/CryptoWritableFile.java | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileContentDecryptorImpl.java b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileContentDecryptorImpl.java index a8d0abdd5..303d30a88 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileContentDecryptorImpl.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/crypto/engine/impl/FileContentDecryptorImpl.java @@ -32,7 +32,6 @@ import javax.crypto.SecretKey; import javax.crypto.ShortBufferException; import javax.crypto.spec.IvParameterSpec; -import org.apache.commons.codec.binary.Hex; import org.cryptomator.crypto.engine.AuthenticationFailedException; import org.cryptomator.crypto.engine.FileContentCryptor; import org.cryptomator.crypto.engine.FileContentDecryptor; @@ -49,7 +48,6 @@ class FileContentDecryptorImpl implements FileContentDecryptor { private final Supplier hmacSha256; private final FileHeader header; private final boolean authenticate; - private final LongAdder ciphertextBytesScheduledForDecryption = new LongAdder(); private final LongAdder cleartextBytesDecrypted = new LongAdder(); private ByteBuffer ciphertextBuffer = ByteBuffer.allocate(CHUNK_SIZE); private long chunkNumber = 0; @@ -68,14 +66,10 @@ class FileContentDecryptorImpl implements FileContentDecryptor { @Override public void append(ByteBuffer ciphertext) throws InterruptedException { - long numChunksNeeded = (contentLength() - 1) / PAYLOAD_SIZE + 1; - long numCiphertextBytesNeeded = numChunksNeeded * CHUNK_SIZE; - - if (ciphertext == FileContentCryptor.EOF || ciphertextBytesScheduledForDecryption.sum() >= numCiphertextBytesNeeded) { + if (ciphertext == FileContentCryptor.EOF) { submitCiphertextBuffer(); submitEof(); } else { - ciphertextBytesScheduledForDecryption.add(ciphertext.remaining()); while (ciphertext.hasRemaining()) { ByteBuffers.copy(ciphertext, ciphertextBuffer); submitCiphertextBufferIfFull(); diff --git a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java index 4cbcd3263..0abf67ff6 100644 --- a/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java +++ b/main/filesystem-crypto/src/main/java/org/cryptomator/filesystem/crypto/CryptoWritableFile.java @@ -40,7 +40,7 @@ class CryptoWritableFile implements WritableFile { private void initialize(long firstCleartextByte) { encryptor = cryptor.createFileContentEncryptor(Optional.empty(), firstCleartextByte); - file.position(cryptor.getHeaderSize()); // skip header size, header is written on close + writeHeader(); // write header with "zero content length" to avoid read access while still writing writeTask = executorService.submit(new CiphertextWriter(file, encryptor)); }