@@ -94,6 +94,8 @@ pub enum AttributeType {
94
94
ObjectId ,
95
95
/// DER encoding of the attribute certificate's subject field
96
96
Owner ,
97
+ /// Algorithm-specific parameter set
98
+ ParameterSet ,
97
99
/// Prime number value of a key
98
100
Prime ,
99
101
/// The prime `p` of an RSA private key
@@ -108,6 +110,10 @@ pub enum AttributeType {
108
110
PublicExponent ,
109
111
/// DER-encoding of the SubjectPublicKeyInfo
110
112
PublicKeyInfo ,
113
+ /// Profile ID
114
+ ProfileId ,
115
+ /// Seed to derive private key
116
+ Seed ,
111
117
/// Determines if the key is sensitive
112
118
Sensitive ,
113
119
/// DER encoding of the certificate serial number
@@ -144,10 +150,6 @@ pub enum AttributeType {
144
150
Wrap ,
145
151
/// Indicates that the key can only be wrapped with a wrapping key that has the Trusted attribute
146
152
WrapWithTrusted ,
147
- /// Seed to derive private key
148
- Seed ,
149
- /// Algorithm-specific parameter set
150
- ParameterSet ,
151
153
}
152
154
153
155
impl AttributeType {
@@ -269,6 +271,7 @@ impl AttributeType {
269
271
CKA_UNIQUE_ID => String :: from ( stringify ! ( CKA_UNIQUE_ID ) ) ,
270
272
CKA_SEED => String :: from ( stringify ! ( CKA_SEED ) ) ,
271
273
CKA_PARAMETER_SET => String :: from ( stringify ! ( CKA_PARAMETER_SET ) ) ,
274
+ CKA_PROFILE_ID => String :: from ( stringify ! ( CKA_PROFILE_ID ) ) ,
272
275
CKA_VENDOR_DEFINED ..=CK_ULONG :: MAX => {
273
276
format ! ( "{}_{}" , stringify!( CKA_VENDOR_DEFINED ) , val)
274
277
}
@@ -331,6 +334,7 @@ impl From<AttributeType> for CK_ATTRIBUTE_TYPE {
331
334
AttributeType :: Prime2 => CKA_PRIME_2 ,
332
335
AttributeType :: Private => CKA_PRIVATE ,
333
336
AttributeType :: PrivateExponent => CKA_PRIVATE_EXPONENT ,
337
+ AttributeType :: ProfileId => CKA_PROFILE_ID ,
334
338
AttributeType :: PublicExponent => CKA_PUBLIC_EXPONENT ,
335
339
AttributeType :: PublicKeyInfo => CKA_PUBLIC_KEY_INFO ,
336
340
AttributeType :: Seed => CKA_SEED ,
@@ -405,6 +409,7 @@ impl TryFrom<CK_ATTRIBUTE_TYPE> for AttributeType {
405
409
CKA_PRIME_2 => Ok ( AttributeType :: Prime2 ) ,
406
410
CKA_PRIVATE => Ok ( AttributeType :: Private ) ,
407
411
CKA_PRIVATE_EXPONENT => Ok ( AttributeType :: PrivateExponent ) ,
412
+ CKA_PROFILE_ID => Ok ( AttributeType :: ProfileId ) ,
408
413
CKA_PUBLIC_EXPONENT => Ok ( AttributeType :: PublicExponent ) ,
409
414
CKA_PUBLIC_KEY_INFO => Ok ( AttributeType :: PublicKeyInfo ) ,
410
415
CKA_SEED => Ok ( AttributeType :: Seed ) ,
@@ -526,6 +531,8 @@ pub enum Attribute {
526
531
Private ( bool ) ,
527
532
/// The private exponent `d`
528
533
PrivateExponent ( Vec < u8 > ) ,
534
+ /// The Profile ID
535
+ ProfileId ( ProfileIdType ) ,
529
536
/// Public exponent value of a key
530
537
PublicExponent ( Vec < u8 > ) ,
531
538
/// DER-encoding of the SubjectPublicKeyInfo
@@ -618,6 +625,7 @@ impl Attribute {
618
625
Attribute :: Prime2 ( _) => AttributeType :: Prime2 ,
619
626
Attribute :: Private ( _) => AttributeType :: Private ,
620
627
Attribute :: PrivateExponent ( _) => AttributeType :: PrivateExponent ,
628
+ Attribute :: ProfileId ( _) => AttributeType :: ProfileId ,
621
629
Attribute :: PublicExponent ( _) => AttributeType :: PublicExponent ,
622
630
Attribute :: PublicKeyInfo ( _) => AttributeType :: PublicKeyInfo ,
623
631
Attribute :: Seed ( _) => AttributeType :: Seed ,
@@ -698,6 +706,7 @@ impl Attribute {
698
706
Attribute :: Prime1 ( bytes) => bytes. len ( ) ,
699
707
Attribute :: Prime2 ( bytes) => bytes. len ( ) ,
700
708
Attribute :: PrivateExponent ( bytes) => bytes. len ( ) ,
709
+ Attribute :: ProfileId ( _) => size_of :: < CK_PROFILE_ID > ( ) ,
701
710
Attribute :: PublicExponent ( bytes) => bytes. len ( ) ,
702
711
Attribute :: PublicKeyInfo ( bytes) => bytes. len ( ) ,
703
712
Attribute :: Seed ( bytes) => bytes. len ( ) ,
@@ -792,6 +801,7 @@ impl Attribute {
792
801
| Attribute :: Id ( bytes) => bytes. as_ptr ( ) as * mut c_void ,
793
802
// Unique types
794
803
Attribute :: ParameterSet ( val) => val as * const _ as * mut c_void ,
804
+ Attribute :: ProfileId ( val) => val as * const _ as * mut c_void ,
795
805
Attribute :: CertificateType ( certificate_type) => {
796
806
certificate_type as * const _ as * mut c_void
797
807
}
@@ -922,6 +932,9 @@ impl TryFrom<CK_ATTRIBUTE> for Attribute {
922
932
AttributeType :: Value => Ok ( Attribute :: Value ( val. to_vec ( ) ) ) ,
923
933
AttributeType :: Id => Ok ( Attribute :: Id ( val. to_vec ( ) ) ) ,
924
934
// Unique types
935
+ AttributeType :: ProfileId => Ok ( Attribute :: ProfileId ( ProfileIdType {
936
+ val : CK_ULONG :: from_ne_bytes ( val. try_into ( ) ?) ,
937
+ } ) ) ,
925
938
AttributeType :: ParameterSet => Ok ( Attribute :: ParameterSet ( ParameterSetType {
926
939
val : CK_ULONG :: from_ne_bytes ( val. try_into ( ) ?) . into ( ) ,
927
940
} ) ) ,
@@ -1278,6 +1291,12 @@ impl ObjectClass {
1278
1291
pub const MECHANISM : ObjectClass = ObjectClass { val : CKO_MECHANISM } ;
1279
1292
/// An OTP key object
1280
1293
pub const OTP_KEY : ObjectClass = ObjectClass { val : CKO_OTP_KEY } ;
1294
+ /// Profile object
1295
+ pub const PROFILE : ObjectClass = ObjectClass { val : CKO_PROFILE } ;
1296
+ /// Validation object
1297
+ pub const VALIDATION : ObjectClass = ObjectClass {
1298
+ val : CKO_VALIDATION ,
1299
+ } ;
1281
1300
1282
1301
pub ( crate ) fn stringify ( class : CK_OBJECT_CLASS ) -> String {
1283
1302
match class {
@@ -1290,6 +1309,8 @@ impl ObjectClass {
1290
1309
CKO_DOMAIN_PARAMETERS => String :: from ( stringify ! ( CKO_DOMAIN_PARAMETERS ) ) ,
1291
1310
CKO_MECHANISM => String :: from ( stringify ! ( CKO_MECHANISM ) ) ,
1292
1311
CKO_OTP_KEY => String :: from ( stringify ! ( CKO_OTP_KEY ) ) ,
1312
+ CKO_PROFILE => String :: from ( stringify ! ( CKO_PROFILE ) ) ,
1313
+ CKO_VALIDATION => String :: from ( stringify ! ( CKO_VALIDATION ) ) ,
1293
1314
_ => format ! ( "unknown ({class:08x})" ) ,
1294
1315
}
1295
1316
}
@@ -1329,6 +1350,8 @@ impl TryFrom<CK_OBJECT_CLASS> for ObjectClass {
1329
1350
CKO_DOMAIN_PARAMETERS => Ok ( ObjectClass :: DOMAIN_PARAMETERS ) ,
1330
1351
CKO_MECHANISM => Ok ( ObjectClass :: MECHANISM ) ,
1331
1352
CKO_OTP_KEY => Ok ( ObjectClass :: OTP_KEY ) ,
1353
+ CKO_PROFILE => Ok ( ObjectClass :: PROFILE ) ,
1354
+ CKO_VALIDATION => Ok ( ObjectClass :: VALIDATION ) ,
1332
1355
1333
1356
_ => {
1334
1357
error ! ( "Object class {} is not supported." , object_class) ;
@@ -1708,3 +1731,92 @@ impl TryFrom<CK_CERTIFICATE_TYPE> for CertificateType {
1708
1731
}
1709
1732
}
1710
1733
}
1734
+
1735
+ #[ derive( Debug , Copy , Clone , PartialEq , Eq ) ]
1736
+ #[ repr( transparent) ]
1737
+ /// The PKCS#11 Profile ID
1738
+ ///
1739
+ /// The profiles and their meaning is defined in the following document:
1740
+ ///
1741
+ /// <https://docs.oasis-open.org/pkcs11/pkcs11-profiles/v3.1/os/pkcs11-profiles-v3.1-os.html>
1742
+ pub struct ProfileIdType {
1743
+ val : CK_PROFILE_ID ,
1744
+ }
1745
+
1746
+ impl ProfileIdType {
1747
+ /// Baseline Provider
1748
+ pub const BASELINE_PROFIDER : ProfileIdType = ProfileIdType {
1749
+ val : CKP_BASELINE_PROVIDER ,
1750
+ } ;
1751
+ /// Extended Provider
1752
+ pub const EXTENDED_PROFIDER : ProfileIdType = ProfileIdType {
1753
+ val : CKP_EXTENDED_PROVIDER ,
1754
+ } ;
1755
+ /// Authentication Token Provider or Consumer
1756
+ pub const AUTHENTICATION_TOKEN : ProfileIdType = ProfileIdType {
1757
+ val : CKP_AUTHENTICATION_TOKEN ,
1758
+ } ;
1759
+ /// Public Certificates Token Provider or Consumer
1760
+ pub const PUBLIC_CERTIFICATES_TOKEN : ProfileIdType = ProfileIdType {
1761
+ val : CKP_PUBLIC_CERTIFICATES_TOKEN ,
1762
+ } ;
1763
+ /// Complete Provider
1764
+ pub const COMPLETE_PROVIDER : ProfileIdType = ProfileIdType {
1765
+ val : CKP_COMPLETE_PROVIDER ,
1766
+ } ;
1767
+ /// HKDF TLS Token
1768
+ pub const HKDF_TLS_TOKEN : ProfileIdType = ProfileIdType {
1769
+ val : CKP_HKDF_TLS_TOKEN ,
1770
+ } ;
1771
+ }
1772
+
1773
+ impl std:: fmt:: Display for ProfileIdType {
1774
+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
1775
+ write ! (
1776
+ f,
1777
+ "{}" ,
1778
+ match self . val {
1779
+ CKP_BASELINE_PROVIDER => stringify!( CKP_BASELINE_PROVIDER ) ,
1780
+ CKP_EXTENDED_PROVIDER => stringify!( CKP_EXTENDED_PROVIDER ) ,
1781
+ CKP_AUTHENTICATION_TOKEN => stringify!( CKP_AUTHENTICATION_TOKEN ) ,
1782
+ CKP_PUBLIC_CERTIFICATES_TOKEN => {
1783
+ stringify!( CKP_PUBLIC_CERTIFICATES_TOKEN )
1784
+ }
1785
+ CKP_COMPLETE_PROVIDER => stringify!( CKP_COMPLETE_PROVIDER ) ,
1786
+ CKP_HKDF_TLS_TOKEN => stringify!( CKP_HKDF_TLS_TOKEN ) ,
1787
+ profile_id => return write!( f, "unknown ({profile_id:08x})" ) ,
1788
+ }
1789
+ )
1790
+ }
1791
+ }
1792
+
1793
+ impl AsRef < CK_PROFILE_ID > for ProfileIdType {
1794
+ fn as_ref ( & self ) -> & CK_PROFILE_ID {
1795
+ & self . val
1796
+ }
1797
+ }
1798
+
1799
+ impl From < ProfileIdType > for CK_PROFILE_ID {
1800
+ fn from ( profile_id : ProfileIdType ) -> Self {
1801
+ * profile_id. as_ref ( )
1802
+ }
1803
+ }
1804
+
1805
+ impl TryFrom < CK_PROFILE_ID > for ProfileIdType {
1806
+ type Error = Error ;
1807
+
1808
+ fn try_from ( profile_id : CK_PROFILE_ID ) -> Result < Self > {
1809
+ match profile_id {
1810
+ CKP_BASELINE_PROVIDER => Ok ( ProfileIdType :: BASELINE_PROFIDER ) ,
1811
+ CKP_EXTENDED_PROVIDER => Ok ( ProfileIdType :: EXTENDED_PROFIDER ) ,
1812
+ CKP_AUTHENTICATION_TOKEN => Ok ( ProfileIdType :: AUTHENTICATION_TOKEN ) ,
1813
+ CKP_PUBLIC_CERTIFICATES_TOKEN => Ok ( ProfileIdType :: PUBLIC_CERTIFICATES_TOKEN ) ,
1814
+ CKP_COMPLETE_PROVIDER => Ok ( ProfileIdType :: COMPLETE_PROVIDER ) ,
1815
+ CKP_HKDF_TLS_TOKEN => Ok ( ProfileIdType :: HKDF_TLS_TOKEN ) ,
1816
+ _ => {
1817
+ error ! ( "Profile Id {} is not supported." , profile_id) ;
1818
+ Err ( Error :: NotSupported )
1819
+ }
1820
+ }
1821
+ }
1822
+ }
0 commit comments