1#![forbid(unsafe_code)]
15#![allow(missing_docs)] use serde::{Deserialize, Serialize};
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(rename_all = "kebab-case")]
22pub enum ParameterSet {
23 MlKem512,
25 MlKem768,
27 MlKem1024,
29}
30
31impl ParameterSet {
32 pub fn public_key_size(&self) -> usize {
34 match self {
35 ParameterSet::MlKem512 => 800,
36 ParameterSet::MlKem768 => 1184,
37 ParameterSet::MlKem1024 => 1568,
38 }
39 }
40
41 pub fn ciphertext_size(&self) -> usize {
43 match self {
44 ParameterSet::MlKem512 => 768,
45 ParameterSet::MlKem768 => 1088,
46 ParameterSet::MlKem1024 => 1568,
47 }
48 }
49
50 pub fn shared_secret_size(&self) -> usize {
52 32
53 }
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct ThresholdPublicKey {
59 pub params: ParameterSet,
61 pub bytes: Vec<u8>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct Share {
68 pub params: ParameterSet,
70 pub party_index: u32,
72 pub bytes: Vec<u8>,
74}
75
76#[derive(Debug, thiserror::Error)]
78pub enum MlKemError {
79 #[error("parameter set mismatch")]
81 ParamMismatch,
82 #[error("threshold not met: have {have}, need {need}")]
84 ThresholdNotMet {
85 have: usize,
87 need: u32,
89 },
90 #[error("operation requires research collaborator engagement: {0}")]
92 ResearchOnly(String),
93}
94
95pub fn placeholder_public_key(params: ParameterSet) -> ThresholdPublicKey {
97 ThresholdPublicKey {
98 params,
99 bytes: vec![0u8; params.public_key_size()],
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106
107 #[test]
108 fn parameter_set_sizes() {
109 assert_eq!(ParameterSet::MlKem512.public_key_size(), 800);
110 assert_eq!(ParameterSet::MlKem768.public_key_size(), 1184);
111 assert_eq!(ParameterSet::MlKem1024.public_key_size(), 1568);
112 }
113
114 #[test]
115 fn shared_secret_always_32() {
116 for params in [
117 ParameterSet::MlKem512,
118 ParameterSet::MlKem768,
119 ParameterSet::MlKem1024,
120 ] {
121 assert_eq!(params.shared_secret_size(), 32);
122 }
123 }
124}