libcrux_traits/kem/
arrayref.rs1use libcrux_secrets::U8;
5
6pub trait Kem<
9 const EK_LEN: usize,
10 const DK_LEN: usize,
11 const CT_LEN: usize,
12 const SS_LEN: usize,
13 const RAND_KEYGEN_LEN: usize,
14 const RAND_ENCAPS_LEN: usize,
15>
16{
17 fn keygen(
21 ek: &mut [u8; EK_LEN],
22 dk: &mut [U8; DK_LEN],
23 rand: &[U8; RAND_KEYGEN_LEN],
24 ) -> Result<(), KeyGenError>;
25
26 fn encaps(
30 ct: &mut [u8; CT_LEN],
31 ss: &mut [U8; SS_LEN],
32 ek: &[u8; EK_LEN],
33 rand: &[U8; RAND_ENCAPS_LEN],
34 ) -> Result<(), EncapsError>;
35
36 fn decaps(
38 ss: &mut [U8; SS_LEN],
39 ct: &[u8; CT_LEN],
40 dk: &[U8; DK_LEN],
41 ) -> Result<(), DecapsError>;
42}
43
44#[derive(Debug)]
46pub enum KeyGenError {
47 InvalidRandomness,
49
50 Unknown,
52}
53
54#[derive(Debug)]
56pub enum EncapsError {
57 InvalidEncapsKey,
59
60 InvalidRandomness,
62
63 Unknown,
65}
66
67#[derive(Debug)]
69pub enum DecapsError {
70 InvalidCiphertext,
72
73 InvalidDecapsKey,
75
76 Unknown,
78}
79
80impl core::fmt::Display for KeyGenError {
81 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
82 let text = match self {
83 KeyGenError::InvalidRandomness => "error generating key with provided randomness",
84 KeyGenError::Unknown => "an unknown error occurred",
85 };
86
87 f.write_str(text)
88 }
89}
90
91impl core::fmt::Display for EncapsError {
92 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
93 let text = match self {
94 EncapsError::InvalidEncapsKey => "encapsulation key is invalid",
95 EncapsError::InvalidRandomness => "error generating key with provided randomness",
96 EncapsError::Unknown => "an unknown error occurred",
97 };
98
99 f.write_str(text)
100 }
101}
102
103impl core::fmt::Display for DecapsError {
104 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
105 let text = match self {
106 DecapsError::InvalidDecapsKey => "encapsulation key is invalid",
107 DecapsError::InvalidCiphertext => "ciphertext is invalid",
108 DecapsError::Unknown => "an unknown error occurred",
109 };
110
111 f.write_str(text)
112 }
113}
114
115#[cfg(feature = "error-in-core")]
116mod error_in_core {
119 impl core::error::Error for super::EncapsError {}
120 impl core::error::Error for super::DecapsError {}
121 impl core::error::Error for super::KeyGenError {}
122}