snowskeleton / snowcrypt

Decrypt aax and aaxc files
Apache License 2.0
9 stars 1 forks source link

Errors with large AAXC #5

Open fortiko opened 1 year ago

fortiko commented 1 year ago

I have trouble converting several files that are >2GB:

Traceback (most recent call last):
  File "/opt/homebrew/bin/snowcrypt", line 8, in <module>
    sys.exit(main())
  File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/main.py", line 43, in main
    decrypt_aaxc(
  File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 205, in decrypt_aaxc
    _decrypt(src, dest, key, iv)
  File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 189, in _decrypt
    _atomizer(inStream, outStream, path.getsize(inStream.name), key, iv)
  File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 176, in _atomizer
    func(
  File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 93, in _just_copy_it
    outStream.write(inStream.read(length))
ValueError: read length must be non-negative or -1

For a bit of debugging, I added these 2 statements:

def _just_copy_it(inStream, outStream, length, t, **_):
    print("LENGTH1: ", length)
    length -= t.write(outStream)
    print("LENGTH2: ", length)
    outStream.write(inStream.read(length))

These are the details for 3 example files:


Result for file 1 (3.140.467.300 bytes, resulting broken m4a size: 2.918.641.456 bytes)

LENGTH1: 108 LENGTH2: 100 LENGTH1: 92 LENGTH2: 84 LENGTH1: 36 LENGTH2: 28 LENGTH1: 20 LENGTH2: 12 LENGTH1: 44 LENGTH2: 36 LENGTH1: 58 LENGTH2: 50 LENGTH1: 16 LENGTH2: 8 LENGTH1: 36 LENGTH2: 28 LENGTH1: 24 LENGTH2: 16 LENGTH1: 15304 LENGTH2: 15296 LENGTH1: 33589244 LENGTH2: 33589236 LENGTH1: 1528052 LENGTH2: 1528044 LENGTH1: 92 LENGTH2: 84 LENGTH1: 36 LENGTH2: 28 LENGTH1: 32 LENGTH2: 24 LENGTH1: 57 LENGTH2: 49 LENGTH1: 76 LENGTH2: 68 LENGTH1: 36 LENGTH2: 28 LENGTH1: 59 LENGTH2: 51 LENGTH1: 720 LENGTH2: 712 LENGTH1: 28 LENGTH2: 20 LENGTH1: 372 LENGTH2: 364 LENGTH1: 368 LENGTH2: 360 LENGTH1: 33 LENGTH2: 25 LENGTH1: 6256 LENGTH2: 6248 LENGTH1: 33 LENGTH2: 25 LENGTH1: 54199 LENGTH2: 54191 LENGTH1: 1372268555 LENGTH2: 1372268547 LENGTH1: 1511176915 LENGTH2: 1511176907 LENGTH1: -1937235809 LENGTH2: -1937235817 Traceback (most recent call last): File "/opt/homebrew/bin/snowcrypt", line 8, in sys.exit(main()) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/main.py", line 43, in main decrypt_aaxc( File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 205, in decrypt_aaxc _decrypt(src, dest, key, iv) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 189, in _decrypt _atomizer(inStream, outStream, path.getsize(inStream.name), key, iv) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 176, in _atomizer func( File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 93, in _just_copy_it outStream.write(inStream.read(length)) ValueError: read length must be non-negative or -1


Result for file 2 (3.009.120.131 bytes, resulting broken m4a size: 1.031.548.124 bytes):

LENGTH1: 108 LENGTH2: 100 LENGTH1: 92 LENGTH2: 84 LENGTH1: 36 LENGTH2: 28 LENGTH1: 20 LENGTH2: 12 LENGTH1: 44 LENGTH2: 36 LENGTH1: 58 LENGTH2: 50 LENGTH1: 16 LENGTH2: 8 LENGTH1: 36 LENGTH2: 28 LENGTH1: 24 LENGTH2: 16 LENGTH1: 5296 LENGTH2: 5288 LENGTH1: 32184532 LENGTH2: 32184524 LENGTH1: 1463376 LENGTH2: 1463368 LENGTH1: 92 LENGTH2: 84 LENGTH1: 36 LENGTH2: 28 LENGTH1: 32 LENGTH2: 24 LENGTH1: 57 LENGTH2: 49 LENGTH1: 76 LENGTH2: 68 LENGTH1: 36 LENGTH2: 28 LENGTH1: 59 LENGTH2: 51 LENGTH1: 2184 LENGTH2: 2176 LENGTH1: 28 LENGTH2: 20 LENGTH1: 1104 LENGTH2: 1096 LENGTH1: 1100 LENGTH2: 1092 LENGTH1: 33 LENGTH2: 25 LENGTH1: 16896 LENGTH2: 16888 LENGTH1: 33 LENGTH2: 25 LENGTH1: 32884 LENGTH2: 32876 LENGTH1: 997839281 LENGTH2: 997839273 LENGTH1: -1698701940 LENGTH2: -1698701948 Traceback (most recent call last): File "/opt/homebrew/bin/snowcrypt", line 8, in sys.exit(main()) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/main.py", line 43, in main decrypt_aaxc( File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 205, in decrypt_aaxc _decrypt(src, dest, key, iv) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 189, in _decrypt _atomizer(inStream, outStream, path.getsize(inStream.name), key, iv) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 176, in _atomizer func( File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 93, in _just_copy_it outStream.write(inStream.read(length)) ValueError: read length must be non-negative or -1


Result for file 3 (3.928.237.809 bytes, resulting broken m4a size: 43.980.806 bytes): LENGTH1: 108 LENGTH2: 100 LENGTH1: 92 LENGTH2: 84 LENGTH1: 36 LENGTH2: 28 LENGTH1: 20 LENGTH2: 12 LENGTH1: 44 LENGTH2: 36 LENGTH1: 58 LENGTH2: 50 LENGTH1: 16 LENGTH2: 8 LENGTH1: 36 LENGTH2: 28 LENGTH1: 24 LENGTH2: 16 LENGTH1: 2848 LENGTH2: 2840 LENGTH1: 42015516 LENGTH2: 42015508 LENGTH1: 1910060 LENGTH2: 1910052 LENGTH1: 92 LENGTH2: 84 LENGTH1: 36 LENGTH2: 28 LENGTH1: 32 LENGTH2: 24 LENGTH1: 57 LENGTH2: 49 LENGTH1: 76 LENGTH2: 68 LENGTH1: 36 LENGTH2: 28 LENGTH1: 59 LENGTH2: 51 LENGTH1: 976 LENGTH2: 968 LENGTH1: 28 LENGTH2: 20 LENGTH1: 500 LENGTH2: 492 LENGTH1: 496 LENGTH2: 488 LENGTH1: 33 LENGTH2: 25 LENGTH1: 8192 LENGTH2: 8184 LENGTH1: 33 LENGTH2: 25 LENGTH1: 40747 LENGTH2: 40739 LENGTH1: -987100931 LENGTH2: -987100939 Traceback (most recent call last): File "/opt/homebrew/bin/snowcrypt", line 8, in sys.exit(main()) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/main.py", line 43, in main decrypt_aaxc( File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 205, in decrypt_aaxc _decrypt(src, dest, key, iv) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 189, in _decrypt _atomizer(inStream, outStream, path.getsize(inStream.name), key, iv) File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 176, in _atomizer func( File "/opt/homebrew/lib/python3.10/site-packages/snowcrypt/snowcrypt.py", line 93, in _just_copy_it outStream.write(inStream.read(length)) ValueError: read length must be non-negative or -1

fortiko commented 1 year ago

Until this can be fixed, I will be using (latest) ffmpeg to decrypt, via

ffmpeg -audible_key key_from_voucher_file -audible_iv iv_from_voucher_file -i input.aaxc -c copy output.m4b

snowskeleton commented 1 year ago

Howdy! This is a strange bug indeed. The only size limitation I'm aware of in the code is line 19 of src/snowcrypt/snowcrypt.py, but that's a 4GB limit, which you're inside of.

What books do you have that get so big? And what did you use to download them? The largest I have in my library is only 2GB at around 70hr long (and it decrypts just fine).

Does FFMPEG correctly decrypt these large files?

fortiko commented 1 year ago

They were downloaded just the same way as the other ones I was able to decrypt successfully with snowcrypt, via https://github.com/mkb79/audible-cli

The books are in the range you mention, 50-70 hours, (Sherlock Holmes Complete Collection for instance). ffmpeg had no problem. I did find some reports though on 44kHz AAXC giving trouble, and all of the ones that we are looking at are not only large (but <4GB), they are also 44kHz. ¯_(ツ)_/¯