@@ -19,7 +19,23 @@ use bitcoin::Network;
19
19
20
20
use miniscript:: ScriptContext ;
21
21
22
- pub use bip39:: { Language , Mnemonic , MnemonicType , Seed } ;
22
+ pub use bip39:: { Language , Mnemonic } ;
23
+
24
+ type Seed = [ u8 ; 64 ] ;
25
+
26
+ /// Type describing entropy length (aka word count) in the mnemonic
27
+ pub enum WordCount {
28
+ /// 12 words mnemonic (128 bits entropy)
29
+ Words12 = 128 ,
30
+ /// 15 words mnemonic (160 bits entropy)
31
+ Words15 = 160 ,
32
+ /// 18 words mnemonic (192 bits entropy)
33
+ Words18 = 192 ,
34
+ /// 21 words mnemonic (224 bits entropy)
35
+ Words21 = 224 ,
36
+ /// 24 words mnemonic (256 bits entropy)
37
+ Words24 = 256 ,
38
+ }
23
39
24
40
use super :: {
25
41
any_network, DerivableKey , DescriptorKey , ExtendedKey , GeneratableKey , GeneratedKey , KeyError ,
@@ -40,7 +56,7 @@ pub type MnemonicWithPassphrase = (Mnemonic, Option<String>);
40
56
#[ cfg_attr( docsrs, doc( cfg( feature = "keys-bip39" ) ) ) ]
41
57
impl < Ctx : ScriptContext > DerivableKey < Ctx > for Seed {
42
58
fn into_extended_key ( self ) -> Result < ExtendedKey < Ctx > , KeyError > {
43
- Ok ( bip32:: ExtendedPrivKey :: new_master ( Network :: Bitcoin , self . as_bytes ( ) ) ?. into ( ) )
59
+ Ok ( bip32:: ExtendedPrivKey :: new_master ( Network :: Bitcoin , & self [ .. ] ) ?. into ( ) )
44
60
}
45
61
46
62
fn into_descriptor_key (
@@ -60,7 +76,7 @@ impl<Ctx: ScriptContext> DerivableKey<Ctx> for Seed {
60
76
impl < Ctx : ScriptContext > DerivableKey < Ctx > for MnemonicWithPassphrase {
61
77
fn into_extended_key ( self ) -> Result < ExtendedKey < Ctx > , KeyError > {
62
78
let ( mnemonic, passphrase) = self ;
63
- let seed = Seed :: new ( & mnemonic, passphrase . as_deref ( ) . unwrap_or ( "" ) ) ;
79
+ let seed: Seed = mnemonic. to_seed ( passphrase . unwrap_or ( "" . to_string ( ) ) ) ;
64
80
65
81
seed. into_extended_key ( )
66
82
}
@@ -101,15 +117,15 @@ impl<Ctx: ScriptContext> DerivableKey<Ctx> for Mnemonic {
101
117
impl < Ctx : ScriptContext > GeneratableKey < Ctx > for Mnemonic {
102
118
type Entropy = [ u8 ; 32 ] ;
103
119
104
- type Options = ( MnemonicType , Language ) ;
105
- type Error = Option < bip39:: ErrorKind > ;
120
+ type Options = ( WordCount , Language ) ;
121
+ type Error = Option < bip39:: Error > ;
106
122
107
123
fn generate_with_entropy (
108
- ( mnemonic_type , language) : Self :: Options ,
124
+ ( word_count , language) : Self :: Options ,
109
125
entropy : Self :: Entropy ,
110
126
) -> Result < GeneratedKey < Self , Ctx > , Self :: Error > {
111
- let entropy = & entropy. as_ref ( ) [ ..( mnemonic_type . entropy_bits ( ) / 8 ) ] ;
112
- let mnemonic = Mnemonic :: from_entropy ( entropy , language ) . map_err ( |e| e . downcast ( ) . ok ( ) ) ?;
127
+ let entropy = & entropy. as_ref ( ) [ ..( word_count as usize / 8 ) ] ;
128
+ let mnemonic = Mnemonic :: from_entropy_in ( language , entropy ) ?;
113
129
114
130
Ok ( GeneratedKey :: new ( mnemonic, any_network ( ) ) )
115
131
}
@@ -121,15 +137,17 @@ mod test {
121
137
122
138
use bitcoin:: util:: bip32;
123
139
124
- use bip39:: { Language , Mnemonic , MnemonicType } ;
140
+ use bip39:: { Language , Mnemonic } ;
125
141
126
142
use crate :: keys:: { any_network, GeneratableKey , GeneratedKey } ;
127
143
144
+ use super :: WordCount ;
145
+
128
146
#[ test]
129
147
fn test_keys_bip39_mnemonic ( ) {
130
148
let mnemonic =
131
149
"aim bunker wash balance finish force paper analyst cabin spoon stable organ" ;
132
- let mnemonic = Mnemonic :: from_phrase ( mnemonic , Language :: English ) . unwrap ( ) ;
150
+ let mnemonic = Mnemonic :: parse_in ( Language :: English , mnemonic ) . unwrap ( ) ;
133
151
let path = bip32:: DerivationPath :: from_str ( "m/44'/0'/0'/0" ) . unwrap ( ) ;
134
152
135
153
let key = ( mnemonic, path) ;
@@ -143,7 +161,7 @@ mod test {
143
161
fn test_keys_bip39_mnemonic_passphrase ( ) {
144
162
let mnemonic =
145
163
"aim bunker wash balance finish force paper analyst cabin spoon stable organ" ;
146
- let mnemonic = Mnemonic :: from_phrase ( mnemonic , Language :: English ) . unwrap ( ) ;
164
+ let mnemonic = Mnemonic :: parse_in ( Language :: English , mnemonic ) . unwrap ( ) ;
147
165
let path = bip32:: DerivationPath :: from_str ( "m/44'/0'/0'/0" ) . unwrap ( ) ;
148
166
149
167
let key = ( ( mnemonic, Some ( "passphrase" . into ( ) ) ) , path) ;
@@ -157,7 +175,7 @@ mod test {
157
175
fn test_keys_generate_bip39 ( ) {
158
176
let generated_mnemonic: GeneratedKey < _ , miniscript:: Segwitv0 > =
159
177
Mnemonic :: generate_with_entropy (
160
- ( MnemonicType :: Words12 , Language :: English ) ,
178
+ ( WordCount :: Words12 , Language :: English ) ,
161
179
crate :: keys:: test:: TEST_ENTROPY ,
162
180
)
163
181
. unwrap ( ) ;
@@ -169,7 +187,7 @@ mod test {
169
187
170
188
let generated_mnemonic: GeneratedKey < _ , miniscript:: Segwitv0 > =
171
189
Mnemonic :: generate_with_entropy (
172
- ( MnemonicType :: Words24 , Language :: English ) ,
190
+ ( WordCount :: Words24 , Language :: English ) ,
173
191
crate :: keys:: test:: TEST_ENTROPY ,
174
192
)
175
193
. unwrap ( ) ;
@@ -180,11 +198,11 @@ mod test {
180
198
#[ test]
181
199
fn test_keys_generate_bip39_random ( ) {
182
200
let generated_mnemonic: GeneratedKey < _ , miniscript:: Segwitv0 > =
183
- Mnemonic :: generate ( ( MnemonicType :: Words12 , Language :: English ) ) . unwrap ( ) ;
201
+ Mnemonic :: generate ( ( WordCount :: Words12 , Language :: English ) ) . unwrap ( ) ;
184
202
assert_eq ! ( generated_mnemonic. valid_networks, any_network( ) ) ;
185
203
186
204
let generated_mnemonic: GeneratedKey < _ , miniscript:: Segwitv0 > =
187
- Mnemonic :: generate ( ( MnemonicType :: Words24 , Language :: English ) ) . unwrap ( ) ;
205
+ Mnemonic :: generate ( ( WordCount :: Words24 , Language :: English ) ) . unwrap ( ) ;
188
206
assert_eq ! ( generated_mnemonic. valid_networks, any_network( ) ) ;
189
207
}
190
208
}
0 commit comments