keyfork-slip10-test-data: initial commit
This commit is contained in:
parent
b922cd1612
commit
ff03fc62ad
|
@ -548,6 +548,7 @@ dependencies = [
|
||||||
"hmac",
|
"hmac",
|
||||||
"k256",
|
"k256",
|
||||||
"keyfork-mnemonic-util",
|
"keyfork-mnemonic-util",
|
||||||
|
"keyfork-slip10-test-data",
|
||||||
"ripemd",
|
"ripemd",
|
||||||
"serde",
|
"serde",
|
||||||
"sha2",
|
"sha2",
|
||||||
|
@ -590,6 +591,13 @@ dependencies = [
|
||||||
"sha2",
|
"sha2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "keyfork-slip10-test-data"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"hex",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "keyforkd"
|
name = "keyforkd"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
@ -9,6 +9,7 @@ members = [
|
||||||
"keyfork-frame",
|
"keyfork-frame",
|
||||||
"keyfork-mnemonic-from-seed",
|
"keyfork-mnemonic-from-seed",
|
||||||
"keyfork-mnemonic-util",
|
"keyfork-mnemonic-util",
|
||||||
|
"keyfork-slip10-test-data",
|
||||||
"keyforkd",
|
"keyforkd",
|
||||||
"smex",
|
"smex",
|
||||||
]
|
]
|
||||||
|
|
|
@ -14,7 +14,7 @@ pub struct Command {
|
||||||
impl Command {
|
impl Command {
|
||||||
pub fn handle(&self) -> super::Result<DerivationResponse> {
|
pub fn handle(&self) -> super::Result<DerivationResponse> {
|
||||||
let mut client = Client::discover_socket()?;
|
let mut client = Client::discover_socket()?;
|
||||||
let request = DerivationRequest::new(self.algorithm.clone(), self.path.clone());
|
let request = DerivationRequest::new(self.algorithm.clone(), &self.path);
|
||||||
client.request(&request)
|
client.request(&request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ ed25519-dalek = { version = "2.0.0", optional = true }
|
||||||
|
|
||||||
# Workspace
|
# Workspace
|
||||||
keyfork-mnemonic-util = { version = "0.1.0", path = "../keyfork-mnemonic-util" }
|
keyfork-mnemonic-util = { version = "0.1.0", path = "../keyfork-mnemonic-util" }
|
||||||
|
keyfork-slip10-test-data = { version = "0.1.0", path = "../keyfork-slip10-test-data" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hex-literal = "0.4.1"
|
hex-literal = "0.4.1"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{DerivationIndex, DerivationPath, PrivateKey, PublicKey};
|
use crate::{DerivationIndex, DerivationPath, PrivateKey, PublicKey, ExtendedPublicKey};
|
||||||
|
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -113,6 +113,10 @@ where
|
||||||
&self.private_key
|
&self.private_key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn extended_public_key(&self) -> ExtendedPublicKey<K::PublicKey> {
|
||||||
|
ExtendedPublicKey::new(self.public_key(), self.chain_code)
|
||||||
|
}
|
||||||
|
|
||||||
/// Return a public key for the current [`PrivateKey`].
|
/// Return a public key for the current [`PrivateKey`].
|
||||||
pub fn public_key(&self) -> K::PublicKey {
|
pub fn public_key(&self) -> K::PublicKey {
|
||||||
self.private_key.public_key()
|
self.private_key.public_key()
|
||||||
|
|
|
@ -43,7 +43,6 @@ impl<K> ExtendedPublicKey<K>
|
||||||
where
|
where
|
||||||
K: PublicKey,
|
K: PublicKey,
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
/// Create a new [`ExtendedPublicKey`] from previously known values.
|
/// Create a new [`ExtendedPublicKey`] from previously known values.
|
||||||
pub fn new(public_key: K, chain_code: ChainCode) -> Self {
|
pub fn new(public_key: K, chain_code: ChainCode) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
@ -52,7 +51,11 @@ where
|
||||||
chain_code,
|
chain_code,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
/// Return the internal [`PublicKey`].
|
||||||
|
pub fn public_key(&self) -> &K {
|
||||||
|
&self.public_key
|
||||||
|
}
|
||||||
|
|
||||||
/// Derive a child with a given [`DerivationIndex`].
|
/// Derive a child with a given [`DerivationIndex`].
|
||||||
///
|
///
|
||||||
|
|
|
@ -67,8 +67,8 @@ pub struct DerivationRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DerivationRequest {
|
impl DerivationRequest {
|
||||||
pub fn new(algorithm: DerivationAlgorithm, path: DerivationPath) -> Self {
|
pub fn new(algorithm: DerivationAlgorithm, path: &DerivationPath) -> Self {
|
||||||
Self { algorithm, path }
|
Self { algorithm, path: path.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn path(&self) -> &DerivationPath {
|
pub fn path(&self) -> &DerivationPath {
|
||||||
|
|
|
@ -4,70 +4,53 @@ use std::str::FromStr;
|
||||||
|
|
||||||
// Pulled from: https://github.com/satoshilabs/slips/blob/master/slip-0010.md
|
// Pulled from: https://github.com/satoshilabs/slips/blob/master/slip-0010.md
|
||||||
|
|
||||||
|
use keyfork_slip10_test_data::{test_data, Test};
|
||||||
|
|
||||||
#[cfg(feature = "secp256k1")]
|
#[cfg(feature = "secp256k1")]
|
||||||
#[test]
|
#[test]
|
||||||
fn secp256k1() {
|
fn secp256k1() {
|
||||||
use k256::SecretKey;
|
use k256::SecretKey;
|
||||||
|
|
||||||
// seed, chain, chain code, private, public
|
let tests = test_data()
|
||||||
let tests = [(
|
.unwrap()
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
.remove(&"secp256k1".to_string())
|
||||||
DerivationPath::from_str("m").unwrap(),
|
.unwrap();
|
||||||
hex!("873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508"),
|
|
||||||
hex!("e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"),
|
for per_seed in tests {
|
||||||
hex!("0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"),
|
let seed = &per_seed.seed;
|
||||||
), (
|
for test in &per_seed.tests {
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
let chain = DerivationPath::from_str(test.chain).unwrap();
|
||||||
DerivationPath::from_str("m/0'").unwrap(),
|
let Test {
|
||||||
hex!("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"),
|
chain_code,
|
||||||
hex!("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea"),
|
private_key,
|
||||||
hex!("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"),
|
public_key,
|
||||||
), (
|
..
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
} = test;
|
||||||
DerivationPath::from_str("m/0'/1").unwrap(),
|
|
||||||
hex!("2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19"),
|
// Tests for ExtendedPrivateKey
|
||||||
hex!("3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368"),
|
let xkey = ExtendedPrivateKey::<SecretKey>::new(seed).unwrap();
|
||||||
hex!("03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"),
|
let derived_key = xkey.derive_path(&chain).unwrap();
|
||||||
), (
|
assert_eq!(
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
derived_key.chain_code().as_slice(),
|
||||||
DerivationPath::from_str("m/0'/1/2'").unwrap(),
|
chain_code,
|
||||||
hex!("04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f"),
|
"test: {chain}",
|
||||||
hex!("cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca"),
|
);
|
||||||
hex!("0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2"),
|
assert_eq!(
|
||||||
), (
|
PrivateKey::to_bytes(derived_key.private_key()).as_slice(),
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
private_key,
|
||||||
DerivationPath::from_str("m/0'/1/2'/2").unwrap(),
|
"test: {chain}",
|
||||||
hex!("cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd"),
|
);
|
||||||
hex!("0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4"),
|
assert_eq!(
|
||||||
hex!("02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29"),
|
PublicKey::to_bytes(&derived_key.public_key()).as_slice(),
|
||||||
), (
|
public_key,
|
||||||
&hex!("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")[..],
|
"test: {chain}",
|
||||||
DerivationPath::from_str("m").unwrap(),
|
);
|
||||||
hex!("60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689"),
|
|
||||||
hex!("4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e"),
|
// Tests for DerivationRequest
|
||||||
hex!("03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7"),
|
let request = DerivationRequest::new(DerivationAlgorithm::Secp256k1, &chain);
|
||||||
), (
|
let response = request.derive_with_master_seed(seed.to_vec()).unwrap();
|
||||||
&hex!("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")[..],
|
assert_eq!(&response.data, private_key, "test: {chain}");
|
||||||
DerivationPath::from_str("m/0").unwrap(),
|
}
|
||||||
hex!("f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c"),
|
|
||||||
hex!("abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e"),
|
|
||||||
hex!("02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"),
|
|
||||||
), (
|
|
||||||
&hex!("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")[..],
|
|
||||||
DerivationPath::from_str("m/0/2147483647'/1/2147483646'/2").unwrap(),
|
|
||||||
hex!("9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271"),
|
|
||||||
hex!("bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23"),
|
|
||||||
hex!("024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c"),
|
|
||||||
)];
|
|
||||||
for (seed, chain, chain_code, private_key, public_key) in tests {
|
|
||||||
let xkey = ExtendedPrivateKey::<SecretKey>::new(seed).unwrap();
|
|
||||||
let derived_key = xkey.derive_path(&chain).unwrap();
|
|
||||||
assert_eq!(derived_key.chain_code(), chain_code);
|
|
||||||
assert_eq!(derived_key.private_key().to_bytes().as_slice(), private_key);
|
|
||||||
assert_eq!(derived_key.public_key().to_bytes(), public_key);
|
|
||||||
let request = DerivationRequest::new(DerivationAlgorithm::Secp256k1, chain);
|
|
||||||
let response = request.derive_with_master_seed(seed.to_vec()).unwrap();
|
|
||||||
assert_eq!(response.data, private_key);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,39 +59,46 @@ fn secp256k1() {
|
||||||
fn ed25519() {
|
fn ed25519() {
|
||||||
use ed25519_dalek::SigningKey;
|
use ed25519_dalek::SigningKey;
|
||||||
|
|
||||||
// seed, chain, chain code, private, public
|
let tests = test_data()
|
||||||
let tests = [
|
.unwrap()
|
||||||
(
|
.remove(&"ed25519".to_string())
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
.unwrap();
|
||||||
DerivationPath::from_str("m").unwrap(),
|
|
||||||
hex!("90046a93de5380a72b5e45010748567d5ea02bbf6522f979e05c0d8d8ca9fffb"),
|
for per_seed in tests {
|
||||||
hex!("2b4be7f19ee27bbf30c667b642d5f4aa69fd169872f8fc3059c08ebae2eb19e7"),
|
let seed = &per_seed.seed;
|
||||||
hex!("00a4b2856bfec510abab89753fac1ac0e1112364e7d250545963f135f2a33188ed"),
|
for test in &per_seed.tests {
|
||||||
),
|
let chain = DerivationPath::from_str(test.chain).unwrap();
|
||||||
(
|
let Test {
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
chain_code,
|
||||||
DerivationPath::from_str("m/0'").unwrap(),
|
private_key,
|
||||||
hex!("8b59aa11380b624e81507a27fedda59fea6d0b779a778918a2fd3590e16e9c69"),
|
public_key,
|
||||||
hex!("68e0fe46dfb67e368c75379acec591dad19df3cde26e63b93a8e704f1dade7a3"),
|
..
|
||||||
hex!("008c8a13df77a28f3445213a0f432fde644acaa215fc72dcdf300d5efaa85d350c"),
|
} = test;
|
||||||
),
|
|
||||||
(
|
// Tests for ExtendedPrivateKey
|
||||||
&hex!("000102030405060708090a0b0c0d0e0f")[..],
|
let xkey = ExtendedPrivateKey::<SigningKey>::new(seed).unwrap();
|
||||||
DerivationPath::from_str("m/0'/1'/2'/2'/1000000000'").unwrap(),
|
let derived_key = xkey.derive_path(&chain).unwrap();
|
||||||
hex!("68789923a0cac2cd5a29172a475fe9e0fb14cd6adb5ad98a3fa70333e7afa230"),
|
assert_eq!(
|
||||||
hex!("8f94d394a8e8fd6b1bc2f3f49f5c47e385281d5c17e65324b0f62483e37e8793"),
|
derived_key.chain_code().as_slice(),
|
||||||
hex!("003c24da049451555d51a7014a37337aa4e12d41e485abccfa46b47dfb2af54b7a"),
|
chain_code,
|
||||||
),
|
"test: {chain}",
|
||||||
];
|
);
|
||||||
for (seed, chain, chain_code, private_key, public_key) in tests {
|
assert_eq!(
|
||||||
let xkey = ExtendedPrivateKey::<SigningKey>::new(seed).unwrap();
|
PrivateKey::to_bytes(derived_key.private_key()).as_slice(),
|
||||||
let derived_key = xkey.derive_path(&chain).unwrap();
|
private_key,
|
||||||
assert_eq!(derived_key.chain_code(), chain_code);
|
"test: {chain}",
|
||||||
assert_eq!(PrivateKey::to_bytes(derived_key.private_key()), private_key);
|
);
|
||||||
assert_eq!(PublicKey::to_bytes(&derived_key.public_key()), public_key);
|
assert_eq!(
|
||||||
let request = DerivationRequest::new(DerivationAlgorithm::Ed25519, chain);
|
PublicKey::to_bytes(&derived_key.public_key()).as_slice(),
|
||||||
let response = request.derive_with_master_seed(seed.to_vec()).unwrap();
|
public_key,
|
||||||
assert_eq!(response.data, private_key);
|
"test: {chain}",
|
||||||
|
);
|
||||||
|
|
||||||
|
// Tests for DerivationRequest
|
||||||
|
let request = DerivationRequest::new(DerivationAlgorithm::Ed25519, &chain);
|
||||||
|
let response = request.derive_with_master_seed(seed.to_vec()).unwrap();
|
||||||
|
assert_eq!(&response.data, private_key, "test: {chain}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "keyfork-slip10-test-data"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
hex = "0.4.3"
|
|
@ -0,0 +1,311 @@
|
||||||
|
// Source: https://github.com/satoshilabs/slips/blob/master/slip-0010.md#test-vectors
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
pub type DecodedHex = Vec<u8>;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Test {
|
||||||
|
pub chain: &'static str,
|
||||||
|
pub fingerprint: DecodedHex,
|
||||||
|
pub chain_code: DecodedHex,
|
||||||
|
pub private_key: DecodedHex,
|
||||||
|
pub public_key: DecodedHex,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct TestData {
|
||||||
|
pub seed: DecodedHex,
|
||||||
|
pub tests: Vec<Test>,
|
||||||
|
}
|
||||||
|
|
||||||
|
const SECP256K1_256: &str = "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a2\
|
||||||
|
9f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542";
|
||||||
|
|
||||||
|
const ED25519_256: &str = "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a2\
|
||||||
|
9f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542";
|
||||||
|
|
||||||
|
// Note: This should never error.
|
||||||
|
pub fn test_data() -> Result<HashMap<String, Vec<TestData>>, Box<dyn std::error::Error>> {
|
||||||
|
// Format:
|
||||||
|
let mut map = HashMap::new();
|
||||||
|
let secp256k1 = vec![
|
||||||
|
TestData {
|
||||||
|
seed: hex::decode("000102030405060708090a0b0c0d0e0f")?,
|
||||||
|
tests: vec![
|
||||||
|
Test {
|
||||||
|
chain: "m",
|
||||||
|
fingerprint: hex::decode("00000000")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'",
|
||||||
|
fingerprint: hex::decode("3442193e")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1",
|
||||||
|
fingerprint: hex::decode("5c1bd648")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1/2'",
|
||||||
|
fingerprint: hex::decode("bef5a2f9")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1/2'/2",
|
||||||
|
fingerprint: hex::decode("ee7ab90c")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1/2'/2/1000000000",
|
||||||
|
fingerprint: hex::decode("d880d7d8")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
TestData {
|
||||||
|
seed: hex::decode(SECP256K1_256)?,
|
||||||
|
tests: vec![
|
||||||
|
Test {
|
||||||
|
chain: "m",
|
||||||
|
fingerprint: hex::decode("00000000")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0",
|
||||||
|
fingerprint: hex::decode("bd16bee5")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0/2147483647'",
|
||||||
|
fingerprint: hex::decode("5a61ff8e")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0/2147483647'/1",
|
||||||
|
fingerprint: hex::decode("d8ab4937")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0/2147483647'/1/2147483646'",
|
||||||
|
fingerprint: hex::decode("78412e3a")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0/2147483647'/1/2147483646'/2",
|
||||||
|
fingerprint: hex::decode("31a507b8")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
map.insert("secp256k1".to_string(), secp256k1);
|
||||||
|
|
||||||
|
let ed25519 = vec![
|
||||||
|
TestData {
|
||||||
|
seed: hex::decode("000102030405060708090a0b0c0d0e0f")?,
|
||||||
|
tests: vec![
|
||||||
|
Test {
|
||||||
|
chain: "m",
|
||||||
|
fingerprint: hex::decode("00000000")?,
|
||||||
|
chain_code: hex::decode(
|
||||||
|
"90046a93de5380a72b5e45010748567d5ea02bbf6522f979e05c0d8d8ca9fffb",
|
||||||
|
)?,
|
||||||
|
private_key: hex::decode(
|
||||||
|
"2b4be7f19ee27bbf30c667b642d5f4aa69fd169872f8fc3059c08ebae2eb19e7",
|
||||||
|
)?,
|
||||||
|
public_key: hex::decode(
|
||||||
|
"00a4b2856bfec510abab89753fac1ac0e1112364e7d250545963f135f2a33188ed",
|
||||||
|
)?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'",
|
||||||
|
fingerprint: hex::decode("ddebc675")?,
|
||||||
|
chain_code: hex::decode("8b59aa11380b624e81507a27fedda59fea6d0b779a778918a2fd3590e16e9c69")?,
|
||||||
|
private_key: hex::decode("68e0fe46dfb67e368c75379acec591dad19df3cde26e63b93a8e704f1dade7a3")?,
|
||||||
|
public_key: hex::decode("008c8a13df77a28f3445213a0f432fde644acaa215fc72dcdf300d5efaa85d350c")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1'",
|
||||||
|
fingerprint: hex::decode("13dab143")?,
|
||||||
|
chain_code: hex::decode("a320425f77d1b5c2505a6b1b27382b37368ee640e3557c315416801243552f14")?,
|
||||||
|
private_key: hex::decode("b1d0bad404bf35da785a64ca1ac54b2617211d2777696fbffaf208f746ae84f2")?,
|
||||||
|
public_key: hex::decode("001932a5270f335bed617d5b935c80aedb1a35bd9fc1e31acafd5372c30f5c1187")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1'/2'",
|
||||||
|
fingerprint: hex::decode("ebe4cb29")?,
|
||||||
|
chain_code: hex::decode("2e69929e00b5ab250f49c3fb1c12f252de4fed2c1db88387094a0f8c4c9ccd6c")?,
|
||||||
|
private_key: hex::decode("92a5b23c0b8a99e37d07df3fb9966917f5d06e02ddbd909c7e184371463e9fc9")?,
|
||||||
|
public_key: hex::decode("00ae98736566d30ed0e9d2f4486a64bc95740d89c7db33f52121f8ea8f76ff0fc1")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1'/2'/2'",
|
||||||
|
fingerprint: hex::decode("316ec1c6")?,
|
||||||
|
chain_code: hex::decode("8f6d87f93d750e0efccda017d662a1b31a266e4a6f5993b15f5c1f07f74dd5cc")?,
|
||||||
|
private_key: hex::decode("30d1dc7e5fc04c31219ab25a27ae00b50f6fd66622f6e9c913253d6511d1e662")?,
|
||||||
|
public_key: hex::decode("008abae2d66361c879b900d204ad2cc4984fa2aa344dd7ddc46007329ac76c429c")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/1'/2'/2'/1000000000'",
|
||||||
|
fingerprint: hex::decode("d6322ccd")?,
|
||||||
|
chain_code: hex::decode("68789923a0cac2cd5a29172a475fe9e0fb14cd6adb5ad98a3fa70333e7afa230")?,
|
||||||
|
private_key: hex::decode("8f94d394a8e8fd6b1bc2f3f49f5c47e385281d5c17e65324b0f62483e37e8793")?,
|
||||||
|
public_key: hex::decode("003c24da049451555d51a7014a37337aa4e12d41e485abccfa46b47dfb2af54b7a")?,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
TestData {
|
||||||
|
seed: hex::decode(ED25519_256)?,
|
||||||
|
tests: vec![
|
||||||
|
Test {
|
||||||
|
chain: "m",
|
||||||
|
fingerprint: hex::decode("00000000")?,
|
||||||
|
chain_code: hex::decode("ef70a74db9c3a5af931b5fe73ed8e1a53464133654fd55e7a66f8570b8e33c3b")?,
|
||||||
|
private_key: hex::decode("171cb88b1b3c1db25add599712e36245d75bc65a1a5c9e18d76f9f2b1eab4012")?,
|
||||||
|
public_key: hex::decode("008fe9693f8fa62a4305a140b9764c5ee01e455963744fe18204b4fb948249308a")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'",
|
||||||
|
fingerprint: hex::decode("31981b50")?,
|
||||||
|
chain_code: hex::decode("0b78a3226f915c082bf118f83618a618ab6dec793752624cbeb622acb562862d")?,
|
||||||
|
private_key: hex::decode("1559eb2bbec5790b0c65d8693e4d0875b1747f4970ae8b650486ed7470845635")?,
|
||||||
|
public_key: hex::decode("0086fab68dcb57aa196c77c5f264f215a112c22a912c10d123b0d03c3c28ef1037")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/2147483647'",
|
||||||
|
fingerprint: hex::decode("1e9411b1")?,
|
||||||
|
chain_code: hex::decode("138f0b2551bcafeca6ff2aa88ba8ed0ed8de070841f0c4ef0165df8181eaad7f")?,
|
||||||
|
private_key: hex::decode("ea4f5bfe8694d8bb74b7b59404632fd5968b774ed545e810de9c32a4fb4192f4")?,
|
||||||
|
public_key: hex::decode("005ba3b9ac6e90e83effcd25ac4e58a1365a9e35a3d3ae5eb07b9e4d90bcf7506d")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/2147483647'/1'",
|
||||||
|
fingerprint: hex::decode("fcadf38c")?,
|
||||||
|
chain_code: hex::decode("73bd9fff1cfbde33a1b846c27085f711c0fe2d66fd32e139d3ebc28e5a4a6b90")?,
|
||||||
|
private_key: hex::decode("3757c7577170179c7868353ada796c839135b3d30554bbb74a4b1e4a5a58505c")?,
|
||||||
|
public_key: hex::decode("002e66aa57069c86cc18249aecf5cb5a9cebbfd6fadeab056254763874a9352b45")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/2147483647'/1'/2147483646'",
|
||||||
|
fingerprint: hex::decode("aca70953")?,
|
||||||
|
chain_code: hex::decode("0902fe8a29f9140480a00ef244bd183e8a13288e4412d8389d140aac1794825a")?,
|
||||||
|
private_key: hex::decode("5837736c89570de861ebc173b1086da4f505d4adb387c6a1b1342d5e4ac9ec72")?,
|
||||||
|
public_key: hex::decode("00e33c0f7d81d843c572275f287498e8d408654fdf0d1e065b84e2e6f157aab09b")?,
|
||||||
|
},
|
||||||
|
Test {
|
||||||
|
chain: "m/0'/2147483647'/1'/2147483646'/2'",
|
||||||
|
fingerprint: hex::decode("422c654b")?,
|
||||||
|
chain_code: hex::decode("5d70af781f3a37b829f0d060924d5e960bdc02e85423494afc0b1a41bbe196d4")?,
|
||||||
|
private_key: hex::decode("551d333177df541ad876a60ea71f00447931c0a9da16f227c11ea080d7391b8d")?,
|
||||||
|
public_key: hex::decode("0047150c75db263559a70d5778bf36abbab30fb061ad69f69ece61a72b0cfa4fc0")?,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
map.insert("ed25519".to_string(), ed25519);
|
||||||
|
|
||||||
|
Ok(map)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn builds_data() {
|
||||||
|
test_data().unwrap();
|
||||||
|
}
|
Loading…
Reference in New Issue