From 919dfb5b141a0fdd843f590f1b2b48dfef7fd4a2 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 15:53:16 +0100 Subject: [PATCH 01/12] Use simpler / shorter Sha256::digest() --- packages/crypto/src/secp256k1.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index dd9e9d1097..6bae129e35 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -206,7 +206,7 @@ mod tests { .unwrap()); // Wrong message fails - let bad_message_hash = Sha256::new().chain([MSG, "\0"].concat()).finalize(); + let bad_message_hash = Sha256::digest([MSG, "\0"].concat().as_bytes()); assert!(!secp256k1_verify( &bad_message_hash, signature.as_bytes(), @@ -245,7 +245,7 @@ mod tests { let signature = hex::decode(sig).unwrap(); // Explicit hash - let message_hash = Sha256::new().chain(&message).finalize(); + let message_hash = Sha256::digest(&message); // secp256k1_verify works assert!( @@ -281,7 +281,7 @@ mod tests { let message = hex::decode(&encoded.message).unwrap(); let hash = hex::decode(&encoded.message_hash).unwrap(); - let message_hash = Sha256::new().chain(&message).finalize(); + let message_hash = Sha256::digest(&message); assert_eq!(hash.as_slice(), message_hash.as_slice()); let signature = hex::decode(&encoded.signature).unwrap(); From ed9311e167bb2b469b1991e3059dc7a3bbf900c1 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 15:53:51 +0100 Subject: [PATCH 02/12] Add digital signature verification benchmarks --- Cargo.lock | 1 + packages/crypto/Cargo.toml | 9 +++ packages/crypto/benches/main.rs | 138 ++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 packages/crypto/benches/main.rs diff --git a/Cargo.lock b/Cargo.lock index 3c9d7572db..ae7c98605d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -201,6 +201,7 @@ name = "cosmwasm-crypto" version = "0.13.2" dependencies = [ "base64", + "criterion", "digest", "ed25519-zebra", "elliptic-curve", diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 2d25ac30d4..1eb196a45b 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -14,6 +14,10 @@ default = [] # This feature requires Rust nightly because it depends on the unstable backtrace feature. backtraces = [] +[lib] +# See https://bheisler.github.io/criterion.rs/book/faq.html#cargo-bench-gives-unrecognized-option-errors-for-valid-command-line-options +bench = false + [dependencies] k256 = { version = "0.7.2", features = ["ecdsa"] } ed25519-zebra = "2" @@ -22,6 +26,7 @@ rand_core = { version = "0.5", features = ["getrandom"] } thiserror = "1.0" [dev-dependencies] +criterion = "0.3" serde = { version = "1.0.103", default-features = false, features = ["derive", "alloc"] } serde_json = "1.0" sha2 = "0.9" @@ -29,3 +34,7 @@ base64 = "0.13.0" hex = "0.4" hex-literal = "0.3.1" elliptic-curve = "0.8.4" + +[[bench]] +name = "main" +harness = false diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs new file mode 100644 index 0000000000..fc4932c607 --- /dev/null +++ b/packages/crypto/benches/main.rs @@ -0,0 +1,138 @@ +use criterion::{criterion_group, criterion_main, Criterion, PlottingBackend}; +use std::time::Duration; + +use hex_literal::hex; +use serde::Deserialize; + +// Crypto stuff +use digest::Digest; +use elliptic_curve::sec1::ToEncodedPoint; +use k256::ecdsa::SigningKey; // type alias +use sha2::Sha256; + +use cosmwasm_crypto::{ + ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, +}; + +const COSMOS_SECP256K1_MSG_HEX: &str = "0a93010a90010a1c2f636f736d6f732e62616e6b2e763162657461312e4d736753656e6412700a2d636f736d6f7331706b707472653766646b6c366766727a6c65736a6a766878686c63337234676d6d6b38727336122d636f736d6f7331717970717870713971637273737a673270767871367273307a716733797963356c7a763778751a100a0575636f736d12073132333435363712650a4e0a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a21034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c7029012040a02080112130a0d0a0575636f736d12043230303010c09a0c1a0c73696d642d74657374696e672001"; +const COSMOS_SECP256K1_SIGNATURE_HEX: &str = "c9dd20e07464d3a688ff4b710b1fbc027e495e797cfa0b4804da2ed117959227772de059808f765aa29b8f92edf30f4c2c5a438e30d3fe6897daa7141e3ce6f9"; +const COSMOS_SECP256K1_PUBKEY_BASE64: &str = "A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ"; + +const COSMOS_ED25519_MSG: &str = ""; +const COSMOS_ED25519_SIGNATURE_HEX: &str = "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"; +const COSMOS_ED25519_PUBLIC_KEY_HEX: &str = + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"; + +// Test data from https://tools.ietf.org/html/rfc8032#section-7.1 +const COSMOS_ED25519_TESTS_JSON: &str = "./testdata/ed25519_tests.json"; + +#[derive(Deserialize, Debug)] +struct Encoded { + #[serde(rename = "privkey")] + private_key: String, + #[serde(rename = "pubkey")] + public_key: String, + message: String, + signature: String, +} + +fn read_cosmos_sigs() -> Vec { + use std::fs::File; + use std::io::BufReader; + + // Open the file in read-only mode with buffer. + let file = File::open(COSMOS_ED25519_TESTS_JSON).unwrap(); + let reader = BufReader::new(file); + + serde_json::from_reader(reader).unwrap() +} + +fn bench_crypto(c: &mut Criterion) { + let mut group = c.benchmark_group("Crypto"); + + group.bench_function("secp256k1_verify", |b| { + let message = hex::decode(COSMOS_SECP256K1_MSG_HEX).unwrap(); + let message_hash = Sha256::digest(&message); + let signature = hex::decode(COSMOS_SECP256K1_SIGNATURE_HEX).unwrap(); + let public_key = base64::decode(COSMOS_SECP256K1_PUBKEY_BASE64).unwrap(); + b.iter(|| { + assert!(secp256k1_verify(&message_hash, &signature, &public_key).unwrap()); + }); + }); + + group.bench_function("secp256k1_recover_pubkey", |b| { + let message_hash = + hex!("82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28"); + let private_key = + hex!("3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1"); + let r_s = hex!("99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66"); + let recovery_param: u8 = 0; + + let expected = SigningKey::from_bytes(&private_key) + .unwrap() + .verify_key() + .to_encoded_point(false) + .as_bytes() + .to_vec(); + + b.iter(|| { + let pubkey = secp256k1_recover_pubkey(&message_hash, &r_s, recovery_param).unwrap(); + assert_eq!(pubkey, expected); + }); + }); + + group.bench_function("ed25519_verify", |b| { + let message = COSMOS_ED25519_MSG.as_bytes(); + let signature = hex::decode(COSMOS_ED25519_SIGNATURE_HEX).unwrap(); + let public_key = hex::decode(COSMOS_ED25519_PUBLIC_KEY_HEX).unwrap(); + b.iter(|| { + assert!(ed25519_verify(&message, &signature, &public_key).unwrap()); + }); + }); + + // Batch verification of five entries + group.bench_function("ed25519_batch_verify_five", |b| { + let codes = read_cosmos_sigs(); + assert_eq!(codes.len(), 5); + + let mut messages: Vec> = vec![]; + let mut signatures: Vec> = vec![]; + let mut public_keys: Vec> = vec![]; + + for encoded in codes { + let message = hex::decode(&encoded.message).unwrap(); + messages.push(message); + + let signature = hex::decode(&encoded.signature).unwrap(); + signatures.push(signature); + + let public_key = hex::decode(&encoded.public_key).unwrap(); + public_keys.push(public_key); + } + + let messages: Vec<&[u8]> = messages.iter().map(|m| m.as_slice()).collect(); + let signatures: Vec<&[u8]> = signatures.iter().map(|m| m.as_slice()).collect(); + let public_keys: Vec<&[u8]> = public_keys.iter().map(|m| m.as_slice()).collect(); + + b.iter(|| { + assert!(ed25519_batch_verify(&messages, &signatures, &public_keys).unwrap()); + }); + }); + + group.finish(); +} + +fn make_config() -> Criterion { + Criterion::default() + .plotting_backend(PlottingBackend::Plotters) + .without_plots() + .measurement_time(Duration::new(10, 0)) + .sample_size(12) +} + +criterion_group!( + name = crypto; + config = make_config(); + targets = bench_crypto +); +criterion_main!(crypto); From 648531b6a2015641a784d03515e8160c3b0adfb9 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 17:31:14 +0100 Subject: [PATCH 03/12] Use chain() for generating bad data --- packages/crypto/src/secp256k1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/src/secp256k1.rs b/packages/crypto/src/secp256k1.rs index 6bae129e35..1089ad2297 100644 --- a/packages/crypto/src/secp256k1.rs +++ b/packages/crypto/src/secp256k1.rs @@ -206,7 +206,7 @@ mod tests { .unwrap()); // Wrong message fails - let bad_message_hash = Sha256::digest([MSG, "\0"].concat().as_bytes()); + let bad_message_hash = Sha256::new().chain(MSG).chain("\0").finalize(); assert!(!secp256k1_verify( &bad_message_hash, signature.as_bytes(), From 8ad8be53ed38e7dac176e54e48b71f5c98e66ceb Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 18:06:47 +0100 Subject: [PATCH 04/12] ed25519 batch verification of different batch lengths --- packages/crypto/benches/main.rs | 68 +++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index fc4932c607..e888af5fe0 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -13,6 +13,7 @@ use sha2::Sha256; use cosmwasm_crypto::{ ed25519_batch_verify, ed25519_verify, secp256k1_recover_pubkey, secp256k1_verify, }; +use std::cmp::min; const COSMOS_SECP256K1_MSG_HEX: &str = "0a93010a90010a1c2f636f736d6f732e62616e6b2e763162657461312e4d736753656e6412700a2d636f736d6f7331706b707472653766646b6c366766727a6c65736a6a766878686c63337234676d6d6b38727336122d636f736d6f7331717970717870713971637273737a673270767871367273307a716733797963356c7a763778751a100a0575636f736d12073132333435363712650a4e0a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a21034f04181eeba35391b858633a765c4a0c189697b40d216354d50890d350c7029012040a02080112130a0d0a0575636f736d12043230303010c09a0c1a0c73696d642d74657374696e672001"; const COSMOS_SECP256K1_SIGNATURE_HEX: &str = "c9dd20e07464d3a688ff4b710b1fbc027e495e797cfa0b4804da2ed117959227772de059808f765aa29b8f92edf30f4c2c5a438e30d3fe6897daa7141e3ce6f9"; @@ -47,6 +48,27 @@ fn read_cosmos_sigs() -> Vec { serde_json::from_reader(reader).unwrap() } +fn read_decode_cosmos_sigs() -> (Vec>, Vec>, Vec>) { + let codes = read_cosmos_sigs(); + + let mut messages: Vec> = vec![]; + let mut signatures: Vec> = vec![]; + let mut public_keys: Vec> = vec![]; + + for encoded in codes { + let message = hex::decode(&encoded.message).unwrap(); + messages.push(message); + + let signature = hex::decode(&encoded.signature).unwrap(); + signatures.push(signature); + + let public_key = hex::decode(&encoded.public_key).unwrap(); + public_keys.push(public_key); + } + + (messages, signatures, public_keys) +} + fn bench_crypto(c: &mut Criterion) { let mut group = c.benchmark_group("Crypto"); @@ -90,34 +112,32 @@ fn bench_crypto(c: &mut Criterion) { }); }); - // Batch verification of five entries - group.bench_function("ed25519_batch_verify_five", |b| { - let codes = read_cosmos_sigs(); - assert_eq!(codes.len(), 5); - - let mut messages: Vec> = vec![]; - let mut signatures: Vec> = vec![]; - let mut public_keys: Vec> = vec![]; - - for encoded in codes { - let message = hex::decode(&encoded.message).unwrap(); - messages.push(message); - - let signature = hex::decode(&encoded.signature).unwrap(); - signatures.push(signature); - - let public_key = hex::decode(&encoded.public_key).unwrap(); - public_keys.push(public_key); - } - + // Ed25519 batch verification of different batch lengths + { + let (messages, signatures, public_keys) = read_decode_cosmos_sigs(); let messages: Vec<&[u8]> = messages.iter().map(|m| m.as_slice()).collect(); let signatures: Vec<&[u8]> = signatures.iter().map(|m| m.as_slice()).collect(); let public_keys: Vec<&[u8]> = public_keys.iter().map(|m| m.as_slice()).collect(); - b.iter(|| { - assert!(ed25519_batch_verify(&messages, &signatures, &public_keys).unwrap()); - }); - }); + for n in (1..=min(messages.len(), 10)).step_by(2) { + group.bench_function( + format!( + "ed25519_batch_verify_{}", + n + ), + |b| { + b.iter(|| { + assert!(ed25519_batch_verify( + &messages[..n], + &signatures[..n], + &public_keys[..n] + ) + .unwrap()); + }); + }, + ); + } + } group.finish(); } From 8ec61296f8baf70452c0686be409e9e8358fd668 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 19:05:13 +0100 Subject: [PATCH 05/12] Use words instead of numbers --- Cargo.lock | 7 +++++++ packages/crypto/Cargo.toml | 1 + packages/crypto/benches/main.rs | 6 ++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae7c98605d..c807f2cbea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,6 +205,7 @@ dependencies = [ "digest", "ed25519-zebra", "elliptic-curve", + "english-numbers", "hex", "hex-literal", "k256", @@ -613,6 +614,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "english-numbers" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4f5d6e192964d498b45abee72ca445e91909094bc8e8791259e82c2a0d1aa6" + [[package]] name = "enumset" version = "1.0.4" diff --git a/packages/crypto/Cargo.toml b/packages/crypto/Cargo.toml index 1eb196a45b..1f47c830dd 100644 --- a/packages/crypto/Cargo.toml +++ b/packages/crypto/Cargo.toml @@ -33,6 +33,7 @@ sha2 = "0.9" base64 = "0.13.0" hex = "0.4" hex-literal = "0.3.1" +english-numbers = "0.3" elliptic-curve = "0.8.4" [[bench]] diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index e888af5fe0..1a3466f229 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -1,6 +1,7 @@ use criterion::{criterion_group, criterion_main, Criterion, PlottingBackend}; use std::time::Duration; +use english_numbers::convert_no_fmt; use hex_literal::hex; use serde::Deserialize; @@ -121,10 +122,7 @@ fn bench_crypto(c: &mut Criterion) { for n in (1..=min(messages.len(), 10)).step_by(2) { group.bench_function( - format!( - "ed25519_batch_verify_{}", - n - ), + format!("ed25519_batch_verify_{}", convert_no_fmt(n as i64)), |b| { b.iter(|| { assert!(ed25519_batch_verify( From 8518dd78d18253c6e862a78ad9c7fc2a7a8ebd23 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 20:37:35 +0100 Subject: [PATCH 06/12] Update README.md --- packages/crypto/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/crypto/README.md b/packages/crypto/README.md index b7f72daaad..b1dc660d0e 100644 --- a/packages/crypto/README.md +++ b/packages/crypto/README.md @@ -15,6 +15,13 @@ and [cosmwasm-std](`https://crates.io/crates/cosmwasm-std`) crates. - `ed25519_batch_verify()`: Batch digital signature verification using the EdDSA ed25519 scheme, for Tendemint signature / public key formats. +## Benchmarking + +``` +cd packages/crypto +cargo bench +``` + ## License This package is part of the cosmwasm repository, licensed under the Apache From 40013e992cfcf3eb5a5bf5ffb0fd0037c920281b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 20:41:43 +0100 Subject: [PATCH 07/12] Add crypto benchmarks to CI --- .circleci/config.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6405ace61d..ce5c15b3ee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,13 +23,14 @@ workflows: requires: - package_vm - package_vm_cranelift + - package_crypto filters: branches: only: # Long living branches - main - /^[0-9]+\.[0-9]+$/ - # 👇 Add your branch here if benchmarking matters to your work + # 👇Add your branch here if benchmarking matters to your work - benchmarking - update-wasmer - metering-restart @@ -858,13 +859,17 @@ jobs: keys: - cargocache-v2-benchmarking-rust:1.49.0-{{ checksum "Cargo.lock" }} - run: - name: Run benchmarks (Singlepass) + name: Run vm benchmarks (Singlepass) working_directory: ~/project/packages/vm command: cargo bench --no-default-features -- --color never --save-baseline singlepass - run: - name: Run benchmarks (Cranelift) + name: Run vm benchmarks (Cranelift) working_directory: ~/project/packages/vm command: cargo bench --no-default-features --features cranelift -- --color never --save-baseline cranelift + - run: + name: Run crypto benchmarks + working_directory: ~/project/packages/crypto + command: cargo bench -- --color never --save-baseline crypto - save_cache: paths: - /usr/local/cargo/registry From 2dc40867adbab4064d9e71b53620deea633a2e3e Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 20:42:19 +0100 Subject: [PATCH 08/12] Add crypto-verify-benchmarks branch to CI benchmarks --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index ce5c15b3ee..7def5e61f6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,6 +36,7 @@ workflows: - metering-restart - load-wasm-speed - cache-analyze + - crypto-verify-benchmarks deploy: jobs: - build_and_upload_devcontracts: From 04e5abfa5b1891b3fbaef930b48db996b6bbf0f8 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 20:46:25 +0100 Subject: [PATCH 09/12] Fix crypto package job name --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7def5e61f6..aea3631cbe 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,7 +23,7 @@ workflows: requires: - package_vm - package_vm_cranelift - - package_crypto + - package_crypto_verify filters: branches: only: From 8326174b5386e624faedb0bdf717f01c3fa9ae9b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 20:52:03 +0100 Subject: [PATCH 10/12] Add crypto package to CI build --- .circleci/config.yml | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index aea3631cbe..fc82576ca1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,6 +4,7 @@ workflows: test: # Keep those job names in sync with .mergify.yml jobs: + - package_crypto - package_schema - package_std - package_storage @@ -23,7 +24,7 @@ workflows: requires: - package_vm - package_vm_cranelift - - package_crypto_verify + - package_crypto filters: branches: only: @@ -47,6 +48,33 @@ workflows: ignore: /.*/ jobs: + package_crypto: + docker: + - image: rust:1.47.0 + steps: + - checkout + - run: + name: Version information + command: rustc --version; cargo --version; rustup --version; rustup target list --installed + - restore_cache: + keys: + - cargocache-v2-package_crypto-rust:1.47.0-{{ checksum "Cargo.lock" }} + - run: + name: Build + working_directory: ~/project/packages/crypto + command: cargo build --locked + - run: + name: Run tests + working_directory: ~/project/packages/crypto + command: cargo test --locked + - save_cache: + paths: + - /usr/local/cargo/registry + - target/debug/.fingerprint + - target/debug/build + - target/debug/deps + key: cargocache-v2-package_crypto-rust:1.47.0-{{ checksum "Cargo.lock" }} + package_schema: docker: - image: rust:1.49.0 From fc7e5df061ad28e58279cc24b799490b2e866938 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 25 Feb 2021 23:32:54 +0100 Subject: [PATCH 11/12] Update CI crypto package rust version to 1.49.0 --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fc82576ca1..bbdded09c8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -50,7 +50,7 @@ workflows: jobs: package_crypto: docker: - - image: rust:1.47.0 + - image: rust:1.49.0 steps: - checkout - run: @@ -58,7 +58,7 @@ jobs: command: rustc --version; cargo --version; rustup --version; rustup target list --installed - restore_cache: keys: - - cargocache-v2-package_crypto-rust:1.47.0-{{ checksum "Cargo.lock" }} + - cargocache-v2-package_crypto-rust:1.49.0-{{ checksum "Cargo.lock" }} - run: name: Build working_directory: ~/project/packages/crypto @@ -73,7 +73,7 @@ jobs: - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: cargocache-v2-package_crypto-rust:1.47.0-{{ checksum "Cargo.lock" }} + key: cargocache-v2-package_crypto-rust:1.49.0-{{ checksum "Cargo.lock" }} package_schema: docker: From 6f855ed9a1f29fe31622d2e8eaf7c34c7b26c184 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Fri, 26 Feb 2021 00:10:45 +0100 Subject: [PATCH 12/12] Add benchmark for ed25519 batch verify with one pubkey --- packages/crypto/benches/main.rs | 40 +++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/crypto/benches/main.rs b/packages/crypto/benches/main.rs index 1a3466f229..1a0ee74c7f 100644 --- a/packages/crypto/benches/main.rs +++ b/packages/crypto/benches/main.rs @@ -20,10 +20,11 @@ const COSMOS_SECP256K1_MSG_HEX: &str = "0a93010a90010a1c2f636f736d6f732e62616e6b const COSMOS_SECP256K1_SIGNATURE_HEX: &str = "c9dd20e07464d3a688ff4b710b1fbc027e495e797cfa0b4804da2ed117959227772de059808f765aa29b8f92edf30f4c2c5a438e30d3fe6897daa7141e3ce6f9"; const COSMOS_SECP256K1_PUBKEY_BASE64: &str = "A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ"; -const COSMOS_ED25519_MSG: &str = ""; -const COSMOS_ED25519_SIGNATURE_HEX: &str = "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"; +// TEST 3 test vector from https://tools.ietf.org/html/rfc8032#section-7.1 +const COSMOS_ED25519_MSG_HEX: &str = "af82"; +const COSMOS_ED25519_SIGNATURE_HEX: &str = "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a"; const COSMOS_ED25519_PUBLIC_KEY_HEX: &str = - "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"; + "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025"; // Test data from https://tools.ietf.org/html/rfc8032#section-7.1 const COSMOS_ED25519_TESTS_JSON: &str = "./testdata/ed25519_tests.json"; @@ -105,7 +106,7 @@ fn bench_crypto(c: &mut Criterion) { }); group.bench_function("ed25519_verify", |b| { - let message = COSMOS_ED25519_MSG.as_bytes(); + let message = hex::decode(COSMOS_ED25519_MSG_HEX).unwrap(); let signature = hex::decode(COSMOS_ED25519_SIGNATURE_HEX).unwrap(); let public_key = hex::decode(COSMOS_ED25519_PUBLIC_KEY_HEX).unwrap(); b.iter(|| { @@ -137,6 +138,37 @@ fn bench_crypto(c: &mut Criterion) { } } + // Ed25519 batch verification of different batch lengths, with the same pubkey + { + //FIXME: Use different messages / signatures + let messages = [hex::decode(COSMOS_ED25519_MSG_HEX).unwrap()]; + let signatures = [hex::decode(COSMOS_ED25519_SIGNATURE_HEX).unwrap()]; + let public_keys = [hex::decode(COSMOS_ED25519_PUBLIC_KEY_HEX).unwrap()]; + + let messages: Vec<&[u8]> = messages.iter().map(|m| m.as_slice()).collect(); + let signatures: Vec<&[u8]> = signatures.iter().map(|m| m.as_slice()).collect(); + let public_keys: Vec<&[u8]> = public_keys.iter().map(|m| m.as_slice()).collect(); + + for n in (1..10).step_by(2) { + group.bench_function( + format!( + "ed25519_batch_verify_one_pubkey_{}", + convert_no_fmt(n as i64) + ), + |b| { + b.iter(|| { + assert!(ed25519_batch_verify( + &messages.repeat(n), + &signatures.repeat(n), + &public_keys + ) + .unwrap()); + }); + }, + ); + } + } + group.finish(); }