diff --git a/src/borg/crypto/key.py b/src/borg/crypto/key.py index 256a3c405..02cfed6e7 100644 --- a/src/borg/crypto/key.py +++ b/src/borg/crypto/key.py @@ -597,7 +597,9 @@ class KeyfileKeyBase(AESKeyBase): return False def decrypt_key_file(self, data, passphrase): - data = msgpack.unpackb(data) + unpacker = get_limited_unpacker('key') + unpacker.feed(data) + data = unpacker.unpack() enc_key = EncryptedKey(internal_dict=data) assert enc_key.version == 1 assert enc_key.algorithm == 'sha256' diff --git a/src/borg/helpers.py b/src/borg/helpers.py index 31e4e379a..0d8bff2a0 100644 --- a/src/borg/helpers.py +++ b/src/borg/helpers.py @@ -169,8 +169,16 @@ def get_limited_unpacker(kind): object_hook=StableDict, unicode_errors='surrogateescape', )) + elif kind == 'key': + args.update(dict(use_list=True, # default value + max_array_len=0, # not used + max_map_len=10, # EncryptedKey dict + max_str_len=4000, # inner key data + object_hook=StableDict, + unicode_errors='surrogateescape', + )) else: - raise ValueError('kind must be "server", "client" or "manifest"') + raise ValueError('kind must be "server", "client", "manifest" or "key"') return msgpack.Unpacker(**args)