@@ -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