22#![ deny( rust_2018_idioms) ]
33
44use crate :: EthereumChannel ;
5- use base64;
65use chrono:: Utc ;
7- use eth_checksum;
86use 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 ,
108} ;
119use ethsign:: { keyfile:: KeyFile , Protected } ;
12- use hex:: ToHex ;
1310use primitives:: {
1411 adapter:: { Adapter , AdapterError , AdapterOptions , AdapterResult , Session } ,
1512 channel_validator:: ChannelValidator ,
@@ -21,8 +18,7 @@ use std::collections::HashMap;
2118use std:: convert:: TryFrom ;
2219use std:: error:: Error ;
2320use std:: fs:: File ;
24- use std:: path:: { Path , PathBuf } ;
25- use std:: str:: FromStr ;
21+ use std:: path:: Path ;
2622use tiny_keccak:: Keccak ;
2723use web3:: {
2824 contract:: { Contract , Options } ,
@@ -50,20 +46,11 @@ impl Adapter for EthereumAdapter {
5046 type Output = EthereumAdapter ;
5147
5248 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+ ( _, _) => {
6552 return Err ( AdapterError :: Configuration (
66- "Missing keystore pwd " . to_string ( ) ,
53+ "Missing keystore json file or password " . to_string ( ) ,
6754 ) )
6855 }
6956 } ;
@@ -131,7 +118,7 @@ impl Adapter for EthereumAdapter {
131118 let message = Message :: from_slice ( & hash_message ( state_root) ) ;
132119 match & self . wallet {
133120 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 " ) ;
135122 let signature: Signature = wallet_sign. into_electrum ( ) . into ( ) ;
136123 Ok ( format ! ( "0x{}" , signature) )
137124 }
@@ -157,10 +144,7 @@ impl Adapter for EthereumAdapter {
157144
158145 match verify_address ( & address, & signature, & message) {
159146 Ok ( result) => Ok ( result) ,
160- Err ( e) => {
161- println ! ( "{}" , e) ;
162- Ok ( false )
163- }
147+ Err ( _) => Ok ( false ) ,
164148 }
165149 }
166150
@@ -189,12 +173,17 @@ impl Adapter for EthereumAdapter {
189173 ) ) ;
190174 }
191175
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 ( ) ;
193182 let invalid_address_checkum = check_address_checksum ( & validators) ;
194183 if invalid_address_checkum {
195184 return Err ( AdapterError :: Configuration (
196- "channel.validators: all addresses are checksummed" . to_string ( )
197- ) )
185+ "channel.validators: all addresses are checksummed" . to_string ( ) ,
186+ ) ) ;
198187 }
199188 // check if channel is valid
200189 let is_channel_valid = EthereumAdapter :: is_channel_valid ( & self . config , channel) ;
@@ -301,7 +290,7 @@ impl Adapter for EthereumAdapter {
301290
302291fn check_address_checksum ( addresses : & [ & str ] ) -> bool {
303292 let mut invalid_address_checkum = false ;
304-
293+
305294 for address in addresses {
306295 if eth_checksum:: checksum ( address) != * address {
307296 invalid_address_checkum = true ;
@@ -352,46 +341,45 @@ struct Header {
352341}
353342
354343pub fn ewt_sign ( signer : & KeyPair , payload : & Payload ) -> Result < String , Box < dyn Error > > {
355- let header_json = Header {
344+ let header = Header {
356345 header_type : "JWT" . to_string ( ) ,
357346 alg : "ETH" . to_string ( ) ,
358347 } ;
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) )
378369}
379370
380371pub fn ewt_verify ( token : & str ) -> Result < VerifyPayload , Box < dyn Error > > {
381372 let parts: Vec < String > = token. split ( '.' ) . map ( ToString :: to_string) . collect ( ) ;
382373
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 ] ) ) ) ;
388375
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 ) ;
391378
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) ?) ;
394380
381+ let payload_string =
382+ String :: from_utf8 ( base64:: decode_config ( & parts[ 1 ] , base64:: URL_SAFE_NO_PAD ) ?) ?;
395383 let payload: Payload = serde_json:: from_str ( & payload_string) ?;
396384
397385 let verified_payload = VerifyPayload {
@@ -435,18 +423,18 @@ mod test {
435423 eth_adapter. unlock ( ) . expect ( "should unlock eth adapter" ) ;
436424
437425 let whoami = eth_adapter. whoami ( ) . expect ( "failed to get whoami" ) ;
438- println ! ( "whami {}" , whoami) ;
439426 assert_eq ! (
440427 whoami, "0x2bDeAFAE53940669DaA6F519373f686c1f3d3393" ,
441428 "failed to get correct whoami"
442429 ) ;
430+
443431 // Sign
444- let message = "2bdeafae53940669daa6f519373f686c" ;
445432 let expected_response =
446433 "0xce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b" ;
434+ let message = "2bdeafae53940669daa6f519373f686c" ;
447435 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+
450438 // Verify
451439 let signature =
452440 "ce654de0b3d14d63e1cb3181eee7a7a37ef4a06c9fabc204faf96f26357441b625b1be460fbe8f5278cc02aa88a5d0ac2f238e9e3b8e4893760d33bccf77e47f1b" ;
@@ -457,7 +445,7 @@ mod test {
457445 & signature,
458446 )
459447 . expect ( "Failed to verify signatures" ) ;
460- println ! ( "{}" , verify ) ;
448+ assert_eq ! ( verify , true , "invalid signature verification" ) ;
461449 }
462450
463451 #[ test]
0 commit comments