| Crates.io | khodpay-bip39 |
| lib.rs | khodpay-bip39 |
| version | 0.4.0 |
| created_at | 2025-10-16 09:58:01.970215+00 |
| updated_at | 2025-12-01 15:13:49.517093+00 |
| description | Production-ready Rust implementation of BIP39 mnemonic code for cryptocurrency wallets |
| homepage | https://github.com/khodpay/rust-wallet |
| repository | https://github.com/khodpay/rust-wallet |
| max_upload_size | |
| id | 1885703 |
| size | 178,809 |
A comprehensive, production-ready Rust implementation of the BIP39 standard for generating deterministic keys in cryptocurrency wallets.
BIP39 (Bitcoin Improvement Proposal 39) defines a method for creating mnemonic phrases (12-24 words) that can be used to generate deterministic cryptocurrency wallet keys. This implementation provides a safe, ergonomic, and fully-tested Rust API.
Add to your Cargo.toml:
[dependencies]
khodpay-bip39 = "0.2.0"
Or via cargo:
cargo add khodpay-bip39
use khodpay_bip39::{Mnemonic, WordCount, Language};
// Generate a new 12-word mnemonic
let mnemonic = Mnemonic::generate(WordCount::Twelve, Language::English)?;
// Display the phrase to the user (they should write it down!)
println!("Your recovery phrase: {}", mnemonic.phrase());
// Generate a cryptographic seed for key derivation
let seed = mnemonic.to_seed("optional passphrase")?;
// Use seed for BIP32 key derivation...
use khodpay_bip39::{Mnemonic, WordCount, Language};
// Generate a new mnemonic with 24 words (highest security)
let mnemonic = Mnemonic::generate(WordCount::TwentyFour, Language::English)?;
// Show the phrase to the user
println!("๐ Your recovery phrase (write this down!):");
println!("{}", mnemonic.phrase());
// Generate seed with passphrase for additional security
let seed = mnemonic.to_seed("my secure passphrase")?;
println!("โ Wallet seed generated ({} bytes)", seed.len());
use khodpay_bip39::{Mnemonic, Language};
// User enters their recovery phrase
let phrase = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
// Parse and validate the phrase
let mnemonic = Mnemonic::from_phrase(phrase, Language::English)?;
// Regenerate the seed (must use same passphrase!)
let seed = mnemonic.to_seed("my secure passphrase")?;
// Now derive keys from the seed...
use khodpay_bip39::{Mnemonic, Language};
// From hardware wallet or external entropy source
let entropy = [42u8; 32]; // 256 bits = 24 words
// Create mnemonic from entropy
let mnemonic = Mnemonic::new(&entropy, Language::English)?;
println!("Mnemonic: {}", mnemonic.phrase());
println!("Entropy: {:?}", mnemonic.entropy());
use khodpay_bip39::{Mnemonic, WordCount, Language};
// Generate Japanese mnemonic
let mnemonic_ja = Mnemonic::generate(WordCount::Twelve, Language::Japanese)?;
println!("ๆฅๆฌ่ช: {}", mnemonic_ja.phrase());
// Generate Spanish mnemonic
let mnemonic_es = Mnemonic::generate(WordCount::Twelve, Language::Spanish)?;
println!("Espaรฑol: {}", mnemonic_es.phrase());
use khodpay_bip39::{Mnemonic, WordCount, Language};
// 12 words = 128 bits entropy (standard)
let m12 = Mnemonic::generate(WordCount::Twelve, Language::English)?;
// 15 words = 160 bits entropy
let m15 = Mnemonic::generate(WordCount::Fifteen, Language::English)?;
// 18 words = 192 bits entropy
let m18 = Mnemonic::generate(WordCount::Eighteen, Language::English)?;
// 21 words = 224 bits entropy
let m21 = Mnemonic::generate(WordCount::TwentyOne, Language::English)?;
// 24 words = 256 bits entropy (maximum security)
let m24 = Mnemonic::generate(WordCount::TwentyFour, Language::English)?;
use khodpay_bip39::{validate_phrase_in_language, Language};
let phrase = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
// Validate the phrase
match validate_phrase_in_language(phrase, Language::English) {
Ok(_) => println!("โ Valid BIP39 phrase"),
Err(e) => println!("โ Invalid: {}", e),
}
use khodpay_bip39::{generate_mnemonic, phrase_to_seed, validate_phrase};
// Generate a phrase directly
let phrase = generate_mnemonic(WordCount::Twelve)?;
// Validate it
validate_phrase(&phrase)?;
// Generate seed from phrase
let seed = phrase_to_seed(&phrase, "passphrase")?;
Mnemonic - Main struct representing a BIP39 mnemonic
new(entropy, language) - Create from raw entropyfrom_phrase(phrase, language) - Parse existing phrasegenerate(word_count, language) - Generate random mnemonicphrase() - Get the mnemonic phraseentropy() - Get the entropy bytesto_seed(passphrase) - Generate cryptographic seedWordCount - Type-safe word count enum (12, 15, 18, 21, 24)
Language - Supported languages enum
Error - Comprehensive error types with helpful messages
bip39/
โโโ src/
โ โโโ lib.rs # Public API exports
โ โโโ error.rs # Error types
โ โโโ language.rs # Language enum
โ โโโ word_count.rs # WordCount enum
โ โโโ mnemonic.rs # Core Mnemonic struct
โ โโโ utils.rs # Utility functions
โโโ tests/
โ โโโ integration_tests.rs # Integration tests
โโโ benches/
โโโ benchmarks.rs # Performance benchmarks
Entropy Generation: This library uses the system's cryptographically secure random number generator (rand::thread_rng()). Ensure your system's RNG is properly seeded.
Mnemonic Storage:
Passphrase Security:
Memory Safety:
zeroize crate for sensitive datause khodpay_bip39::{Mnemonic, WordCount, Language};
// โ DO: Generate with maximum entropy
let mnemonic = Mnemonic::generate(WordCount::TwentyFour, Language::English)?;
// โ DO: Use passphrases for additional security
let seed = mnemonic.to_seed("strong passphrase")?;
// โ DON'T: Use weak entropy sources
// โ DON'T: Store mnemonics in application state
// โ DON'T: Log or transmit mnemonics
The crate includes comprehensive test coverage:
# Run all tests
cargo test
# Run with output
cargo test -- --nocapture
# Run only unit tests
cargo test --lib
# Run only integration tests
cargo test --test integration_tests
# Run only doc tests
cargo test --doc
# Run benchmarks
cargo bench
Benchmarks on Apple M1 (example):
generate_mnemonic_12_words ~500 ยตs
generate_mnemonic_24_words ~800 ยตs
from_phrase ~100 ยตs
to_seed (2048 iterations) ~15 ms
validate_phrase ~50 ยตs
Run benchmarks yourself:
cargo bench
Contributions are welcome! Please ensure:
cargo testcargo fmtcargo clippyThis project is dual-licensed under:
You may choose either license for your use.
For bugs, questions, or feature requests, please open an issue on the repository.
โ ๏ธ Disclaimer: This library handles sensitive cryptographic material. Use at your own risk. Always audit cryptographic code before using in production.