#![forbid(unsafe_code)]
use postcard::experimental::max_size::MaxSize;
use serde::{Deserialize, Serialize};
use typenum::U64;
use crate::{
aead::{Aead, AeadId, IndCca2},
hash::{Hash, HashId},
kdf::{Kdf, KdfId},
kem::{Kem, KemId},
mac::{Mac, MacId},
signer::{Signer, SignerId},
Id,
};
pub trait CipherSuite {
const ID: Id;
type Aead: Aead + IndCca2;
type Hash: Hash<DigestSize = U64>;
type Kdf: Kdf;
type Kem: Kem;
type Mac: Mac<KeySize = U64, TagSize = U64>;
type Signer: Signer;
}
#[derive(Copy, Clone, Eq, PartialEq, Serialize, Deserialize, MaxSize)]
pub(crate) struct SuiteIds {
pub aead: AeadId,
pub hash: HashId,
pub kdf: KdfId,
pub kem: KemId,
pub mac: MacId,
pub signer: SignerId,
}
impl SuiteIds {
#[allow(clippy::cast_possible_truncation)]
pub const fn into_bytes(self) -> [u8; 6 * 2] {
[
self.aead.to_u16() as u8,
(self.aead.to_u16() >> 8) as u8,
self.hash.to_u16() as u8,
(self.hash.to_u16() >> 8) as u8,
self.kdf.to_u16() as u8,
(self.kdf.to_u16() >> 8) as u8,
self.kem.to_u16() as u8,
(self.kem.to_u16() >> 8) as u8,
self.mac.to_u16() as u8,
(self.mac.to_u16() >> 8) as u8,
self.signer.to_u16() as u8,
(self.signer.to_u16() >> 8) as u8,
]
}
pub const fn from_suite<S: CipherSuite>() -> Self {
Self {
aead: S::Aead::ID,
hash: S::Hash::ID,
kdf: S::Kdf::ID,
kem: S::Kem::ID,
mac: S::Mac::ID,
signer: S::Signer::ID,
}
}
}