2
2
#![ deny( rust_2018_idioms) ]
3
3
4
4
use crate :: EthereumChannel ;
5
- use base64;
6
5
use chrono:: Utc ;
7
- use eth_checksum;
8
6
use ethkey:: {
9
- public_to_address, recover, sign, verify_address, Address , KeyPair , Message , Public , Signature ,
7
+ public_to_address, recover, sign, verify_address, Address , KeyPair , Message , Signature ,
10
8
} ;
11
9
use ethsign:: { keyfile:: KeyFile , Protected } ;
12
- use hex:: ToHex ;
13
10
use primitives:: {
14
11
adapter:: { Adapter , AdapterError , AdapterOptions , AdapterResult , Session } ,
15
12
channel_validator:: ChannelValidator ,
@@ -21,8 +18,7 @@ use std::collections::HashMap;
21
18
use std:: convert:: TryFrom ;
22
19
use std:: error:: Error ;
23
20
use std:: fs:: File ;
24
- use std:: path:: { Path , PathBuf } ;
25
- use std:: str:: FromStr ;
21
+ use std:: path:: Path ;
26
22
use tiny_keccak:: Keccak ;
27
23
use web3:: {
28
24
contract:: { Contract , Options } ,
@@ -50,20 +46,11 @@ impl Adapter for EthereumAdapter {
50
46
type Output = EthereumAdapter ;
51
47
52
48
fn init ( opts : AdapterOptions , config : & Config ) -> AdapterResult < EthereumAdapter > {
53
- let keystore_json = match opts. keystore_file {
54
- Some ( file) => file,
55
- None => {
56
- return Err ( AdapterError :: Configuration (
57
- "Missing keystore json file" . to_string ( ) ,
58
- ) )
59
- }
60
- } ;
61
-
62
- let keystore_pwd = match opts. keystore_pwd {
63
- Some ( file) => file,
64
- None => {
49
+ let ( keystore_json, keystore_pwd) = match ( opts. keystore_file , opts. keystore_pwd ) {
50
+ ( Some ( file) , Some ( pwd) ) => ( file, pwd) ,
51
+ ( _, _) => {
65
52
return Err ( AdapterError :: Configuration (
66
- "Missing keystore pwd " . to_string ( ) ,
53
+ "Missing keystore json file or password " . to_string ( ) ,
67
54
) )
68
55
}
69
56
} ;
@@ -131,7 +118,7 @@ impl Adapter for EthereumAdapter {
131
118
let message = Message :: from_slice ( & hash_message ( state_root) ) ;
132
119
match & self . wallet {
133
120
Some ( wallet) => {
134
- let wallet_sign = sign ( wallet. secret ( ) , & message) . expect ( "sign message " ) ;
121
+ let wallet_sign = sign ( wallet. secret ( ) , & message) . expect ( "failed to sign messages " ) ;
135
122
let signature: Signature = wallet_sign. into_electrum ( ) . into ( ) ;
136
123
Ok ( format ! ( "0x{}" , signature) )
137
124
}
@@ -157,10 +144,7 @@ impl Adapter for EthereumAdapter {
157
144
158
145
match verify_address ( & address, & signature, & message) {
159
146
Ok ( result) => Ok ( result) ,
160
- Err ( e) => {
161
- println ! ( "{}" , e) ;
162
- Ok ( false )
163
- }
147
+ Err ( _) => Ok ( false ) ,
164
148
}
165
149
}
166
150
@@ -189,12 +173,17 @@ impl Adapter for EthereumAdapter {
189
173
) ) ;
190
174
}
191
175
192
- let validators: Vec < & str > = channel. spec . validators . into_iter ( ) . map ( |v| & v. id [ ..] ) . collect ( ) ;
176
+ let validators: Vec < & str > = channel
177
+ . spec
178
+ . validators
179
+ . into_iter ( )
180
+ . map ( |v| & v. id [ ..] )
181
+ . collect ( ) ;
193
182
let invalid_address_checkum = check_address_checksum ( & validators) ;
194
183
if invalid_address_checkum {
195
184
return Err ( AdapterError :: Configuration (
196
- "channel.validators: all addresses are checksummed" . to_string ( )
197
- ) )
185
+ "channel.validators: all addresses are checksummed" . to_string ( ) ,
186
+ ) ) ;
198
187
}
199
188
// check if channel is valid
200
189
let is_channel_valid = EthereumAdapter :: is_channel_valid ( & self . config , channel) ;
@@ -301,7 +290,7 @@ impl Adapter for EthereumAdapter {
301
290
302
291
fn check_address_checksum ( addresses : & [ & str ] ) -> bool {
303
292
let mut invalid_address_checkum = false ;
304
-
293
+
305
294
for address in addresses {
306
295
if eth_checksum:: checksum ( address) != * address {
307
296
invalid_address_checkum = true ;
@@ -352,46 +341,45 @@ struct Header {
352
341
}
353
342
354
343
pub fn ewt_sign ( signer : & KeyPair , payload : & Payload ) -> Result < String , Box < dyn Error > > {
355
- let header_json = Header {
344
+ let header = Header {
356
345
header_type : "JWT" . to_string ( ) ,
357
346
alg : "ETH" . to_string ( ) ,
358
347
} ;
359
- let header_1 = serde_json:: to_string ( & header_json) ?;
360
- println ! ( "header json {}" , header_1) ;
361
-
362
- let header = base64:: encode_config ( & header_1. as_bytes ( ) , base64:: URL_SAFE_NO_PAD ) ;
363
- println ! ( "header hex {}" , header) ;
364
- let payload_json = serde_json:: to_string ( & payload) ?;
365
- println ! ( "payload json hex {}" , payload_json) ;
366
- let payload_encoded = base64:: encode_config ( & payload_json, base64:: URL_SAFE_NO_PAD ) ;
367
- let payload_string = format ! ( "{}.{}" , header, payload_encoded) ;
368
-
369
- println ! ( "payload string {}" , payload_string) ;
370
-
371
- let message = Message :: from_slice ( & hash_message ( & payload_string) ) ;
372
- let wallet_sign = sign ( signer. secret ( ) , & message) ?;
373
- let signature: Signature = wallet_sign. into_electrum ( ) . into ( ) ;
374
- println ! ( "\n available signature {} \n " , signature) ;
375
- let sig_hex = hex:: decode ( format ! ( "{}" , signature) ) ?;
376
- let tail = base64:: encode_config ( & sig_hex, base64:: URL_SAFE_NO_PAD ) ;
377
- Ok ( format ! ( "{}.{}.{}" , header, payload_encoded, tail) )
348
+
349
+ let header_encoded = base64:: encode_config (
350
+ & serde_json:: to_string ( & header) ?. as_bytes ( ) ,
351
+ base64:: URL_SAFE_NO_PAD ,
352
+ ) ;
353
+
354
+ let payload_encoded =
355
+ base64:: encode_config ( & serde_json:: to_string ( payload) ?, base64:: URL_SAFE_NO_PAD ) ;
356
+
357
+ let message = Message :: from_slice ( & hash_message ( & format ! (
358
+ "{}.{}" ,
359
+ header_encoded, payload_encoded
360
+ ) ) ) ;
361
+ let signature: Signature = sign ( signer. secret ( ) , & message) ?. into_electrum ( ) . into ( ) ;
362
+
363
+ let token = base64:: encode_config (
364
+ & hex:: decode ( format ! ( "{}" , signature) ) ?,
365
+ base64:: URL_SAFE_NO_PAD ,
366
+ ) ;
367
+
368
+ Ok ( format ! ( "{}.{}.{}" , header_encoded, payload_encoded, token) )
378
369
}
379
370
380
371
pub fn ewt_verify ( token : & str ) -> Result < VerifyPayload , Box < dyn Error > > {
381
372
let parts: Vec < String > = token. split ( '.' ) . map ( ToString :: to_string) . collect ( ) ;
382
373
383
- let msg = format ! ( "{}.{}" , parts[ 0 ] , parts[ 1 ] ) ;
384
- let message = Message :: from_slice ( & hash_message ( & msg) ) ;
385
-
386
- let sig = base64:: decode_config ( & parts[ 2 ] , base64:: URL_SAFE_NO_PAD ) ?;
387
- let signature = Signature :: from_electrum ( & sig) ;
374
+ let message = Message :: from_slice ( & hash_message ( & format ! ( "{}.{}" , parts[ 0 ] , parts[ 1 ] ) ) ) ;
388
375
389
- let public_key = recover ( & signature , & message ) ?;
390
- let address = public_to_address ( & public_key ) ;
376
+ let decoded_signature = base64 :: decode_config ( & parts [ 2 ] , base64 :: URL_SAFE_NO_PAD ) ?;
377
+ let signature = Signature :: from_electrum ( & decoded_signature ) ;
391
378
392
- let decode_part1 = base64:: decode_config ( & parts[ 1 ] , base64:: URL_SAFE_NO_PAD ) ?;
393
- let payload_string = String :: from_utf8 ( decode_part1) ?;
379
+ let address = public_to_address ( & recover ( & signature, & message) ?) ;
394
380
381
+ let payload_string =
382
+ String :: from_utf8 ( base64:: decode_config ( & parts[ 1 ] , base64:: URL_SAFE_NO_PAD ) ?) ?;
395
383
let payload: Payload = serde_json:: from_str ( & payload_string) ?;
396
384
397
385
let verified_payload = VerifyPayload {
@@ -435,18 +423,18 @@ mod test {
435
423
eth_adapter. unlock ( ) . expect ( "should unlock eth adapter" ) ;
436
424
437
425
let whoami = eth_adapter. whoami ( ) . expect ( "failed to get whoami" ) ;
438
- println ! ( "whami {}" , whoami) ;
439
426
assert_eq ! (
440
427
whoami, "0x2bDeAFAE53940669DaA6F519373f686c1f3d3393" ,
441
428
"failed to get correct whoami"
442
429
) ;
430
+
443
431
// Sign
444
- let message = "2bdeafae53940669daa6f519373f686c" ;
445
432
let expected_response =
446
433
"0xce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b" ;
434
+ let message = "2bdeafae53940669daa6f519373f686c" ;
447
435
let response = eth_adapter. sign ( message) . expect ( "failed to sign message" ) ;
448
- println ! ( "{}" , response) ;
449
- // assert_eq!(expected_response, response, "invalid signature");
436
+ assert_eq ! ( expected_response , response, "invalid signature" ) ;
437
+
450
438
// Verify
451
439
let signature =
452
440
"ce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b" ;
@@ -457,7 +445,7 @@ mod test {
457
445
& signature,
458
446
)
459
447
. expect ( "Failed to verify signatures" ) ;
460
- println ! ( "{}" , verify ) ;
448
+ assert_eq ! ( verify , true , "invalid signature verification" ) ;
461
449
}
462
450
463
451
#[ test]
0 commit comments