Make MultiSigner use compressed ECDSA public key (#4502)

* Don't use compressed ecdsa public key in verify

* Make `ECDSA` public support compressed

* Make it a proper `expect` message
This commit is contained in:
Bastian Köcher
2019-12-31 20:04:53 +01:00
committed by Gavin Wood
parent 585f0c0811
commit 8ecc450fd9
5 changed files with 145 additions and 95 deletions
+15 -2
View File
@@ -102,7 +102,7 @@ impl Verify for sp_core::ecdsa::Signature {
self.as_ref(),
&sp_io::hashing::blake2_256(msg.get()),
) {
Ok(pubkey) => <dyn AsRef<[u8]>>::as_ref(signer) == &pubkey[..],
Ok(pubkey) => signer.as_compressed().map(|s| &s[..] == &pubkey[..]).unwrap_or(false),
_ => false,
}
}
@@ -1307,8 +1307,9 @@ pub trait BlockIdTo<Block: self::Block> {
#[cfg(test)]
mod tests {
use super::AccountIdConversion;
use super::*;
use crate::codec::{Encode, Decode, Input};
use sp_core::{crypto::Pair, ecdsa};
mod t {
use sp_core::crypto::KeyTypeId;
@@ -1388,4 +1389,16 @@ mod tests {
assert_eq!(t.remaining_len(), Ok(None));
assert_eq!(buffer, [0, 0]);
}
#[test]
fn ecdsa_verify_works() {
let msg = &b"test-message"[..];
let (pair, _) = ecdsa::Pair::generate();
let signature = pair.sign(&msg);
assert!(ecdsa::Pair::verify(&signature, msg, &pair.public()));
assert!(signature.verify(msg, &pair.public()));
assert!(signature.verify(msg, &pair.public().into_compressed().unwrap()));
}
}