Exemplo n.º 1
0
def _decryptio_version1(total_head: bytes, io: IO,
                        encrypt_password: bytes) -> Optional[DecryptIO]:
    encrypt_password = padding_key(encrypt_password, 32)

    if len(total_head) < ENCRYPT_HEAD_LEN:
        return

    # Version 1
    b_mc, magic_code, nonce_or_iv, total_origin_len = parse_head(total_head)
    b_mc = aes256cbc_decrypt(b_mc, encrypt_password,
                             random_bytes(16, encrypt_password))
    total_origin_len = u8x8_to_u64(total_origin_len)

    if b_mc != BAIDUPCS_PY_CRYPTO_MAGIC_CODE:
        return

    if magic_code == SimpleEncryptIO.MAGIC_CODE:
        return SimpleDecryptIO(io, encrypt_password, b"", total_origin_len)
    elif magic_code == ChaCha20EncryptIO.MAGIC_CODE:
        return ChaCha20DecryptIO(io, encrypt_password, nonce_or_iv,
                                 total_origin_len)
    elif magic_code == AES256CBCEncryptIO.MAGIC_CODE:
        return AES256CBCDecryptIO(io, encrypt_password, nonce_or_iv,
                                  total_origin_len)
    else:
        logging.warning(f"Unknown magic_code: {magic_code}")
        return
Exemplo n.º 2
0
def to_decryptio(io: IO, encrypt_key: Any):
    if not encrypt_key:
        return io

    encrypt_key = padding_key(encrypt_key, 32)

    head = io.read(ENCRYPT_HEAD_LEN)
    if len(head) != ENCRYPT_HEAD_LEN:
        io.seek(0, 0)
        return io

    b_mc, magic_code, nonce_or_iv, total_origin_len = parse_head(head)
    b_mc = aes256cbc_decrypt(b_mc, encrypt_key, random_bytes(16, encrypt_key))
    total_origin_len = u8x8_to_u64(total_origin_len)

    if b_mc != BAIDUPCS_PY_CRYPTO_MAGIC_CODE:
        io.seek(0, 0)
        return io

    if magic_code == SimpleEncryptIO.MAGIC_CODE:
        return SimpleDecryptIO(io, encrypt_key, total_origin_len)
    elif magic_code == ChaCha20EncryptIO.MAGIC_CODE:
        return ChaCha20DecryptIO(io, encrypt_key, nonce_or_iv,
                                 total_origin_len)
    elif magic_code == AES256CBCEncryptIO.MAGIC_CODE:
        return AES256CBCDecryptIO(io, encrypt_key, nonce_or_iv,
                                  total_origin_len)
    else:
        logging.warning(f"Unknown magic_code: {magic_code}")
        io.seek(0, 0)
        return io
Exemplo n.º 3
0
def _decryptio_version3(total_head: bytes, io: IO,
                        encrypt_password: bytes) -> Optional[DecryptIO]:
    if len(total_head) < PADDED_ENCRYPT_HEAD_WITH_SALT_LEN:
        return

    enc_head, salt_for_head = (
        total_head[:PADDED_ENCRYPT_HEAD_LEN],
        total_head[PADDED_ENCRYPT_HEAD_LEN:],
    )

    encrypt_key_for_head, iv_for_head = generate_key_iv(
        encrypt_password, salt_for_head, 32, 16)

    head = aes256cbc_decrypt(enc_head, encrypt_key_for_head, iv_for_head)

    b_mc, magic_code, padding_salt, total_origin_len = parse_head(head)
    total_origin_len = u8x8_to_u64(total_origin_len)

    salt = padding_salt[:8]
    encrypt_key, nonce_or_iv = generate_key_iv(encrypt_password, salt, 32, 16)

    if b_mc != BAIDUPCS_PY_CRYPTO_MAGIC_CODE:
        return

    eio = None
    if magic_code == SimpleEncryptIO.MAGIC_CODE:
        eio = SimpleDecryptIO(io, encrypt_key, nonce_or_iv, total_origin_len)
    elif magic_code == ChaCha20EncryptIO.MAGIC_CODE:
        eio = ChaCha20DecryptIO(io, encrypt_key, nonce_or_iv, total_origin_len)
    elif magic_code == AES256CBCEncryptIO.MAGIC_CODE:
        eio = AES256CBCDecryptIO(io, encrypt_key, nonce_or_iv,
                                 total_origin_len)
    else:
        logging.warning(f"Unknown magic_code: {magic_code}")
        return

    eio._total_head_len = PADDED_ENCRYPT_HEAD_WITH_SALT_LEN
    return eio