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 */
35CK_RV
36pkcs11_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