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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
use rand::Rng; use ::params::{ PUBLICKEYBYTES, SECRETKEYBYTES, SHAREDKEYBYTES, BYTES }; use ::kyber; pub mod uake { use ::params::{ UAKE_SENDABYTES, UAKE_SENDBBYTES }; use super::*; pub fn init_a( rng: &mut Rng, send: &mut [u8; UAKE_SENDABYTES], tk: &mut [u8; SHAREDKEYBYTES], sk: &mut [u8; SECRETKEYBYTES], pkb: &[u8; PUBLICKEYBYTES] ) { kyber::keypair(rng, send, sk); kyber::enc(rng, &mut send[PUBLICKEYBYTES..], tk, pkb); } pub fn shared_b( rng: &mut Rng, send: &mut [u8; UAKE_SENDBBYTES], k: &mut [u8; SHAREDKEYBYTES], recv: &[u8; UAKE_SENDABYTES], skb: &[u8; SECRETKEYBYTES] ) { let mut buf = [0; SHAREDKEYBYTES]; let mut buf2 = [0; SHAREDKEYBYTES]; kyber::enc(rng, send, &mut buf, recv); kyber::dec(&mut buf2, &recv[PUBLICKEYBYTES..], skb); shake128!(k; &buf, &buf2); } pub fn shared_a( k: &mut [u8; SHAREDKEYBYTES], recv: &[u8; UAKE_SENDBBYTES], tk: &[u8; SHAREDKEYBYTES], sk: &[u8; SECRETKEYBYTES] ) { let mut buf = [0; SHAREDKEYBYTES]; let mut buf2 = [0; SHAREDKEYBYTES]; kyber::dec(&mut buf, recv, sk); buf2.copy_from_slice(&tk[..SHAREDKEYBYTES]); shake128!(k; &buf, &buf2); } } pub mod ake { use ::params::{ AKE_SENDABYTES, AKE_SENDBBYTES }; use super::*; pub fn init_a( rng: &mut Rng, send: &mut [u8; AKE_SENDABYTES], tk: &mut [u8; SHAREDKEYBYTES], sk: &mut [u8; SECRETKEYBYTES], pkb: &[u8; PUBLICKEYBYTES] ) { kyber::keypair(rng, send, sk); kyber::enc(rng, &mut send[PUBLICKEYBYTES..], tk, pkb); } pub fn shared_b( rng: &mut Rng, send: &mut [u8; AKE_SENDBBYTES], k: &mut [u8; SHAREDKEYBYTES], recv: &[u8; AKE_SENDABYTES], skb: &[u8; SECRETKEYBYTES], pka: &[u8; PUBLICKEYBYTES] ) { let mut buf = [0; SHAREDKEYBYTES]; let mut buf2 = [0; SHAREDKEYBYTES]; let mut buf3 = [0; SHAREDKEYBYTES]; kyber::enc(rng, send, &mut buf, recv); kyber::enc(rng, &mut send[BYTES..], &mut buf2, pka); kyber::dec(&mut buf3, &recv[PUBLICKEYBYTES..], skb); shake128!(k; &buf, &buf2, &buf3); } pub fn shared_a( k: &mut [u8; SHAREDKEYBYTES], recv: &[u8; AKE_SENDBBYTES], tk: &[u8; SHAREDKEYBYTES], sk: &[u8; SECRETKEYBYTES], ska: &[u8; SECRETKEYBYTES] ) { let mut buf = [0; SHAREDKEYBYTES]; let mut buf2 = [0; SHAREDKEYBYTES]; let mut buf3 = [0; SHAREDKEYBYTES]; kyber::dec(&mut buf, recv, sk); kyber::dec(&mut buf2, &recv[BYTES..], ska); buf3.copy_from_slice(&tk[..SHAREDKEYBYTES]); shake128!(k; &buf, &buf2, &buf3); } }