|
| 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