Skip to content

Commit

Permalink
crypto: expose verify with hashed message as input in library (Mysten…
Browse files Browse the repository at this point in the history
  • Loading branch information
joyqvq authored Aug 9, 2022
1 parent 6eaf8ef commit b247710
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 1 deletion.
18 changes: 18 additions & 0 deletions narwhal/crypto/src/secp256k1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,24 @@ impl Verifier<Secp256k1Signature> for Secp256k1PublicKey {
}
}

impl Secp256k1PublicKey {
pub fn verify_hashed(
&self,
hased_msg: &[u8],
signature: &Secp256k1Signature,
) -> Result<(), signature::Error> {
match Message::from_slice(hased_msg) {
Ok(message) => match signature.sig.recover(&message) {
Ok(recovered_key) if self.as_bytes() == recovered_key.serialize().as_slice() => {
Ok(())
}
_ => Err(signature::Error::new()),
},
_ => Err(signature::Error::new()),
}
}
}

impl AsRef<[u8]> for Secp256k1PublicKey {
fn as_ref(&self) -> &[u8] {
self.bytes
Expand Down
34 changes: 33 additions & 1 deletion narwhal/crypto/src/tests/secp256k1_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ fn verify_valid_signature() {
// Get a keypair.
let kp = keys().pop().unwrap();

// Make signature.
// Sign over raw message, hashed to keccak256.
let message: &[u8] = b"Hello, world!";
let digest = message.digest();

Expand All @@ -139,6 +139,38 @@ fn verify_valid_signature() {
assert!(kp.public().verify(&digest.0, &signature).is_ok());
}

#[test]
fn verify_valid_signature_against_hashed_msg() {
// Get a keypair.
let kp = keys().pop().unwrap();

// Sign over raw message (hashed to keccak256 internally).
let message: &[u8] = b"Hello, world!";
let signature = kp.sign(message);

// Verify the signature against hashed message.
assert!(kp
.public()
.verify_hashed(
<sha3::Keccak256 as sha3::digest::Digest>::digest(message).as_slice(),
&signature
)
.is_ok());
}

#[test]
fn verify_hashed_failed_if_message_unhashed() {
// Get a keypair.
let kp = keys().pop().unwrap();

// Sign over raw message (hashed to keccak256 internally).
let message: &[u8] = &[0u8; 1];
let signature = kp.sign(message);

// Verify the signature against unhashed msg fails.
assert!(kp.public().verify_hashed(message, &signature).is_err());
}

#[test]
fn verify_invalid_signature() {
// Get a keypair.
Expand Down

0 comments on commit b247710

Please sign in to comment.