Skip to content

Commit 2b74c8d

Browse files
kuliq23jgriffiths
authored andcommitted
bip32: add some of the new bip32 checks to bip32_key_unserialize
1 parent 455ec5b commit 2b74c8d

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

src/bip32.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,9 @@ int bip32_key_unserialize(const unsigned char *bytes, size_t bytes_len,
577577
key_out->version == BIP32_VER_TEST_PRIVATE)
578578
return wipe_key_fail(key_out); /* Public key data in private key */
579579

580+
if (wally_ec_public_key_verify(bytes, sizeof(key_out->pub_key)) != WALLY_OK)
581+
return wipe_key_fail(key_out); /* Invalid public key */
582+
580583
copy_in(key_out->pub_key, bytes, sizeof(key_out->pub_key));
581584
bip32_key_strip_private_key(key_out);
582585
}

src/test/test_bip32.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,68 @@ def test_bip32_vectors(self):
389389
self.do_test_vector(vec_1)
390390
self.do_test_vector(vec_3)
391391

392+
def test_vector_5_invalid_keys(self):
393+
"""BIP32 Test Vector 5: invalid extended keys must be rejected"""
394+
invalid_keys = [
395+
# pubkey version / prvkey mismatch
396+
'xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3'
397+
'zgtU6LBpB85b3D2yc8sfvZU521AAwdZafEz7mnzBBsz4wKY5fTtTQBm',
398+
# prvkey version / pubkey mismatch
399+
'xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63o'
400+
'StZzFGTQQD3dC4H2D5GBj7vWvSQaaBv5cxi9gafk7NF3pnBju6dwKvH',
401+
# invalid pubkey prefix 04
402+
'xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3'
403+
'zgtU6Txnt3siSujt9RCVYsx4qHZGc62TG4McvMGcAUjeuwZdduYEvFn',
404+
# invalid prvkey prefix 04
405+
'xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63o'
406+
'StZzFGpWnsj83BHtEy5Zt8CcDr1UiRXuWCmTQLxEK9vbz5gPstX92JQ',
407+
# invalid pubkey prefix 01
408+
'xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3'
409+
'zgtU6N8ZMMXctdiCjxTNq964yKkwrkBJJwpzZS4HS2fxvyYUA4q2Xe4',
410+
# invalid prvkey prefix 01
411+
'xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63o'
412+
'StZzFAzHGBP2UuGCqWLTAPLcMtD9y5gkZ6Eq3Rjuahrv17fEQ3Qen6J',
413+
# Note we don't currently fail keys where the fingerprint
414+
# and index are inconsistent, as some implementations do
415+
# not set them correctly (but nonetheless work for their
416+
# intended purpose(s)).
417+
# zero depth with non-zero parent fingerprint (xprv)
418+
#'xprv9s2SPatNQ9Vc6GTbVMFPFo7jsaZySyzk7L8n2uqKXJen3KUmvQNT'
419+
#'uLh3fhZMBoG3G4ZW1N2kZuHEPY53qmbZzCHshoQnNf4GvELZfqTUrcv',
420+
# zero depth with non-zero parent fingerprint (xpub)
421+
#'xpub661no6RGEX3uJkY4bNnPcw4URcQTrSibUZ4NqJEw5eBkv7ovTwgi'
422+
#'T91XX27VbEXGENhYRCf7hyEbWrR3FewATdCEebj6znwMfQkhRYHRLpJ',
423+
# zero depth with non-zero index (xprv)
424+
#'xprv9s21ZrQH4r4TsiLvyLXqM9P7k1K3EYhA1kkD6xuquB5i39AU8KF4'
425+
#'2acDyL3qsDbU9NmZn6MsGSUYZEsuoePmjzsB3eFKSUEh3Gu1N3cqVUN',
426+
# zero depth with non-zero index (xpub)
427+
#'xpub661MyMwAuDcm6CRQ5N4qiHKrJ39Xe1R1NyfouMKTTWcguwVcfrZJ'
428+
#'aNvhpebzGerh7gucBvzEQWRugZDuDXjNDRmXzSZe4c7mnTK97pTvGS8',
429+
# unknown extended key version (1)
430+
'DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8X'
431+
'nmdfHGMQzT7ayAmfo4z3gY5KfbrZWZ6St24UVf2Qgo6oujFktLHdHY4',
432+
# unknown extended key version (2)
433+
'DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8X'
434+
'nmdfHPmHJiEDXkTiJTVV9rHEBUem2mwVbbNfvT2MTcAqj3nesx8uBf9',
435+
# private key 0 not in 1..n-1
436+
'xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63o'
437+
'StZzF93Y5wvzdUayhgkkFoicQZcP3y52uPPxFnfoLZB21Teqt1VvEHx',
438+
# private key n not in 1..n-1
439+
'xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63o'
440+
'StZzFAzHGBP2UuGCqWLTAPLcMtD5SDKr24z3aiUvKr9bJpdrcLg1y3G',
441+
# invalid pubkey 020000000000000000000000000000000000000000000000000000000000000007
442+
'xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3'
443+
'zgtU6Q5JXayek4PRsn35jii4veMimro1xefsM58PgBMrvdYre8QyULY',
444+
# invalid checksum
445+
'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPP'
446+
'qjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHL',
447+
]
448+
449+
key_out = POINTER(ext_key)()
450+
for base58_key in invalid_keys:
451+
ret = bip32_key_from_base58_alloc(utf8(base58_key), byref(key_out))
452+
self.assertEqual(ret, WALLY_EINVAL)
453+
392454
def do_test_vector(self, vec):
393455

394456
# BIP32 Test vector 1

0 commit comments

Comments
 (0)