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);
    }
}