From da09b95baed89d1b0e7697dc3aa985c6f7a494d6 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 25 Aug 2023 05:19:47 -0500 Subject: [PATCH] keyfork-mnemonic-util: Mnemonic::seed(&self) -> Vec --- keyfork-mnemonic-util/src/lib.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/keyfork-mnemonic-util/src/lib.rs b/keyfork-mnemonic-util/src/lib.rs index ee97432..017e00f 100644 --- a/keyfork-mnemonic-util/src/lib.rs +++ b/keyfork-mnemonic-util/src/lib.rs @@ -197,6 +197,26 @@ impl Mnemonic { Ok(Mnemonic { words, wordlist }) } + #[must_use] + pub fn seed(&self) -> Vec { + let mut bits = vec![false; self.words.len() * 11]; + for (index, word) in self.words.iter().enumerate() { + for bit in 0..11 { + bits[index * 11 + bit] = (word & (1 << (10 - bit))) > 0; + } + } + bits.truncate(bits.len() - bits.len() % 32); + bits.chunks_exact(8) + .map(|chunk| { + let mut num = 0u8; + for i in 0..8 { + num += u8::from(chunk[7 - i]) << i; + } + num + }) + .collect::>() + } + #[must_use] pub fn into_inner(self) -> (Vec, Arc) { (self.words, self.wordlist) @@ -219,6 +239,17 @@ mod tests { ); } + #[test] + fn reproduces_its_own_seed() { + let mut random_handle = File::open("/dev/random").unwrap(); + let entropy = &mut [0u8; 256 / 8]; + random_handle.read_exact(&mut entropy[..]).unwrap(); + let wordlist = Wordlist::default().arc(); + let mnemonic = super::Mnemonic::from_entropy(&entropy[..256 / 8], wordlist).unwrap(); + let seed = mnemonic.seed(); + assert_eq!(&seed, entropy); + } + #[test] fn conforms_to_trezor_tests() { let content = include_str!("data/vectors.json");