Skip to content

Commit 043fd1a

Browse files
committed
Add SLH-DSA mechanisms
also removes the use of Deref trait in existing ML-DSA and ML-KEM mechanisms Signed-off-by: Jakub Jelen <[email protected]>
1 parent 5b62136 commit 043fd1a

File tree

2 files changed

+264
-13
lines changed

2 files changed

+264
-13
lines changed

cryptoki/src/mechanism/mod.rs

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,58 @@ impl MechanismType {
402402
val: CKM_HASH_ML_DSA_SHAKE256,
403403
};
404404

405+
// SLH-DSA
406+
/// SLH-DSA key pair generation mechanism
407+
pub const SLH_DSA_KEY_PAIR_GEN: MechanismType = MechanismType {
408+
val: CKM_SLH_DSA_KEY_PAIR_GEN,
409+
};
410+
/// SLH-DSA signature mechanism
411+
pub const SLH_DSA: MechanismType = MechanismType { val: CKM_SLH_DSA };
412+
/// HashSLH-DSA signature mechanism
413+
pub const HASH_SLH_DSA: MechanismType = MechanismType {
414+
val: CKM_HASH_SLH_DSA,
415+
};
416+
/// HashSLH-DSA signature mechanism with SHA224
417+
pub const HASH_SLH_DSA_SHA224: MechanismType = MechanismType {
418+
val: CKM_HASH_SLH_DSA_SHA224,
419+
};
420+
/// HashSLH-DSA signature mechanism with SHA256
421+
pub const HASH_SLH_DSA_SHA256: MechanismType = MechanismType {
422+
val: CKM_HASH_SLH_DSA_SHA256,
423+
};
424+
/// HashSLH-DSA signature mechanism with SHA384
425+
pub const HASH_SLH_DSA_SHA384: MechanismType = MechanismType {
426+
val: CKM_HASH_SLH_DSA_SHA384,
427+
};
428+
/// HashSLH-DSA signature mechanism with SHA512
429+
pub const HASH_SLH_DSA_SHA512: MechanismType = MechanismType {
430+
val: CKM_HASH_SLH_DSA_SHA512,
431+
};
432+
/// HashSLH-DSA signature mechanism with SHA3-224
433+
pub const HASH_SLH_DSA_SHA3_224: MechanismType = MechanismType {
434+
val: CKM_HASH_SLH_DSA_SHA3_224,
435+
};
436+
/// HashML-DSA signature mechanism with SHA3-256
437+
pub const HASH_SLH_DSA_SHA3_256: MechanismType = MechanismType {
438+
val: CKM_HASH_SLH_DSA_SHA3_256,
439+
};
440+
/// HashML-DSA signature mechanism with SHA3-384
441+
pub const HASH_SLH_DSA_SHA3_384: MechanismType = MechanismType {
442+
val: CKM_HASH_SLH_DSA_SHA3_384,
443+
};
444+
/// HashML-DSA signature mechanism with SHA3-512
445+
pub const HASH_SLH_DSA_SHA3_512: MechanismType = MechanismType {
446+
val: CKM_HASH_SLH_DSA_SHA3_512,
447+
};
448+
/// HashSLH-DSA signature mechanism with SHAKE128
449+
pub const HASH_SLH_DSA_SHAKE128: MechanismType = MechanismType {
450+
val: CKM_HASH_SLH_DSA_SHAKE128,
451+
};
452+
/// HashML-DSA signature mechanism with SHAKE256
453+
pub const HASH_SLH_DSA_SHAKE256: MechanismType = MechanismType {
454+
val: CKM_HASH_SLH_DSA_SHAKE256,
455+
};
456+
405457
/// Create vendor defined mechanism
406458
///
407459
/// # Arguments
@@ -811,6 +863,19 @@ impl MechanismType {
811863
CKM_HASH_ML_DSA_SHA3_512 => String::from(stringify!(CKM_HASH_ML_DSA_SHA3_512)),
812864
CKM_HASH_ML_DSA_SHAKE128 => String::from(stringify!(CKM_HASH_ML_DSA_SHAKE128)),
813865
CKM_HASH_ML_DSA_SHAKE256 => String::from(stringify!(CKM_HASH_ML_DSA_SHAKE256)),
866+
CKM_SLH_DSA_KEY_PAIR_GEN => String::from(stringify!(CKM_SLH_DSA_KEY_PAIR_GEN)),
867+
CKM_SLH_DSA => String::from(stringify!(CKM_SLH_DSA)),
868+
CKM_HASH_SLH_DSA => String::from(stringify!(CKM_HASH_SLH_DSA)),
869+
CKM_HASH_SLH_DSA_SHA224 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA224)),
870+
CKM_HASH_SLH_DSA_SHA256 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA256)),
871+
CKM_HASH_SLH_DSA_SHA384 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA384)),
872+
CKM_HASH_SLH_DSA_SHA512 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA512)),
873+
CKM_HASH_SLH_DSA_SHA3_224 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA3_224)),
874+
CKM_HASH_SLH_DSA_SHA3_256 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA3_256)),
875+
CKM_HASH_SLH_DSA_SHA3_384 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA3_384)),
876+
CKM_HASH_SLH_DSA_SHA3_512 => String::from(stringify!(CKM_HASH_SLH_DSA_SHA3_512)),
877+
CKM_HASH_SLH_DSA_SHAKE128 => String::from(stringify!(CKM_HASH_SLH_DSA_SHAKE128)),
878+
CKM_HASH_SLH_DSA_SHAKE256 => String::from(stringify!(CKM_HASH_SLH_DSA_SHAKE256)),
814879
_ => format!("unknown {mech:08x}"),
815880
}
816881
}
@@ -912,6 +977,18 @@ impl TryFrom<CK_MECHANISM_TYPE> for MechanismType {
912977
CKM_HASH_ML_DSA_SHA3_384 => Ok(MechanismType::HASH_ML_DSA_SHA3_384),
913978
CKM_HASH_ML_DSA_SHA3_512 => Ok(MechanismType::HASH_ML_DSA_SHA3_512),
914979
CKM_HASH_ML_DSA_SHAKE128 => Ok(MechanismType::HASH_ML_DSA_SHAKE128),
980+
CKM_SLH_DSA_KEY_PAIR_GEN => Ok(MechanismType::SLH_DSA_KEY_PAIR_GEN),
981+
CKM_SLH_DSA => Ok(MechanismType::SLH_DSA),
982+
CKM_HASH_SLH_DSA => Ok(MechanismType::HASH_SLH_DSA),
983+
CKM_HASH_SLH_DSA_SHA224 => Ok(MechanismType::HASH_SLH_DSA_SHA224),
984+
CKM_HASH_SLH_DSA_SHA256 => Ok(MechanismType::HASH_SLH_DSA_SHA256),
985+
CKM_HASH_SLH_DSA_SHA384 => Ok(MechanismType::HASH_SLH_DSA_SHA384),
986+
CKM_HASH_SLH_DSA_SHA512 => Ok(MechanismType::HASH_SLH_DSA_SHA512),
987+
CKM_HASH_SLH_DSA_SHA3_224 => Ok(MechanismType::HASH_SLH_DSA_SHA3_224),
988+
CKM_HASH_SLH_DSA_SHA3_256 => Ok(MechanismType::HASH_SLH_DSA_SHA3_256),
989+
CKM_HASH_SLH_DSA_SHA3_384 => Ok(MechanismType::HASH_SLH_DSA_SHA3_384),
990+
CKM_HASH_SLH_DSA_SHA3_512 => Ok(MechanismType::HASH_SLH_DSA_SHA3_512),
991+
CKM_HASH_SLH_DSA_SHAKE128 => Ok(MechanismType::HASH_SLH_DSA_SHAKE128),
915992
other => {
916993
error!("Mechanism type {} is not supported.", other);
917994
Err(Error::NotSupported)
@@ -1176,6 +1253,34 @@ pub enum Mechanism<'a> {
11761253
/// HashML-DSA signature mechanism with SHAKE256
11771254
HashMlDsaShake256(dsa::SignAdditionalContext<'a>),
11781255

1256+
// SLH-DSA
1257+
/// SLH-DSA key pair generation mechanism
1258+
SlhDsaKeyPairGen,
1259+
/// SLH-DSA signature mechanism
1260+
SlhDsa(dsa::SignAdditionalContext<'a>),
1261+
/// HashSLH-DSA signature mechanism
1262+
HashSlhDsa(dsa::HashSignAdditionalContext<'a>),
1263+
/// HashSLH-DSA signature mechanism with SHA224
1264+
HashSlhDsaSha224(dsa::SignAdditionalContext<'a>),
1265+
/// HashSLH-DSA signature mechanism with SHA256
1266+
HashSlhDsaSha256(dsa::SignAdditionalContext<'a>),
1267+
/// HashSLH-DSA signature mechanism with SHA384
1268+
HashSlhDsaSha384(dsa::SignAdditionalContext<'a>),
1269+
/// HashSLH-DSA signature mechanism with SHA512
1270+
HashSlhDsaSha512(dsa::SignAdditionalContext<'a>),
1271+
/// HashSLH-DSA signature mechanism with SHA3-224
1272+
HashSlhDsaSha3_224(dsa::SignAdditionalContext<'a>),
1273+
/// HashSLH-DSA signature mechanism with SHA3-256
1274+
HashSlhDsaSha3_256(dsa::SignAdditionalContext<'a>),
1275+
/// HashSLH-DSA signature mechanism with SHA3-384
1276+
HashSlhDsaSha3_384(dsa::SignAdditionalContext<'a>),
1277+
/// HashSLH-DSA signature mechanism with SHA3-512
1278+
HashSlhDsaSha3_512(dsa::SignAdditionalContext<'a>),
1279+
/// HashSLH-DSA signature mechanism with SHAKE128
1280+
HashSlhDsaShake128(dsa::SignAdditionalContext<'a>),
1281+
/// HashSLH-DSA signature mechanism with SHAKE256
1282+
HashSlhDsaShake256(dsa::SignAdditionalContext<'a>),
1283+
11791284
/// Vendor defined mechanism
11801285
VendorDefined(VendorDefinedMechanism<'a>),
11811286
}
@@ -1278,6 +1383,20 @@ impl Mechanism<'_> {
12781383
Mechanism::HashMlDsaShake128(_) => MechanismType::HASH_ML_DSA_SHAKE128,
12791384
Mechanism::HashMlDsaShake256(_) => MechanismType::HASH_ML_DSA_SHAKE256,
12801385

1386+
Mechanism::SlhDsaKeyPairGen => MechanismType::SLH_DSA_KEY_PAIR_GEN,
1387+
Mechanism::SlhDsa(_) => MechanismType::SLH_DSA,
1388+
Mechanism::HashSlhDsa(_) => MechanismType::HASH_SLH_DSA,
1389+
Mechanism::HashSlhDsaSha224(_) => MechanismType::HASH_SLH_DSA_SHA224,
1390+
Mechanism::HashSlhDsaSha256(_) => MechanismType::HASH_SLH_DSA_SHA256,
1391+
Mechanism::HashSlhDsaSha384(_) => MechanismType::HASH_SLH_DSA_SHA384,
1392+
Mechanism::HashSlhDsaSha512(_) => MechanismType::HASH_SLH_DSA_SHA512,
1393+
Mechanism::HashSlhDsaSha3_224(_) => MechanismType::HASH_SLH_DSA_SHA3_224,
1394+
Mechanism::HashSlhDsaSha3_256(_) => MechanismType::HASH_SLH_DSA_SHA3_256,
1395+
Mechanism::HashSlhDsaSha3_384(_) => MechanismType::HASH_SLH_DSA_SHA3_384,
1396+
Mechanism::HashSlhDsaSha3_512(_) => MechanismType::HASH_SLH_DSA_SHA3_512,
1397+
Mechanism::HashSlhDsaShake128(_) => MechanismType::HASH_SLH_DSA_SHAKE128,
1398+
Mechanism::HashSlhDsaShake256(_) => MechanismType::HASH_SLH_DSA_SHAKE256,
1399+
12811400
Mechanism::VendorDefined(vm) => MechanismType {
12821401
val: vm.inner.mechanism,
12831402
},
@@ -1353,6 +1472,25 @@ impl From<&Mechanism<'_>> for CK_MECHANISM {
13531472
},
13541473
Some(params) => make_mechanism(mechanism, params),
13551474
},
1475+
Mechanism::HashSlhDsa(params) => make_mechanism(mechanism, params),
1476+
Mechanism::SlhDsa(params)
1477+
| Mechanism::HashSlhDsaSha224(params)
1478+
| Mechanism::HashSlhDsaSha256(params)
1479+
| Mechanism::HashSlhDsaSha384(params)
1480+
| Mechanism::HashSlhDsaSha512(params)
1481+
| Mechanism::HashSlhDsaSha3_224(params)
1482+
| Mechanism::HashSlhDsaSha3_256(params)
1483+
| Mechanism::HashSlhDsaSha3_384(params)
1484+
| Mechanism::HashSlhDsaSha3_512(params)
1485+
| Mechanism::HashSlhDsaShake128(params)
1486+
| Mechanism::HashSlhDsaShake256(params) => match params.inner() {
1487+
None => CK_MECHANISM {
1488+
mechanism,
1489+
pParameter: null_mut(),
1490+
ulParameterLen: 0,
1491+
},
1492+
Some(params) => make_mechanism(mechanism, params),
1493+
},
13561494
// Mechanisms without parameters
13571495
Mechanism::AesKeyGen
13581496
| Mechanism::AesEcb
@@ -1400,7 +1538,8 @@ impl From<&Mechanism<'_>> for CK_MECHANISM {
14001538
| Mechanism::HkdfKeyGen
14011539
| Mechanism::MlKemKeyPairGen
14021540
| Mechanism::MlKem
1403-
| Mechanism::MlDsaKeyPairGen => CK_MECHANISM {
1541+
| Mechanism::MlDsaKeyPairGen
1542+
| Mechanism::SlhDsaKeyPairGen => CK_MECHANISM {
14041543
mechanism,
14051544
pParameter: null_mut(),
14061545
ulParameterLen: 0,

cryptoki/src/object.rs

Lines changed: 124 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,15 +1096,23 @@ impl TryFrom<Ulong> for ParameterSetType {
10961096
impl From<MlKemParameterSetType> for ParameterSetType {
10971097
fn from(val: MlKemParameterSetType) -> Self {
10981098
ParameterSetType {
1099-
val: Ulong::new(*val),
1099+
val: Ulong::new(*val.as_ref()),
11001100
}
11011101
}
11021102
}
11031103

11041104
impl From<MlDsaParameterSetType> for ParameterSetType {
11051105
fn from(val: MlDsaParameterSetType) -> Self {
11061106
ParameterSetType {
1107-
val: Ulong::new(*val),
1107+
val: Ulong::new(*val.as_ref()),
1108+
}
1109+
}
1110+
}
1111+
1112+
impl From<SlhDsaParameterSetType> for ParameterSetType {
1113+
fn from(val: SlhDsaParameterSetType) -> Self {
1114+
ParameterSetType {
1115+
val: Ulong::new(*val.as_ref()),
11081116
}
11091117
}
11101118
}
@@ -1146,17 +1154,15 @@ impl std::fmt::Display for MlKemParameterSetType {
11461154
}
11471155
}
11481156

1149-
impl Deref for MlKemParameterSetType {
1150-
type Target = CK_ML_KEM_PARAMETER_SET_TYPE;
1151-
1152-
fn deref(&self) -> &Self::Target {
1157+
impl AsRef<CK_ML_KEM_PARAMETER_SET_TYPE> for MlKemParameterSetType {
1158+
fn as_ref(&self) -> &CK_ML_KEM_PARAMETER_SET_TYPE {
11531159
&self.val
11541160
}
11551161
}
11561162

11571163
impl From<MlKemParameterSetType> for CK_ML_KEM_PARAMETER_SET_TYPE {
11581164
fn from(val: MlKemParameterSetType) -> Self {
1159-
*val
1165+
*val.as_ref()
11601166
}
11611167
}
11621168

@@ -1215,17 +1221,15 @@ impl std::fmt::Display for MlDsaParameterSetType {
12151221
}
12161222
}
12171223

1218-
impl Deref for MlDsaParameterSetType {
1219-
type Target = CK_ML_DSA_PARAMETER_SET_TYPE;
1220-
1221-
fn deref(&self) -> &Self::Target {
1224+
impl AsRef<CK_ML_DSA_PARAMETER_SET_TYPE> for MlDsaParameterSetType {
1225+
fn as_ref(&self) -> &CK_ML_DSA_PARAMETER_SET_TYPE {
12221226
&self.val
12231227
}
12241228
}
12251229

12261230
impl From<MlDsaParameterSetType> for CK_ML_DSA_PARAMETER_SET_TYPE {
12271231
fn from(val: MlDsaParameterSetType) -> Self {
1228-
*val
1232+
*val.as_ref()
12291233
}
12301234
}
12311235

@@ -1253,6 +1257,109 @@ impl From<ParameterSetType> for MlDsaParameterSetType {
12531257
}
12541258
}
12551259

1260+
#[derive(Copy, Debug, Clone, PartialEq, Eq)]
1261+
#[repr(transparent)]
1262+
/// Identifier of the SLH-DSA parameter set
1263+
pub struct SlhDsaParameterSetType {
1264+
val: CK_SLH_DSA_PARAMETER_SET_TYPE,
1265+
}
1266+
1267+
impl SlhDsaParameterSetType {
1268+
/// SLH-DSA-SHA2-128s
1269+
pub const SHA2_128S: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHA2_128S };
1270+
/// SLH-DSA-SHAKE-128s
1271+
pub const SHAKE_128S: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHAKE_128S };
1272+
/// SLH-DSA-SHA2-128f
1273+
pub const SHA2_128F: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHA2_128F };
1274+
/// SLH-DSA-SHAKE-128f
1275+
pub const SHAKE_128F: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHAKE_128F };
1276+
/// SLH-DSA-SHA2-192s
1277+
pub const SHA2_192S: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHA2_192S };
1278+
/// SLH-DSA-SHAKE-192s
1279+
pub const SHAKE_192S: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHAKE_192S };
1280+
/// SLH-DSA-SHA2-192f
1281+
pub const SHA2_192F: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHA2_192F };
1282+
/// SLH-DSA-SHAKE-192f
1283+
pub const SHAKE_192F: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHAKE_192F };
1284+
/// SLH-DSA-SHA2-256s
1285+
pub const SHA2_256S: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHA2_256S };
1286+
/// SLH-DSA-SHAKE-256s
1287+
pub const SHAKE_256S: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHAKE_256S };
1288+
/// SLH-DSA-SHA2-256f
1289+
pub const SHA2_256F: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHA2_256F };
1290+
/// SLH-DSA-SHAKE-256f
1291+
pub const SHAKE_256F: SlhDsaParameterSetType = SlhDsaParameterSetType { val: CKP_SLH_DSA_SHAKE_256F };
1292+
1293+
pub(crate) fn stringify(val: CK_SLH_DSA_PARAMETER_SET_TYPE) -> String {
1294+
match val {
1295+
CKP_SLH_DSA_SHA2_128S => String::from(stringify!(CKP_SLH_DSA_SHA2_128S)),
1296+
CKP_SLH_DSA_SHAKE_128S => String::from(stringify!(CKP_SLH_DSA_SHAKE_128S)),
1297+
CKP_SLH_DSA_SHA2_128F => String::from(stringify!(CKP_SLH_DSA_SHA2_128F)),
1298+
CKP_SLH_DSA_SHAKE_128F => String::from(stringify!(CKP_SLH_DSA_SHAKE_128F)),
1299+
CKP_SLH_DSA_SHA2_192S => String::from(stringify!(CKP_SLH_DSA_SHA2_192S)),
1300+
CKP_SLH_DSA_SHAKE_192S => String::from(stringify!(CKP_SLH_DSA_SHAKE_192S)),
1301+
CKP_SLH_DSA_SHA2_192F => String::from(stringify!(CKP_SLH_DSA_SHA2_192F)),
1302+
CKP_SLH_DSA_SHAKE_192F => String::from(stringify!(CKP_SLH_DSA_SHAKE_192F)),
1303+
CKP_SLH_DSA_SHA2_256S => String::from(stringify!(CKP_SLH_DSA_SHA2_256S)),
1304+
CKP_SLH_DSA_SHAKE_256S => String::from(stringify!(CKP_SLH_DSA_SHAKE_256S)),
1305+
CKP_SLH_DSA_SHA2_256F => String::from(stringify!(CKP_SLH_DSA_SHA2_256F)),
1306+
CKP_SLH_DSA_SHAKE_256F => String::from(stringify!(CKP_SLH_DSA_SHAKE_256F)),
1307+
_ => format!("unknown ({val:08x})"),
1308+
}
1309+
}
1310+
}
1311+
1312+
impl std::fmt::Display for SlhDsaParameterSetType {
1313+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1314+
write!(f, "{}", SlhDsaParameterSetType::stringify(self.val))
1315+
}
1316+
}
1317+
1318+
impl AsRef<CK_SLH_DSA_PARAMETER_SET_TYPE> for SlhDsaParameterSetType {
1319+
fn as_ref(&self) -> &CK_SLH_DSA_PARAMETER_SET_TYPE {
1320+
&self.val
1321+
}
1322+
}
1323+
1324+
impl From<SlhDsaParameterSetType> for CK_SLH_DSA_PARAMETER_SET_TYPE {
1325+
fn from(val: SlhDsaParameterSetType) -> Self {
1326+
*val.as_ref()
1327+
}
1328+
}
1329+
1330+
impl TryFrom<CK_ML_DSA_PARAMETER_SET_TYPE> for SlhDsaParameterSetType {
1331+
type Error = Error;
1332+
1333+
fn try_from(val: CK_ML_DSA_PARAMETER_SET_TYPE) -> Result<Self> {
1334+
match val {
1335+
CKP_SLH_DSA_SHA2_128S => Ok(SlhDsaParameterSetType::SHA2_128S),
1336+
CKP_SLH_DSA_SHAKE_128S => Ok(SlhDsaParameterSetType::SHAKE_128S),
1337+
CKP_SLH_DSA_SHA2_128F => Ok(SlhDsaParameterSetType::SHA2_128F),
1338+
CKP_SLH_DSA_SHAKE_128F => Ok(SlhDsaParameterSetType::SHAKE_128F),
1339+
CKP_SLH_DSA_SHA2_192S => Ok(SlhDsaParameterSetType::SHA2_192S),
1340+
CKP_SLH_DSA_SHAKE_192S => Ok(SlhDsaParameterSetType::SHAKE_192S),
1341+
CKP_SLH_DSA_SHA2_192F => Ok(SlhDsaParameterSetType::SHA2_192F),
1342+
CKP_SLH_DSA_SHAKE_192F => Ok(SlhDsaParameterSetType::SHAKE_192F),
1343+
CKP_SLH_DSA_SHA2_256S => Ok(SlhDsaParameterSetType::SHA2_256S),
1344+
CKP_SLH_DSA_SHAKE_256S => Ok(SlhDsaParameterSetType::SHAKE_256S),
1345+
CKP_SLH_DSA_SHA2_256F => Ok(SlhDsaParameterSetType::SHA2_256F),
1346+
CKP_SLH_DSA_SHAKE_256F => Ok(SlhDsaParameterSetType::SHAKE_256F),
1347+
_ => {
1348+
error!("SLH-DSA parameter set {} is not supported.", val);
1349+
Err(Error::NotSupported)
1350+
}
1351+
}
1352+
}
1353+
}
1354+
1355+
impl From<ParameterSetType> for SlhDsaParameterSetType {
1356+
fn from(val: ParameterSetType) -> Self {
1357+
SlhDsaParameterSetType {
1358+
val: CK_ULONG::from(*val),
1359+
}
1360+
}
1361+
}
1362+
12561363
#[derive(Copy, Debug, Clone, PartialEq, Eq)]
12571364
#[repr(transparent)]
12581365
/// Identifier of the class of an object
@@ -1496,6 +1603,9 @@ impl KeyType {
14961603
/// ML-DSA key
14971604
pub const ML_DSA: KeyType = KeyType { val: CKK_ML_DSA };
14981605

1606+
/// SLH-DSA key
1607+
pub const SLH_DSA: KeyType = KeyType { val: CKK_SLH_DSA };
1608+
14991609
/// Create vendor defined key type
15001610
///
15011611
/// # Arguments
@@ -1570,6 +1680,7 @@ impl KeyType {
15701680
CKK_HKDF => String::from(stringify!(CKK_HKDF)),
15711681
CKK_ML_KEM => String::from(stringify!(CKK_ML_KEM)),
15721682
CKK_ML_DSA => String::from(stringify!(CKK_ML_DSA)),
1683+
CKK_SLH_DSA => String::from(stringify!(CKK_SLH_DSA)),
15731684
CKK_VENDOR_DEFINED..=CK_ULONG::MAX => String::from(stringify!(key_type)),
15741685
_ => format!("unknown ({key_type:08x})"),
15751686
}
@@ -1647,6 +1758,7 @@ impl TryFrom<CK_KEY_TYPE> for KeyType {
16471758
CKK_HKDF => Ok(KeyType::HKDF),
16481759
CKK_ML_KEM => Ok(KeyType::ML_KEM),
16491760
CKK_ML_DSA => Ok(KeyType::ML_DSA),
1761+
CKK_SLH_DSA => Ok(KeyType::SLH_DSA),
16501762
CKK_VENDOR_DEFINED..=CK_ULONG::MAX => KeyType::new_vendor_defined(key_type),
16511763
_ => {
16521764
error!("Key type {} is not supported.", key_type);

0 commit comments

Comments
 (0)