1#![forbid(unsafe_code)]
2#![no_std]
3
4use rac::{
5 LineValid,
6 generic_array::{ArrayLength, GenericArray},
7};
8
9pub trait Kem {
10 type PublicKey: LineValid;
11 type SecretKey: LineValid;
12 type CipherText: LineValid;
13 type PairSeedLength: ArrayLength<u8>;
14 type PublicKeyHashLength: ArrayLength<u8>;
15 type EncapsulationSeedLength: ArrayLength<u8>;
16 type SharedSecretLength: ArrayLength<u8>;
17
18 fn generate_pair(
19 seed: &GenericArray<u8, Self::PairSeedLength>,
20 ) -> (Self::PublicKey, Self::SecretKey);
21 fn encapsulate(
22 seed: &GenericArray<u8, Self::EncapsulationSeedLength>,
23 public_key: &Self::PublicKey,
24 public_key_hash: &GenericArray<u8, Self::PublicKeyHashLength>,
25 ) -> (Self::CipherText, GenericArray<u8, Self::SharedSecretLength>);
26 fn decapsulate(
27 secret_key: &Self::SecretKey,
28 public_key: &Self::PublicKey,
29 public_key_hash: &GenericArray<u8, Self::PublicKeyHashLength>,
30 cipher_text: &Self::CipherText,
31 ) -> GenericArray<u8, Self::SharedSecretLength>;
32}