From 07c14104f70a277bc5a866346e615e4fdafbe6cb Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 18 Jan 2018 12:31:34 +0100 Subject: [PATCH] Tests for ed25519 verify. --- substrate/executor/src/wasm_executor.rs | 15 +++++++++++ substrate/primitives/src/ed25519.rs | 24 ++++++++++++++++++ substrate/wasm-runtime/support/src/lib.rs | 11 +++----- .../release/runtime_test.compact.wasm | Bin 843 -> 1193 bytes .../release/runtime_test.wasm | Bin 960 -> 1281 bytes substrate/wasm-runtime/test/src/lib.rs | 13 ++++++++-- 6 files changed, 54 insertions(+), 9 deletions(-) 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 f4c438ec106e2dad2e662f47d1abbb293e62178c..e4431c2606a6e09c8aabfc4baf815ebe5c296a54 100644 GIT binary patch literal 1193 zcmZ8g%Tg0T6uteJN755$kOh{To>_&3B~p-}ZgQ!jTv_GXO)?|{&V)=-$$(;&h6SbN zhq%OV@Ke~h_Y=H5lLR!6>iask&wVt+vk?OTwqNVXIepl?$L7!zm1qwj16jG1$`G(J z`_cp8KbS9){Bkq-Sag%Y-oe517v0Nbnx0+(Sch*Nr_&?>X4S`5Jxhvie11Oe$3-&e z&WiCgK1+aGf5ZBRNxvTt_YPVhtgUWsqY?n}-jIy?ldB3vF2KC>L|Cz}-?<~ItP-aaI5j$>x0g^&)m|@6@NWN|` z!$T2pg;L8%95*=1PzFqyQa3hK+W(s;x)D;aCMZQI14gtsC8X>|lC-V>?C&RIe2##0 zlSDm?C`#fMD(#{{hhR*5*hEjeMj*6!fV(J23^L7$nP~DLWDCGPd58f44zZ?P-XWN* z3SsDG2v1@2B~VHtf$)s!SEWK%2Q88;S+ImPL!yg1BQA#B9$nMt58RZLzjNlS_};-V za%~XhG(O5XqN?V(+F0I&Wy8C{H#h!VfUSI@eUrg;#yX% z_{O-T*Y;p|j_rkG$K)I5h_wY^fF5-RY*RFZ!Z?~-cE7ki{D{^;9NVEdMk1pglvrAZ zkh)64;I~HH9+|HuB|{;2UF^uPn)OY zThKt9lt-`DjE5oMmQoKNBpT(U`Q)MiY$|X0OmSC<)A1N^Ux}0W6X2n$ou+v@d!G!# Ezbf6@Qvd(} delta 503 zcmYk3&2G~`6ot?Hcx-1}a0IB`G3hFcASxs*6}rf+#G;$3i>}y2ZaOJWT04pzKp+$r zynvObU;$emf(;Tcz?;ySw5mGN=-%^<&be2b@9}S?k=IuY02@T@qe1tx61IFF*^kX= zval9tr%yBH*_LNBJ09n=7cVn#&pMu6<(HS$7{Y_tgZZK;8_4$0lkGsLK&enbN;U@q z!O#tlRr`N?r5-f4zMmL&7fT1u>_t(ImgR?{JV&H%(_^_=rxP=D{)*ryV|+y*^tq&T zwktAM6Vj=q9SRH#O9L_#rqT#P#uMt3aBVV8S&tjh=ch@J-8u&DiEkWx6sM98oloqt zH(M@-)RgcHhp*s;bmBQ1zTOBo`yg{2PhsFLOR@gK_ZeUR;w=;FBeB2QP=ZnP4^y|J zVLuMP`Xj$R)PRm4h6yyZ@)_c$K=NNRcFazTmKwQWXqQ!Vlf3);~^QO=hQ$msBn j_O+N)6=Thi8FuB?aAF5s$Jm24c_Of>sX2Y{<07;~hIGcq4DDDs9o`X)s|t z4^>mrl9G$ra8f}eJvPMW>}va1+cqXik}9PP8iN34YuQP7*A){3bHE9tKOhr z^?Sn!*hjUy=9_KTf&U57*_>T6>TNh5PI{M<_ru8m9!X0%z(&GGP25RH2ye#A({7ns zx$PE0``@Vj3C%)v@4p_%lsgIvJnn!8wsPgsBVkpTHy!jU*O{_poGJ8iN0G@*hSt}< zmr^7DUw(8OITt&Ia+USq^?~As+}#_tHY|Yrz9Omx0r5_T+^FCxLyyV2lsrWYL)W4m zN?htS!GX%?DQPyd(kW)9cT|?+60pY^X25_K)N-lnGR!mwL5fR)pJ3}1a7!jZ@H4vC zwZmIy2W$yh5W)_L>5?m%i^sd88~*$Qw>9NI6-Fz*-(Xb4Qp7!dOulrQm%pH-CuPw@ z*xCg+L0SrH@ulS~g9&Y^_90-{7GXH>Q!|4^)Pq*9XIkM2kqql=|oh z4>eFm39ADlii2GH$hCbW_e;r=7JMD_u?!{hhLAO=v3wbFR+WdL?!3M`@?UQASarRT zOUZMxJfLVfpxCCMyBXgm+vc5k63RtuGhUmCjpbaXSfgc5PiGr&#X(gw{Y9!luAWZNTd?Gndp&w#82EM2TA{2iyY}ehlyz z_$mDf9QXmu+No0_Su^jwc{AftjC4~l0PH9_XEn}6UDvE`0*IiL*F<|nQ=puEJqP$N z77JV6M)q?xy+9t#t?Ycdsg~>X%7Qt4&*=+0o283augBny>p8Ay z3=liQ7PHk|>yk}{EsEvswomJ^#l}``N$g5i>#VHcxgPrtliH2wz z&rxo#XTkQR_PypnDrV^Y712+|cx_-X;+|29p%_z4j8viN8(%{+6&Y4EH=7|{@ zL1~gJHsD%}crsvH!x1UGF&vv%g?vIbF=X%dsEY}5gBLh^0|z_;FWKa618DT=m@=-Q zK@U^34vkPb?V{O_vwQme!MA-0$nTu_-M$Z432tq^sB4i2GD_=I?BNV^>JZ7XWyYu-UJ(=8q$+4zJ;(gAdL07v4a zdEtJpy$+~c`yGh#wkehEE)kdqJUzv|*PbGRm?V&pJ*uVyaOLe%f0qU_aP34JAmxV$ z#*^NA8Ud3?`ShP@`qIzJ)lCJXW%&5Hn2{8h%O%W_6c_0im}41VW@WbdXy*f%QyJ11 IqnC@pKX_xoTmS$7 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);