bip0032

Crates.iobip0032
lib.rsbip0032
version0.0.3
created_at2022-04-14 10:28:43.907053+00
updated_at2026-01-25 05:19:32.260977+00
descriptionAnother Rust implementation of BIP-0032 standard
homepagehttps://github.com/koushiro/rust-bips
repositoryhttps://github.com/koushiro/rust-bips
max_upload_size
id567416
size163,627
Qinxuan Chen (koushiro)

documentation

https://docs.rs/bip0032

README

bip0032

Another Rust implementation of BIP-0032 standard.

Support curves and features

Curve Feature Backends Hardened Non-hardened (private) Non-hardened (public) Serialization
secp256k1 k256 | secp256k1 | libsecp256k1 k256, secp256k1, libsecp256k1 yes yes yes yes

Usage

Seed material is typically derived from a BIP-0039 mnemonic (for example, via bip0039).

use bip0039::{Count, English, Mnemonic};

let mnemonic = <Mnemonic<English>>::generate(Count::Words12);
let seed = mnemonic.to_seed("");

The examples below assume the seed from above.

  1. Private parent key -> private child key (supports hardened).
use bip0032::{DerivationPath, ExtendedPrivateKey, Version, curve::secp256k1::*};

let master = ExtendedPrivateKey::<Secp256k1Curve<K256Backend>>::new(&seed).unwrap();
let path: DerivationPath = "m/0H/1".parse().unwrap();
let child = master.derive_path(&path).unwrap();
let xprv = child
    .encode_with(Version::XPRV)
    .unwrap()
    .to_string();
  1. Private parent key -> public child key.
use bip0032::{DerivationPath, ExtendedPrivateKey, Version, curve::secp256k1::*};

let master = ExtendedPrivateKey::<Secp256k1Curve<K256Backend>>::new(&seed).unwrap();
let path: DerivationPath = "m/0H/1".parse().unwrap();
let child = master.derive_path(&path).unwrap();
let xpub = child
    .public_key()
    .encode_with(Version::XPUB)
    .unwrap()
    .to_string();
  1. Public parent key -> public child key (non-hardened only).
use bip0032::{DerivationPath, ExtendedPublicKey, Version, curve::secp256k1::*};

let parent_xpub = "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8";
let parent: ExtendedPublicKey<Secp256k1Curve<K256Backend>> = parent_xpub.parse().unwrap();
let path: DerivationPath = "m/0/1".parse().unwrap();
let child = parent.derive_path(&path).unwrap();
let xpub = child
    .encode_with(Version::XPUB)
    .unwrap()
    .to_string();
  1. Public parent key -> private child key: impossible (BIP-0032 does not allow it).

SLIP-0010 (optional)

SLIP-0010 support is available behind the slip10 feature. See SLIP-0010.md for details, examples, and the feature matrix.

Documentation

See documentation and examples at https://docs.rs/bip0032.

Features

  • Derivation path parsing with hardened suffixes (', h, H)
  • Extended key Base58Check encoding/decoding (xpub/xprv)
  • Multiple secp256k1 backends
  • Optional SLIP-0010 support
  • Support no_std environment

Performance

See benchmarks for more details

Alternatives

License

This project is licensed under the Apache License, Version 2.0 - see the LICENSE file for details.

Commit count: 72

cargo fmt