-
Notifications
You must be signed in to change notification settings - Fork 85
Description
Hello,
I am working with a PKCS11 interface requiring the use of vendored mechanisms. I did not find a way to do so with this crate and was wondering if this could be added. Beside this issue (#54) which focuses on errors, it seems to me the subject was not discussed, at least publicly.
Do you plan implementing this feature or would you accept a PR for it?
In case you are open to the idea, I already looked at the code and it seems to me this boils down to provide a mean to extend the Mechanism enum. Because the rust-cryptoki library cannot know in advance, I could not think of a simple way to ensure the library user constructs correct PKCS11 mechanisms.
I think a simple solution would be to offer an additional VendoredMechanism in the Mechanism enum which would expose the inners of what makes a CK_MECHANISM : a MechanismType and some arbitrary bytes as parameters.
In a working PoC, I implemented this:
// In src/mechanism/vendored.rs
pub struct VendoredMechanism {
pub mech_type: MechanismType,
pub params: Vec<CK_BYTE>,
}
// In src/mechanism/mod.rs
pub enum Mechanism {
...
VendoredMechanism(vendored::VendoredMechanism),
}
impl Mechanism {
/// Get the type of a mechanism
pub fn mechanism_type(&self) -> MechanismType {
...
Mechanism::VendoredMechanism(mech) => mech.mech_type,
}
}
impl From<&Mechanism> for CK_MECHANISM {
fn from(mech: &Mechanism) -> Self {
let mechanism = mech.mechanism_type().into();
match mech {
Mechanism::VendoredMechanism(mech) => CK_MECHANISM {
mechanism,
pParameter: mech.params.as_slice() as *const _ as *mut c_void,
ulParameterLen: mech.params.len() as u64,
},
}
}
}Which can be used as so:
pub const SOME_VENDORED_MECH: MechanismType = MechanismType {
val: SOME_VENDORED_MECH_VALUE,
};
pub struct SomeVendoredMech {
pub field1: u8,
pub field2: u8,
}
impl From<&SomeVendoredMech> for VendoredMechanism {
fn from(mech: &SomeVendoredMech) -> Self {
VendoredMechanism {
mech_type: SOME_VENDORED_MECH,
params: vec![
mech.field1,
mech.field2,
],
}
}
}I know this code is not that great, it's just to start the discussion and suggest a simple way to go. I look forward for your input!