mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-26 13:25:49 +01:00
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:
parent
11dd28085a
commit
f2a2874177
3 changed files with 121 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Add table
Reference in a new issue