Add new invalid BIP 32 test vectors (#3634)

* Add new invalid BIP 32 test vectors

* Make sure priv key isn't zero

* Add comments
This commit is contained in:
benthecarman 2021-08-31 07:59:34 -05:00 committed by GitHub
parent 11dd28085a
commit f2a2874177
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 121 additions and 2 deletions

View file

@ -277,6 +277,120 @@ class ExtKeyTest extends BitcoinSUnitTest {
"xpub6BJA1jSqiukeaesWfxe6sNK9CCGaujFFSJLomWHprUL9DePQ4JDkM5d88n49sMGJxrhpjazuXYWdMf17C9T5XnxkopaeS7jGk1GyyVziaMt")
}
it must "pass test vector 5 in BIP32" in {
// pubkey version / prvkey mismatch
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6LBpB85b3D2yc8sfvZU521AAwdZafEz7mnzBBsz4wKY5fTtTQBm")
.key)
// prvkey version / pubkey mismatch
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFGTQQD3dC4H2D5GBj7vWvSQaaBv5cxi9gafk7NF3pnBju6dwKvH")
.key)
// invalid pubkey prefix 04
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6Txnt3siSujt9RCVYsx4qHZGc62TG4McvMGcAUjeuwZdduYEvFn")
.key)
// invalid prvkey prefix 04
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFGpWnsj83BHtEy5Zt8CcDr1UiRXuWCmTQLxEK9vbz5gPstX92JQ")
.key)
// invalid pubkey prefix 01
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6N8ZMMXctdiCjxTNq964yKkwrkBJJwpzZS4HS2fxvyYUA4q2Xe4")
.key)
// invalid prvkey prefix 01
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFAzHGBP2UuGCqWLTAPLcMtD9y5gkZ6Eq3Rjuahrv17fEQ3Qen6J")
.key)
// zero depth with non-zero parent fingerprint
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s2SPatNQ9Vc6GTbVMFPFo7jsaZySyzk7L8n2uqKXJen3KUmvQNTuLh3fhZMBoG3G4ZW1N2kZuHEPY53qmbZzCHshoQnNf4GvELZfqTUrcv")
.key)
// zero depth with non-zero parent fingerprint
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xpub661no6RGEX3uJkY4bNnPcw4URcQTrSibUZ4NqJEw5eBkv7ovTwgiT91XX27VbEXGENhYRCf7hyEbWrR3FewATdCEebj6znwMfQkhRYHRLpJ")
.key)
// zero depth with non-zero index
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH4r4TsiLvyLXqM9P7k1K3EYhA1kkD6xuquB5i39AU8KF42acDyL3qsDbU9NmZn6MsGSUYZEsuoePmjzsB3eFKSUEh3Gu1N3cqVUN")
.key)
// zero depth with non-zero index
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xpub661MyMwAuDcm6CRQ5N4qiHKrJ39Xe1R1NyfouMKTTWcguwVcfrZJaNvhpebzGerh7gucBvzEQWRugZDuDXjNDRmXzSZe4c7mnTK97pTvGS8")
.key)
// unknown extended key version
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8XnmdfHGMQzT7ayAmfo4z3gY5KfbrZWZ6St24UVf2Qgo6oujFktLHdHY4")
.key)
// unknown extended key version
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8XnmdfHPmHJiEDXkTiJTVV9rHEBUem2mwVbbNfvT2MTcAqj3nesx8uBf9")
.key)
// private key 0 not in 1..n-1
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzF93Y5wvzdUayhgkkFoicQZcP3y52uPPxFnfoLZB21Teqt1VvEHx")
.key)
// private key n not in 1..n-1
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFAzHGBP2UuGCqWLTAPLcMtD5SDKr24z3aiUvKr9bJpdrcLg1y3G")
.key)
// invalid pubkey 020000000000000000000000000000000000000000000000000000000000000007
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6Q5JXayek4PRsn35jii4veMimro1xefsM58PgBMrvdYre8QyULY")
.key)
// invalid checksum
assertThrows[IllegalArgumentException](
ExtKey
.fromString(
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHL")
.key)
}
it must "have derivation symmetry with (1<<31)-1, last i before hardened keys" in {
//xprv9s21ZrQH143K4QWHDnxmxUbzAQYiDavkg14kQcmZjP2KaSB1PZs5BUsyNGSrWXTzZ9qwyJo5yzvDe3fWybykc8CQPDZMaKupTeVbkfG7osL
//actual priv key 68e5ed2b2c8fc5a6605107d29d074e3d6ccb119c2811007e32f48305176f814c

View file

@ -16,6 +16,10 @@ sealed abstract class ExtKey extends NetworkElement {
require(bytes.size == 78,
"ExtKey must be 78 bytes in size, got: " + bytes.size)
require(
depth != UInt8.zero || !(childNum != UInt32.zero || fingerprint != ExtKey.masterFingerprint),
"Cannot have a 0 depth with non-zero parent fingerprint")
protected type VersionType <: ExtKeyVersion
/** The network and private/public key identifier for this key */

View file

@ -147,8 +147,9 @@ trait BouncycastleCryptoRuntime extends CryptoRuntime {
override def secKeyVerify(privateKeyBytes: ByteVector): Boolean = {
val num = new BigInteger(1, privateKeyBytes.toArray)
BouncyCastleCryptoParams.curve.getCurve.isValidFieldElement(num) && num
.compareTo(BouncyCastleCryptoParams.curve.getN) < 0
BouncyCastleCryptoParams.curve.getCurve.isValidFieldElement(num) &&
num.compareTo(BouncyCastleCryptoParams.curve.getN) < 0 &&
num != BigInteger.ZERO
}
override def verify(