@@ -17,21 +17,23 @@ use util::bip32::HARDENED;
17
17
const ACCOUNT_MAX : u32 = 99 ; // 100 accounts
18
18
19
19
/// Does limit checks the keypath, whitelisting bip44 purpose, account and change.
20
- /// Only allows the well-known xpub of m'/44'/60'/0'/0 for now.
20
+ /// Only allows the well-known xpubs of m'/44'/60'/0'/0 and m'/44'/1 '/0'/0 for now.
21
21
/// Since ethereum doesn't use the "change" path part it is always 0 and have become part of the
22
22
/// xpub keypath.
23
23
/// @return true if the keypath is valid, false if it is invalid.
24
- pub fn is_valid_keypath_xpub ( keypath : & [ u32 ] , expected_coin : u32 ) -> bool {
25
- keypath. len ( ) == 4 && keypath[ ..4 ] == [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 ]
24
+ pub fn is_valid_keypath_xpub ( keypath : & [ u32 ] ) -> bool {
25
+ keypath. len ( ) == 4
26
+ && ( keypath[ ..4 ] == [ 44 + HARDENED , 60 + HARDENED , 0 + HARDENED , 0 ]
27
+ || keypath[ ..4 ] == [ 44 + HARDENED , 1 + HARDENED , 0 + HARDENED , 0 ] )
26
28
}
27
29
28
30
/// Does limit checks the keypath, whitelisting bip44 purpose, account and change.
29
31
/// Returns true if the keypath is valid, false if it is invalid.
30
- pub fn is_valid_keypath_address ( keypath : & [ u32 ] , expected_coin : u32 ) -> bool {
32
+ pub fn is_valid_keypath_address ( keypath : & [ u32 ] ) -> bool {
31
33
if keypath. len ( ) != 5 {
32
34
return false ;
33
35
}
34
- if !is_valid_keypath_xpub ( & keypath[ ..4 ] , expected_coin ) {
36
+ if !is_valid_keypath_xpub ( & keypath[ ..4 ] ) {
35
37
return false ;
36
38
}
37
39
if keypath[ 4 ] > ACCOUNT_MAX {
@@ -46,66 +48,98 @@ mod tests {
46
48
47
49
#[ test]
48
50
fn test_is_valid_keypath_xpub ( ) {
49
- let expected_coin = 60 + HARDENED ;
50
- assert ! ( is_valid_keypath_xpub(
51
- & [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 ] ,
52
- expected_coin
53
- ) ) ;
51
+ assert ! ( is_valid_keypath_xpub( & [
52
+ 44 + HARDENED ,
53
+ 60 + HARDENED ,
54
+ 0 + HARDENED ,
55
+ 0
56
+ ] ) ) ;
57
+ assert ! ( is_valid_keypath_xpub( & [
58
+ 44 + HARDENED ,
59
+ 1 + HARDENED ,
60
+ 0 + HARDENED ,
61
+ 0
62
+ ] ) ) ;
54
63
// wrong coin.
55
- assert ! ( !is_valid_keypath_xpub(
56
- & [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 ] ,
57
- expected_coin + 1 ,
58
- ) ) ;
64
+ assert ! ( !is_valid_keypath_xpub( & [
65
+ 44 + HARDENED ,
66
+ 0 + HARDENED ,
67
+ 0 + HARDENED ,
68
+ 0
69
+ ] ) ) ;
59
70
// too short
60
- assert ! ( !is_valid_keypath_xpub(
61
- & [ 44 + HARDENED , expected_coin, 0 + HARDENED ] ,
62
- expected_coin + 1 ,
63
- ) ) ;
71
+ assert ! ( !is_valid_keypath_xpub( & [
72
+ 44 + HARDENED ,
73
+ 60 + HARDENED ,
74
+ 0 + HARDENED
75
+ ] ) ) ;
64
76
// too long
65
- assert ! ( !is_valid_keypath_xpub(
66
- & [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 , 0 ] ,
67
- expected_coin + 1 ,
68
- ) ) ;
77
+ assert ! ( !is_valid_keypath_xpub( & [
78
+ 44 + HARDENED ,
79
+ 60 + HARDENED ,
80
+ 0 + HARDENED ,
81
+ 0 ,
82
+ 0
83
+ ] ) ) ;
69
84
}
70
85
71
86
#[ test]
72
87
fn test_is_valid_keypath_address ( ) {
73
- let expected_coin = 60 + HARDENED ;
74
- let keypath_for_account =
75
- |account| [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 , account] ;
76
-
77
88
// 100 good paths.
78
89
for account in 0 ..100 {
79
- assert ! ( is_valid_keypath_address(
80
- & keypath_for_account( account) ,
81
- expected_coin
82
- ) ) ;
90
+ assert ! ( is_valid_keypath_address( & [
91
+ 44 + HARDENED ,
92
+ 60 + HARDENED ,
93
+ 0 + HARDENED ,
94
+ 0 ,
95
+ account
96
+ ] ) ) ;
97
+ assert ! ( is_valid_keypath_address( & [
98
+ 44 + HARDENED ,
99
+ 1 + HARDENED ,
100
+ 0 + HARDENED ,
101
+ 0 ,
102
+ account
103
+ ] ) ) ;
83
104
// wrong coin
84
- assert ! ( !is_valid_keypath_address(
85
- & keypath_for_account( account) ,
86
- expected_coin + 1
87
- ) ) ;
105
+ assert ! ( !is_valid_keypath_address( & [
106
+ 44 + HARDENED ,
107
+ 0 + HARDENED ,
108
+ 0 + HARDENED ,
109
+ 0 ,
110
+ account
111
+ ] ) ) ;
88
112
}
89
- assert ! ( !is_valid_keypath_address(
90
- & keypath_for_account( 100 ) ,
91
- expected_coin
92
- ) ) ;
113
+ // account too high
114
+ assert ! ( !is_valid_keypath_address( & [
115
+ 44 + HARDENED ,
116
+ 60 + HARDENED ,
117
+ 0 + HARDENED ,
118
+ 0 ,
119
+ 100
120
+ ] ) ) ;
93
121
94
122
// too short
95
- assert ! ( !is_valid_keypath_address(
96
- & [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 ] ,
97
- expected_coin
98
- ) ) ;
123
+ assert ! ( !is_valid_keypath_address( & [
124
+ 44 + HARDENED ,
125
+ 60 + HARDENED ,
126
+ 0 + HARDENED ,
127
+ 0
128
+ ] ) ) ;
99
129
// too long
100
- assert ! ( !is_valid_keypath_address(
101
- & [ 44 + HARDENED , expected_coin, 0 + HARDENED , 0 , 0 , 0 ] ,
102
- expected_coin
103
- ) ) ;
130
+ assert ! ( !is_valid_keypath_address( & [
131
+ 44 + HARDENED ,
132
+ 60 + HARDENED ,
133
+ 0 + HARDENED ,
134
+ 0 ,
135
+ 0 ,
136
+ 0
137
+ ] ) ) ;
104
138
// tweak keypath elements
105
139
for i in 0 ..4 {
106
- let mut keypath = keypath_for_account ( 0 ) ;
140
+ let mut keypath = [ 44 + HARDENED , 60 + HARDENED , 0 + HARDENED , 0 , 0 ] ;
107
141
keypath[ i] += 1 ;
108
- assert ! ( !is_valid_keypath_address( & keypath, expected_coin ) ) ;
142
+ assert ! ( !is_valid_keypath_address( & keypath) ) ;
109
143
}
110
144
}
111
145
}
0 commit comments