bc_components/mldsa/
mldsa_level.rs1use anyhow::{bail, Error, Result};
2use dcbor::prelude::*;
3use pqcrypto_mldsa::*;
4
5use super::{MLDSAPrivateKey, MLDSAPublicKey};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23#[repr(u32)]
24pub enum MLDSA {
25 MLDSA44 = 2,
27 MLDSA65 = 3,
29 MLDSA87 = 5,
31}
32
33impl MLDSA {
34 pub fn keypair(self) -> (MLDSAPrivateKey, MLDSAPublicKey) {
47 match self {
48 MLDSA::MLDSA44 => {
49 let (pk, sk) = mldsa44::keypair();
50 (
51 MLDSAPrivateKey::MLDSA44(Box::new(sk)),
52 MLDSAPublicKey::MLDSA44(Box::new(pk)),
53 )
54 }
55 MLDSA::MLDSA65 => {
56 let (pk, sk) = mldsa65::keypair();
57 (
58 MLDSAPrivateKey::MLDSA65(Box::new(sk)),
59 MLDSAPublicKey::MLDSA65(Box::new(pk)),
60 )
61 }
62 MLDSA::MLDSA87 => {
63 let (pk, sk) = mldsa87::keypair();
64 (
65 MLDSAPrivateKey::MLDSA87(Box::new(sk)),
66 MLDSAPublicKey::MLDSA87(Box::new(pk)),
67 )
68 }
69 }
70 }
71
72 pub fn private_key_size(&self) -> usize {
74 match self {
75 MLDSA::MLDSA44 => mldsa44::secret_key_bytes(),
76 MLDSA::MLDSA65 => mldsa65::secret_key_bytes(),
77 MLDSA::MLDSA87 => mldsa87::secret_key_bytes(),
78 }
79 }
80
81 pub fn public_key_size(&self) -> usize {
83 match self {
84 MLDSA::MLDSA44 => mldsa44::public_key_bytes(),
85 MLDSA::MLDSA65 => mldsa65::public_key_bytes(),
86 MLDSA::MLDSA87 => mldsa87::public_key_bytes(),
87 }
88 }
89
90 pub fn signature_size(&self) -> usize {
92 match self {
93 MLDSA::MLDSA44 => mldsa44::signature_bytes(),
94 MLDSA::MLDSA65 => mldsa65::signature_bytes(),
95 MLDSA::MLDSA87 => mldsa87::signature_bytes(),
96 }
97 }
98}
99
100impl From<MLDSA> for CBOR {
102 fn from(level: MLDSA) -> Self {
104 (level as u32).into()
105 }
106}
107
108impl TryFrom<CBOR> for MLDSA {
110 type Error = Error;
111
112 fn try_from(cbor: CBOR) -> Result<Self> {
117 let level = u32::try_from(cbor)?;
118 match level {
119 2 => Ok(MLDSA::MLDSA44),
120 3 => Ok(MLDSA::MLDSA65),
121 5 => Ok(MLDSA::MLDSA87),
122 _ => bail!("Invalid MLDSA level: {}", level),
123 }
124 }
125}
126
127#[cfg(test)]
128mod tests {
129 use super::*;
130
131 #[test]
132 fn test_mldsa_level() {
133 let level = MLDSA::MLDSA44;
134 assert_eq!(format!("{:?}", level), "MLDSA44");
135 let cbor = CBOR::from(level);
136 let level2 = MLDSA::try_from(cbor).unwrap();
137 assert_eq!(level, level2);
138
139 let level = MLDSA::MLDSA65;
140 assert_eq!(format!("{:?}", level), "MLDSA65");
141 let cbor = CBOR::from(level);
142 let level2 = MLDSA::try_from(cbor).unwrap();
143 assert_eq!(level, level2);
144
145 let level = MLDSA::MLDSA87;
146 assert_eq!(format!("{:?}", level), "MLDSA87");
147 let cbor = CBOR::from(level);
148 let level2 = MLDSA::try_from(cbor).unwrap();
149 assert_eq!(level, level2);
150 }
151}