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(ð_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(ð_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(ð_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);