@@ -119,7 +119,7 @@ impl Adapter for EthereumAdapter {
119
119
let message = Message :: from_slice ( & hash_message ( & state_root) ) ;
120
120
let wallet_sign = wallet
121
121
. sign ( & self . keystore_pwd , & message)
122
- . map_err ( |_| map_error ( "failed to sign messages" ) ) ?;
122
+ . map_err ( |err| Error :: SignMessage ( EwtSigningError :: SigningMessage ( err ) ) ) ?;
123
123
let signature: Signature = wallet_sign. into_electrum ( ) . into ( ) ;
124
124
125
125
Ok ( format ! ( "0x{}" , signature) )
@@ -222,7 +222,7 @@ impl Adapter for EthereumAdapter {
222
222
} ;
223
223
224
224
let verified = ewt_verify ( header_encoded, payload_encoded, token_encoded)
225
- . map_err ( |e| map_error ( & e . to_string ( ) ) ) ?;
225
+ . map_err ( |err| AdapterError :: Adapter ( Error :: VerifyMessage ( err ) ) ) ?;
226
226
227
227
if self . whoami ( ) . to_checksum ( ) != verified. payload . id {
228
228
return Err ( AdapterError :: Configuration (
@@ -273,7 +273,7 @@ impl Adapter for EthereumAdapter {
273
273
} ;
274
274
275
275
ewt_sign ( & wallet, & self . keystore_pwd , & payload)
276
- . map_err ( |_| map_error ( "Failed to sign token" ) )
276
+ . map_err ( |err| AdapterError :: Adapter ( Error :: SignMessage ( err ) ) )
277
277
}
278
278
}
279
279
@@ -369,28 +369,32 @@ pub fn ewt_sign(
369
369
signer : & SafeAccount ,
370
370
password : & Password ,
371
371
payload : & Payload ,
372
- ) -> Result < String , Box < dyn std :: error :: Error > > {
372
+ ) -> Result < String , EwtSigningError > {
373
373
let header = Header {
374
374
header_type : "JWT" . to_string ( ) ,
375
375
alg : "ETH" . to_string ( ) ,
376
376
} ;
377
377
378
- let header_encoded =
379
- base64:: encode_config ( & serde_json:: to_string ( & header) ?, base64:: URL_SAFE_NO_PAD ) ;
378
+ let header_encoded = base64:: encode_config (
379
+ & serde_json:: to_string ( & header) . map_err ( EwtSigningError :: HeaderSerialization ) ?,
380
+ base64:: URL_SAFE_NO_PAD ,
381
+ ) ;
380
382
381
- let payload_encoded =
382
- base64:: encode_config ( & serde_json:: to_string ( payload) ?, base64:: URL_SAFE_NO_PAD ) ;
383
+ let payload_encoded = base64:: encode_config (
384
+ & serde_json:: to_string ( payload) . map_err ( EwtSigningError :: PayloadSerialization ) ?,
385
+ base64:: URL_SAFE_NO_PAD ,
386
+ ) ;
383
387
let message = Message :: from_slice ( & hash_message (
384
388
& format ! ( "{}.{}" , header_encoded, payload_encoded) . as_bytes ( ) ,
385
389
) ) ;
386
390
let signature: Signature = signer
387
391
. sign ( password, & message)
388
- . map_err ( |_| map_error ( "sign message" ) ) ?
392
+ . map_err ( EwtSigningError :: SigningMessage ) ?
389
393
. into_electrum ( )
390
394
. into ( ) ;
391
395
392
396
let token = base64:: encode_config (
393
- & hex:: decode ( format ! ( "{}" , signature) ) ?,
397
+ & hex:: decode ( format ! ( "{}" , signature) ) . map_err ( EwtSigningError :: DecodingHexSignature ) ?,
394
398
base64:: URL_SAFE_NO_PAD ,
395
399
) ;
396
400
@@ -401,21 +405,25 @@ pub fn ewt_verify(
401
405
header_encoded : & str ,
402
406
payload_encoded : & str ,
403
407
token : & str ,
404
- ) -> Result < VerifyPayload , Box < dyn std :: error :: Error > > {
408
+ ) -> Result < VerifyPayload , EwtVerifyError > {
405
409
let message = Message :: from_slice ( & hash_message (
406
410
& format ! ( "{}.{}" , header_encoded, payload_encoded) . as_bytes ( ) ,
407
411
) ) ;
408
412
409
- let decoded_signature = base64:: decode_config ( & token, base64:: URL_SAFE_NO_PAD ) ?;
413
+ let decoded_signature = base64:: decode_config ( & token, base64:: URL_SAFE_NO_PAD )
414
+ . map_err ( EwtVerifyError :: SignatureDecoding ) ?;
410
415
let signature = Signature :: from_electrum ( & decoded_signature) ;
411
416
412
- let address = public_to_address ( & recover ( & signature, & message) ?) ;
417
+ let address =
418
+ public_to_address ( & recover ( & signature, & message) . map_err ( EwtVerifyError :: AddressRecovery ) ?) ;
413
419
414
- let payload_string = String :: from_utf8 ( base64:: decode_config (
415
- & payload_encoded,
416
- base64:: URL_SAFE_NO_PAD ,
417
- ) ?) ?;
418
- let payload: Payload = serde_json:: from_str ( & payload_string) ?;
420
+ let payload_string = String :: from_utf8 (
421
+ base64:: decode_config ( & payload_encoded, base64:: URL_SAFE_NO_PAD )
422
+ . map_err ( EwtVerifyError :: PayloadDecoding ) ?,
423
+ )
424
+ . map_err ( EwtVerifyError :: PayloadUtf8 ) ?;
425
+ let payload: Payload =
426
+ serde_json:: from_str ( & payload_string) . map_err ( EwtVerifyError :: PayloadDeserialization ) ?;
419
427
420
428
let verified_payload = VerifyPayload {
421
429
from : ValidatorId :: from ( address. as_fixed_bytes ( ) ) ,
@@ -482,21 +490,72 @@ mod error {
482
490
actual : ChannelId ,
483
491
} ,
484
492
ChannelInactive ( ChannelId ) ,
493
+ /// Signing of the message failed
494
+ SignMessage ( EwtSigningError ) ,
495
+ VerifyMessage ( EwtVerifyError ) ,
485
496
}
486
497
498
+ impl std:: error:: Error for Error { }
499
+
487
500
impl AdapterErrorKind for Error { }
488
501
489
502
impl fmt:: Display for Error {
490
503
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
491
504
use Error :: * ;
492
505
493
506
match self {
494
- Keystore ( err) => write ! ( f, "Keystore error: {}" , err) ,
495
- WalletUnlock ( err) => write ! ( f, "Wallet unlocking error: {}" , err) ,
496
- Web3 ( err) => write ! ( f, "Web3 error: {}" , err) ,
497
- RelayerClient ( err) => write ! ( f, "Relayer client error: {}" , err) ,
507
+ Keystore ( err) => write ! ( f, "Keystore error - {}" , err) ,
508
+ WalletUnlock ( err) => write ! ( f, "Wallet unlocking error - {}" , err) ,
509
+ Web3 ( err) => write ! ( f, "Web3 error - {}" , err) ,
510
+ RelayerClient ( err) => write ! ( f, "Relayer client error - {}" , err) ,
498
511
InvalidChannelId { expected, actual} => write ! ( f, "The hashed EthereumChannel.id ({}) is not the same as the Channel.id ({}) that was provided" , expected, actual) ,
499
- ChannelInactive ( channel_id) => write ! ( f, "Channel ({}) is not Active on the ethereum network" , channel_id)
512
+ ChannelInactive ( channel_id) => write ! ( f, "Channel ({}) is not Active on the ethereum network" , channel_id) ,
513
+ SignMessage ( err) => write ! ( f, "Signing message - {}" , err) ,
514
+ VerifyMessage ( err) => write ! ( f, "Verifying message - {}" , err) ,
515
+ }
516
+ }
517
+ }
518
+
519
+ #[ derive( Debug ) ]
520
+ pub enum EwtSigningError {
521
+ HeaderSerialization ( serde_json:: Error ) ,
522
+ PayloadSerialization ( serde_json:: Error ) ,
523
+ SigningMessage ( ethstore:: Error ) ,
524
+ DecodingHexSignature ( hex:: FromHexError ) ,
525
+ }
526
+
527
+ impl fmt:: Display for EwtSigningError {
528
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
529
+ use EwtSigningError :: * ;
530
+
531
+ match self {
532
+ HeaderSerialization ( err) => write ! ( f, "Header serialization - {}" , err) ,
533
+ PayloadSerialization ( err) => write ! ( f, "Payload serialization - {}" , err) ,
534
+ SigningMessage ( err) => write ! ( f, "{}" , err) ,
535
+ DecodingHexSignature ( err) => write ! ( f, "Decoding hex of Signature - {}" , err) ,
536
+ }
537
+ }
538
+ }
539
+
540
+ #[ derive( Debug ) ]
541
+ pub enum EwtVerifyError {
542
+ AddressRecovery ( parity_crypto:: publickey:: Error ) ,
543
+ SignatureDecoding ( base64:: DecodeError ) ,
544
+ PayloadDecoding ( base64:: DecodeError ) ,
545
+ PayloadDeserialization ( serde_json:: Error ) ,
546
+ PayloadUtf8 ( std:: string:: FromUtf8Error ) ,
547
+ }
548
+
549
+ impl fmt:: Display for EwtVerifyError {
550
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
551
+ use EwtVerifyError :: * ;
552
+
553
+ match self {
554
+ AddressRecovery ( err) => write ! ( f, "Address recovery - {}" , err) ,
555
+ SignatureDecoding ( err) => write ! ( f, "Signature decoding - {}" , err) ,
556
+ PayloadDecoding ( err) => write ! ( f, "Payload decoding - {}" , err) ,
557
+ PayloadDeserialization ( err) => write ! ( f, "Payload deserialization - {}" , err) ,
558
+ PayloadUtf8 ( err) => write ! ( f, "Payload is not a valid utf8 string - {}" , err) ,
500
559
}
501
560
}
502
561
}
0 commit comments