xref: /illumos-gate/usr/src/lib/libcryptoutil/common/mechkeygen.c (revision 26ff1ce9e5494c59fafe62a0c6e3ca41cd0f2a99)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <cryptoutil.h>
29 
30 /*
31  * Get the key generation mechanism for the given mechanism.
32  *
33  * All mechanisms in PKCS #11 v2.20 are listed here.
34  */
35 CK_RV
36 pkcs11_mech2keygen(CK_MECHANISM_TYPE mech_type, CK_MECHANISM_TYPE *gen_mech)
37 {
38 	switch (mech_type) {
39 
40 	case CKM_RSA_PKCS_KEY_PAIR_GEN:
41 	case CKM_RSA_PKCS:
42 	case CKM_RSA_9796:
43 	case CKM_RSA_X_509:
44 	case CKM_MD2_RSA_PKCS:
45 	case CKM_MD5_RSA_PKCS:
46 	case CKM_SHA1_RSA_PKCS:
47 	case CKM_SHA256_RSA_PKCS:
48 	case CKM_SHA384_RSA_PKCS:
49 	case CKM_SHA512_RSA_PKCS:
50 	case CKM_SHA256_RSA_PKCS_PSS:
51 	case CKM_SHA384_RSA_PKCS_PSS:
52 	case CKM_SHA512_RSA_PKCS_PSS:
53 	case CKM_RIPEMD128_RSA_PKCS:
54 	case CKM_RIPEMD160_RSA_PKCS:
55 	case CKM_RSA_PKCS_OAEP:
56 		*gen_mech = CKM_RSA_PKCS_KEY_PAIR_GEN;
57 		break;
58 
59 	case CKM_RSA_X9_31_KEY_PAIR_GEN:
60 	case CKM_RSA_X9_31:
61 	case CKM_SHA1_RSA_X9_31:
62 		*gen_mech = CKM_RSA_X9_31_KEY_PAIR_GEN;
63 		break;
64 
65 	case CKM_RSA_PKCS_PSS:
66 	case CKM_SHA1_RSA_PKCS_PSS:
67 		*gen_mech = CKM_RSA_PKCS_KEY_PAIR_GEN;
68 		break;
69 
70 	case CKM_DH_PKCS_PARAMETER_GEN:
71 		*gen_mech = CKM_DH_PKCS_PARAMETER_GEN;
72 		break;
73 
74 	case CKM_DSA_KEY_PAIR_GEN:
75 	case CKM_DSA:
76 	case CKM_DSA_SHA1:
77 		*gen_mech = CKM_DSA_KEY_PAIR_GEN;
78 		break;
79 
80 	case CKM_DSA_PARAMETER_GEN:
81 		*gen_mech = CKM_DSA_PARAMETER_GEN;
82 		break;
83 
84 	case CKM_FORTEZZA_TIMESTAMP:
85 		*gen_mech = CKM_DSA_KEY_PAIR_GEN;
86 		break;
87 
88 	case CKM_DH_PKCS_KEY_PAIR_GEN:
89 	case CKM_DH_PKCS_DERIVE:
90 		*gen_mech = CKM_DH_PKCS_KEY_PAIR_GEN;
91 		break;
92 
93 	case CKM_ECDSA:
94 	case CKM_ECDSA_SHA1:
95 	case CKM_EC_KEY_PAIR_GEN:
96 	case CKM_ECDH1_DERIVE:
97 	case CKM_ECDH1_COFACTOR_DERIVE:
98 	case CKM_ECMQV_DERIVE:
99 		*gen_mech = CKM_EC_KEY_PAIR_GEN;
100 		break;
101 
102 	case CKM_X9_42_DH_KEY_PAIR_GEN:
103 	case CKM_X9_42_DH_DERIVE:
104 	case CKM_X9_42_DH_HYBRID_DERIVE:
105 	case CKM_X9_42_MQV_DERIVE:
106 		*gen_mech = CKM_X9_42_DH_KEY_PAIR_GEN;
107 		break;
108 
109 	case CKM_X9_42_DH_PARAMETER_GEN:
110 		*gen_mech = CKM_X9_42_DH_PARAMETER_GEN;
111 		break;
112 
113 	case CKM_KEA_KEY_PAIR_GEN:
114 	case CKM_KEA_KEY_DERIVE:
115 		*gen_mech = CKM_KEA_KEY_PAIR_GEN;
116 		break;
117 
118 	case CKM_MD2:
119 	case CKM_MD2_HMAC:
120 	case CKM_MD2_HMAC_GENERAL:
121 	case CKM_MD5:
122 	case CKM_MD5_HMAC:
123 	case CKM_MD5_HMAC_GENERAL:
124 	case CKM_SHA_1:
125 	case CKM_SHA_1_HMAC:
126 	case CKM_SHA_1_HMAC_GENERAL:
127 	case CKM_SHA256:
128 	case CKM_SHA256_HMAC:
129 	case CKM_SHA256_HMAC_GENERAL:
130 	case CKM_SHA384:
131 	case CKM_SHA384_HMAC:
132 	case CKM_SHA384_HMAC_GENERAL:
133 	case CKM_SHA512:
134 	case CKM_SHA512_HMAC:
135 	case CKM_SHA512_HMAC_GENERAL:
136 	case CKM_GENERIC_SECRET_KEY_GEN:
137 	case CKM_FASTHASH:
138 	case CKM_PKCS5_PBKD2:
139 	case CKM_PBA_SHA1_WITH_SHA1_HMAC:
140 		*gen_mech = CKM_GENERIC_SECRET_KEY_GEN;
141 		break;
142 
143 	case CKM_SSL3_MD5_MAC:
144 	case CKM_SSL3_SHA1_MAC:
145 	case CKM_SSL3_PRE_MASTER_KEY_GEN:
146 	case CKM_SSL3_MASTER_KEY_DERIVE:
147 	case CKM_SSL3_KEY_AND_MAC_DERIVE:
148 	case CKM_SSL3_MASTER_KEY_DERIVE_DH:
149 		*gen_mech = CKM_SSL3_PRE_MASTER_KEY_GEN;
150 		break;
151 
152 	case CKM_TLS_PRE_MASTER_KEY_GEN:
153 	case CKM_TLS_MASTER_KEY_DERIVE:
154 	case CKM_TLS_KEY_AND_MAC_DERIVE:
155 	case CKM_TLS_MASTER_KEY_DERIVE_DH:
156 	case CKM_TLS_PRF:
157 		*gen_mech = CKM_TLS_PRE_MASTER_KEY_GEN;
158 		break;
159 
160 	case CKM_WTLS_PRE_MASTER_KEY_GEN:
161 	case CKM_WTLS_MASTER_KEY_DERIVE:
162 	case CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC:
163 	case CKM_WTLS_PRF:
164 	case CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE:
165 	case CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE:
166 		*gen_mech = CKM_WTLS_PRE_MASTER_KEY_GEN;
167 		break;
168 
169 	case CKM_CONCATENATE_BASE_AND_KEY:
170 	case CKM_CONCATENATE_BASE_AND_DATA:
171 	case CKM_CONCATENATE_DATA_AND_BASE:
172 	case CKM_XOR_BASE_AND_DATA:
173 	case CKM_EXTRACT_KEY_FROM_KEY:
174 	case CKM_RIPEMD128:
175 	case CKM_RIPEMD128_HMAC:
176 	case CKM_RIPEMD128_HMAC_GENERAL:
177 	case CKM_RIPEMD160:
178 	case CKM_RIPEMD160_HMAC:
179 	case CKM_RIPEMD160_HMAC_GENERAL:
180 	case CKM_SHA1_KEY_DERIVATION:
181 	case CKM_SHA256_KEY_DERIVATION:
182 	case CKM_SHA384_KEY_DERIVATION:
183 	case CKM_SHA512_KEY_DERIVATION:
184 	case CKM_MD5_KEY_DERIVATION:
185 	case CKM_MD2_KEY_DERIVATION:
186 	/* not sure the following 2 should be CKK_DES or not */
187 	case CKM_KEY_WRAP_LYNKS: /* wrap/unwrap secret key w/ DES key */
188 	case CKM_KEY_WRAP_SET_OAEP:  /* wrap/unwarp DES key w/ RSA key */
189 		*gen_mech = CKM_GENERIC_SECRET_KEY_GEN;
190 		break;
191 
192 	case CKM_RC2_KEY_GEN:
193 	case CKM_RC2_ECB:
194 	case CKM_RC2_CBC:
195 	case CKM_RC2_MAC:
196 	case CKM_RC2_MAC_GENERAL:
197 	case CKM_RC2_CBC_PAD:
198 	case CKM_PBE_SHA1_RC2_128_CBC:
199 	case CKM_PBE_SHA1_RC2_40_CBC:
200 		*gen_mech = CKM_RC2_KEY_GEN;
201 		break;
202 
203 	case CKM_RC4_KEY_GEN:
204 	case CKM_RC4:
205 	case CKM_PBE_SHA1_RC4_128:
206 	case CKM_PBE_SHA1_RC4_40:
207 		*gen_mech = CKM_RC4_KEY_GEN;
208 		break;
209 
210 	case CKM_DES_KEY_GEN:
211 	case CKM_DES_ECB:
212 	case CKM_DES_CBC:
213 	case CKM_DES_MAC:
214 	case CKM_DES_MAC_GENERAL:
215 	case CKM_DES_CBC_PAD:
216 	case CKM_PBE_MD2_DES_CBC:
217 	case CKM_PBE_MD5_DES_CBC:
218 	case CKM_DES_OFB64:
219 	case CKM_DES_OFB8:
220 	case CKM_DES_CFB64:
221 	case CKM_DES_CFB8:
222 	case CKM_DES_ECB_ENCRYPT_DATA:
223 	case CKM_DES_CBC_ENCRYPT_DATA:
224 		*gen_mech = CKM_DES_KEY_GEN;
225 		break;
226 
227 	case CKM_DES2_KEY_GEN:
228 	case CKM_PBE_SHA1_DES2_EDE_CBC:
229 		*gen_mech = CKM_DES2_KEY_GEN;
230 		break;
231 
232 	case CKM_DES3_KEY_GEN:
233 	case CKM_DES3_ECB:
234 	case CKM_DES3_CBC:
235 	case CKM_DES3_MAC:
236 	case CKM_DES3_MAC_GENERAL:
237 	case CKM_DES3_CBC_PAD:
238 	case CKM_PBE_SHA1_DES3_EDE_CBC:
239 	case CKM_DES3_ECB_ENCRYPT_DATA:
240 	case CKM_DES3_CBC_ENCRYPT_DATA:
241 		*gen_mech = CKM_DES3_KEY_GEN;
242 		break;
243 
244 	case CKM_CAST_KEY_GEN:
245 	case CKM_CAST_ECB:
246 	case CKM_CAST_CBC:
247 	case CKM_CAST_MAC:
248 	case CKM_CAST_MAC_GENERAL:
249 	case CKM_CAST_CBC_PAD:
250 	case CKM_PBE_MD5_CAST_CBC:
251 		*gen_mech = CKM_CAST_KEY_GEN;
252 		break;
253 
254 	case CKM_CAST3_KEY_GEN:
255 	case CKM_CAST3_ECB:
256 	case CKM_CAST3_CBC:
257 	case CKM_CAST3_MAC:
258 	case CKM_CAST3_MAC_GENERAL:
259 	case CKM_CAST3_CBC_PAD:
260 	case CKM_PBE_MD5_CAST3_CBC:
261 		*gen_mech = CKM_CAST3_KEY_GEN;
262 		break;
263 
264 	case CKM_CAST128_KEY_GEN:
265 	case CKM_CAST128_ECB:
266 	case CKM_CAST128_CBC:
267 	case CKM_CAST128_MAC:
268 	case CKM_CAST128_MAC_GENERAL:
269 	case CKM_CAST128_CBC_PAD:
270 	case CKM_PBE_MD5_CAST128_CBC:
271 	case CKM_PBE_SHA1_CAST128_CBC:
272 		*gen_mech = CKM_CAST128_KEY_GEN;
273 		break;
274 
275 	case CKM_RC5_KEY_GEN:
276 	case CKM_RC5_ECB:
277 	case CKM_RC5_CBC:
278 	case CKM_RC5_MAC:
279 	case CKM_RC5_MAC_GENERAL:
280 	case CKM_RC5_CBC_PAD:
281 		*gen_mech = CKM_RC5_KEY_GEN;
282 		break;
283 
284 	case CKM_IDEA_KEY_GEN:
285 	case CKM_IDEA_ECB:
286 	case CKM_IDEA_CBC:
287 	case CKM_IDEA_MAC:
288 	case CKM_IDEA_MAC_GENERAL:
289 	case CKM_IDEA_CBC_PAD:
290 		*gen_mech = CKM_IDEA_KEY_GEN;
291 		break;
292 
293 	case CKM_SKIPJACK_KEY_GEN:
294 	case CKM_SKIPJACK_ECB64:
295 	case CKM_SKIPJACK_CBC64:
296 	case CKM_SKIPJACK_OFB64:
297 	case CKM_SKIPJACK_CFB64:
298 	case CKM_SKIPJACK_CFB32:
299 	case CKM_SKIPJACK_CFB16:
300 	case CKM_SKIPJACK_CFB8:
301 	case CKM_SKIPJACK_WRAP:
302 	case CKM_SKIPJACK_PRIVATE_WRAP:
303 	case CKM_SKIPJACK_RELAYX:
304 		*gen_mech = CKM_SKIPJACK_KEY_GEN;
305 		break;
306 
307 	case CKM_BATON_KEY_GEN:
308 	case CKM_BATON_ECB128:
309 	case CKM_BATON_ECB96:
310 	case CKM_BATON_CBC128:
311 	case CKM_BATON_COUNTER:
312 	case CKM_BATON_SHUFFLE:
313 	case CKM_BATON_WRAP:
314 		*gen_mech = CKM_BATON_KEY_GEN;
315 		break;
316 
317 	case CKM_JUNIPER_KEY_GEN:
318 	case CKM_JUNIPER_ECB128:
319 	case CKM_JUNIPER_CBC128:
320 	case CKM_JUNIPER_COUNTER:
321 	case CKM_JUNIPER_SHUFFLE:
322 	case CKM_JUNIPER_WRAP:
323 		*gen_mech = CKM_JUNIPER_KEY_GEN;
324 		break;
325 
326 	case CKM_CDMF_KEY_GEN:
327 	case CKM_CDMF_ECB:
328 	case CKM_CDMF_CBC:
329 	case CKM_CDMF_MAC:
330 	case CKM_CDMF_MAC_GENERAL:
331 	case CKM_CDMF_CBC_PAD:
332 		*gen_mech = CKM_CDMF_KEY_GEN;
333 		break;
334 
335 	case CKM_AES_KEY_GEN:
336 	case CKM_AES_ECB:
337 	case CKM_AES_CBC:
338 	case CKM_AES_MAC:
339 	case CKM_AES_MAC_GENERAL:
340 	case CKM_AES_CBC_PAD:
341 	case CKM_AES_ECB_ENCRYPT_DATA:
342 	case CKM_AES_CBC_ENCRYPT_DATA:
343 		*gen_mech = CKM_AES_KEY_GEN;
344 		break;
345 
346 	case CKM_BLOWFISH_KEY_GEN:
347 	case CKM_BLOWFISH_CBC:
348 		*gen_mech = CKM_BLOWFISH_KEY_GEN;
349 		break;
350 
351 	case CKM_TWOFISH_KEY_GEN:
352 	case CKM_TWOFISH_CBC:
353 		*gen_mech = CKM_TWOFISH_KEY_GEN;
354 		break;
355 
356 	default:
357 		return (CKR_MECHANISM_INVALID);
358 		break;
359 	}
360 
361 	return (CKR_OK);
362 }
363