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
#![forbid(unsafe_code)]
#![no_std]

use rac::{
    LineValid,
    generic_array::{ArrayLength, GenericArray},
};

pub trait Kem {
    type PublicKey: LineValid;
    type SecretKey: LineValid;
    type CipherText: LineValid;
    type PairSeedLength: ArrayLength<u8>;
    type PublicKeyHashLength: ArrayLength<u8>;
    type EncapsulationSeedLength: ArrayLength<u8>;
    type SharedSecretLength: ArrayLength<u8>;

    fn generate_pair(
        seed: &GenericArray<u8, Self::PairSeedLength>,
    ) -> (Self::PublicKey, Self::SecretKey);
    fn encapsulate(
        seed: &GenericArray<u8, Self::EncapsulationSeedLength>,
        public_key: &Self::PublicKey,
        public_key_hash: &GenericArray<u8, Self::PublicKeyHashLength>,
    ) -> (Self::CipherText, GenericArray<u8, Self::SharedSecretLength>);
    fn decapsulate(
        secret_key: &Self::SecretKey,
        public_key_hash: &GenericArray<u8, Self::PublicKeyHashLength>,
        cipher_text: &Self::CipherText,
    ) -> GenericArray<u8, Self::SharedSecretLength>;
}