2023-09-28 02:30:56 +00:00
|
|
|
use crate::Client;
|
2023-09-26 00:40:37 +00:00
|
|
|
use keyfork_derive_util::{request::*, DerivationPath};
|
|
|
|
use keyfork_slip10_test_data::test_data;
|
2024-02-12 07:31:22 +00:00
|
|
|
use keyforkd::test_util::{run_test, Infallible};
|
2023-09-12 03:41:55 +00:00
|
|
|
use std::{os::unix::net::UnixStream, str::FromStr};
|
|
|
|
|
|
|
|
#[test]
|
2024-02-12 07:31:22 +00:00
|
|
|
#[cfg(feature = "secp256k1")]
|
2024-02-12 06:28:04 +00:00
|
|
|
fn secp256k1_test_suite() {
|
2024-02-12 07:31:22 +00:00
|
|
|
use k256::SecretKey;
|
|
|
|
|
2023-09-26 00:40:37 +00:00
|
|
|
let tests = test_data()
|
|
|
|
.unwrap()
|
|
|
|
.remove(&"secp256k1".to_string())
|
|
|
|
.unwrap();
|
|
|
|
|
2024-02-12 06:28:04 +00:00
|
|
|
for seed_test in tests {
|
|
|
|
let seed = seed_test.seed;
|
2024-02-12 07:31:22 +00:00
|
|
|
run_test(&seed, move |socket_path| -> Result<(), Box<dyn std::error::Error + Send>> {
|
2024-02-12 06:28:04 +00:00
|
|
|
for test in seed_test.tests {
|
2024-02-18 22:59:23 +00:00
|
|
|
let socket = UnixStream::connect(socket_path).unwrap();
|
2024-02-12 06:28:04 +00:00
|
|
|
let mut client = Client::new(socket);
|
|
|
|
let chain = DerivationPath::from_str(test.chain).unwrap();
|
2024-02-12 07:31:22 +00:00
|
|
|
let chain_len = chain.len();
|
|
|
|
if chain_len < 2 {
|
2024-02-12 06:28:04 +00:00
|
|
|
continue;
|
|
|
|
}
|
2024-02-12 07:31:22 +00:00
|
|
|
// Consistency check: ensure the server and the client can each derive the same
|
|
|
|
// key using an XPrv, for all but the last XPrv, which is verified after this
|
|
|
|
for i in 2..chain_len {
|
|
|
|
// FIXME: Keyfork will only allow one request per session
|
2024-02-18 22:59:23 +00:00
|
|
|
let socket = UnixStream::connect(socket_path).unwrap();
|
2024-02-12 07:31:22 +00:00
|
|
|
let mut client = Client::new(socket);
|
|
|
|
let path = DerivationPath::from_str(test.chain).unwrap();
|
|
|
|
let left_path = path.inner()[..i]
|
|
|
|
.iter()
|
|
|
|
.fold(DerivationPath::default(), |p, i| p.chain_push(i.clone()));
|
|
|
|
let right_path = path.inner()[i..]
|
|
|
|
.iter()
|
|
|
|
.fold(DerivationPath::default(), |p, i| p.chain_push(i.clone()));
|
|
|
|
let xprv = dbg!(client.request_xprv::<SecretKey>(&left_path)).unwrap();
|
|
|
|
let derived_xprv = xprv.derive_path(&right_path).unwrap();
|
2024-02-18 22:59:23 +00:00
|
|
|
let socket = UnixStream::connect(socket_path).unwrap();
|
2024-02-12 07:31:22 +00:00
|
|
|
let mut client = Client::new(socket);
|
|
|
|
let keyforkd_xprv = client.request_xprv::<SecretKey>(&path).unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
derived_xprv, keyforkd_xprv,
|
|
|
|
"{left_path} + {right_path} != {path}"
|
|
|
|
);
|
|
|
|
}
|
2024-02-12 06:28:04 +00:00
|
|
|
let req = DerivationRequest::new(
|
|
|
|
DerivationAlgorithm::Secp256k1,
|
|
|
|
&DerivationPath::from_str(test.chain).unwrap(),
|
|
|
|
);
|
|
|
|
let response =
|
|
|
|
DerivationResponse::try_from(client.request(&req.into()).unwrap()).unwrap();
|
|
|
|
assert_eq!(&response.data, test.private_key.as_slice());
|
2023-09-26 00:40:37 +00:00
|
|
|
}
|
2024-02-12 07:31:22 +00:00
|
|
|
Ok(())
|
|
|
|
})
|
|
|
|
.unwrap();
|
2023-09-26 00:40:37 +00:00
|
|
|
}
|
2023-09-12 03:41:55 +00:00
|
|
|
}
|
2023-09-12 06:36:05 +00:00
|
|
|
|
|
|
|
#[test]
|
2024-02-12 07:31:22 +00:00
|
|
|
#[cfg(feature = "ed25519")]
|
2024-02-12 06:28:04 +00:00
|
|
|
fn ed25519_test_suite() {
|
2024-02-12 07:31:22 +00:00
|
|
|
use ed25519_dalek::SigningKey;
|
|
|
|
|
|
|
|
let tests = test_data().unwrap().remove(&"ed25519".to_string()).unwrap();
|
2023-09-12 06:36:05 +00:00
|
|
|
|
2024-02-12 06:28:04 +00:00
|
|
|
for seed_test in tests {
|
|
|
|
let seed = seed_test.seed;
|
|
|
|
run_test(&seed, move |socket_path| {
|
|
|
|
for test in seed_test.tests {
|
2024-02-18 22:59:23 +00:00
|
|
|
let socket = UnixStream::connect(socket_path).unwrap();
|
2024-02-12 06:28:04 +00:00
|
|
|
let mut client = Client::new(socket);
|
|
|
|
let chain = DerivationPath::from_str(test.chain).unwrap();
|
2024-02-12 07:31:22 +00:00
|
|
|
let chain_len = chain.len();
|
|
|
|
if chain_len < 2 {
|
2024-02-12 06:28:04 +00:00
|
|
|
continue;
|
|
|
|
}
|
2024-02-12 07:31:22 +00:00
|
|
|
for i in 2..chain_len {
|
|
|
|
// Consistency check: ensure the server and the client can each derive the same
|
|
|
|
// key using an XPrv, for all but the last XPrv, which is verified after this
|
|
|
|
let path = DerivationPath::from_str(test.chain).unwrap();
|
|
|
|
let left_path = path.inner()[..i]
|
|
|
|
.iter()
|
|
|
|
.fold(DerivationPath::default(), |p, i| p.chain_push(i.clone()));
|
|
|
|
let right_path = path.inner()[i..]
|
|
|
|
.iter()
|
|
|
|
.fold(DerivationPath::default(), |p, i| p.chain_push(i.clone()));
|
|
|
|
let xprv = dbg!(client.request_xprv::<SigningKey>(&left_path)).unwrap();
|
|
|
|
let derived_xprv = xprv.derive_path(&right_path).unwrap();
|
|
|
|
let keyforkd_xprv = client.request_xprv::<SigningKey>(&path).unwrap();
|
|
|
|
assert_eq!(
|
|
|
|
derived_xprv, keyforkd_xprv,
|
|
|
|
"{left_path} + {right_path} != {path}"
|
|
|
|
);
|
|
|
|
}
|
2024-02-12 06:28:04 +00:00
|
|
|
let req = DerivationRequest::new(
|
|
|
|
DerivationAlgorithm::Ed25519,
|
|
|
|
&DerivationPath::from_str(test.chain).unwrap(),
|
|
|
|
);
|
|
|
|
let response =
|
|
|
|
DerivationResponse::try_from(client.request(&req.into()).unwrap()).unwrap();
|
|
|
|
assert_eq!(&response.data, test.private_key.as_slice());
|
2023-09-26 00:40:37 +00:00
|
|
|
}
|
2024-02-12 06:28:04 +00:00
|
|
|
Infallible::Ok(())
|
2024-02-12 07:31:22 +00:00
|
|
|
})
|
|
|
|
.unwrap();
|
2023-09-12 06:36:05 +00:00
|
|
|
}
|
|
|
|
}
|