Skip to content

Commit 73971a7

Browse files
committed
adapter - ewt_sign & ewt_verify errors
1 parent b499d43 commit 73971a7

File tree

1 file changed

+82
-23
lines changed

1 file changed

+82
-23
lines changed

adapter/src/ethereum.rs

Lines changed: 82 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ impl Adapter for EthereumAdapter {
119119
let message = Message::from_slice(&hash_message(&state_root));
120120
let wallet_sign = wallet
121121
.sign(&self.keystore_pwd, &message)
122-
.map_err(|_| map_error("failed to sign messages"))?;
122+
.map_err(|err| Error::SignMessage(EwtSigningError::SigningMessage(err)))?;
123123
let signature: Signature = wallet_sign.into_electrum().into();
124124

125125
Ok(format!("0x{}", signature))
@@ -222,7 +222,7 @@ impl Adapter for EthereumAdapter {
222222
};
223223

224224
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)))?;
226226

227227
if self.whoami().to_checksum() != verified.payload.id {
228228
return Err(AdapterError::Configuration(
@@ -273,7 +273,7 @@ impl Adapter for EthereumAdapter {
273273
};
274274

275275
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)))
277277
}
278278
}
279279

@@ -369,28 +369,32 @@ pub fn ewt_sign(
369369
signer: &SafeAccount,
370370
password: &Password,
371371
payload: &Payload,
372-
) -> Result<String, Box<dyn std::error::Error>> {
372+
) -> Result<String, EwtSigningError> {
373373
let header = Header {
374374
header_type: "JWT".to_string(),
375375
alg: "ETH".to_string(),
376376
};
377377

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+
);
380382

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+
);
383387
let message = Message::from_slice(&hash_message(
384388
&format!("{}.{}", header_encoded, payload_encoded).as_bytes(),
385389
));
386390
let signature: Signature = signer
387391
.sign(password, &message)
388-
.map_err(|_| map_error("sign message"))?
392+
.map_err(EwtSigningError::SigningMessage)?
389393
.into_electrum()
390394
.into();
391395

392396
let token = base64::encode_config(
393-
&hex::decode(format!("{}", signature))?,
397+
&hex::decode(format!("{}", signature)).map_err(EwtSigningError::DecodingHexSignature)?,
394398
base64::URL_SAFE_NO_PAD,
395399
);
396400

@@ -401,21 +405,25 @@ pub fn ewt_verify(
401405
header_encoded: &str,
402406
payload_encoded: &str,
403407
token: &str,
404-
) -> Result<VerifyPayload, Box<dyn std::error::Error>> {
408+
) -> Result<VerifyPayload, EwtVerifyError> {
405409
let message = Message::from_slice(&hash_message(
406410
&format!("{}.{}", header_encoded, payload_encoded).as_bytes(),
407411
));
408412

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)?;
410415
let signature = Signature::from_electrum(&decoded_signature);
411416

412-
let address = public_to_address(&recover(&signature, &message)?);
417+
let address =
418+
public_to_address(&recover(&signature, &message).map_err(EwtVerifyError::AddressRecovery)?);
413419

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)?;
419427

420428
let verified_payload = VerifyPayload {
421429
from: ValidatorId::from(address.as_fixed_bytes()),
@@ -482,21 +490,72 @@ mod error {
482490
actual: ChannelId,
483491
},
484492
ChannelInactive(ChannelId),
493+
/// Signing of the message failed
494+
SignMessage(EwtSigningError),
495+
VerifyMessage(EwtVerifyError),
485496
}
486497

498+
impl std::error::Error for Error {}
499+
487500
impl AdapterErrorKind for Error {}
488501

489502
impl fmt::Display for Error {
490503
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
491504
use Error::*;
492505

493506
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),
498511
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),
500559
}
501560
}
502561
}

0 commit comments

Comments
 (0)