bip32: make Xpriv::new_master be infallible

The only error path for this is cryptographically unreachable and was
removed in a previous commit.
This commit is contained in:
Andrew Poelstra 2025-04-21 22:33:28 +00:00
parent 0e5e021b69
commit 32d96f6c33
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
4 changed files with 7 additions and 7 deletions

View File

@ -33,7 +33,7 @@ fn main() {
let secp = Secp256k1::preallocated_new(buf.as_mut_slice()).unwrap(); let secp = Secp256k1::preallocated_new(buf.as_mut_slice()).unwrap();
// calculate root key from seed // calculate root key from seed
let root = Xpriv::new_master(NetworkKind::Main, &seed).unwrap(); let root = Xpriv::new_master(NetworkKind::Main, &seed);
println!("Root key: {}", root); println!("Root key: {}", root);
// derive child xpub // derive child xpub

View File

@ -598,12 +598,12 @@ impl From<InvalidBase58PayloadLengthError> for Error {
impl Xpriv { impl Xpriv {
/// Constructs a new master key from a seed value /// Constructs a new master key from a seed value
pub fn new_master(network: impl Into<NetworkKind>, seed: &[u8]) -> Result<Xpriv, Error> { pub fn new_master(network: impl Into<NetworkKind>, seed: &[u8]) -> Xpriv {
let mut engine = HmacEngine::<sha512::HashEngine>::new(b"Bitcoin seed"); let mut engine = HmacEngine::<sha512::HashEngine>::new(b"Bitcoin seed");
engine.input(seed); engine.input(seed);
let hmac = engine.finalize(); let hmac = engine.finalize();
Ok(Xpriv { Xpriv {
network: network.into(), network: network.into(),
depth: 0, depth: 0,
parent_fingerprint: Default::default(), parent_fingerprint: Default::default(),
@ -613,7 +613,7 @@ impl Xpriv {
) )
.expect("cryptographically unreachable"), .expect("cryptographically unreachable"),
chain_code: ChainCode::from_hmac(hmac), chain_code: ChainCode::from_hmac(hmac),
}) }
} }
/// Constructs a new ECDSA compressed private key matching internal secret key representation. /// Constructs a new ECDSA compressed private key matching internal secret key representation.
@ -1111,7 +1111,7 @@ mod tests {
expected_sk: &str, expected_sk: &str,
expected_pk: &str, expected_pk: &str,
) { ) {
let mut sk = Xpriv::new_master(network, seed).unwrap(); let mut sk = Xpriv::new_master(network, seed);
let mut pk = Xpub::from_xpriv(secp, &sk); let mut pk = Xpub::from_xpriv(secp, &sk);
// Check derivation convenience method for Xpriv // Check derivation convenience method for Xpriv

View File

@ -1439,7 +1439,7 @@ mod tests {
let mut hd_keypaths: BTreeMap<secp256k1::PublicKey, KeySource> = Default::default(); let mut hd_keypaths: BTreeMap<secp256k1::PublicKey, KeySource> = Default::default();
let mut sk: Xpriv = Xpriv::new_master(NetworkKind::Main, &seed).unwrap(); let mut sk: Xpriv = Xpriv::new_master(NetworkKind::Main, &seed);
let fprint = sk.fingerprint(secp); let fprint = sk.fingerprint(secp);

View File

@ -120,7 +120,7 @@ fn build_extended_private_key() -> Xpriv {
let xpriv = extended_private_key.parse::<Xpriv>().unwrap(); let xpriv = extended_private_key.parse::<Xpriv>().unwrap();
let sk = PrivateKey::from_wif(seed).unwrap(); let sk = PrivateKey::from_wif(seed).unwrap();
let seeded = Xpriv::new_master(NetworkKind::Test, &sk.inner.secret_bytes()).unwrap(); let seeded = Xpriv::new_master(NetworkKind::Test, &sk.inner.secret_bytes());
assert_eq!(xpriv, seeded); assert_eq!(xpriv, seeded);
xpriv xpriv