@@ -82,7 +82,45 @@ pub struct EcKdf<'a> {
82
82
shared_data : Option < & ' a [ u8 ] > ,
83
83
}
84
84
85
- impl EcKdf < ' _ > {
85
+ macro_rules! ansi {
86
+ { $func_name: ident, $algo: ident, $algo_name: literal } => {
87
+ #[ doc = "The key derivation function based on " ]
88
+ #[ doc = $algo_name]
89
+ #[ doc = " as defined in the ANSI X9.63 standard. The
90
+ derived key is produced by concatenating hashes of
91
+ the shared value followed by 00000001, 00000002,
92
+ etc. until we find enough bytes to fill the
93
+ `CKA_VALUE_LEN` of the derived key." ]
94
+ pub fn $func_name( shared_data: & ' a [ u8 ] ) -> Self {
95
+ Self {
96
+ kdf_type: $algo,
97
+ shared_data: Some ( shared_data) ,
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ macro_rules! sp800 {
104
+ { $func_name: ident, $algo: ident, $algo_name: literal } => {
105
+ #[ doc = "The key derivation function based on " ]
106
+ #[ doc = $algo_name]
107
+ #[ doc = " as defined in the [NIST SP800-56A standard, revision
108
+ 2](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf),
109
+ section 5.8.1.1. The derived key is produced by
110
+ concatenating hashes of 00000001, 00000002,
111
+ etc. followed by the shared value until we find
112
+ enough bytes to fill the `CKA_VALUE_LEN` of the
113
+ derived key." ]
114
+ pub fn $func_name( shared_data: & ' a [ u8 ] ) -> Self {
115
+ Self {
116
+ kdf_type: $algo,
117
+ shared_data: Some ( shared_data) ,
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+ impl < ' a > EcKdf < ' a > {
86
124
/// The null transformation. The derived key value is produced by
87
125
/// taking bytes from the left of the agreed value. The new key
88
126
/// size is limited to the size of the agreed value.
@@ -93,16 +131,25 @@ impl EcKdf<'_> {
93
131
}
94
132
}
95
133
96
- /// The key derivation function based on sha256 as defined in the ANSI X9.63 standard. The
97
- /// derived key is produced by concatenating hashes of the shared
98
- /// value followed by 00000001, 00000002, etc. until we find
99
- /// enough bytes to fill the `CKA_VALUE_LEN` of the derived key.
100
- pub fn sha256 ( ) -> Self {
101
- Self {
102
- kdf_type : CKD_SHA256_KDF ,
103
- shared_data : None ,
104
- }
105
- }
134
+ ansi ! ( sha1, CKD_SHA1_KDF , "SHA1" ) ;
135
+ ansi ! ( sha224, CKD_SHA224_KDF , "SHA224" ) ;
136
+ ansi ! ( sha256, CKD_SHA256_KDF , "SHA256" ) ;
137
+ ansi ! ( sha384, CKD_SHA384_KDF , "SHA384" ) ;
138
+ ansi ! ( sha512, CKD_SHA512_KDF , "SHA512" ) ;
139
+ ansi ! ( sha3_224, CKD_SHA3_224_KDF , "SHA3_224" ) ;
140
+ ansi ! ( sha3_256, CKD_SHA3_256_KDF , "SHA3_256" ) ;
141
+ ansi ! ( sha3_384, CKD_SHA3_384_KDF , "SHA3_384" ) ;
142
+ ansi ! ( sha3_512, CKD_SHA3_512_KDF , "SHA3_512" ) ;
143
+
144
+ sp800 ! ( sha1_sp800, CKD_SHA1_KDF_SP800 , "SHA1" ) ;
145
+ sp800 ! ( sha224_sp800, CKD_SHA224_KDF_SP800 , "SHA224" ) ;
146
+ sp800 ! ( sha256_sp800, CKD_SHA256_KDF_SP800 , "SHA256" ) ;
147
+ sp800 ! ( sha384_sp800, CKD_SHA384_KDF_SP800 , "SHA384" ) ;
148
+ sp800 ! ( sha512_sp800, CKD_SHA512_KDF_SP800 , "SHA512" ) ;
149
+ sp800 ! ( sha3_224_sp800, CKD_SHA3_224_KDF_SP800 , "SHA3_224" ) ;
150
+ sp800 ! ( sha3_256_sp800, CKD_SHA3_256_KDF_SP800 , "SHA3_256" ) ;
151
+ sp800 ! ( sha3_384_sp800, CKD_SHA3_384_KDF_SP800 , "SHA3_384" ) ;
152
+ sp800 ! ( sha3_512_sp800, CKD_SHA3_512_KDF_SP800 , "SHA3_512" ) ;
106
153
107
154
// The intention here is to be able to support other methods with
108
155
// shared data, without it being a breaking change, by just adding
0 commit comments