From 38246e3165d0170062ec6dccbc6d555f61052248 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 4 Jan 2022 15:26:06 +0000 Subject: [PATCH 1/2] Encode UAs/UVKs in ascending typecode order. Signed-off-by: Daira Hopwood --- unified_encoding.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/unified_encoding.py b/unified_encoding.py index 5c73e5b..e2cd24b 100644 --- a/unified_encoding.py +++ b/unified_encoding.py @@ -23,7 +23,7 @@ def encode_unified(rng, items, hrp): has_p2pkh = False has_p2sh = False - for item in items: + for item in sorted(items): if item[1]: if item[0] == P2PKH_ITEM: has_p2pkh = True @@ -32,10 +32,9 @@ def encode_unified(rng, items, hrp): assert (not (has_p2pkh and has_p2sh)) encoded_items.append(tlv(item[0], item[1])) - items_bytes = rng.sample(encoded_items, k=len(encoded_items)) - items_bytes.append(padding(hrp)) + encoded_items.append(padding(hrp)) - r_bytes = b"".join(items_bytes) + r_bytes = b"".join(encoded_items) converted = convertbits(f4jumble(r_bytes), 8, 5) return bech32_encode(hrp, converted, Encoding.BECH32M) @@ -51,6 +50,7 @@ def decode_unified(encoded, expected_hrp, expected_lengths): rest = decoded[:-16] result = {} + prev_type = -1 while len(rest) > 0: (item_type, rest) = parse_compact_size(rest) (item_len, rest) = parse_compact_size(rest) @@ -78,5 +78,8 @@ def decode_unified(encoded, expected_hrp, expected_lengths): assert not ('unknown' in result), "duplicate unknown item detected" result['unknown'] = (item_type, item) + assert item_type > prev_type, "items out of order: typecodes %r and %r" % (prev_type, item_type) + prev_type = item_type + return result From ca0fdf3b30c76f94b4f36bcbd8e430ae432d9148 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 4 Jan 2022 15:26:18 +0000 Subject: [PATCH 2/2] Cosmetics. Signed-off-by: Daira Hopwood --- unified_full_viewing_keys.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unified_full_viewing_keys.py b/unified_full_viewing_keys.py index baa81f9..962a524 100755 --- a/unified_full_viewing_keys.py +++ b/unified_full_viewing_keys.py @@ -87,8 +87,8 @@ def main(): ufvk = encode_unified(rng, receivers, "uview") expected_lengths = { - P2PKH_ITEM: 65, - SAPLING_ITEM: 128, + P2PKH_ITEM: 65, + SAPLING_ITEM: 128, ORCHARD_ITEM: 96, unknown_tc: unknown_len }