@@ -12,6 +12,14 @@ use crate::{
12
12
} ,
13
13
} ;
14
14
15
+ const MAX_TOKEN_SIZE : u8 = 5 ;
16
+ const PATH_LENGTH : usize = 20 ;
17
+ const HASH_LENGTH : usize = 32 ;
18
+ const PATH_HEX_LENGTH : usize = PATH_LENGTH * 2 ;
19
+ const FIRST_FRAME_PREFIX_LENGTH : usize = PATH_LENGTH + 1 ; // path + 1 byte token size
20
+ const CALL_CONTRACT_FLAG : u8 = 0x01 ;
21
+ const SCRIPT_OFFSET : usize = 3 ; // the encoded script offset in the tx
22
+
15
23
#[ repr( u8 ) ]
16
24
pub enum Ins {
17
25
GetVersion ,
@@ -58,23 +66,24 @@ pub fn handle_apdu(
58
66
}
59
67
Ins :: GetPubKey => {
60
68
let data = comm. get_data ( ) ?;
61
- if data. len ( ) != 21 {
69
+ // 1 byte flag indicating whether address verification is needed
70
+ if data. len ( ) != PATH_LENGTH + 1 {
62
71
return Err ( ErrorCode :: BadLen . into ( ) ) ;
63
72
}
64
- let raw_path = & data[ ..20 ] ;
73
+ let raw_path = & data[ ..PATH_LENGTH ] ;
65
74
deserialize_path :: < io:: Reply > (
66
75
raw_path,
67
76
& mut path,
68
77
ErrorCode :: HDPathDecodingFailed . into ( ) ,
69
78
) ?;
70
79
71
80
println ( "raw path" ) ;
72
- println_slice :: < 40 > ( raw_path) ;
81
+ println_slice :: < PATH_HEX_LENGTH > ( raw_path) ;
73
82
let p1 = apdu_header. p1 ;
74
83
let p2 = apdu_header. p2 ;
75
84
let ( pk, hd_index) = derive_pub_key ( & mut path, p1, p2) ?;
76
85
77
- let need_to_display = data[ 20 ] != 0 ;
86
+ let need_to_display = data[ PATH_LENGTH ] != 0 ;
78
87
if need_to_display {
79
88
review_address ( & pk) ?;
80
89
}
@@ -84,17 +93,17 @@ pub fn handle_apdu(
84
93
}
85
94
Ins :: SignHash => {
86
95
let data = comm. get_data ( ) ?;
87
- if data. len ( ) != 4 * 5 + 32 {
96
+ if data. len ( ) != PATH_LENGTH + HASH_LENGTH {
88
97
return Err ( ErrorCode :: BadLen . into ( ) ) ;
89
98
}
90
99
// This check can be removed, but we keep it for double checking
91
100
deserialize_path :: < io:: Reply > (
92
- & data[ ..20 ] ,
101
+ & data[ ..PATH_LENGTH ] ,
93
102
& mut path,
94
103
ErrorCode :: HDPathDecodingFailed . into ( ) ,
95
104
) ?;
96
105
97
- match sign_hash_ui ( & path, & data[ 20 ..] ) {
106
+ match sign_hash_ui ( & path, & data[ PATH_LENGTH ..] ) {
98
107
Ok ( ( signature_buf, length, _) ) => comm. append ( & signature_buf[ ..length as usize ] ) ,
99
108
Err ( code) => return Err ( code. into ( ) ) ,
100
109
}
@@ -127,32 +136,31 @@ pub fn handle_apdu(
127
136
Ok ( ( ) )
128
137
}
129
138
130
- const MAX_TOKEN_SIZE : u8 = 5 ;
131
-
132
139
fn handle_sign_tx (
133
140
apdu_header : & ApduHeader ,
134
141
data : & [ u8 ] ,
135
142
sign_tx_context : & mut SignTxContext ,
136
143
tx_reviewer : & mut TxReviewer ,
137
144
) -> Result < ( ) , ErrorCode > {
138
145
match apdu_header. p1 {
139
- 0 if data. len ( ) < 21 => Err ( ErrorCode :: BadLen ) , // 20 bytes path + 1 byte token size
146
+ 0 if data. len ( ) < FIRST_FRAME_PREFIX_LENGTH => Err ( ErrorCode :: BadLen ) ,
140
147
0 => {
141
- sign_tx_context. init ( data) ?;
142
- let token_size = data[ 20 ] ;
148
+ sign_tx_context. init ( & data[ .. PATH_LENGTH ] ) ?;
149
+ let token_size = data[ FIRST_FRAME_PREFIX_LENGTH - 1 ] ;
143
150
if token_size > MAX_TOKEN_SIZE {
144
151
return Err ( ErrorCode :: InvalidTokenSize ) ;
145
152
}
146
- let tx_data_index: usize = 21 + TOKEN_METADATA_SIZE * ( token_size as usize ) ;
147
- if data. len ( ) < tx_data_index + 3 {
153
+ let tx_data_index: usize =
154
+ FIRST_FRAME_PREFIX_LENGTH + TOKEN_METADATA_SIZE * ( token_size as usize ) ;
155
+ if data. len ( ) < tx_data_index + SCRIPT_OFFSET {
148
156
return Err ( ErrorCode :: BadLen ) ;
149
157
}
150
158
let tx_data = & data[ tx_data_index..] ;
151
- let is_tx_execute_script = tx_data[ 2 ] == 0x01 ;
159
+ let is_tx_execute_script = tx_data[ SCRIPT_OFFSET - 1 ] == CALL_CONTRACT_FLAG ;
152
160
if is_tx_execute_script {
153
161
check_blind_signing ( ) ?;
154
162
}
155
- let token_metadata = & data[ 21 ..tx_data_index] ;
163
+ let token_metadata = & data[ FIRST_FRAME_PREFIX_LENGTH ..tx_data_index] ;
156
164
check_token_metadata ( token_size, token_metadata) ?;
157
165
tx_reviewer. init ( is_tx_execute_script, token_metadata) ?;
158
166
sign_tx_context. handle_data ( apdu_header, tx_data, tx_reviewer)
0 commit comments