Skip to content

Commit b092ebd

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 <jjelen@redhat.com>
1 parent 9d05683 commit b092ebd

File tree

2 files changed

+288
-13
lines changed

2 files changed

+288
-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,

0 commit comments

Comments
 (0)