organize benches, refactor
This commit is contained in:
parent
0702313755
commit
28f58d7222
8 changed files with 144 additions and 191 deletions
|
|
@ -8,3 +8,7 @@ crypto-bigint = { version = "0.6.1" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
rand = ["crypto-bigint/rand"]
|
rand = ["crypto-bigint/rand"]
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
name = "benchmarks"
|
||||||
|
path = "bench/bench.rs"
|
||||||
|
|
|
||||||
87
bench/Cargo.lock
generated
87
bench/Cargo.lock
generated
|
|
@ -1,87 +0,0 @@
|
||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
version = 4
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "autocfg"
|
|
||||||
version = "1.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bench"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"diffie-hellman",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg-if"
|
|
||||||
version = "1.0.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crypto-bigint"
|
|
||||||
version = "0.6.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "96272c2ff28b807e09250b180ad1fb7889a3258f7455759b5c3c58b719467130"
|
|
||||||
dependencies = [
|
|
||||||
"num-traits",
|
|
||||||
"rand_core",
|
|
||||||
"subtle",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "diffie-hellman"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"crypto-bigint",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "getrandom"
|
|
||||||
version = "0.2.16"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
"wasi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.177"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-traits"
|
|
||||||
version = "0.2.19"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.6.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
|
||||||
dependencies = [
|
|
||||||
"getrandom",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "subtle"
|
|
||||||
version = "2.6.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasi"
|
|
||||||
version = "0.11.1+wasi-snapshot-preview1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "bench"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2024"
|
|
||||||
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
diffie-hellman = { path = ".." }
|
|
||||||
105
bench/bench.rs
Normal file
105
bench/bench.rs
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
#![feature(test)]
|
||||||
|
extern crate test;
|
||||||
|
|
||||||
|
mod benches {
|
||||||
|
use test::{black_box, Bencher};
|
||||||
|
use crypto_bigint::U448;
|
||||||
|
use diffie_hellman::{Public, Secret, U256};
|
||||||
|
use diffie_hellman::edwards::{ed448_clamp, ED448_GOLDILOCKS};
|
||||||
|
use diffie_hellman::montgomery::{clamp_u256, CURVE_25519};
|
||||||
|
use diffie_hellman::traits::{Curve, Point};
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn diffie_hellman(b: &mut Bencher) {
|
||||||
|
let a = Secret::from(U256::from_u32(123456789));
|
||||||
|
let p = Public::from(&Secret::from(U256::from_u64(987654321)));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(a.diffie_hellman(&p));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn public_key_derivation(b: &mut Bencher) {
|
||||||
|
let a = Secret::from(U256::from_u32(123456789));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(Public::from(&a))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn montgomery_point_add(b: &mut Bencher) {
|
||||||
|
let p = CURVE_25519.point(U256::from_u32(123456789));
|
||||||
|
let q = p.double();
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.add(&q, &p))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn montgomery_point_double(b: &mut Bencher) {
|
||||||
|
let p = CURVE_25519.point(U256::from_u32(123456789));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.double())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn montgomery_ladder(b: &mut Bencher) {
|
||||||
|
let p = CURVE_25519.point(U256::from_u32(123456789));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.ladder(&clamp_u256(U256::from_u64(987654321))))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn constant_time_montgomery_ladder(b: &mut Bencher) {
|
||||||
|
let p = CURVE_25519.point(U256::from_u32(123456789));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.ct_ladder(&clamp_u256(U256::from_u64(987654321))))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn edwards_point_add(b: &mut Bencher) {
|
||||||
|
let p = CURVE_25519.generator();
|
||||||
|
let q = p.double();
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.add(&q, &p))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn edwards_point_double(b: &mut Bencher) {
|
||||||
|
let p = ED448_GOLDILOCKS.generator();
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.double())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn edwards_ladder(b: &mut Bencher) {
|
||||||
|
let p = ED448_GOLDILOCKS.point(U448::from_u32(123456789));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.ladder(&ed448_clamp(U448::from_u64(987654321))))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn constant_time_edwards_ladder(b: &mut Bencher) {
|
||||||
|
let p = ED448_GOLDILOCKS.point(U448::from_u32(123456789));
|
||||||
|
|
||||||
|
b.iter(|| {
|
||||||
|
black_box(p.ct_ladder(&ed448_clamp(U448::from_u64(987654321))))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
[toolchain]
|
|
||||||
channel = "nightly"
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
#![feature(test)]
|
|
||||||
extern crate test;
|
|
||||||
|
|
||||||
mod benches {
|
|
||||||
use test::{black_box, Bencher};
|
|
||||||
use diffie_hellman::{clamp_u256, Public, Secret, CURVE_25519, U256};
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn diffie_hellman(b: &mut Bencher) {
|
|
||||||
let a = Secret::from(U256::from_u32(123456789));
|
|
||||||
let p = Public::from(&Secret::from(U256::from_u64(987654321)));
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
black_box(a.diffie_hellman(&p));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn public_key_derivation(b: &mut Bencher) {
|
|
||||||
let a = Secret::from(U256::from_u32(123456789));
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
black_box(Public::from(&a))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn montgomery_point_add(b: &mut Bencher) {
|
|
||||||
let p = CURVE_25519.point(U256::from_u32(123456789));
|
|
||||||
let q = p.double();
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
black_box(p.add(q, p))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn montgomery_point_double(b: &mut Bencher) {
|
|
||||||
let p = CURVE_25519.point(U256::from_u32(123456789));
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
black_box(p.double())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn montgomery_ladder(b: &mut Bencher) {
|
|
||||||
let p = CURVE_25519.point(U256::from_u32(123456789));
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
black_box(p.ladder(clamp_u256(U256::from_u64(987654321))))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[bench]
|
|
||||||
fn constant_time_montgomery_ladder(b: &mut Bencher) {
|
|
||||||
let p = CURVE_25519.point(U256::from_u32(123456789));
|
|
||||||
|
|
||||||
b.iter(|| {
|
|
||||||
black_box(p.ct_ladder(clamp_u256(U256::from_u64(987654321))))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
use crate::traits::{Curve, Point};
|
use crate::traits::{Curve, Point};
|
||||||
use crypto_bigint::{AddMod, ConstZero, Integer, InvMod, MulMod, NonZero, SubMod, U512, Zero};
|
use crypto_bigint::{AddMod, ConstZero, Integer, InvMod, MulMod, NonZero, SubMod, U448};
|
||||||
use std::ops::Div;
|
use std::ops::Div;
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
struct EdwardsCurve<N>
|
pub struct EdwardsCurve<N>
|
||||||
where
|
where
|
||||||
N: AddMod<Output = N> + SubMod<Output = N> + MulMod<Output = N> + InvMod<Output = N> + Copy,
|
N: AddMod<Output = N> + SubMod<Output = N> + MulMod<Output = N> + InvMod<Output = N> + Copy,
|
||||||
{
|
{
|
||||||
|
|
@ -14,21 +14,30 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The edwards curve Ed448-Goldilocks
|
/// The edwards curve Ed448-Goldilocks
|
||||||
const ED_MOD: U512 = U512::ONE
|
pub const ED448_MOD: U448 = U448::ONE
|
||||||
.shl(448)
|
.sub_mod(&U448::ONE.shl(224), &U448::MAX)
|
||||||
.sub_mod(&U512::ONE.shl(224), &U512::MAX)
|
.sub_mod(&U448::ONE, &U448::MAX);
|
||||||
.sub_mod(&U512::ONE, &U512::MAX);
|
pub const ED448_GOLDILOCKS: EdwardsCurve<U448> = EdwardsCurve::new(
|
||||||
const ED448_GOLDILOCKS: EdwardsCurve<U512> = EdwardsCurve::new(
|
U448::ZERO.sub_mod(&U448::from_u16(39081), &ED448_MOD),
|
||||||
U512::ZERO.sub_mod(&U512::from_u16(39081), &ED_MOD),
|
ED448_MOD,
|
||||||
ED_MOD,
|
U448::from_be_hex(
|
||||||
U512::from_be_hex(
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa955555555555555555555555555555555555555555555555555555555",
|
||||||
"0000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa955555555555555555555555555555555555555555555555555555555",
|
|
||||||
),
|
),
|
||||||
U512::from_be_hex(
|
U448::from_be_hex(
|
||||||
"0000000000000000ae05e9634ad7048db359d6205086c2b0036ed7a035884dd7b7e36d728ad8c4b80d6565833a2a3098bbbcb2bed1cda06bdaeafbcdea9386ed",
|
"ae05e9634ad7048db359d6205086c2b0036ed7a035884dd7b7e36d728ad8c4b80d6565833a2a3098bbbcb2bed1cda06bdaeafbcdea9386ed",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pub fn ed448_clamp(mut n: U448) -> U448 {
|
||||||
|
n &= U448::from_u8(0b11).not();
|
||||||
|
|
||||||
|
let big = U448::ONE.shl(447);
|
||||||
|
n &= big.not();
|
||||||
|
n |= big;
|
||||||
|
|
||||||
|
n
|
||||||
|
}
|
||||||
|
|
||||||
impl<N> EdwardsCurve<N>
|
impl<N> EdwardsCurve<N>
|
||||||
where
|
where
|
||||||
N: AddMod<Output = N>
|
N: AddMod<Output = N>
|
||||||
|
|
@ -145,7 +154,6 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn double(&self) -> Self {
|
fn double(&self) -> Self {
|
||||||
/*
|
|
||||||
let a = self.x.add_mod(&self.y, &self.curve.p);
|
let a = self.x.add_mod(&self.y, &self.curve.p);
|
||||||
let b = a.mul_mod(&a, &self.curve.p);
|
let b = a.mul_mod(&a, &self.curve.p);
|
||||||
let c = self.x.mul_mod(&self.x, &self.curve.p);
|
let c = self.x.mul_mod(&self.x, &self.curve.p);
|
||||||
|
|
@ -164,9 +172,6 @@ where
|
||||||
z,
|
z,
|
||||||
curve: self.curve,
|
curve: self.curve,
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
self.add(self, self)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mul(&self, x: &N) -> Self {
|
fn mul(&self, x: &N) -> Self {
|
||||||
|
|
@ -227,11 +232,11 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn double() {
|
fn double() {
|
||||||
let x = U512::from_be_hex(
|
let x = U448::from_be_hex(
|
||||||
"000000000000000049dcbc5c6c0cce2c1419a17226f929ea255a09cf4e0891c693fda4be70c74cc301b7bdf1515dd8ba21aee1798949e120e2ce42ac48ba7f30",
|
"49dcbc5c6c0cce2c1419a17226f929ea255a09cf4e0891c693fda4be70c74cc301b7bdf1515dd8ba21aee1798949e120e2ce42ac48ba7f30",
|
||||||
);
|
);
|
||||||
let y = U512::from_be_hex(
|
let y = U448::from_be_hex(
|
||||||
"0000000000000000d49077e4accde527164b33a5de021b979cb7c02f0457d845c90dc3227b8a5bc1c0d8f97ea1ca9472b5d444285d0d4f5b32e236f86de51839",
|
"d49077e4accde527164b33a5de021b979cb7c02f0457d845c90dc3227b8a5bc1c0d8f97ea1ca9472b5d444285d0d4f5b32e236f86de51839",
|
||||||
);
|
);
|
||||||
let p = ED448_GOLDILOCKS.generator().double();
|
let p = ED448_GOLDILOCKS.generator().double();
|
||||||
|
|
||||||
|
|
@ -241,11 +246,11 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn explicit_double() {
|
fn explicit_double() {
|
||||||
let x = U512::from_be_hex(
|
let x = U448::from_be_hex(
|
||||||
"000000000000000049dcbc5c6c0cce2c1419a17226f929ea255a09cf4e0891c693fda4be70c74cc301b7bdf1515dd8ba21aee1798949e120e2ce42ac48ba7f30",
|
"49dcbc5c6c0cce2c1419a17226f929ea255a09cf4e0891c693fda4be70c74cc301b7bdf1515dd8ba21aee1798949e120e2ce42ac48ba7f30",
|
||||||
);
|
);
|
||||||
let y = U512::from_be_hex(
|
let y = U448::from_be_hex(
|
||||||
"0000000000000000d49077e4accde527164b33a5de021b979cb7c02f0457d845c90dc3227b8a5bc1c0d8f97ea1ca9472b5d444285d0d4f5b32e236f86de51839",
|
"d49077e4accde527164b33a5de021b979cb7c02f0457d845c90dc3227b8a5bc1c0d8f97ea1ca9472b5d444285d0d4f5b32e236f86de51839",
|
||||||
);
|
);
|
||||||
let p = ED448_GOLDILOCKS.generator();
|
let p = ED448_GOLDILOCKS.generator();
|
||||||
let p = p.add(&p, &p);
|
let p = p.add(&p, &p);
|
||||||
|
|
@ -259,8 +264,8 @@ mod test {
|
||||||
let p = ED448_GOLDILOCKS.generator();
|
let p = ED448_GOLDILOCKS.generator();
|
||||||
let q = p.neg();
|
let q = p.neg();
|
||||||
|
|
||||||
let x = U512::ZERO;
|
let x = U448::ZERO;
|
||||||
let y = U512::ONE;
|
let y = U448::ONE;
|
||||||
|
|
||||||
let sum = p.add(&q, &p);
|
let sum = p.add(&q, &p);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod macros;
|
mod macros;
|
||||||
|
|
||||||
mod edwards;
|
pub mod edwards;
|
||||||
mod montgomery;
|
pub mod montgomery;
|
||||||
mod traits;
|
pub mod traits;
|
||||||
|
|
||||||
pub use crypto_bigint::{ConstChoice, Encoding, NonZero, U256};
|
pub use crypto_bigint::{ConstChoice, Encoding, NonZero, U256};
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue