Skip to content

Commit 7159d27

Browse files
committed
Add CSIDH example
1 parent 0cef809 commit 7159d27

4 files changed

Lines changed: 412 additions & 0 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

isogeny/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ edition = "2024"
66
[dependencies]
77
field = { path = "../field" }
88
curve = { path = "../curve" }
9+
10+
[dev-dependencies]
11+
rand = "0.10.1"

isogeny/examples/csidh.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use curve::Curve;
2+
use isogeny::csidh;
3+
use rand::{RngExt, rng};
4+
5+
const KEY_BOUND: usize = 74;
6+
7+
fn random_private_key<R: RngExt>(rng: &mut R) -> [i8; csidh::PRIMES.len()] {
8+
let mut key = [0i8; csidh::PRIMES.len()];
9+
for slot in key.iter_mut().take(KEY_BOUND) {
10+
*slot = (rng.random::<u8>() % 3) as i8 - 1;
11+
}
12+
key
13+
}
14+
15+
fn main() {
16+
let mut rng = rng();
17+
let a_priv = random_private_key(&mut rng);
18+
let b_priv = random_private_key(&mut rng);
19+
let ells: Vec<u64> = csidh::PRIMES.iter().take(KEY_BOUND).copied().collect();
20+
println!("Small primes in play: {:?}", ells);
21+
println!("Alice's private: {:?}", &a_priv[..KEY_BOUND]);
22+
println!("Bob's private: {:?}", &b_priv[..KEY_BOUND]);
23+
24+
let start = csidh::base_curve();
25+
26+
println!("\nDeriving public curves...");
27+
let t = std::time::Instant::now();
28+
let a_pub = csidh::action(&start, &a_priv, &mut || rng.random::<u64>());
29+
let b_pub = csidh::action(&start, &b_priv, &mut || rng.random::<u64>());
30+
println!("done in {:?}", t.elapsed());
31+
32+
println!("\nDeriving shared secrets...");
33+
let t = std::time::Instant::now();
34+
let a_shared = csidh::action(&b_pub, &a_priv, &mut || rng.random::<u64>());
35+
let b_shared = csidh::action(&a_pub, &b_priv, &mut || rng.random::<u64>());
36+
println!("done in {:?}", t.elapsed());
37+
38+
let j_a = a_shared.j_invariant();
39+
let j_b = b_shared.j_invariant();
40+
assert_eq!(j_a, j_b, "shared j-invariants disagreed");
41+
println!("\nShared j-invariant: {:?}", j_a);
42+
println!("CSIDH shared secret established.");
43+
}

0 commit comments

Comments
 (0)