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