Skip to content

Commit 4913b50

Browse files
authored
Merge pull request #307 from Jakuje/slh-dsa
Add SLH-DSA mechanism
2 parents 2765af6 + b092ebd commit 4913b50

File tree

4 files changed

+308
-33
lines changed

4 files changed

+308
-33
lines changed

cryptoki/src/mechanism/mldsa.rs renamed to cryptoki/src/mechanism/dsa.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
//! ML-DSA mechanism types
1+
//! ML-DSA and SLH-DSA mechanism parameters
22
33
use crate::mechanism::{Mechanism, MechanismType};
44

55
use cryptoki_sys::*;
66
use std::{convert::TryInto, marker::PhantomData, ptr::null_mut};
77

8-
/// The hedge type for ML-DSA signature
8+
/// The hedge type for ML-DSA and SLH-DSA signature
99
#[derive(Debug, Clone, Copy, PartialEq, Default)]
1010
pub enum HedgeType {
1111
/// Token may create either a hedged signature or a deterministic signature
@@ -33,7 +33,7 @@ impl From<HedgeType> for CK_ULONG {
3333
}
3434
}
3535

36-
/// The ML-DSA additional context for signatures
36+
/// The ML-DSA and SLH-DSA additional context for signatures
3737
///
3838
/// This structure wraps `CK_SIGN_ADDITIONAL_CONTEXT` structure.
3939
#[derive(Debug, Clone, Copy)]
@@ -44,7 +44,7 @@ pub struct SignAdditionalContext<'a> {
4444
}
4545

4646
impl SignAdditionalContext<'_> {
47-
/// Construct ML-DSA signature parameters.
47+
/// Construct ML-DSA and SLH-DSA signature parameters.
4848
///
4949
/// # Arguments
5050
///
@@ -94,7 +94,7 @@ impl SignAdditionalContext<'_> {
9494
}
9595
}
9696

97-
/// The ML-DSA additional context for signatures with hashing information
97+
/// The ML-DSA and SLH-DSA additional context for signatures with hashing information
9898
///
9999
/// This structure wraps `CK_HASH_SIGN_ADDITIONAL_CONTEXT` structure.
100100
#[derive(Debug, Clone, Copy)]
@@ -105,7 +105,7 @@ pub struct HashSignAdditionalContext<'a> {
105105
}
106106

107107
impl HashSignAdditionalContext<'_> {
108-
/// Construct HashML-DSA Signature parameters.
108+
/// Construct HashML-DSA or HashSLH-DSA Signature parameters.
109109
///
110110
/// # Arguments
111111
///

cryptoki/src/mechanism/mod.rs

Lines changed: 153 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
//! Data types for mechanisms
44
55
pub mod aead;
6+
pub mod dsa;
67
pub mod eddsa;
78
pub mod ekdf;
89
pub mod elliptic_curve;
910
pub mod hkdf;
1011
pub mod kbkdf;
1112
mod mechanism_info;
12-
pub mod mldsa;
1313
pub mod rsa;
1414
pub mod vendor_defined;
1515

@@ -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)
@@ -1152,29 +1229,57 @@ pub enum Mechanism<'a> {
11521229
/// ML-DSA key pair generation mechanism
11531230
MlDsaKeyPairGen,
11541231
/// ML-DSA signature mechanism
1155-
MlDsa(mldsa::SignAdditionalContext<'a>),
1232+
MlDsa(dsa::SignAdditionalContext<'a>),
11561233
/// HashML-DSA signature mechanism
1157-
HashMlDsa(mldsa::HashSignAdditionalContext<'a>),
1234+
HashMlDsa(dsa::HashSignAdditionalContext<'a>),
11581235
/// HashML-DSA signature mechanism with SHA224
1159-
HashMlDsaSha224(mldsa::SignAdditionalContext<'a>),
1236+
HashMlDsaSha224(dsa::SignAdditionalContext<'a>),
11601237
/// HashML-DSA signature mechanism with SHA256
1161-
HashMlDsaSha256(mldsa::SignAdditionalContext<'a>),
1238+
HashMlDsaSha256(dsa::SignAdditionalContext<'a>),
11621239
/// HashML-DSA signature mechanism with SHA384
1163-
HashMlDsaSha384(mldsa::SignAdditionalContext<'a>),
1240+
HashMlDsaSha384(dsa::SignAdditionalContext<'a>),
11641241
/// HashML-DSA signature mechanism with SHA512
1165-
HashMlDsaSha512(mldsa::SignAdditionalContext<'a>),
1242+
HashMlDsaSha512(dsa::SignAdditionalContext<'a>),
11661243
/// HashML-DSA signature mechanism with SHA3-224
1167-
HashMlDsaSha3_224(mldsa::SignAdditionalContext<'a>),
1244+
HashMlDsaSha3_224(dsa::SignAdditionalContext<'a>),
11681245
/// HashML-DSA signature mechanism with SHA3-256
1169-
HashMlDsaSha3_256(mldsa::SignAdditionalContext<'a>),
1246+
HashMlDsaSha3_256(dsa::SignAdditionalContext<'a>),
11701247
/// HashML-DSA signature mechanism with SHA3-384
1171-
HashMlDsaSha3_384(mldsa::SignAdditionalContext<'a>),
1248+
HashMlDsaSha3_384(dsa::SignAdditionalContext<'a>),
11721249
/// HashML-DSA signature mechanism with SHA3-512
1173-
HashMlDsaSha3_512(mldsa::SignAdditionalContext<'a>),
1250+
HashMlDsaSha3_512(dsa::SignAdditionalContext<'a>),
11741251
/// HashML-DSA signature mechanism with SHAKE128
1175-
HashMlDsaShake128(mldsa::SignAdditionalContext<'a>),
1252+
HashMlDsaShake128(dsa::SignAdditionalContext<'a>),
11761253
/// HashML-DSA signature mechanism with SHAKE256
1177-
HashMlDsaShake256(mldsa::SignAdditionalContext<'a>),
1254+
HashMlDsaShake256(dsa::SignAdditionalContext<'a>),
1255+
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>),
11781283

11791284
/// Vendor defined mechanism
11801285
VendorDefined(VendorDefinedMechanism<'a>),
@@ -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)