1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#![feature(iterator_step_by)] extern crate rand; extern crate byteorder; extern crate tiny_keccak; #[cfg(feature = "tor")] pub mod batcher; mod reduce; mod ntt; mod error_correction; pub mod poly; pub mod params; pub mod newhope; use rand::Rng; use tiny_keccak::Keccak; pub use params::{ N, Q, POLY_BYTES, SEEDBYTES, RECBYTES, SENDABYTES, SENDBBYTES }; pub fn keygen<R: Rng>(mut r: R, sk: &mut [u8; POLY_BYTES], pk: &mut [u8; SENDABYTES]) { let (mut ska, mut pka) = ([0; N], [0; N]); let (pk, nonce) = pk.split_at_mut(POLY_BYTES); r.fill_bytes(nonce); newhope::keygen(&mut ska, &mut pka, nonce, r); poly::poly_tobytes(&ska, sk); poly::poly_tobytes(&pka, pk); } pub fn sharedb<R: Rng>(r: R, sharedkey: &mut [u8; 32], pk: &[u8; SENDABYTES], msg: &mut [u8; SENDBBYTES]) { let (pk, nonce) = pk.split_at(POLY_BYTES); let (pkb_bytes, rec_bytes) = msg.split_at_mut(POLY_BYTES); let mut pka = [0; N]; let mut pkb = [0; N]; let mut rec = [0; N]; poly::poly_frombytes(pk, &mut pka); newhope::sharedb( sharedkey, &mut pkb, &mut rec, &pka, nonce, r ); let mut sha3 = Keccak::new_sha3_256(); sha3.update(sharedkey); sha3.finalize(sharedkey); poly::poly_tobytes(&pkb, pkb_bytes); newhope::rec_tobytes(&rec, rec_bytes); } pub fn shareda(sharedkey: &mut [u8; 32], sk: &[u8; POLY_BYTES], msg: &[u8; SENDBBYTES]) { let mut ska = [0; N]; let (mut pkb, mut rec) = ([0; N], [0; N]); let (pkb_bytes, rec_bytes) = msg.split_at(POLY_BYTES); poly::poly_frombytes(sk, &mut ska); poly::poly_frombytes(pkb_bytes, &mut pkb); newhope::rec_frombytes(rec_bytes, &mut rec); newhope::shareda(sharedkey, &ska, &pkb, &rec); let mut sha3 = Keccak::new_sha3_256(); sha3.update(sharedkey); sha3.finalize(sharedkey); }