@@ -6,6 +6,7 @@ pub mod aead;
6
6
pub mod elliptic_curve;
7
7
mod mechanism_info;
8
8
pub mod rsa;
9
+ pub mod ekdf;
9
10
10
11
use crate :: error:: Error ;
11
12
use cryptoki_sys:: * ;
@@ -17,6 +18,7 @@ use std::ops::Deref;
17
18
use std:: ptr:: null_mut;
18
19
19
20
pub use mechanism_info:: MechanismInfo ;
21
+ use crate :: mechanism:: rsa:: { PkcsOaepParams , PkcsOaepSource } ;
20
22
21
23
#[ derive( Copy , Debug , Clone , PartialEq , Eq ) ]
22
24
// transparent so that a vector of MechanismType should have the same layout than a vector of
@@ -64,6 +66,9 @@ impl MechanismType {
64
66
/// AES-GCM mechanism
65
67
pub const AES_GCM : MechanismType = MechanismType { val : CKM_AES_GCM } ;
66
68
69
+ /// Derivation via encryption
70
+ pub const AES_CBC_ENCRYPT_DATA : MechanismType = MechanismType { val : CKM_AES_CBC_ENCRYPT_DATA } ;
71
+
67
72
// RSA
68
73
/// PKCS #1 RSA key pair generation mechanism
69
74
pub const RSA_PKCS_KEY_PAIR_GEN : MechanismType = MechanismType {
@@ -241,6 +246,10 @@ impl MechanismType {
241
246
pub const SHA512_RSA_PKCS_PSS : MechanismType = MechanismType {
242
247
val : CKM_SHA512_RSA_PKCS_PSS ,
243
248
} ;
249
+ /// GENERIC-SECRET-KEY-GEN mechanism
250
+ pub const GENERIC_SECRET_KEY_GEN : MechanismType = MechanismType {
251
+ val : CKM_GENERIC_SECRET_KEY_GEN
252
+ } ;
244
253
245
254
pub ( crate ) fn stringify ( mech : CK_MECHANISM_TYPE ) -> String {
246
255
match mech {
@@ -629,6 +638,7 @@ impl TryFrom<CK_MECHANISM_TYPE> for MechanismType {
629
638
fn try_from ( mechanism_type : CK_MECHANISM_TYPE ) -> Result < Self , Self :: Error > {
630
639
match mechanism_type {
631
640
CKM_AES_KEY_GEN => Ok ( MechanismType :: AES_KEY_GEN ) ,
641
+ CKM_AES_CBC_ENCRYPT_DATA => Ok ( MechanismType :: AES_CBC_ENCRYPT_DATA ) ,
632
642
CKM_RSA_PKCS_KEY_PAIR_GEN => Ok ( MechanismType :: RSA_PKCS_KEY_PAIR_GEN ) ,
633
643
CKM_RSA_PKCS => Ok ( MechanismType :: RSA_PKCS ) ,
634
644
CKM_RSA_PKCS_PSS => Ok ( MechanismType :: RSA_PKCS_PSS ) ,
@@ -648,6 +658,7 @@ impl TryFrom<CK_MECHANISM_TYPE> for MechanismType {
648
658
CKM_SHA256_RSA_PKCS => Ok ( MechanismType :: SHA256_RSA_PKCS ) ,
649
659
CKM_SHA384_RSA_PKCS => Ok ( MechanismType :: SHA384_RSA_PKCS ) ,
650
660
CKM_SHA512_RSA_PKCS => Ok ( MechanismType :: SHA512_RSA_PKCS ) ,
661
+ CKM_GENERIC_SECRET_KEY_GEN => Ok ( MechanismType :: GENERIC_SECRET_KEY_GEN ) ,
651
662
other => {
652
663
error ! ( "Mechanism type {} is not supported." , other) ;
653
664
Err ( Error :: NotSupported )
@@ -689,6 +700,14 @@ pub enum Mechanism<'a> {
689
700
AesKeyWrapPad ,
690
701
/// AES-GCM mechanism
691
702
AesGcm ( aead:: GcmParams < ' a > ) ,
703
+ /// AES-CBC-ENCRYPT-DATA mechanism
704
+ ///
705
+ /// The parameter to this mechanism is the initialization vector and the message to encrypt. These mechanisms allow
706
+ /// derivation of keys using the result of an encryption operation as the key value.
707
+ ///
708
+ /// For derivation, the message length must be a multiple of the block
709
+ /// size. See https://www.cryptsoft.com/pkcs11doc/v220/
710
+ AesCbcEncryptData ( ekdf:: AesCbcDeriveParams < ' a > ) ,
692
711
693
712
// RSA
694
713
/// PKCS #1 RSA key pair generation mechanism
@@ -701,7 +720,7 @@ pub enum Mechanism<'a> {
701
720
RsaPkcsPss ( rsa:: PkcsPssParams ) ,
702
721
/// Multi-purpose mechanism based on the RSA public-key cryptosystem and the OAEP block format
703
722
/// defined in PKCS #1
704
- RsaPkcsOaep ( rsa :: PkcsOaepParams < ' a > ) ,
723
+ RsaPkcsOaep ( PkcsOaepParams < ' a > ) ,
705
724
/// Multi-purpose mechanism based on the RSA public-key cryptosystem. This is so-called "raw"
706
725
/// RSA, as assumed in X.509.
707
726
RsaX509 ,
@@ -816,6 +835,9 @@ pub enum Mechanism<'a> {
816
835
Sha384RsaPkcsPss ( rsa:: PkcsPssParams ) ,
817
836
/// SHA256-RSA-PKCS-PSS mechanism
818
837
Sha512RsaPkcsPss ( rsa:: PkcsPssParams ) ,
838
+
839
+ /// GENERIC-SECRET-KEY-GEN mechanism
840
+ GenericSecretKeyGen
819
841
}
820
842
821
843
impl Mechanism < ' _ > {
@@ -829,7 +851,7 @@ impl Mechanism<'_> {
829
851
Mechanism :: AesKeyWrap => MechanismType :: AES_KEY_WRAP ,
830
852
Mechanism :: AesKeyWrapPad => MechanismType :: AES_KEY_WRAP_PAD ,
831
853
Mechanism :: AesGcm ( _) => MechanismType :: AES_GCM ,
832
-
854
+ Mechanism :: AesCbcEncryptData ( _ ) => MechanismType :: AES_CBC_ENCRYPT_DATA ,
833
855
Mechanism :: RsaPkcsKeyPairGen => MechanismType :: RSA_PKCS_KEY_PAIR_GEN ,
834
856
Mechanism :: RsaPkcs => MechanismType :: RSA_PKCS ,
835
857
Mechanism :: RsaPkcsPss ( _) => MechanismType :: RSA_PKCS_PSS ,
@@ -874,6 +896,8 @@ impl Mechanism<'_> {
874
896
Mechanism :: Sha256RsaPkcsPss ( _) => MechanismType :: SHA256_RSA_PKCS_PSS ,
875
897
Mechanism :: Sha384RsaPkcsPss ( _) => MechanismType :: SHA384_RSA_PKCS_PSS ,
876
898
Mechanism :: Sha512RsaPkcsPss ( _) => MechanismType :: SHA512_RSA_PKCS_PSS ,
899
+
900
+ Mechanism :: GenericSecretKeyGen => MechanismType :: GENERIC_SECRET_KEY_GEN
877
901
}
878
902
}
879
903
}
@@ -883,9 +907,13 @@ impl From<&Mechanism<'_>> for CK_MECHANISM {
883
907
let mechanism = mech. mechanism_type ( ) . into ( ) ;
884
908
match mech {
885
909
// Mechanisms with parameters
886
- Mechanism :: AesCbc ( params) | Mechanism :: AesCbcPad ( params) => {
910
+ Mechanism :: AesCbc ( params)
911
+ | Mechanism :: AesCbcPad ( params) => {
887
912
make_mechanism ( mechanism, params)
888
- }
913
+ } ,
914
+ Mechanism :: AesCbcEncryptData ( params) => {
915
+ make_mechanism ( mechanism, params)
916
+ } ,
889
917
Mechanism :: DesCbc ( params)
890
918
| Mechanism :: Des3Cbc ( params)
891
919
| Mechanism :: DesCbcPad ( params)
@@ -936,7 +964,8 @@ impl From<&Mechanism<'_>> for CK_MECHANISM {
936
964
| Mechanism :: Sha224RsaPkcs
937
965
| Mechanism :: Sha256RsaPkcs
938
966
| Mechanism :: Sha384RsaPkcs
939
- | Mechanism :: Sha512RsaPkcs => CK_MECHANISM {
967
+ | Mechanism :: Sha512RsaPkcs
968
+ | Mechanism :: GenericSecretKeyGen => CK_MECHANISM {
940
969
mechanism,
941
970
pParameter : null_mut ( ) ,
942
971
ulParameterLen : 0 ,
@@ -961,7 +990,7 @@ fn make_mechanism<T>(mechanism: CK_MECHANISM_TYPE, param: &T) -> CK_MECHANISM {
961
990
962
991
#[ cfg( feature = "psa-crypto-conversions" ) ]
963
992
#[ allow( deprecated) ]
964
- impl TryFrom < psa_crypto:: types:: algorithm:: Algorithm > for Mechanism {
993
+ impl TryFrom < psa_crypto:: types:: algorithm:: Algorithm > for Mechanism < ' _ > {
965
994
type Error = Error ;
966
995
967
996
fn try_from ( alg : psa_crypto:: types:: algorithm:: Algorithm ) -> Result < Self , Self :: Error > {
@@ -989,13 +1018,11 @@ impl TryFrom<psa_crypto::types::algorithm::Algorithm> for Mechanism {
989
1018
Ok ( Mechanism :: Ecdsa )
990
1019
}
991
1020
Algorithm :: AsymmetricEncryption ( AsymmetricEncryption :: RsaOaep { hash_alg } ) => {
992
- Ok ( Mechanism :: RsaPkcsOaep ( rsa:: PkcsOaepParams {
993
- hash_alg : Mechanism :: try_from ( Algorithm :: from ( hash_alg) ) ?. mechanism_type ( ) ,
994
- mgf : rsa:: PkcsMgfType :: from_psa_crypto_hash ( hash_alg) ?,
995
- source : rsa:: PkcsOaepSourceType :: DATA_SPECIFIED ,
996
- source_data : std:: ptr:: null ( ) ,
997
- source_data_len : 0 . into ( ) ,
998
- } ) )
1021
+ Ok ( Mechanism :: RsaPkcsOaep ( PkcsOaepParams :: new (
1022
+ Mechanism :: try_from ( Algorithm :: from ( hash_alg) ) ?. mechanism_type ( ) ,
1023
+ rsa:: PkcsMgfType :: from_psa_crypto_hash ( hash_alg) ?,
1024
+ PkcsOaepSource :: empty ( ) ,
1025
+ ) ) )
999
1026
}
1000
1027
alg => {
1001
1028
error ! ( "{:?} is not a supported algorithm" , alg) ;
0 commit comments