@@ -115,7 +115,9 @@ impl Adapter for EthereumAdapter {
115
115
116
116
fn sign ( & self , state_root : & str ) -> AdapterResult < String > {
117
117
if let Some ( wallet) = & self . wallet {
118
- let message = Message :: from_slice ( & hash_message ( state_root) ) ;
118
+ let state_root = hex:: decode ( state_root)
119
+ . map_err ( |_| AdapterError :: Signature ( "invalid state_root" . to_string ( ) ) ) ?;
120
+ let message = Message :: from_slice ( & hash_message ( & state_root) ) ;
119
121
let wallet_sign = wallet
120
122
. sign ( & self . keystore_pwd , & message)
121
123
. map_err ( |_| map_error ( "failed to sign messages" ) ) ?;
@@ -130,11 +132,16 @@ impl Adapter for EthereumAdapter {
130
132
}
131
133
132
134
fn verify ( & self , signer : & ValidatorId , state_root : & str , sig : & str ) -> AdapterResult < bool > {
133
- let decoded_signature = hex:: decode ( sig)
135
+ if !sig. starts_with ( "0x" ) {
136
+ return Err ( AdapterError :: Signature ( "not 0x prefixed hex" . to_string ( ) ) ) ;
137
+ }
138
+ let decoded_signature = hex:: decode ( & sig[ 2 ..] )
134
139
. map_err ( |_| AdapterError :: Signature ( "invalid signature" . to_string ( ) ) ) ?;
135
140
let address = Address :: from_slice ( signer. inner ( ) ) ;
136
141
let signature = Signature :: from_electrum ( & decoded_signature) ;
137
- let message = Message :: from_slice ( & hash_message ( state_root) ) ;
142
+ let state_root = hex:: decode ( state_root)
143
+ . map_err ( |_| AdapterError :: Signature ( "invalid state_root" . to_string ( ) ) ) ?;
144
+ let message = Message :: from_slice ( & hash_message ( & state_root) ) ;
138
145
139
146
verify_address ( & address, & signature, & message) . or_else ( |_| Ok ( false ) )
140
147
}
@@ -314,14 +321,13 @@ impl RelayerClient {
314
321
}
315
322
}
316
323
317
- fn hash_message ( message : & str ) -> [ u8 ; 32 ] {
324
+ fn hash_message ( message : & [ u8 ] ) -> [ u8 ; 32 ] {
318
325
let eth = "\x19 Ethereum Signed Message:\n " ;
319
326
let message_length = message. len ( ) ;
320
327
321
- let encoded = format ! ( "{}{}{}" , eth, message_length, message) ;
322
-
323
328
let mut result = Keccak :: new_keccak256 ( ) ;
324
- result. update ( & encoded. as_bytes ( ) ) ;
329
+ result. update ( & format ! ( "{}{}" , eth, message_length) . as_bytes ( ) ) ;
330
+ result. update ( & message) ;
325
331
326
332
let mut res: [ u8 ; 32 ] = [ 0 ; 32 ] ;
327
333
result. finalize ( & mut res) ;
@@ -371,10 +377,9 @@ pub fn ewt_sign(
371
377
372
378
let payload_encoded =
373
379
base64:: encode_config ( & serde_json:: to_string ( payload) ?, base64:: URL_SAFE_NO_PAD ) ;
374
- let message = Message :: from_slice ( & hash_message ( & format ! (
375
- "{}.{}" ,
376
- header_encoded, payload_encoded
377
- ) ) ) ;
380
+ let message = Message :: from_slice ( & hash_message (
381
+ & format ! ( "{}.{}" , header_encoded, payload_encoded) . as_bytes ( ) ,
382
+ ) ) ;
378
383
let signature: Signature = signer
379
384
. sign ( password, & message)
380
385
. map_err ( |_| map_error ( "sign message" ) ) ?
@@ -394,10 +399,9 @@ pub fn ewt_verify(
394
399
payload_encoded : & str ,
395
400
token : & str ,
396
401
) -> Result < VerifyPayload , Box < dyn Error > > {
397
- let message = Message :: from_slice ( & hash_message ( & format ! (
398
- "{}.{}" ,
399
- header_encoded, payload_encoded
400
- ) ) ) ;
402
+ let message = Message :: from_slice ( & hash_message (
403
+ & format ! ( "{}.{}" , header_encoded, payload_encoded) . as_bytes ( ) ,
404
+ ) ) ;
401
405
402
406
let decoded_signature = base64:: decode_config ( & token, base64:: URL_SAFE_NO_PAD ) ?;
403
407
let signature = Signature :: from_electrum ( & decoded_signature) ;
@@ -466,19 +470,19 @@ mod test {
466
470
467
471
// Sign
468
472
let expected_response =
469
- "0xce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b " ;
473
+ "0x625fd46f82c4cfd135ea6a8534e85dbf50beb157046dce59d2e97aacdf4e38381d1513c0e6f002b2f05c05458038b187754ff38cc0658dfc9ba854cccfb6e13e1b " ;
470
474
let message = "2bdeafae53940669daa6f519373f686c" ;
471
475
let response = eth_adapter. sign ( message) . expect ( "failed to sign message" ) ;
472
476
assert_eq ! ( expected_response, response, "invalid signature" ) ;
473
477
474
478
// Verify
475
479
let signature =
476
- "ce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b " ;
480
+ "0x9e07f12958ce7c5eb1362eb9461e4745dd9d74a42b921391393caea700bfbd6e1ad876a7d8f9202ef1fe6110dbfe87840c5676ca5c4fda9f3330694a1ac2a1fc1b " ;
477
481
let verify = eth_adapter
478
482
. verify (
479
- & ValidatorId :: try_from ( "2bDeAFAE53940669DaA6F519373f686c1f3d3393 " )
483
+ & ValidatorId :: try_from ( "2892f6C41E0718eeeDd49D98D648C789668cA67d " )
480
484
. expect ( "Failed to parse id" ) ,
481
- "2bdeafae53940669daa6f519373f686c " ,
485
+ "8bc45d8eb27f4c98cab35d17b0baecc2a263d6831ef0800f4c190cbfac6d20a3 " ,
482
486
& signature,
483
487
)
484
488
. expect ( "Failed to verify signatures" ) ;
0 commit comments