cryptomator / sanitizer

Utility to find and fix problems within vaults
https://cryptomator.org/
GNU General Public License v3.0
33 stars 9 forks source link

Sanitizer v0.6 (Java 12 / Windows) : decryptVault : Exception on loadHeaderIfNecessary(DecryptingReadableByteChannel.java:75) #7

Closed nondedjeu closed 5 years ago

nondedjeu commented 5 years ago

Hi, While using sanitizer's decryptVault command, many files are successfully getting decrypted but sometimes the process crashes with a similar exception stack as below. A workaround consists of manually deleting the source file on which the process crashed, and restart the whole decryptVault process (which takes hours on my large vault) until the process crashes on another file, etc... Is there a way to anticipate on which files the process will crash, in order to delete these files upfront ? Or a way to tell sanitizer to only log these exceptions in a log file but keep processing the next files ?

Failed to authenticate name of RC/7QMWWF7QIVTSS7ZRPAIJBTISLLFRDX/SVMBI5ATOICAXXY2TAQU6NTXMTS642UF.lng
RC/7QMWWF7QIVTSS7ZRPAIJBTISLLFRDX/SVMBI5ATOICAXXY2TAQU6NTXMTS642UF.lng -> /media/ext/flv2/root/unknown-file-2.LNG
Failed to authenticate name of RC/7QMWWF7QIVTSS7ZRPAIJBTISLLFRDX/TSC5272ZPIKOFAHXPH3QRVH7JOQOLZ5P.lng
RC/7QMWWF7QIVTSS7ZRPAIJBTISLLFRDX/TSC5272ZPIKOFAHXPH3QRVH7JOQOLZ5P.lng -> /media/ext/flv2/root/unknown-file-3.LNG
Exception in thread "main" java.lang.IllegalArgumentException: Unable to read header from channel.
    at org.cryptomator.cryptolib.v1.DecryptingReadableByteChannel.loadHeaderIfNecessary(DecryptingReadableByteChannel.java:75)
    at org.cryptomator.cryptolib.v1.DecryptingReadableByteChannel.read(DecryptingReadableByteChannel.java:48)
    at org.cryptomator.sanitizer.restorer.ScannedVault$EncryptedFile.tryDecryptTo(ScannedVault.java:310)
    at org.cryptomator.sanitizer.restorer.ScannedVault$Entry.decryptTo(ScannedVault.java:355)
    at org.cryptomator.sanitizer.restorer.ScannedVault$EncryptedDirectory.lambda$decryptContentsTo$1(ScannedVault.java:231)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.cryptomator.sanitizer.restorer.ScannedVault$EncryptedDirectory.decryptContentsTo(ScannedVault.java:231)
    at org.cryptomator.sanitizer.restorer.ScannedVault$EncryptedDirectory.tryDecryptTo(ScannedVault.java:214)
    at org.cryptomator.sanitizer.restorer.ScannedVault$Entry.decryptTo(ScannedVault.java:355)
    at org.cryptomator.sanitizer.restorer.ScannedVault.lambda$decryptTo$0(ScannedVault.java:194)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1675)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.cryptomator.sanitizer.restorer.ScannedVault.decryptTo(ScannedVault.java:194)
    at org.cryptomator.sanitizer.restorer.VaultDecryptor.run(VaultDecryptor.java:41)
    at org.cryptomator.sanitizer.commands.DecryptVaultRunner.run(DecryptVaultRunner.java:21)
    at org.cryptomator.sanitizer.commands.DecryptVaultCommand.run(DecryptVaultCommand.java:91)
    at org.cryptomator.sanitizer.commands.Commands.run(Commands.java:75)
    at org.cryptomator.sanitizer.Sanitizer.main(Sanitizer.java:16)
    at java.base/java.util.Optional.ifPresent(Optional.java:183)
    at org.cryptomator.sanitizer.Sanitizer.main(Sanitizer.java:12)
nondedjeu commented 5 years ago

To answer myself, just had to delete all .lng files that were ≤ 66 bytes and decryptVault then completed successfully. (not sure about the "66" value, you should double-check that before proceeding)

overheadhunter commented 5 years ago

A well-formatted 0-byte file has 88 ciphertext bytes, a 1-byte file at least 137 bytes (Source).

So the real magic number here should be < 88