diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 719343f8fa..07056b1df7 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -273,4 +273,19 @@ mod tests { FromHex::from_hex("ecd0e108a98e192af1d2c25055f4e3bed784b5c877204e73219a5203251feaab").unwrap() ); } + + #[test] + fn ed25519_verify_should_work() { + let mut ext = TestExternalities::default(); + let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); + let key = ed25519::Pair::from_seed(&tiny_keccak::keccak256(b"test")); + let sig = key.sign(b"all ok!"); + let mut calldata = vec![]; + calldata.extend_from_slice(key.public().as_ref()); + calldata.extend_from_slice(sig.as_ref()); + assert_eq!( + WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &CallData(calldata)).unwrap(), + vec![1] + ); + } } diff --git a/substrate/primitives/src/ed25519.rs b/substrate/primitives/src/ed25519.rs index 58556b6669..f6a02a735b 100644 --- a/substrate/primitives/src/ed25519.rs +++ b/substrate/primitives/src/ed25519.rs @@ -48,6 +48,18 @@ impl Signature { } } +impl AsRef<[u8; 64]> for Signature { + fn as_ref(&self) -> &[u8; 64] { + &self.0 + } +} + +impl AsRef<[u8]> for Signature { + fn as_ref(&self) -> &[u8] { + &self.0[..] + } +} + impl Public { pub fn from(data: [u8; 32]) -> Self { Public(data) @@ -59,6 +71,18 @@ impl Public { } } +impl AsRef<[u8; 32]> for Public { + fn as_ref(&self) -> &[u8; 32] { + &self.0 + } +} + +impl AsRef<[u8]> for Public { + fn as_ref(&self) -> &[u8] { + &self.0[..] + } +} + impl Pair { /// Generate new secure (random) key pair. pub fn new() -> Pair { diff --git a/substrate/wasm-runtime/support/src/lib.rs b/substrate/wasm-runtime/support/src/lib.rs index 9f75504513..57606a3f1b 100644 --- a/substrate/wasm-runtime/support/src/lib.rs +++ b/substrate/wasm-runtime/support/src/lib.rs @@ -91,13 +91,10 @@ pub fn keccak256(data: &[u8]) -> [u8; 32] { } /// Verify a ed25519 signature. -pub fn ed25519_verify(sig: &[u8; 64], msg: &[u8], pubkey: &[u8; 32]) -> bool { - unsafe { - match ext_ed25519_verify(&msg[0], msg.len() as u32, &sig[0], &pubkey[0]) { - 0 => false, - _ => true, - } - } +pub fn ed25519_verify(sig: &[u8], msg: &[u8], pubkey: &[u8]) -> bool { + sig.len() != 64 || pubkey.len() != 32 || unsafe { + ext_ed25519_verify(&msg[0], msg.len() as u32, &sig[0], &pubkey[0]) + } == 0 } pub trait Printable { diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index f4c438ec10..e4431c2606 100644 Binary files a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm and b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm differ diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.wasm index 7e0366cd99..501cee72e0 100644 Binary files a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.wasm differ diff --git a/substrate/wasm-runtime/test/src/lib.rs b/substrate/wasm-runtime/test/src/lib.rs index a24de0219d..8bbba9e7a8 100644 --- a/substrate/wasm-runtime/test/src/lib.rs +++ b/substrate/wasm-runtime/test/src/lib.rs @@ -8,12 +8,21 @@ use alloc::vec::Vec; #[macro_use] extern crate runtime_support; -use runtime_support::{set_storage, storage, print, keccak256}; +use runtime_support::{set_storage, storage, print, keccak256, ed25519_verify}; fn test_keccak256(input: Vec) -> Vec { keccak256(&input).to_vec() } +fn test_ed25519_verify(input: Vec) -> Vec { + let sig = &input[0..64]; + let pubkey = &input[64..96]; + let msg = b"all ok!"; + let mut r = Vec::new(); + r.push(ed25519_verify(sig, &msg[..], pubkey) as u8); + r +} + fn test_data_in(input: Vec) -> Vec { print(b"set_storage" as &[u8]); set_storage(b"input", &input); @@ -29,4 +38,4 @@ fn test_data_in(input: Vec) -> Vec { } -impl_stubs!(test_data_in, test_keccak256); +impl_stubs!(test_data_in, test_keccak256, test_ed25519_verify);