11# test_codex32.py
2- import logging
2+ """Tests for BIP-93 Codex32 implementation."""
33import pytest
44
55from data .bip93_vectors import (
2828 InvalidThreshold ,
2929 InvalidCase ,
3030)
31- # If the correct name is not Codex32, update it to match the actual exported symbol from src/codex32.py
32- # For example, if the class is named Codex32String, ensure it is defined and exported in src/codex32.py
33-
34-
35- def hexlify (data ):
36- return bytes (data ).hex ()
3731
3832def test_parts ():
33+ """Test Vector 1: parse a codex32 string into parts"""
3934 c32 = Codex32String .from_string (VECTOR_1 ["secret_s" ])
4035 parts = c32 .parts ()
4136 assert parts .hrp == VECTOR_1 ["hrp" ]
4237 assert parts .k == VECTOR_1 ["k" ]
4338 assert parts .share_index == VECTOR_1 ["share_index" ]
44- assert parts .id == VECTOR_1 ["id " ]
39+ assert parts .ident == VECTOR_1 ["identifier " ]
4540 assert parts .payload == VECTOR_1 ["payload" ]
4641 assert parts .checksum == VECTOR_1 ["checksum" ]
4742 assert parts .data ().hex () == VECTOR_1 ["secret_hex" ]
4843
4944def test_derive_and_recover ():
45+ """Test Vector 2: derive new share and recover the secret"""
5046 a = Codex32String .from_string (VECTOR_2 ["share_A" ])
5147 c = Codex32String .from_string (VECTOR_2 ["share_C" ])
5248 # interpolation target is 'D' (uppercase as inputs are uppercase)
@@ -57,11 +53,12 @@ def test_derive_and_recover():
5753 assert s .parts ().data ().hex () == VECTOR_2 ["secret_hex" ]
5854
5955def test_from_seed_and_interpolate_3_of_5 ():
56+ """Test Vector 3: encode secret share from seed and split 3-of-5"""
6057 seed = bytes .fromhex (VECTOR_3 ["secret_hex" ])
6158 a = Codex32String .from_string (VECTOR_3 ["share_a" ])
6259 c = Codex32String .from_string (VECTOR_3 ["share_c" ])
6360 parts = a .parts ()
64- s = Codex32String .from_seed (seed , parts .hrp , parts .k , parts .id , pad_val = 0 )
61+ s = Codex32String .from_seed (seed , parts .ident , parts .hrp , parts .k , pad_val = 0 )
6562 assert str (s ) == VECTOR_3 ["secret_s" ]
6663 d = Codex32String .interpolate_at ([s , a , c ], 'd' )
6764 e = Codex32String .interpolate_at ([s , a , c ], 'e' )
@@ -70,22 +67,25 @@ def test_from_seed_and_interpolate_3_of_5():
7067 assert str (e ) == VECTOR_3 ["derived_e" ]
7168 assert str (f ) == VECTOR_3 ["derived_f" ]
7269 for pad_val in range (4 ):
73- s = Codex32String .from_seed (seed , parts .hrp , parts .k , parts .id , pad_val = pad_val )
70+ s = Codex32String .from_seed (seed , parts .ident , parts .hrp , parts .k , pad_val = pad_val )
7471 assert str (s ) == VECTOR_3 ["secret_s_alternates" ][pad_val ]
7572
7673def test_from_seed_and_alternates ():
74+ """Test Vector 4: encode secret share from seed"""
7775 seed = bytes .fromhex (VECTOR_4 ["secret_hex" ])
78- for pad_val in range (0b1111 ):
79- s = Codex32String .from_seed (seed , hrp = 'ms' , k = 0 , id = 'leet' , share_idx = 's' , pad_val = pad_val )
80- assert str (s ) == VECTOR_4 ["secret_s_alternates" ][pad_val ]
76+ for pad_v in range (0b1111 ):
77+ s = Codex32String .from_seed (seed , hrp = 'ms' , k = 0 , ident = 'leet' , share_idx = 's' , pad_val = pad_v )
78+ assert str (s ) == VECTOR_4 ["secret_s_alternates" ][pad_v ]
8179 assert s .parts ().data () == list (seed ) or s .parts ().data () == seed
8280 # confirm all 16 encodings decode to same master data
8381
8482def test_long_string ():
83+ """Test Vector 5: decode long codex32 secret and confirm secret bytes."""
8584 long_str = VECTOR_5 ["secret_s" ]
8685 long_seed = Codex32String .from_string (long_str )
8786 assert long_seed .parts ().data ().hex () == VECTOR_5 ["secret_hex" ]
8887
88+ # pylint: disable=missing-function-docstring
8989def test_invalid_bad_checksums ():
9090 for chk in BAD_CHECKSUMS :
9191 with pytest .raises (InvalidChecksum ):
0 commit comments