Skip to content

Commit

Permalink
Merge pull request #237 from jrozner/add-vendor-defined-attributes
Browse files Browse the repository at this point in the history
Add support for vendor defined attributes
  • Loading branch information
hug-dev authored Dec 26, 2024
2 parents c45a81b + 6921373 commit 3d14be8
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions cryptoki/src/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ use std::fmt::Formatter;
use std::mem::size_of;
use std::ops::Deref;

const MAX_CU_ULONG: CK_ULONG = !0;

#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[non_exhaustive]
/// Type of an attribute
Expand Down Expand Up @@ -128,6 +130,8 @@ pub enum AttributeType {
Value,
/// Length in bytes of the value
ValueLen,
/// Vendor defined attribute
VendorDefined(CK_ATTRIBUTE_TYPE),
/// Determines if a key supports verifying
Verify,
/// Determines if a key supports verifying where the data can be recovered from the signature
Expand Down Expand Up @@ -254,6 +258,9 @@ impl AttributeType {
CKA_UNWRAP_TEMPLATE => String::from(stringify!(CKA_UNWRAP_TEMPLATE)),
CKA_DERIVE_TEMPLATE => String::from(stringify!(CKA_DERIVE_TEMPLATE)),
CKA_ALLOWED_MECHANISMS => String::from(stringify!(CKA_ALLOWED_MECHANISMS)),
CKA_VENDOR_DEFINED..=MAX_CU_ULONG => {
format!("{}_{}", stringify!(CKA_VENDOR_DEFINED), val)
}
_ => format!("unknown ({val:08x})"),
}
}
Expand Down Expand Up @@ -324,6 +331,7 @@ impl From<AttributeType> for CK_ATTRIBUTE_TYPE {
AttributeType::Url => CKA_URL,
AttributeType::Value => CKA_VALUE,
AttributeType::ValueLen => CKA_VALUE_LEN,
AttributeType::VendorDefined(val) => val,
AttributeType::Verify => CKA_VERIFY,
AttributeType::VerifyRecover => CKA_VERIFY_RECOVER,
AttributeType::Wrap => CKA_WRAP,
Expand Down Expand Up @@ -396,6 +404,7 @@ impl TryFrom<CK_ATTRIBUTE_TYPE> for AttributeType {
CKA_VERIFY_RECOVER => Ok(AttributeType::VerifyRecover),
CKA_WRAP => Ok(AttributeType::Wrap),
CKA_WRAP_WITH_TRUSTED => Ok(AttributeType::WrapWithTrusted),
CKA_VENDOR_DEFINED..=MAX_CU_ULONG => Ok(AttributeType::VendorDefined(attribute_type)),
attr_type => {
error!("Attribute type {} not supported.", attr_type);
Err(Error::NotSupported)
Expand Down Expand Up @@ -518,6 +527,8 @@ pub enum Attribute {
Value(Vec<u8>),
/// Length in bytes of the value
ValueLen(Ulong),
/// Vendor defined value
VendorDefined((AttributeType, Vec<u8>)),
/// Determines if a key supports verifying
Verify(bool),
/// Determines if a key supports verifying where the data can be recovered from the signature
Expand Down Expand Up @@ -587,6 +598,7 @@ impl Attribute {
Attribute::Url(_) => AttributeType::Url,
Attribute::Value(_) => AttributeType::Value,
Attribute::ValueLen(_) => AttributeType::ValueLen,
Attribute::VendorDefined((num, _)) => *num,
Attribute::Verify(_) => AttributeType::Verify,
Attribute::VerifyRecover(_) => AttributeType::VerifyRecover,
Attribute::Wrap(_) => AttributeType::Wrap,
Expand Down Expand Up @@ -658,6 +670,7 @@ impl Attribute {
Attribute::AllowedMechanisms(mechanisms) => {
size_of::<CK_MECHANISM_TYPE>() * mechanisms.len()
}
Attribute::VendorDefined((_, bytes)) => bytes.len(),
}
}

Expand Down Expand Up @@ -730,6 +743,7 @@ impl Attribute {
| Attribute::Subject(bytes)
| Attribute::Url(bytes)
| Attribute::Value(bytes)
| Attribute::VendorDefined((_, bytes))
| Attribute::Id(bytes) => bytes.as_ptr() as *mut c_void,
// Unique types
Attribute::CertificateType(certificate_type) => {
Expand Down Expand Up @@ -930,6 +944,10 @@ impl TryFrom<CK_ATTRIBUTE> for Attribute {
}
}
}
AttributeType::VendorDefined(t) => Ok(Attribute::VendorDefined((
AttributeType::VendorDefined(t),
val.to_vec(),
))),
}
}
}
Expand Down

0 comments on commit 3d14be8

Please sign in to comment.