/ console / algorithms / benches / ecdsa.rs
ecdsa.rs
  1  // Copyright (c) 2025-2026 ACDC Network
  2  // This file is part of the alphavm library.
  3  //
  4  // Alpha Chain | Delta Chain Protocol
  5  // International Monetary Graphite.
  6  //
  7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
  8  // They built world-class ZK infrastructure. We installed the EASY button.
  9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
 10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
 11  //
 12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
 13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
 14  // No rights reserved. No permission required. No warranty. No refunds.
 15  //
 16  // https://creativecommons.org/publicdomain/zero/1.0/
 17  // SPDX-License-Identifier: CC0-1.0
 18  
 19  #[macro_use]
 20  extern crate criterion;
 21  
 22  use alphavm_console_algorithms::{ECDSASignature, Keccak256, Keccak384, Keccak512};
 23  use alphavm_console_types::prelude::*;
 24  use alphavm_utilities::{TestRng, Uniform};
 25  
 26  use k256::ecdsa::{SigningKey, VerifyingKey};
 27  
 28  use criterion::Criterion;
 29  
 30  fn ecdsa_keccak256(c: &mut Criterion) {
 31      let rng = &mut TestRng::default();
 32      let hasher = Keccak256::default();
 33  
 34      // Sample a random signing key.
 35      let signing_key = SigningKey::random(rng);
 36      let vk = VerifyingKey::from(&signing_key);
 37  
 38      // Sample a random message.
 39      let message: Vec<u8> = (0..256).map(|_| u8::rand(rng)).collect::<Vec<_>>();
 40      let message_bits = message.to_bits_le();
 41  
 42      // Sign the message.
 43      let signature = ECDSASignature::sign(&signing_key, &hasher, &message_bits).unwrap();
 44  
 45      c.bench_function(&format!("ECDSA (Keccak256) verify - input size {}", message.len()), |b| {
 46          b.iter(|| signature.verify(&vk, &hasher, &message_bits).unwrap())
 47      });
 48      let eth_address = ECDSASignature::ethereum_address_from_public_key(&vk).unwrap();
 49      c.bench_function(&format!("ECDSA (Keccak256) ETH verify - input size {}", message.len()), |b| {
 50          b.iter(|| signature.verify_ethereum(&eth_address, &hasher, &message_bits).unwrap())
 51      });
 52  }
 53  
 54  fn ecdsa_keccak384(c: &mut Criterion) {
 55      let rng = &mut TestRng::default();
 56      let hasher = Keccak384::default();
 57  
 58      // Sample a random signing key.
 59      let signing_key = SigningKey::random(rng);
 60      let vk = VerifyingKey::from(&signing_key);
 61  
 62      // Sample a random message.
 63      let message: Vec<u8> = (0..256).map(|_| u8::rand(rng)).collect::<Vec<_>>();
 64      let message_bits = message.to_bits_le();
 65  
 66      // Sign the message.
 67      let signature = ECDSASignature::sign(&signing_key, &hasher, &message_bits).unwrap();
 68  
 69      c.bench_function(&format!("ECDSA (Keccak384) verify - input size {}", message.len()), |b| {
 70          b.iter(|| signature.verify(&vk, &hasher, &message_bits).unwrap())
 71      });
 72      let eth_address = ECDSASignature::ethereum_address_from_public_key(&vk).unwrap();
 73      c.bench_function(&format!("ECDSA (Keccak384) ETH verify - input size {}", message.len()), |b| {
 74          b.iter(|| signature.verify_ethereum(&eth_address, &hasher, &message_bits).unwrap())
 75      });
 76  }
 77  
 78  fn ecdsa_keccak512(c: &mut Criterion) {
 79      let rng = &mut TestRng::default();
 80      let hasher = Keccak512::default();
 81  
 82      // Sample a random signing key.
 83      let signing_key = SigningKey::random(rng);
 84      let vk = VerifyingKey::from(&signing_key);
 85  
 86      // Sample a random message.
 87      let message: Vec<u8> = (0..256).map(|_| u8::rand(rng)).collect::<Vec<_>>();
 88      let message_bits = message.to_bits_le();
 89  
 90      // Sign the message.
 91      let signature = ECDSASignature::sign(&signing_key, &hasher, &message_bits).unwrap();
 92  
 93      c.bench_function(&format!("ECDSA (Keccak512) verify - input size {}", message.len()), |b| {
 94          b.iter(|| signature.verify(&vk, &hasher, &message_bits).unwrap())
 95      });
 96      let eth_address = ECDSASignature::ethereum_address_from_public_key(&vk).unwrap();
 97      c.bench_function(&format!("ECDSA (Keccak512) ETH verify - input size {}", message.len()), |b| {
 98          b.iter(|| signature.verify_ethereum(&eth_address, &hasher, &message_bits).unwrap())
 99      });
100  }
101  
102  criterion_group! {
103      name = keccak;
104      config = Criterion::default().sample_size(1000);
105      targets = ecdsa_keccak256, ecdsa_keccak384, ecdsa_keccak512
106  }
107  
108  criterion_main!(keccak);