Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions isogeny/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ edition = "2024"
[dependencies]
field = { path = "../field" }
curve = { path = "../curve" }

[dev-dependencies]
rand = "0.10.1"
43 changes: 43 additions & 0 deletions isogeny/examples/csidh.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
use curve::Curve;
use isogeny::csidh;
use rand::{RngExt, rng};

const KEY_BOUND: usize = 74;

fn random_private_key<R: RngExt>(rng: &mut R) -> [i8; csidh::PRIMES.len()] {
let mut key = [0i8; csidh::PRIMES.len()];
for slot in key.iter_mut().take(KEY_BOUND) {
*slot = (rng.random::<u8>() % 3) as i8 - 1;
}
key
}

fn main() {
let mut rng = rng();
let a_priv = random_private_key(&mut rng);
let b_priv = random_private_key(&mut rng);
let ells: Vec<u64> = csidh::PRIMES.iter().take(KEY_BOUND).copied().collect();
println!("Small primes in play: {:?}", ells);
println!("Alice's private: {:?}", &a_priv[..KEY_BOUND]);
println!("Bob's private: {:?}", &b_priv[..KEY_BOUND]);

let start = csidh::base_curve();

println!("\nDeriving public curves...");
let t = std::time::Instant::now();
let a_pub = csidh::action(&start, &a_priv, &mut || rng.random::<u64>());
let b_pub = csidh::action(&start, &b_priv, &mut || rng.random::<u64>());
println!("done in {:?}", t.elapsed());

println!("\nDeriving shared secrets...");
let t = std::time::Instant::now();
let a_shared = csidh::action(&b_pub, &a_priv, &mut || rng.random::<u64>());
let b_shared = csidh::action(&a_pub, &b_priv, &mut || rng.random::<u64>());
println!("done in {:?}", t.elapsed());

let j_a = a_shared.j_invariant();
let j_b = b_shared.j_invariant();
assert_eq!(j_a, j_b, "shared j-invariants disagreed");
println!("\nShared j-invariant: {:?}", j_a);
println!("CSIDH shared secret established.");
}
Loading
Loading