Skip to content

Commit 2f6a5ab

Browse files
Add mechanisms for simple key derivation
Signed-off-by: Jacob Prud'homme <2160185+jacobprudhomme@users.noreply.github.com>
1 parent 9a0092a commit 2f6a5ab

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

cryptoki/src/mechanism/mod.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ use std::ptr::null_mut;
2525
use vendor_defined::VendorDefinedMechanism;
2626

2727
use crate::error::Error;
28+
use crate::mechanism::misc::{ExtractParams, KeyDerivationStringData};
2829
use crate::mechanism::rsa::PkcsOaepParams;
30+
use crate::object::ObjectHandle;
2931
pub use mechanism_info::MechanismInfo;
3032

3133
#[derive(Copy, Debug, Clone, PartialEq, Eq)]
@@ -343,6 +345,28 @@ impl MechanismType {
343345
val: CKM_SP800_108_DOUBLE_PIPELINE_KDF,
344346
};
345347

348+
// Other simple key derivation mechanisms
349+
/// Concatenation of a base key and another key
350+
pub const CONCATENATE_BASE_AND_KEY: MechanismType = MechanismType {
351+
val: CKM_CONCATENATE_BASE_AND_KEY,
352+
};
353+
/// Concatenation of a base key and data (i.e. data appended)
354+
pub const CONCATENATE_BASE_AND_DATA: MechanismType = MechanismType {
355+
val: CKM_CONCATENATE_BASE_AND_DATA,
356+
};
357+
/// Concatenation of data and a base key (i.e. data prepended)
358+
pub const CONCATENATE_DATA_AND_BASE: MechanismType = MechanismType {
359+
val: CKM_CONCATENATE_DATA_AND_BASE,
360+
};
361+
/// XOR-ing of a base key and data
362+
pub const XOR_BASE_AND_DATA: MechanismType = MechanismType {
363+
val: CKM_XOR_BASE_AND_DATA,
364+
};
365+
/// Extraction of a key from bits of another key
366+
pub const EXTRACT_KEY_FROM_KEY: MechanismType = MechanismType {
367+
val: CKM_EXTRACT_KEY_FROM_KEY,
368+
};
369+
346370
// ML-KEM
347371
/// ML-KEM key pair generation mechanism
348372
pub const ML_KEM_KEY_PAIR_GEN: MechanismType = MechanismType {
@@ -964,6 +988,11 @@ impl TryFrom<CK_MECHANISM_TYPE> for MechanismType {
964988
CKM_SP800_108_COUNTER_KDF => Ok(MechanismType::SP800_108_COUNTER_KDF),
965989
CKM_SP800_108_FEEDBACK_KDF => Ok(MechanismType::SP800_108_FEEDBACK_KDF),
966990
CKM_SP800_108_DOUBLE_PIPELINE_KDF => Ok(MechanismType::SP800_108_DOUBLE_PIPELINE_KDF),
991+
CKM_CONCATENATE_BASE_AND_KEY => Ok(MechanismType::CONCATENATE_BASE_AND_KEY),
992+
CKM_CONCATENATE_BASE_AND_DATA => Ok(MechanismType::CONCATENATE_BASE_AND_DATA),
993+
CKM_CONCATENATE_DATA_AND_BASE => Ok(MechanismType::CONCATENATE_DATA_AND_BASE),
994+
CKM_XOR_BASE_AND_DATA => Ok(MechanismType::XOR_BASE_AND_DATA),
995+
CKM_EXTRACT_KEY_FROM_KEY => Ok(MechanismType::EXTRACT_KEY_FROM_KEY),
967996
CKM_ML_KEM_KEY_PAIR_GEN => Ok(MechanismType::ML_KEM_KEY_PAIR_GEN),
968997
CKM_ML_KEM => Ok(MechanismType::ML_KEM),
969998
CKM_ML_DSA_KEY_PAIR_GEN => Ok(MechanismType::ML_DSA_KEY_PAIR_GEN),
@@ -1220,6 +1249,18 @@ pub enum Mechanism<'a> {
12201249
/// NIST SP 800-108 KDF (aka KBKDF) mechanism in double pipeline-mode
12211250
KbkdfDoublePipeline(kbkdf::KbkdfParams<'a>),
12221251

1252+
// Other simple key derivation mechanisms
1253+
/// Concatenation of a base key and another key
1254+
ConcatenateBaseAndKey(ObjectHandle),
1255+
/// Concatenation of a base key and data (i.e. data appended)
1256+
ConcatenateBaseAndData(KeyDerivationStringData<'a>),
1257+
/// Concatenation of data and a base key (i.e. data prepended)
1258+
ConcatenateDataAndBase(KeyDerivationStringData<'a>),
1259+
/// XOR-ing of a base key and data
1260+
XorBaseAndData(KeyDerivationStringData<'a>),
1261+
/// Extraction of a key from bits of another key
1262+
ExtractKeyFromKey(ExtractParams),
1263+
12231264
// ML-KEM
12241265
/// ML-KEM key pair generation mechanism
12251266
MlKemKeyPairGen,
@@ -1367,6 +1408,12 @@ impl Mechanism<'_> {
13671408
Mechanism::KbkdfFeedback(_) => MechanismType::SP800_108_FEEDBACK_KDF,
13681409
Mechanism::KbkdfDoublePipeline(_) => MechanismType::SP800_108_DOUBLE_PIPELINE_KDF,
13691410

1411+
Mechanism::ConcatenateBaseAndKey(_) => MechanismType::CONCATENATE_BASE_AND_KEY,
1412+
Mechanism::ConcatenateBaseAndData(_) => MechanismType::CONCATENATE_BASE_AND_DATA,
1413+
Mechanism::ConcatenateDataAndBase(_) => MechanismType::CONCATENATE_DATA_AND_BASE,
1414+
Mechanism::XorBaseAndData(_) => MechanismType::XOR_BASE_AND_DATA,
1415+
Mechanism::ExtractKeyFromKey(_) => MechanismType::EXTRACT_KEY_FROM_KEY,
1416+
13701417
Mechanism::MlKemKeyPairGen => MechanismType::ML_KEM_KEY_PAIR_GEN,
13711418
Mechanism::MlKem => MechanismType::ML_KEM,
13721419

@@ -1454,6 +1501,11 @@ impl From<&Mechanism<'_>> for CK_MECHANISM {
14541501
make_mechanism(mechanism, params.inner())
14551502
}
14561503
Mechanism::KbkdfFeedback(params) => make_mechanism(mechanism, params.inner()),
1504+
Mechanism::ConcatenateBaseAndKey(params) => make_mechanism(mechanism, params),
1505+
Mechanism::ConcatenateBaseAndData(params)
1506+
| Mechanism::ConcatenateDataAndBase(params)
1507+
| Mechanism::XorBaseAndData(params) => make_mechanism(mechanism, params),
1508+
Mechanism::ExtractKeyFromKey(params) => make_mechanism(mechanism, params),
14571509
Mechanism::HashMlDsa(params) => make_mechanism(mechanism, params),
14581510
Mechanism::MlDsa(params)
14591511
| Mechanism::HashMlDsaSha224(params)

cryptoki/src/object.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,7 @@ impl TryFrom<CK_ATTRIBUTE> for Attribute {
10191019
}
10201020

10211021
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1022+
#[repr(transparent)]
10221023
/// Token specific identifier for an object
10231024
pub struct ObjectHandle {
10241025
handle: CK_OBJECT_HANDLE,

0 commit comments

Comments
 (0)