Skip to content

Commit c4c1180

Browse files
committed
rust: move bitbox02::keystore::bip39_mnemonic_from_seed() to bip39 module
1 parent 1d0096a commit c4c1180

File tree

4 files changed

+36
-37
lines changed

4 files changed

+36
-37
lines changed

src/rust/bitbox02-rust/src/bip39.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ pub fn get_word(idx: u16) -> Result<zeroize::Zeroizing<String>, ()> {
2626
))
2727
}
2828

29+
/// Encode a seed as a BIP39 mnemonic.
30+
pub fn mnemonic_from_seed(seed: &[u8]) -> Result<zeroize::Zeroizing<String>, ()> {
31+
let mnemonic = bip39::Mnemonic::from_entropy(seed).map_err(|_| ())?;
32+
Ok(zeroize::Zeroizing::new(mnemonic.to_string()))
33+
}
34+
2935
/// Decode a BIP39 mnemonic.
3036
pub fn mnemonic_to_seed(mnemonic: &str) -> Result<zeroize::Zeroizing<Vec<u8>>, ()> {
3137
let mnemonic =
@@ -103,6 +109,33 @@ mod tests {
103109
assert_eq!(get_word(563).unwrap().as_ref() as &str, "edit");
104110
}
105111

112+
#[test]
113+
fn test_mnemonic_from_seed() {
114+
// 12 words
115+
let seed = b"\xae\x6a\x40\x26\x1f\x0a\xcc\x16\x57\x04\x9c\xb2\x1a\xf5\xfb\xf7";
116+
assert_eq!(
117+
mnemonic_from_seed(seed).unwrap().as_str(),
118+
"purpose faith another dignity proud arctic foster near rare stumble leave urge",
119+
);
120+
121+
// 18 words
122+
let seed = b"\x2a\x3e\x07\xa9\xe7\x5e\xd7\x3a\xa6\xb2\xe1\xaf\x90\x3d\x50\x17\xde\x80\x4f\xdf\x2b\x45\xc2\x4b";
123+
assert_eq!(
124+
mnemonic_from_seed(seed).unwrap().as_str(),
125+
"clay usual tuna solid uniform outer onion found question limit favorite cook trend child lake hamster seat foot",
126+
);
127+
128+
// 24 words
129+
let seed = b"\x24\x1d\x5b\x78\x35\x90\xc2\x1f\x79\x69\x8e\x7c\xe8\x92\xdd\x03\xfb\x2c\x8f\xad\xc2\x44\x0e\xc2\x3a\xa5\xde\x9e\x2d\x23\x81\xb0";
130+
assert_eq!(
131+
mnemonic_from_seed(seed).unwrap().as_str(),
132+
"catch turn task hen around autumn toss crack language duty resemble among ready elephant require embrace attract balcony practice rule tissue mushroom almost athlete",
133+
);
134+
135+
// Invalid seed side
136+
assert!(mnemonic_from_seed(b"foo").is_err());
137+
}
138+
106139
#[test]
107140
fn test_mnemonic_to_seed() {
108141
assert!(mnemonic_to_seed("invalid").is_err());

src/rust/bitbox02-rust/src/hww/api/show_mnemonic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub async fn process(hal: &mut impl crate::hal::Hal) -> Result<Response, Error>
3434
crate::keystore::copy_seed()?
3535
};
3636

37-
bitbox02::keystore::bip39_mnemonic_from_seed(&seed)?
37+
crate::bip39::mnemonic_from_seed(&seed)?
3838
};
3939

4040
hal.ui()

src/rust/bitbox02-rust/src/keystore.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub fn create_and_store_seed(password: &str, host_entropy: &[u8]) -> Result<(),
8484

8585
/// Returns the keystore's seed encoded as a BIP-39 mnemonic.
8686
pub fn get_bip39_mnemonic() -> Result<zeroize::Zeroizing<String>, ()> {
87-
keystore::bip39_mnemonic_from_seed(&copy_seed()?)
87+
crate::bip39::mnemonic_from_seed(&copy_seed()?)
8888
}
8989

9090
fn get_xprv(keypath: &[u32]) -> Result<bip32::Xprv, ()> {
@@ -276,7 +276,7 @@ pub fn bip85_bip39(words: u32, index: u32) -> Result<zeroize::Zeroizing<String>,
276276
];
277277

278278
let entropy = bip85_entropy(&keypath)?;
279-
keystore::bip39_mnemonic_from_seed(&entropy[..seed_size])
279+
crate::bip39::mnemonic_from_seed(&entropy[..seed_size])
280280
}
281281

282282
/// Computes a 16 byte deterministic seed specifically for Lightning hot wallets according to BIP-85.

src/rust/bitbox02/src/keystore.rs

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
extern crate alloc;
1616

17-
use alloc::string::{String, ToString};
1817
use alloc::vec;
1918
use alloc::vec::Vec;
2019

@@ -231,11 +230,6 @@ pub fn _copy_bip39_seed() -> Result<zeroize::Zeroizing<Vec<u8>>, ()> {
231230
}
232231
}
233232

234-
pub fn bip39_mnemonic_from_seed(seed: &[u8]) -> Result<zeroize::Zeroizing<String>, ()> {
235-
let mnemonic = bip39::Mnemonic::from_entropy(seed).map_err(|_| ())?;
236-
Ok(zeroize::Zeroizing::new(mnemonic.to_string()))
237-
}
238-
239233
pub struct SignResult {
240234
pub signature: [u8; 64],
241235
pub recid: u8,
@@ -315,36 +309,8 @@ pub fn mock_unlocked(seed: &[u8]) {
315309
mod tests {
316310
use super::*;
317311
use bitcoin::secp256k1;
318-
319312
use util::bb02_async::block_on;
320313

321-
#[test]
322-
fn test_bip39_mnemonic_from_seed() {
323-
// 12 words
324-
let seed = b"\xae\x6a\x40\x26\x1f\x0a\xcc\x16\x57\x04\x9c\xb2\x1a\xf5\xfb\xf7";
325-
assert_eq!(
326-
bip39_mnemonic_from_seed(seed).unwrap().as_str(),
327-
"purpose faith another dignity proud arctic foster near rare stumble leave urge",
328-
);
329-
330-
// 18 words
331-
let seed = b"\x2a\x3e\x07\xa9\xe7\x5e\xd7\x3a\xa6\xb2\xe1\xaf\x90\x3d\x50\x17\xde\x80\x4f\xdf\x2b\x45\xc2\x4b";
332-
assert_eq!(
333-
bip39_mnemonic_from_seed(seed).unwrap().as_str(),
334-
"clay usual tuna solid uniform outer onion found question limit favorite cook trend child lake hamster seat foot",
335-
);
336-
337-
// 24 words
338-
let seed = b"\x24\x1d\x5b\x78\x35\x90\xc2\x1f\x79\x69\x8e\x7c\xe8\x92\xdd\x03\xfb\x2c\x8f\xad\xc2\x44\x0e\xc2\x3a\xa5\xde\x9e\x2d\x23\x81\xb0";
339-
assert_eq!(
340-
bip39_mnemonic_from_seed(seed).unwrap().as_str(),
341-
"catch turn task hen around autumn toss crack language duty resemble among ready elephant require embrace attract balcony practice rule tissue mushroom almost athlete",
342-
);
343-
344-
// Invalid seed side
345-
assert!(bip39_mnemonic_from_seed(b"foo").is_err());
346-
}
347-
348314
#[test]
349315
fn test_derive_bip39_seed() {
350316
struct Test {

0 commit comments

Comments
 (0)