|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 /* |
|
5 * This file maps various PKCS #11 Mechanisms to related mechanisms, key |
|
6 * types, and ASN.1 encodings. |
|
7 */ |
|
8 #include "seccomon.h" |
|
9 #include "secmod.h" |
|
10 #include "secmodi.h" |
|
11 #include "pkcs11t.h" |
|
12 #include "pk11func.h" |
|
13 #include "secitem.h" |
|
14 #include "secder.h" |
|
15 #include "secasn1.h" |
|
16 #include "secoid.h" |
|
17 #include "secerr.h" |
|
18 |
|
19 /************************************************************* |
|
20 * local static and global data |
|
21 *************************************************************/ |
|
22 |
|
23 /* |
|
24 * Tables used for Extended mechanism mapping (currently not used) |
|
25 */ |
|
26 typedef struct { |
|
27 CK_MECHANISM_TYPE keyGen; |
|
28 CK_KEY_TYPE keyType; |
|
29 CK_MECHANISM_TYPE type; |
|
30 CK_MECHANISM_TYPE padType; |
|
31 int blockSize; |
|
32 int iv; |
|
33 } pk11MechanismData; |
|
34 |
|
35 static pk11MechanismData pk11_default = |
|
36 { CKM_GENERIC_SECRET_KEY_GEN, CKK_GENERIC_SECRET, |
|
37 CKM_FAKE_RANDOM, CKM_FAKE_RANDOM, 8, 8 }; |
|
38 static pk11MechanismData *pk11_MechanismTable = NULL; |
|
39 static int pk11_MechTableSize = 0; |
|
40 static int pk11_MechEntrySize = 0; |
|
41 |
|
42 /* |
|
43 * list of mechanisms we're willing to wrap secret keys with. |
|
44 * This list is ordered by preference. |
|
45 */ |
|
46 CK_MECHANISM_TYPE wrapMechanismList[] = { |
|
47 CKM_DES3_ECB, |
|
48 CKM_CAST5_ECB, |
|
49 CKM_AES_ECB, |
|
50 CKM_CAMELLIA_ECB, |
|
51 CKM_SEED_ECB, |
|
52 CKM_CAST5_ECB, |
|
53 CKM_DES_ECB, |
|
54 CKM_KEY_WRAP_LYNKS, |
|
55 CKM_IDEA_ECB, |
|
56 CKM_CAST3_ECB, |
|
57 CKM_CAST_ECB, |
|
58 CKM_RC5_ECB, |
|
59 CKM_RC2_ECB, |
|
60 CKM_CDMF_ECB, |
|
61 CKM_SKIPJACK_WRAP, |
|
62 }; |
|
63 |
|
64 int wrapMechanismCount = sizeof(wrapMechanismList)/sizeof(wrapMechanismList[0]); |
|
65 |
|
66 /********************************************************************* |
|
67 * Mechanism Mapping functions |
|
68 *********************************************************************/ |
|
69 |
|
70 /* |
|
71 * lookup an entry in the mechanism table. If none found, return the |
|
72 * default structure. |
|
73 */ |
|
74 static pk11MechanismData * |
|
75 pk11_lookup(CK_MECHANISM_TYPE type) |
|
76 { |
|
77 int i; |
|
78 for (i=0; i < pk11_MechEntrySize; i++) { |
|
79 if (pk11_MechanismTable[i].type == type) { |
|
80 return (&pk11_MechanismTable[i]); |
|
81 } |
|
82 } |
|
83 return &pk11_default; |
|
84 } |
|
85 |
|
86 /* |
|
87 * find the best key wrap mechanism for this slot. |
|
88 */ |
|
89 CK_MECHANISM_TYPE |
|
90 PK11_GetBestWrapMechanism(PK11SlotInfo *slot) |
|
91 { |
|
92 int i; |
|
93 for (i=0; i < wrapMechanismCount; i++) { |
|
94 if (PK11_DoesMechanism(slot,wrapMechanismList[i])) { |
|
95 return wrapMechanismList[i]; |
|
96 } |
|
97 } |
|
98 return CKM_INVALID_MECHANISM; |
|
99 } |
|
100 |
|
101 /* |
|
102 * NOTE: This is not thread safe. Called at init time, and when loading |
|
103 * a new Entry. It is reasonably safe as long as it is not re-entered |
|
104 * (readers will always see a consistant table) |
|
105 * |
|
106 * This routine is called to add entries to the mechanism table, once there, |
|
107 * they can not be removed. |
|
108 */ |
|
109 void |
|
110 PK11_AddMechanismEntry(CK_MECHANISM_TYPE type, CK_KEY_TYPE key, |
|
111 CK_MECHANISM_TYPE keyGen, |
|
112 CK_MECHANISM_TYPE padType, |
|
113 int ivLen, int blockSize) |
|
114 { |
|
115 int tableSize = pk11_MechTableSize; |
|
116 int size = pk11_MechEntrySize; |
|
117 int entry = size++; |
|
118 pk11MechanismData *old = pk11_MechanismTable; |
|
119 pk11MechanismData *newt = pk11_MechanismTable; |
|
120 |
|
121 |
|
122 if (size > tableSize) { |
|
123 int oldTableSize = tableSize; |
|
124 tableSize += 10; |
|
125 newt = PORT_NewArray(pk11MechanismData, tableSize); |
|
126 if (newt == NULL) return; |
|
127 |
|
128 if (old) PORT_Memcpy(newt, old, oldTableSize*sizeof(*newt)); |
|
129 } else old = NULL; |
|
130 |
|
131 newt[entry].type = type; |
|
132 newt[entry].keyType = key; |
|
133 newt[entry].keyGen = keyGen; |
|
134 newt[entry].padType = padType; |
|
135 newt[entry].iv = ivLen; |
|
136 newt[entry].blockSize = blockSize; |
|
137 |
|
138 pk11_MechanismTable = newt; |
|
139 pk11_MechTableSize = tableSize; |
|
140 pk11_MechEntrySize = size; |
|
141 if (old) PORT_Free(old); |
|
142 } |
|
143 |
|
144 /* |
|
145 * Get the mechanism needed for the given key type |
|
146 */ |
|
147 CK_MECHANISM_TYPE |
|
148 PK11_GetKeyMechanism(CK_KEY_TYPE type) |
|
149 { |
|
150 switch (type) { |
|
151 case CKK_SEED: |
|
152 return CKM_SEED_CBC; |
|
153 case CKK_CAMELLIA: |
|
154 return CKM_CAMELLIA_CBC; |
|
155 case CKK_AES: |
|
156 return CKM_AES_CBC; |
|
157 case CKK_DES: |
|
158 return CKM_DES_CBC; |
|
159 case CKK_DES3: |
|
160 return CKM_DES3_KEY_GEN; |
|
161 case CKK_DES2: |
|
162 return CKM_DES2_KEY_GEN; |
|
163 case CKK_CDMF: |
|
164 return CKM_CDMF_CBC; |
|
165 case CKK_RC2: |
|
166 return CKM_RC2_CBC; |
|
167 case CKK_RC4: |
|
168 return CKM_RC4; |
|
169 case CKK_RC5: |
|
170 return CKM_RC5_CBC; |
|
171 case CKK_SKIPJACK: |
|
172 return CKM_SKIPJACK_CBC64; |
|
173 case CKK_BATON: |
|
174 return CKM_BATON_CBC128; |
|
175 case CKK_JUNIPER: |
|
176 return CKM_JUNIPER_CBC128; |
|
177 case CKK_IDEA: |
|
178 return CKM_IDEA_CBC; |
|
179 case CKK_CAST: |
|
180 return CKM_CAST_CBC; |
|
181 case CKK_CAST3: |
|
182 return CKM_CAST3_CBC; |
|
183 case CKK_CAST5: |
|
184 return CKM_CAST5_CBC; |
|
185 case CKK_RSA: |
|
186 return CKM_RSA_PKCS; |
|
187 case CKK_DSA: |
|
188 return CKM_DSA; |
|
189 case CKK_DH: |
|
190 return CKM_DH_PKCS_DERIVE; |
|
191 case CKK_KEA: |
|
192 return CKM_KEA_KEY_DERIVE; |
|
193 case CKK_EC: /* CKK_ECDSA is deprecated */ |
|
194 return CKM_ECDSA; |
|
195 case CKK_GENERIC_SECRET: |
|
196 default: |
|
197 return CKM_SHA_1_HMAC; |
|
198 } |
|
199 } |
|
200 |
|
201 /* |
|
202 * Get the key type needed for the given mechanism |
|
203 */ |
|
204 CK_KEY_TYPE |
|
205 PK11_GetKeyType(CK_MECHANISM_TYPE type,unsigned long len) |
|
206 { |
|
207 switch (type) { |
|
208 case CKM_SEED_ECB: |
|
209 case CKM_SEED_CBC: |
|
210 case CKM_SEED_MAC: |
|
211 case CKM_SEED_MAC_GENERAL: |
|
212 case CKM_SEED_CBC_PAD: |
|
213 case CKM_SEED_KEY_GEN: |
|
214 return CKK_SEED; |
|
215 case CKM_CAMELLIA_ECB: |
|
216 case CKM_CAMELLIA_CBC: |
|
217 case CKM_CAMELLIA_MAC: |
|
218 case CKM_CAMELLIA_MAC_GENERAL: |
|
219 case CKM_CAMELLIA_CBC_PAD: |
|
220 case CKM_CAMELLIA_KEY_GEN: |
|
221 return CKK_CAMELLIA; |
|
222 case CKM_AES_ECB: |
|
223 case CKM_AES_CBC: |
|
224 case CKM_AES_CCM: |
|
225 case CKM_AES_CTR: |
|
226 case CKM_AES_CTS: |
|
227 case CKM_AES_GCM: |
|
228 case CKM_AES_MAC: |
|
229 case CKM_AES_MAC_GENERAL: |
|
230 case CKM_AES_CBC_PAD: |
|
231 case CKM_AES_KEY_GEN: |
|
232 case CKM_NETSCAPE_AES_KEY_WRAP: |
|
233 case CKM_NETSCAPE_AES_KEY_WRAP_PAD: |
|
234 return CKK_AES; |
|
235 case CKM_DES_ECB: |
|
236 case CKM_DES_CBC: |
|
237 case CKM_DES_MAC: |
|
238 case CKM_DES_MAC_GENERAL: |
|
239 case CKM_DES_CBC_PAD: |
|
240 case CKM_DES_KEY_GEN: |
|
241 case CKM_KEY_WRAP_LYNKS: |
|
242 case CKM_PBE_MD2_DES_CBC: |
|
243 case CKM_PBE_MD5_DES_CBC: |
|
244 return CKK_DES; |
|
245 case CKM_DES3_ECB: |
|
246 case CKM_DES3_CBC: |
|
247 case CKM_DES3_MAC: |
|
248 case CKM_DES3_MAC_GENERAL: |
|
249 case CKM_DES3_CBC_PAD: |
|
250 return (len == 16) ? CKK_DES2 : CKK_DES3; |
|
251 case CKM_DES2_KEY_GEN: |
|
252 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
253 return CKK_DES2; |
|
254 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
255 case CKM_DES3_KEY_GEN: |
|
256 return CKK_DES3; |
|
257 case CKM_CDMF_ECB: |
|
258 case CKM_CDMF_CBC: |
|
259 case CKM_CDMF_MAC: |
|
260 case CKM_CDMF_MAC_GENERAL: |
|
261 case CKM_CDMF_CBC_PAD: |
|
262 case CKM_CDMF_KEY_GEN: |
|
263 return CKK_CDMF; |
|
264 case CKM_RC2_ECB: |
|
265 case CKM_RC2_CBC: |
|
266 case CKM_RC2_MAC: |
|
267 case CKM_RC2_MAC_GENERAL: |
|
268 case CKM_RC2_CBC_PAD: |
|
269 case CKM_RC2_KEY_GEN: |
|
270 case CKM_PBE_SHA1_RC2_128_CBC: |
|
271 case CKM_PBE_SHA1_RC2_40_CBC: |
|
272 return CKK_RC2; |
|
273 case CKM_RC4: |
|
274 case CKM_RC4_KEY_GEN: |
|
275 return CKK_RC4; |
|
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 case CKM_RC5_KEY_GEN: |
|
282 return CKK_RC5; |
|
283 case CKM_SKIPJACK_CBC64: |
|
284 case CKM_SKIPJACK_ECB64: |
|
285 case CKM_SKIPJACK_OFB64: |
|
286 case CKM_SKIPJACK_CFB64: |
|
287 case CKM_SKIPJACK_CFB32: |
|
288 case CKM_SKIPJACK_CFB16: |
|
289 case CKM_SKIPJACK_CFB8: |
|
290 case CKM_SKIPJACK_KEY_GEN: |
|
291 case CKM_SKIPJACK_WRAP: |
|
292 case CKM_SKIPJACK_PRIVATE_WRAP: |
|
293 return CKK_SKIPJACK; |
|
294 case CKM_BATON_ECB128: |
|
295 case CKM_BATON_ECB96: |
|
296 case CKM_BATON_CBC128: |
|
297 case CKM_BATON_COUNTER: |
|
298 case CKM_BATON_SHUFFLE: |
|
299 case CKM_BATON_WRAP: |
|
300 case CKM_BATON_KEY_GEN: |
|
301 return CKK_BATON; |
|
302 case CKM_JUNIPER_ECB128: |
|
303 case CKM_JUNIPER_CBC128: |
|
304 case CKM_JUNIPER_COUNTER: |
|
305 case CKM_JUNIPER_SHUFFLE: |
|
306 case CKM_JUNIPER_WRAP: |
|
307 case CKM_JUNIPER_KEY_GEN: |
|
308 return CKK_JUNIPER; |
|
309 case CKM_IDEA_CBC: |
|
310 case CKM_IDEA_ECB: |
|
311 case CKM_IDEA_MAC: |
|
312 case CKM_IDEA_MAC_GENERAL: |
|
313 case CKM_IDEA_CBC_PAD: |
|
314 case CKM_IDEA_KEY_GEN: |
|
315 return CKK_IDEA; |
|
316 case CKM_CAST_ECB: |
|
317 case CKM_CAST_CBC: |
|
318 case CKM_CAST_MAC: |
|
319 case CKM_CAST_MAC_GENERAL: |
|
320 case CKM_CAST_CBC_PAD: |
|
321 case CKM_CAST_KEY_GEN: |
|
322 case CKM_PBE_MD5_CAST_CBC: |
|
323 return CKK_CAST; |
|
324 case CKM_CAST3_ECB: |
|
325 case CKM_CAST3_CBC: |
|
326 case CKM_CAST3_MAC: |
|
327 case CKM_CAST3_MAC_GENERAL: |
|
328 case CKM_CAST3_CBC_PAD: |
|
329 case CKM_CAST3_KEY_GEN: |
|
330 case CKM_PBE_MD5_CAST3_CBC: |
|
331 return CKK_CAST3; |
|
332 case CKM_CAST5_ECB: |
|
333 case CKM_CAST5_CBC: |
|
334 case CKM_CAST5_MAC: |
|
335 case CKM_CAST5_MAC_GENERAL: |
|
336 case CKM_CAST5_CBC_PAD: |
|
337 case CKM_CAST5_KEY_GEN: |
|
338 case CKM_PBE_MD5_CAST5_CBC: |
|
339 return CKK_CAST5; |
|
340 case CKM_RSA_PKCS: |
|
341 case CKM_RSA_9796: |
|
342 case CKM_RSA_X_509: |
|
343 case CKM_MD2_RSA_PKCS: |
|
344 case CKM_MD5_RSA_PKCS: |
|
345 case CKM_SHA1_RSA_PKCS: |
|
346 case CKM_SHA224_RSA_PKCS: |
|
347 case CKM_SHA256_RSA_PKCS: |
|
348 case CKM_SHA384_RSA_PKCS: |
|
349 case CKM_SHA512_RSA_PKCS: |
|
350 case CKM_KEY_WRAP_SET_OAEP: |
|
351 case CKM_RSA_PKCS_KEY_PAIR_GEN: |
|
352 case CKM_RSA_X9_31_KEY_PAIR_GEN: |
|
353 return CKK_RSA; |
|
354 case CKM_DSA: |
|
355 case CKM_DSA_SHA1: |
|
356 case CKM_DSA_KEY_PAIR_GEN: |
|
357 return CKK_DSA; |
|
358 case CKM_DH_PKCS_DERIVE: |
|
359 case CKM_DH_PKCS_KEY_PAIR_GEN: |
|
360 return CKK_DH; |
|
361 case CKM_KEA_KEY_DERIVE: |
|
362 case CKM_KEA_KEY_PAIR_GEN: |
|
363 return CKK_KEA; |
|
364 case CKM_ECDSA: |
|
365 case CKM_ECDSA_SHA1: |
|
366 case CKM_EC_KEY_PAIR_GEN: /* aka CKM_ECDSA_KEY_PAIR_GEN */ |
|
367 case CKM_ECDH1_DERIVE: |
|
368 return CKK_EC; /* CKK_ECDSA is deprecated */ |
|
369 case CKM_SSL3_PRE_MASTER_KEY_GEN: |
|
370 case CKM_GENERIC_SECRET_KEY_GEN: |
|
371 case CKM_SSL3_MASTER_KEY_DERIVE: |
|
372 case CKM_SSL3_MASTER_KEY_DERIVE_DH: |
|
373 case CKM_SSL3_KEY_AND_MAC_DERIVE: |
|
374 case CKM_SSL3_SHA1_MAC: |
|
375 case CKM_SSL3_MD5_MAC: |
|
376 case CKM_TLS_MASTER_KEY_DERIVE: |
|
377 case CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256: |
|
378 case CKM_TLS_MASTER_KEY_DERIVE_DH: |
|
379 case CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256: |
|
380 case CKM_TLS_KEY_AND_MAC_DERIVE: |
|
381 case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256: |
|
382 case CKM_SHA_1_HMAC: |
|
383 case CKM_SHA_1_HMAC_GENERAL: |
|
384 case CKM_SHA224_HMAC: |
|
385 case CKM_SHA224_HMAC_GENERAL: |
|
386 case CKM_SHA256_HMAC: |
|
387 case CKM_SHA256_HMAC_GENERAL: |
|
388 case CKM_SHA384_HMAC: |
|
389 case CKM_SHA384_HMAC_GENERAL: |
|
390 case CKM_SHA512_HMAC: |
|
391 case CKM_SHA512_HMAC_GENERAL: |
|
392 case CKM_MD2_HMAC: |
|
393 case CKM_MD2_HMAC_GENERAL: |
|
394 case CKM_MD5_HMAC: |
|
395 case CKM_MD5_HMAC_GENERAL: |
|
396 case CKM_TLS_PRF_GENERAL: |
|
397 case CKM_NSS_TLS_PRF_GENERAL_SHA256: |
|
398 return CKK_GENERIC_SECRET; |
|
399 default: |
|
400 return pk11_lookup(type)->keyType; |
|
401 } |
|
402 } |
|
403 |
|
404 /* |
|
405 * Get the Key Gen Mechanism needed for the given |
|
406 * crypto mechanism |
|
407 */ |
|
408 CK_MECHANISM_TYPE |
|
409 PK11_GetKeyGen(CK_MECHANISM_TYPE type) |
|
410 { |
|
411 return PK11_GetKeyGenWithSize(type, 0); |
|
412 } |
|
413 |
|
414 CK_MECHANISM_TYPE |
|
415 PK11_GetKeyGenWithSize(CK_MECHANISM_TYPE type, int size) |
|
416 { |
|
417 switch (type) { |
|
418 case CKM_SEED_ECB: |
|
419 case CKM_SEED_CBC: |
|
420 case CKM_SEED_MAC: |
|
421 case CKM_SEED_MAC_GENERAL: |
|
422 case CKM_SEED_CBC_PAD: |
|
423 case CKM_SEED_KEY_GEN: |
|
424 return CKM_SEED_KEY_GEN; |
|
425 case CKM_CAMELLIA_ECB: |
|
426 case CKM_CAMELLIA_CBC: |
|
427 case CKM_CAMELLIA_MAC: |
|
428 case CKM_CAMELLIA_MAC_GENERAL: |
|
429 case CKM_CAMELLIA_CBC_PAD: |
|
430 case CKM_CAMELLIA_KEY_GEN: |
|
431 return CKM_CAMELLIA_KEY_GEN; |
|
432 case CKM_AES_ECB: |
|
433 case CKM_AES_CBC: |
|
434 case CKM_AES_CCM: |
|
435 case CKM_AES_CTR: |
|
436 case CKM_AES_CTS: |
|
437 case CKM_AES_GCM: |
|
438 case CKM_AES_MAC: |
|
439 case CKM_AES_MAC_GENERAL: |
|
440 case CKM_AES_CBC_PAD: |
|
441 case CKM_AES_KEY_GEN: |
|
442 return CKM_AES_KEY_GEN; |
|
443 case CKM_DES_ECB: |
|
444 case CKM_DES_CBC: |
|
445 case CKM_DES_MAC: |
|
446 case CKM_DES_MAC_GENERAL: |
|
447 case CKM_KEY_WRAP_LYNKS: |
|
448 case CKM_DES_CBC_PAD: |
|
449 case CKM_DES_KEY_GEN: |
|
450 return CKM_DES_KEY_GEN; |
|
451 case CKM_DES3_ECB: |
|
452 case CKM_DES3_CBC: |
|
453 case CKM_DES3_MAC: |
|
454 case CKM_DES3_MAC_GENERAL: |
|
455 case CKM_DES3_CBC_PAD: |
|
456 return (size == 16) ? CKM_DES2_KEY_GEN : CKM_DES3_KEY_GEN; |
|
457 case CKM_DES3_KEY_GEN: |
|
458 return CKM_DES3_KEY_GEN; |
|
459 case CKM_DES2_KEY_GEN: |
|
460 return CKM_DES2_KEY_GEN; |
|
461 case CKM_CDMF_ECB: |
|
462 case CKM_CDMF_CBC: |
|
463 case CKM_CDMF_MAC: |
|
464 case CKM_CDMF_MAC_GENERAL: |
|
465 case CKM_CDMF_CBC_PAD: |
|
466 case CKM_CDMF_KEY_GEN: |
|
467 return CKM_CDMF_KEY_GEN; |
|
468 case CKM_RC2_ECB: |
|
469 case CKM_RC2_CBC: |
|
470 case CKM_RC2_MAC: |
|
471 case CKM_RC2_MAC_GENERAL: |
|
472 case CKM_RC2_CBC_PAD: |
|
473 case CKM_RC2_KEY_GEN: |
|
474 return CKM_RC2_KEY_GEN; |
|
475 case CKM_RC4: |
|
476 case CKM_RC4_KEY_GEN: |
|
477 return CKM_RC4_KEY_GEN; |
|
478 case CKM_RC5_ECB: |
|
479 case CKM_RC5_CBC: |
|
480 case CKM_RC5_MAC: |
|
481 case CKM_RC5_MAC_GENERAL: |
|
482 case CKM_RC5_CBC_PAD: |
|
483 case CKM_RC5_KEY_GEN: |
|
484 return CKM_RC5_KEY_GEN; |
|
485 case CKM_SKIPJACK_CBC64: |
|
486 case CKM_SKIPJACK_ECB64: |
|
487 case CKM_SKIPJACK_OFB64: |
|
488 case CKM_SKIPJACK_CFB64: |
|
489 case CKM_SKIPJACK_CFB32: |
|
490 case CKM_SKIPJACK_CFB16: |
|
491 case CKM_SKIPJACK_CFB8: |
|
492 case CKM_SKIPJACK_WRAP: |
|
493 case CKM_SKIPJACK_KEY_GEN: |
|
494 return CKM_SKIPJACK_KEY_GEN; |
|
495 case CKM_BATON_ECB128: |
|
496 case CKM_BATON_ECB96: |
|
497 case CKM_BATON_CBC128: |
|
498 case CKM_BATON_COUNTER: |
|
499 case CKM_BATON_SHUFFLE: |
|
500 case CKM_BATON_WRAP: |
|
501 case CKM_BATON_KEY_GEN: |
|
502 return CKM_BATON_KEY_GEN; |
|
503 case CKM_JUNIPER_ECB128: |
|
504 case CKM_JUNIPER_CBC128: |
|
505 case CKM_JUNIPER_COUNTER: |
|
506 case CKM_JUNIPER_SHUFFLE: |
|
507 case CKM_JUNIPER_WRAP: |
|
508 case CKM_JUNIPER_KEY_GEN: |
|
509 return CKM_JUNIPER_KEY_GEN; |
|
510 case CKM_IDEA_CBC: |
|
511 case CKM_IDEA_ECB: |
|
512 case CKM_IDEA_MAC: |
|
513 case CKM_IDEA_MAC_GENERAL: |
|
514 case CKM_IDEA_CBC_PAD: |
|
515 case CKM_IDEA_KEY_GEN: |
|
516 return CKM_IDEA_KEY_GEN; |
|
517 case CKM_CAST_ECB: |
|
518 case CKM_CAST_CBC: |
|
519 case CKM_CAST_MAC: |
|
520 case CKM_CAST_MAC_GENERAL: |
|
521 case CKM_CAST_CBC_PAD: |
|
522 case CKM_CAST_KEY_GEN: |
|
523 return CKM_CAST_KEY_GEN; |
|
524 case CKM_CAST3_ECB: |
|
525 case CKM_CAST3_CBC: |
|
526 case CKM_CAST3_MAC: |
|
527 case CKM_CAST3_MAC_GENERAL: |
|
528 case CKM_CAST3_CBC_PAD: |
|
529 case CKM_CAST3_KEY_GEN: |
|
530 return CKM_CAST3_KEY_GEN; |
|
531 case CKM_CAST5_ECB: |
|
532 case CKM_CAST5_CBC: |
|
533 case CKM_CAST5_MAC: |
|
534 case CKM_CAST5_MAC_GENERAL: |
|
535 case CKM_CAST5_CBC_PAD: |
|
536 case CKM_CAST5_KEY_GEN: |
|
537 return CKM_CAST5_KEY_GEN; |
|
538 case CKM_RSA_PKCS: |
|
539 case CKM_RSA_9796: |
|
540 case CKM_RSA_X_509: |
|
541 case CKM_MD2_RSA_PKCS: |
|
542 case CKM_MD5_RSA_PKCS: |
|
543 case CKM_SHA1_RSA_PKCS: |
|
544 case CKM_SHA224_RSA_PKCS: |
|
545 case CKM_SHA256_RSA_PKCS: |
|
546 case CKM_SHA384_RSA_PKCS: |
|
547 case CKM_SHA512_RSA_PKCS: |
|
548 case CKM_KEY_WRAP_SET_OAEP: |
|
549 case CKM_RSA_PKCS_KEY_PAIR_GEN: |
|
550 return CKM_RSA_PKCS_KEY_PAIR_GEN; |
|
551 case CKM_RSA_X9_31_KEY_PAIR_GEN: |
|
552 return CKM_RSA_X9_31_KEY_PAIR_GEN; |
|
553 case CKM_DSA: |
|
554 case CKM_DSA_SHA1: |
|
555 case CKM_DSA_KEY_PAIR_GEN: |
|
556 return CKM_DSA_KEY_PAIR_GEN; |
|
557 case CKM_DH_PKCS_DERIVE: |
|
558 case CKM_DH_PKCS_KEY_PAIR_GEN: |
|
559 return CKM_DH_PKCS_KEY_PAIR_GEN; |
|
560 case CKM_KEA_KEY_DERIVE: |
|
561 case CKM_KEA_KEY_PAIR_GEN: |
|
562 return CKM_KEA_KEY_PAIR_GEN; |
|
563 case CKM_ECDSA: |
|
564 case CKM_ECDSA_SHA1: |
|
565 case CKM_EC_KEY_PAIR_GEN: /* aka CKM_ECDSA_KEY_PAIR_GEN */ |
|
566 case CKM_ECDH1_DERIVE: |
|
567 return CKM_EC_KEY_PAIR_GEN; |
|
568 case CKM_SSL3_PRE_MASTER_KEY_GEN: |
|
569 case CKM_SSL3_MASTER_KEY_DERIVE: |
|
570 case CKM_SSL3_KEY_AND_MAC_DERIVE: |
|
571 case CKM_SSL3_SHA1_MAC: |
|
572 case CKM_SSL3_MD5_MAC: |
|
573 case CKM_TLS_MASTER_KEY_DERIVE: |
|
574 case CKM_TLS_KEY_AND_MAC_DERIVE: |
|
575 case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256: |
|
576 return CKM_SSL3_PRE_MASTER_KEY_GEN; |
|
577 case CKM_SHA_1_HMAC: |
|
578 case CKM_SHA_1_HMAC_GENERAL: |
|
579 case CKM_SHA224_HMAC: |
|
580 case CKM_SHA224_HMAC_GENERAL: |
|
581 case CKM_SHA256_HMAC: |
|
582 case CKM_SHA256_HMAC_GENERAL: |
|
583 case CKM_SHA384_HMAC: |
|
584 case CKM_SHA384_HMAC_GENERAL: |
|
585 case CKM_SHA512_HMAC: |
|
586 case CKM_SHA512_HMAC_GENERAL: |
|
587 case CKM_MD2_HMAC: |
|
588 case CKM_MD2_HMAC_GENERAL: |
|
589 case CKM_MD5_HMAC: |
|
590 case CKM_MD5_HMAC_GENERAL: |
|
591 case CKM_TLS_PRF_GENERAL: |
|
592 case CKM_NSS_TLS_PRF_GENERAL_SHA256: |
|
593 case CKM_GENERIC_SECRET_KEY_GEN: |
|
594 return CKM_GENERIC_SECRET_KEY_GEN; |
|
595 case CKM_PBE_MD2_DES_CBC: |
|
596 case CKM_PBE_MD5_DES_CBC: |
|
597 case CKM_PBA_SHA1_WITH_SHA1_HMAC: |
|
598 case CKM_NETSCAPE_PBE_SHA1_HMAC_KEY_GEN: |
|
599 case CKM_NETSCAPE_PBE_MD5_HMAC_KEY_GEN: |
|
600 case CKM_NETSCAPE_PBE_MD2_HMAC_KEY_GEN: |
|
601 case CKM_NETSCAPE_PBE_SHA1_DES_CBC: |
|
602 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC: |
|
603 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC: |
|
604 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4: |
|
605 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4: |
|
606 case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC: |
|
607 case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC: |
|
608 case CKM_PBE_SHA1_RC2_40_CBC: |
|
609 case CKM_PBE_SHA1_RC2_128_CBC: |
|
610 case CKM_PBE_SHA1_RC4_40: |
|
611 case CKM_PBE_SHA1_RC4_128: |
|
612 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
613 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
614 case CKM_PKCS5_PBKD2: |
|
615 return type; |
|
616 default: |
|
617 return pk11_lookup(type)->keyGen; |
|
618 } |
|
619 } |
|
620 |
|
621 /* |
|
622 * get the mechanism block size |
|
623 */ |
|
624 int |
|
625 PK11_GetBlockSize(CK_MECHANISM_TYPE type,SECItem *params) |
|
626 { |
|
627 CK_RC5_PARAMS *rc5_params; |
|
628 CK_RC5_CBC_PARAMS *rc5_cbc_params; |
|
629 switch (type) { |
|
630 case CKM_RC5_ECB: |
|
631 if ((params) && (params->data)) { |
|
632 rc5_params = (CK_RC5_PARAMS *) params->data; |
|
633 return (rc5_params->ulWordsize)*2; |
|
634 } |
|
635 return 8; |
|
636 case CKM_RC5_CBC: |
|
637 case CKM_RC5_CBC_PAD: |
|
638 if ((params) && (params->data)) { |
|
639 rc5_cbc_params = (CK_RC5_CBC_PARAMS *) params->data; |
|
640 return (rc5_cbc_params->ulWordsize)*2; |
|
641 } |
|
642 return 8; |
|
643 case CKM_DES_ECB: |
|
644 case CKM_DES3_ECB: |
|
645 case CKM_RC2_ECB: |
|
646 case CKM_IDEA_ECB: |
|
647 case CKM_CAST_ECB: |
|
648 case CKM_CAST3_ECB: |
|
649 case CKM_CAST5_ECB: |
|
650 case CKM_RC2_CBC: |
|
651 case CKM_SKIPJACK_CBC64: |
|
652 case CKM_SKIPJACK_ECB64: |
|
653 case CKM_SKIPJACK_OFB64: |
|
654 case CKM_SKIPJACK_CFB64: |
|
655 case CKM_DES_CBC: |
|
656 case CKM_DES3_CBC: |
|
657 case CKM_IDEA_CBC: |
|
658 case CKM_CAST_CBC: |
|
659 case CKM_CAST3_CBC: |
|
660 case CKM_CAST5_CBC: |
|
661 case CKM_DES_CBC_PAD: |
|
662 case CKM_DES3_CBC_PAD: |
|
663 case CKM_RC2_CBC_PAD: |
|
664 case CKM_IDEA_CBC_PAD: |
|
665 case CKM_CAST_CBC_PAD: |
|
666 case CKM_CAST3_CBC_PAD: |
|
667 case CKM_CAST5_CBC_PAD: |
|
668 case CKM_PBE_MD2_DES_CBC: |
|
669 case CKM_PBE_MD5_DES_CBC: |
|
670 case CKM_NETSCAPE_PBE_SHA1_DES_CBC: |
|
671 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC: |
|
672 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC: |
|
673 case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC: |
|
674 case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC: |
|
675 case CKM_PBE_SHA1_RC2_40_CBC: |
|
676 case CKM_PBE_SHA1_RC2_128_CBC: |
|
677 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
678 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
679 return 8; |
|
680 case CKM_SKIPJACK_CFB32: |
|
681 case CKM_SKIPJACK_CFB16: |
|
682 case CKM_SKIPJACK_CFB8: |
|
683 return 4; |
|
684 case CKM_SEED_ECB: |
|
685 case CKM_SEED_CBC: |
|
686 case CKM_SEED_CBC_PAD: |
|
687 case CKM_CAMELLIA_ECB: |
|
688 case CKM_CAMELLIA_CBC: |
|
689 case CKM_CAMELLIA_CBC_PAD: |
|
690 case CKM_AES_ECB: |
|
691 case CKM_AES_CBC: |
|
692 case CKM_AES_CBC_PAD: |
|
693 case CKM_BATON_ECB128: |
|
694 case CKM_BATON_CBC128: |
|
695 case CKM_BATON_COUNTER: |
|
696 case CKM_BATON_SHUFFLE: |
|
697 case CKM_JUNIPER_ECB128: |
|
698 case CKM_JUNIPER_CBC128: |
|
699 case CKM_JUNIPER_COUNTER: |
|
700 case CKM_JUNIPER_SHUFFLE: |
|
701 return 16; |
|
702 case CKM_BATON_ECB96: |
|
703 return 12; |
|
704 case CKM_RC4: |
|
705 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4: |
|
706 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4: |
|
707 case CKM_PBE_SHA1_RC4_40: |
|
708 case CKM_PBE_SHA1_RC4_128: |
|
709 return 0; |
|
710 case CKM_RSA_PKCS: |
|
711 case CKM_RSA_9796: |
|
712 case CKM_RSA_X_509: |
|
713 /*actually it's the modulus length of the key!*/ |
|
714 return -1; /* failure */ |
|
715 default: |
|
716 return pk11_lookup(type)->blockSize; |
|
717 } |
|
718 } |
|
719 |
|
720 /* |
|
721 * get the iv length |
|
722 */ |
|
723 int |
|
724 PK11_GetIVLength(CK_MECHANISM_TYPE type) |
|
725 { |
|
726 switch (type) { |
|
727 case CKM_SEED_ECB: |
|
728 case CKM_CAMELLIA_ECB: |
|
729 case CKM_AES_ECB: |
|
730 case CKM_DES_ECB: |
|
731 case CKM_DES3_ECB: |
|
732 case CKM_RC2_ECB: |
|
733 case CKM_IDEA_ECB: |
|
734 case CKM_SKIPJACK_WRAP: |
|
735 case CKM_BATON_WRAP: |
|
736 case CKM_RC5_ECB: |
|
737 case CKM_CAST_ECB: |
|
738 case CKM_CAST3_ECB: |
|
739 case CKM_CAST5_ECB: |
|
740 return 0; |
|
741 case CKM_RC2_CBC: |
|
742 case CKM_DES_CBC: |
|
743 case CKM_DES3_CBC: |
|
744 case CKM_IDEA_CBC: |
|
745 case CKM_PBE_MD2_DES_CBC: |
|
746 case CKM_PBE_MD5_DES_CBC: |
|
747 case CKM_NETSCAPE_PBE_SHA1_DES_CBC: |
|
748 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC: |
|
749 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC: |
|
750 case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC: |
|
751 case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC: |
|
752 case CKM_PBE_SHA1_RC2_40_CBC: |
|
753 case CKM_PBE_SHA1_RC2_128_CBC: |
|
754 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
755 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
756 case CKM_RC5_CBC: |
|
757 case CKM_CAST_CBC: |
|
758 case CKM_CAST3_CBC: |
|
759 case CKM_CAST5_CBC: |
|
760 case CKM_RC2_CBC_PAD: |
|
761 case CKM_DES_CBC_PAD: |
|
762 case CKM_DES3_CBC_PAD: |
|
763 case CKM_IDEA_CBC_PAD: |
|
764 case CKM_RC5_CBC_PAD: |
|
765 case CKM_CAST_CBC_PAD: |
|
766 case CKM_CAST3_CBC_PAD: |
|
767 case CKM_CAST5_CBC_PAD: |
|
768 return 8; |
|
769 case CKM_SEED_CBC: |
|
770 case CKM_SEED_CBC_PAD: |
|
771 case CKM_CAMELLIA_CBC: |
|
772 case CKM_CAMELLIA_CBC_PAD: |
|
773 case CKM_AES_CBC: |
|
774 case CKM_AES_CBC_PAD: |
|
775 return 16; |
|
776 case CKM_SKIPJACK_CBC64: |
|
777 case CKM_SKIPJACK_ECB64: |
|
778 case CKM_SKIPJACK_OFB64: |
|
779 case CKM_SKIPJACK_CFB64: |
|
780 case CKM_SKIPJACK_CFB32: |
|
781 case CKM_SKIPJACK_CFB16: |
|
782 case CKM_SKIPJACK_CFB8: |
|
783 case CKM_BATON_ECB128: |
|
784 case CKM_BATON_ECB96: |
|
785 case CKM_BATON_CBC128: |
|
786 case CKM_BATON_COUNTER: |
|
787 case CKM_BATON_SHUFFLE: |
|
788 case CKM_JUNIPER_ECB128: |
|
789 case CKM_JUNIPER_CBC128: |
|
790 case CKM_JUNIPER_COUNTER: |
|
791 case CKM_JUNIPER_SHUFFLE: |
|
792 return 24; |
|
793 case CKM_RC4: |
|
794 case CKM_RSA_PKCS: |
|
795 case CKM_RSA_9796: |
|
796 case CKM_RSA_X_509: |
|
797 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4: |
|
798 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4: |
|
799 case CKM_PBE_SHA1_RC4_40: |
|
800 case CKM_PBE_SHA1_RC4_128: |
|
801 return 0; |
|
802 default: |
|
803 return pk11_lookup(type)->iv; |
|
804 } |
|
805 } |
|
806 |
|
807 |
|
808 /* These next two utilities are here to help facilitate future |
|
809 * Dynamic Encrypt/Decrypt symetric key mechanisms, and to allow functions |
|
810 * like SSL and S-MIME to automatically add them. |
|
811 */ |
|
812 SECItem * |
|
813 pk11_ParamFromIVWithLen(CK_MECHANISM_TYPE type, SECItem *iv, int keyLen) |
|
814 { |
|
815 CK_RC2_CBC_PARAMS *rc2_params = NULL; |
|
816 CK_RC2_PARAMS *rc2_ecb_params = NULL; |
|
817 CK_RC5_PARAMS *rc5_params = NULL; |
|
818 CK_RC5_CBC_PARAMS *rc5_cbc_params = NULL; |
|
819 SECItem *param; |
|
820 |
|
821 param = (SECItem *)PORT_Alloc(sizeof(SECItem)); |
|
822 if (param == NULL) return NULL; |
|
823 param->data = NULL; |
|
824 param->len = 0; |
|
825 param->type = 0; |
|
826 switch (type) { |
|
827 case CKM_SEED_ECB: |
|
828 case CKM_CAMELLIA_ECB: |
|
829 case CKM_AES_ECB: |
|
830 case CKM_DES_ECB: |
|
831 case CKM_DES3_ECB: |
|
832 case CKM_RSA_PKCS: |
|
833 case CKM_RSA_X_509: |
|
834 case CKM_RSA_9796: |
|
835 case CKM_IDEA_ECB: |
|
836 case CKM_CDMF_ECB: |
|
837 case CKM_CAST_ECB: |
|
838 case CKM_CAST3_ECB: |
|
839 case CKM_CAST5_ECB: |
|
840 case CKM_RC4: |
|
841 break; |
|
842 case CKM_RC2_ECB: |
|
843 rc2_ecb_params = (CK_RC2_PARAMS *)PORT_Alloc(sizeof(CK_RC2_PARAMS)); |
|
844 if (rc2_ecb_params == NULL) break; |
|
845 /* Maybe we should pass the key size in too to get this value? */ |
|
846 *rc2_ecb_params = keyLen ? keyLen*8 : 128; |
|
847 param->data = (unsigned char *) rc2_ecb_params; |
|
848 param->len = sizeof(CK_RC2_PARAMS); |
|
849 break; |
|
850 case CKM_RC2_CBC: |
|
851 case CKM_RC2_CBC_PAD: |
|
852 rc2_params = (CK_RC2_CBC_PARAMS *)PORT_Alloc(sizeof(CK_RC2_CBC_PARAMS)); |
|
853 if (rc2_params == NULL) break; |
|
854 /* Maybe we should pass the key size in too to get this value? */ |
|
855 rc2_params->ulEffectiveBits = keyLen ? keyLen*8 : 128; |
|
856 if (iv && iv->data) |
|
857 PORT_Memcpy(rc2_params->iv,iv->data,sizeof(rc2_params->iv)); |
|
858 param->data = (unsigned char *) rc2_params; |
|
859 param->len = sizeof(CK_RC2_CBC_PARAMS); |
|
860 break; |
|
861 case CKM_RC5_CBC: |
|
862 case CKM_RC5_CBC_PAD: |
|
863 rc5_cbc_params = (CK_RC5_CBC_PARAMS *) |
|
864 PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + ((iv) ? iv->len : 0)); |
|
865 if (rc5_cbc_params == NULL) break; |
|
866 if (iv && iv->data && iv->len) { |
|
867 rc5_cbc_params->pIv = ((CK_BYTE_PTR) rc5_cbc_params) |
|
868 + sizeof(CK_RC5_CBC_PARAMS); |
|
869 PORT_Memcpy(rc5_cbc_params->pIv,iv->data,iv->len); |
|
870 rc5_cbc_params->ulIvLen = iv->len; |
|
871 rc5_cbc_params->ulWordsize = iv->len/2; |
|
872 } else { |
|
873 rc5_cbc_params->ulWordsize = 4; |
|
874 rc5_cbc_params->pIv = NULL; |
|
875 rc5_cbc_params->ulIvLen = 0; |
|
876 } |
|
877 rc5_cbc_params->ulRounds = 16; |
|
878 param->data = (unsigned char *) rc5_cbc_params; |
|
879 param->len = sizeof(CK_RC5_CBC_PARAMS); |
|
880 break; |
|
881 case CKM_RC5_ECB: |
|
882 rc5_params = (CK_RC5_PARAMS *)PORT_Alloc(sizeof(CK_RC5_PARAMS)); |
|
883 if (rc5_params == NULL) break; |
|
884 if (iv && iv->data && iv->len) { |
|
885 rc5_params->ulWordsize = iv->len/2; |
|
886 } else { |
|
887 rc5_params->ulWordsize = 4; |
|
888 } |
|
889 rc5_params->ulRounds = 16; |
|
890 param->data = (unsigned char *) rc5_params; |
|
891 param->len = sizeof(CK_RC5_PARAMS); |
|
892 break; |
|
893 |
|
894 case CKM_SEED_CBC: |
|
895 case CKM_CAMELLIA_CBC: |
|
896 case CKM_AES_CBC: |
|
897 case CKM_DES_CBC: |
|
898 case CKM_DES3_CBC: |
|
899 case CKM_IDEA_CBC: |
|
900 case CKM_CDMF_CBC: |
|
901 case CKM_CAST_CBC: |
|
902 case CKM_CAST3_CBC: |
|
903 case CKM_CAST5_CBC: |
|
904 case CKM_CAMELLIA_CBC_PAD: |
|
905 case CKM_AES_CBC_PAD: |
|
906 case CKM_DES_CBC_PAD: |
|
907 case CKM_DES3_CBC_PAD: |
|
908 case CKM_IDEA_CBC_PAD: |
|
909 case CKM_CDMF_CBC_PAD: |
|
910 case CKM_CAST_CBC_PAD: |
|
911 case CKM_CAST3_CBC_PAD: |
|
912 case CKM_CAST5_CBC_PAD: |
|
913 case CKM_SKIPJACK_CBC64: |
|
914 case CKM_SKIPJACK_ECB64: |
|
915 case CKM_SKIPJACK_OFB64: |
|
916 case CKM_SKIPJACK_CFB64: |
|
917 case CKM_SKIPJACK_CFB32: |
|
918 case CKM_SKIPJACK_CFB16: |
|
919 case CKM_SKIPJACK_CFB8: |
|
920 case CKM_BATON_ECB128: |
|
921 case CKM_BATON_ECB96: |
|
922 case CKM_BATON_CBC128: |
|
923 case CKM_BATON_COUNTER: |
|
924 case CKM_BATON_SHUFFLE: |
|
925 case CKM_JUNIPER_ECB128: |
|
926 case CKM_JUNIPER_CBC128: |
|
927 case CKM_JUNIPER_COUNTER: |
|
928 case CKM_JUNIPER_SHUFFLE: |
|
929 if ((iv == NULL) || (iv->data == NULL)) break; |
|
930 param->data = (unsigned char*)PORT_Alloc(iv->len); |
|
931 if (param->data != NULL) { |
|
932 PORT_Memcpy(param->data,iv->data,iv->len); |
|
933 param->len = iv->len; |
|
934 } |
|
935 break; |
|
936 /* unknown mechanism, pass IV in if it's there */ |
|
937 default: |
|
938 if (pk11_lookup(type)->iv == 0) { |
|
939 break; |
|
940 } |
|
941 if ((iv == NULL) || (iv->data == NULL)) { |
|
942 break; |
|
943 } |
|
944 param->data = (unsigned char*)PORT_Alloc(iv->len); |
|
945 if (param->data != NULL) { |
|
946 PORT_Memcpy(param->data,iv->data,iv->len); |
|
947 param->len = iv->len; |
|
948 } |
|
949 break; |
|
950 } |
|
951 return param; |
|
952 } |
|
953 |
|
954 /* These next two utilities are here to help facilitate future |
|
955 * Dynamic Encrypt/Decrypt symetric key mechanisms, and to allow functions |
|
956 * like SSL and S-MIME to automatically add them. |
|
957 */ |
|
958 SECItem * |
|
959 PK11_ParamFromIV(CK_MECHANISM_TYPE type,SECItem *iv) |
|
960 { |
|
961 return pk11_ParamFromIVWithLen(type, iv, 0); |
|
962 } |
|
963 |
|
964 unsigned char * |
|
965 PK11_IVFromParam(CK_MECHANISM_TYPE type,SECItem *param,int *len) |
|
966 { |
|
967 CK_RC2_CBC_PARAMS *rc2_params; |
|
968 CK_RC5_CBC_PARAMS *rc5_cbc_params; |
|
969 |
|
970 *len = 0; |
|
971 switch (type) { |
|
972 case CKM_SEED_ECB: |
|
973 case CKM_CAMELLIA_ECB: |
|
974 case CKM_AES_ECB: |
|
975 case CKM_DES_ECB: |
|
976 case CKM_DES3_ECB: |
|
977 case CKM_RSA_PKCS: |
|
978 case CKM_RSA_X_509: |
|
979 case CKM_RSA_9796: |
|
980 case CKM_IDEA_ECB: |
|
981 case CKM_CDMF_ECB: |
|
982 case CKM_CAST_ECB: |
|
983 case CKM_CAST3_ECB: |
|
984 case CKM_CAST5_ECB: |
|
985 case CKM_RC4: |
|
986 return NULL; |
|
987 case CKM_RC2_ECB: |
|
988 return NULL; |
|
989 case CKM_RC2_CBC: |
|
990 case CKM_RC2_CBC_PAD: |
|
991 rc2_params = (CK_RC2_CBC_PARAMS *)param->data; |
|
992 *len = sizeof(rc2_params->iv); |
|
993 return &rc2_params->iv[0]; |
|
994 case CKM_RC5_CBC: |
|
995 case CKM_RC5_CBC_PAD: |
|
996 rc5_cbc_params = (CK_RC5_CBC_PARAMS *) param->data; |
|
997 *len = rc5_cbc_params->ulIvLen; |
|
998 return rc5_cbc_params->pIv; |
|
999 case CKM_SEED_CBC: |
|
1000 case CKM_CAMELLIA_CBC: |
|
1001 case CKM_AES_CBC: |
|
1002 case CKM_DES_CBC: |
|
1003 case CKM_DES3_CBC: |
|
1004 case CKM_IDEA_CBC: |
|
1005 case CKM_CDMF_CBC: |
|
1006 case CKM_CAST_CBC: |
|
1007 case CKM_CAST3_CBC: |
|
1008 case CKM_CAST5_CBC: |
|
1009 case CKM_CAMELLIA_CBC_PAD: |
|
1010 case CKM_AES_CBC_PAD: |
|
1011 case CKM_DES_CBC_PAD: |
|
1012 case CKM_DES3_CBC_PAD: |
|
1013 case CKM_IDEA_CBC_PAD: |
|
1014 case CKM_CDMF_CBC_PAD: |
|
1015 case CKM_CAST_CBC_PAD: |
|
1016 case CKM_CAST3_CBC_PAD: |
|
1017 case CKM_CAST5_CBC_PAD: |
|
1018 case CKM_SKIPJACK_CBC64: |
|
1019 case CKM_SKIPJACK_ECB64: |
|
1020 case CKM_SKIPJACK_OFB64: |
|
1021 case CKM_SKIPJACK_CFB64: |
|
1022 case CKM_SKIPJACK_CFB32: |
|
1023 case CKM_SKIPJACK_CFB16: |
|
1024 case CKM_SKIPJACK_CFB8: |
|
1025 case CKM_BATON_ECB128: |
|
1026 case CKM_BATON_ECB96: |
|
1027 case CKM_BATON_CBC128: |
|
1028 case CKM_BATON_COUNTER: |
|
1029 case CKM_BATON_SHUFFLE: |
|
1030 case CKM_JUNIPER_ECB128: |
|
1031 case CKM_JUNIPER_CBC128: |
|
1032 case CKM_JUNIPER_COUNTER: |
|
1033 case CKM_JUNIPER_SHUFFLE: |
|
1034 break; |
|
1035 /* unknown mechanism, pass IV in if it's there */ |
|
1036 default: |
|
1037 break; |
|
1038 } |
|
1039 if (param->data) { |
|
1040 *len = param->len; |
|
1041 } |
|
1042 return param->data; |
|
1043 } |
|
1044 |
|
1045 typedef struct sec_rc5cbcParameterStr { |
|
1046 SECItem version; |
|
1047 SECItem rounds; |
|
1048 SECItem blockSizeInBits; |
|
1049 SECItem iv; |
|
1050 } sec_rc5cbcParameter; |
|
1051 |
|
1052 static const SEC_ASN1Template sec_rc5ecb_parameter_template[] = { |
|
1053 { SEC_ASN1_SEQUENCE, |
|
1054 0, NULL, sizeof(sec_rc5cbcParameter) }, |
|
1055 { SEC_ASN1_INTEGER, |
|
1056 offsetof(sec_rc5cbcParameter,version) }, |
|
1057 { SEC_ASN1_INTEGER, |
|
1058 offsetof(sec_rc5cbcParameter,rounds) }, |
|
1059 { SEC_ASN1_INTEGER, |
|
1060 offsetof(sec_rc5cbcParameter,blockSizeInBits) }, |
|
1061 { 0 } |
|
1062 }; |
|
1063 |
|
1064 static const SEC_ASN1Template sec_rc5cbc_parameter_template[] = { |
|
1065 { SEC_ASN1_SEQUENCE, |
|
1066 0, NULL, sizeof(sec_rc5cbcParameter) }, |
|
1067 { SEC_ASN1_INTEGER, |
|
1068 offsetof(sec_rc5cbcParameter,version) }, |
|
1069 { SEC_ASN1_INTEGER, |
|
1070 offsetof(sec_rc5cbcParameter,rounds) }, |
|
1071 { SEC_ASN1_INTEGER, |
|
1072 offsetof(sec_rc5cbcParameter,blockSizeInBits) }, |
|
1073 { SEC_ASN1_OCTET_STRING, |
|
1074 offsetof(sec_rc5cbcParameter,iv) }, |
|
1075 { 0 } |
|
1076 }; |
|
1077 |
|
1078 typedef struct sec_rc2cbcParameterStr { |
|
1079 SECItem rc2ParameterVersion; |
|
1080 SECItem iv; |
|
1081 } sec_rc2cbcParameter; |
|
1082 |
|
1083 static const SEC_ASN1Template sec_rc2cbc_parameter_template[] = { |
|
1084 { SEC_ASN1_SEQUENCE, |
|
1085 0, NULL, sizeof(sec_rc2cbcParameter) }, |
|
1086 { SEC_ASN1_INTEGER, |
|
1087 offsetof(sec_rc2cbcParameter,rc2ParameterVersion) }, |
|
1088 { SEC_ASN1_OCTET_STRING, |
|
1089 offsetof(sec_rc2cbcParameter,iv) }, |
|
1090 { 0 } |
|
1091 }; |
|
1092 |
|
1093 static const SEC_ASN1Template sec_rc2ecb_parameter_template[] = { |
|
1094 { SEC_ASN1_SEQUENCE, |
|
1095 0, NULL, sizeof(sec_rc2cbcParameter) }, |
|
1096 { SEC_ASN1_INTEGER, |
|
1097 offsetof(sec_rc2cbcParameter,rc2ParameterVersion) }, |
|
1098 { 0 } |
|
1099 }; |
|
1100 |
|
1101 /* S/MIME picked id values to represent differnt keysizes */ |
|
1102 /* I do have a formula, but it ain't pretty, and it only works because you |
|
1103 * can always match three points to a parabola:) */ |
|
1104 static unsigned char rc2_map(SECItem *version) |
|
1105 { |
|
1106 long x; |
|
1107 |
|
1108 x = DER_GetInteger(version); |
|
1109 |
|
1110 switch (x) { |
|
1111 case 58: return 128; |
|
1112 case 120: return 64; |
|
1113 case 160: return 40; |
|
1114 } |
|
1115 return 128; |
|
1116 } |
|
1117 |
|
1118 static unsigned long rc2_unmap(unsigned long x) |
|
1119 { |
|
1120 switch (x) { |
|
1121 case 128: return 58; |
|
1122 case 64: return 120; |
|
1123 case 40: return 160; |
|
1124 } |
|
1125 return 58; |
|
1126 } |
|
1127 |
|
1128 |
|
1129 |
|
1130 /* Generate a mechaism param from a type, and iv. */ |
|
1131 SECItem * |
|
1132 PK11_ParamFromAlgid(SECAlgorithmID *algid) |
|
1133 { |
|
1134 CK_RC2_CBC_PARAMS * rc2_cbc_params = NULL; |
|
1135 CK_RC2_PARAMS * rc2_ecb_params = NULL; |
|
1136 CK_RC5_CBC_PARAMS * rc5_cbc_params = NULL; |
|
1137 CK_RC5_PARAMS * rc5_ecb_params = NULL; |
|
1138 PLArenaPool * arena = NULL; |
|
1139 SECItem * mech = NULL; |
|
1140 SECOidTag algtag; |
|
1141 SECStatus rv; |
|
1142 CK_MECHANISM_TYPE type; |
|
1143 /* initialize these to prevent UMRs in the ASN1 decoder. */ |
|
1144 SECItem iv = {siBuffer, NULL, 0}; |
|
1145 sec_rc2cbcParameter rc2 = { {siBuffer, NULL, 0}, {siBuffer, NULL, 0} }; |
|
1146 sec_rc5cbcParameter rc5 = { {siBuffer, NULL, 0}, {siBuffer, NULL, 0}, |
|
1147 {siBuffer, NULL, 0}, {siBuffer, NULL, 0} }; |
|
1148 |
|
1149 algtag = SECOID_GetAlgorithmTag(algid); |
|
1150 type = PK11_AlgtagToMechanism(algtag); |
|
1151 |
|
1152 mech = PORT_New(SECItem); |
|
1153 if (mech == NULL) { |
|
1154 return NULL; |
|
1155 } |
|
1156 mech->type = siBuffer; |
|
1157 mech->data = NULL; |
|
1158 mech->len = 0; |
|
1159 |
|
1160 arena = PORT_NewArena(1024); |
|
1161 if (!arena) { |
|
1162 goto loser; |
|
1163 } |
|
1164 |
|
1165 /* handle the complicated cases */ |
|
1166 switch (type) { |
|
1167 case CKM_RC2_ECB: |
|
1168 rv = SEC_ASN1DecodeItem(arena, &rc2 ,sec_rc2ecb_parameter_template, |
|
1169 &(algid->parameters)); |
|
1170 if (rv != SECSuccess) { |
|
1171 goto loser; |
|
1172 } |
|
1173 rc2_ecb_params = PORT_New(CK_RC2_PARAMS); |
|
1174 if (rc2_ecb_params == NULL) { |
|
1175 goto loser; |
|
1176 } |
|
1177 *rc2_ecb_params = rc2_map(&rc2.rc2ParameterVersion); |
|
1178 mech->data = (unsigned char *) rc2_ecb_params; |
|
1179 mech->len = sizeof *rc2_ecb_params; |
|
1180 break; |
|
1181 case CKM_RC2_CBC: |
|
1182 case CKM_RC2_CBC_PAD: |
|
1183 rv = SEC_ASN1DecodeItem(arena, &rc2 ,sec_rc2cbc_parameter_template, |
|
1184 &(algid->parameters)); |
|
1185 if (rv != SECSuccess) { |
|
1186 goto loser; |
|
1187 } |
|
1188 rc2_cbc_params = PORT_New(CK_RC2_CBC_PARAMS); |
|
1189 if (rc2_cbc_params == NULL) { |
|
1190 goto loser; |
|
1191 } |
|
1192 mech->data = (unsigned char *) rc2_cbc_params; |
|
1193 mech->len = sizeof *rc2_cbc_params; |
|
1194 rc2_cbc_params->ulEffectiveBits = rc2_map(&rc2.rc2ParameterVersion); |
|
1195 if (rc2.iv.len != sizeof rc2_cbc_params->iv) { |
|
1196 PORT_SetError(SEC_ERROR_INPUT_LEN); |
|
1197 goto loser; |
|
1198 } |
|
1199 PORT_Memcpy(rc2_cbc_params->iv, rc2.iv.data, rc2.iv.len); |
|
1200 break; |
|
1201 case CKM_RC5_ECB: |
|
1202 rv = SEC_ASN1DecodeItem(arena, &rc5 ,sec_rc5ecb_parameter_template, |
|
1203 &(algid->parameters)); |
|
1204 if (rv != SECSuccess) { |
|
1205 goto loser; |
|
1206 } |
|
1207 rc5_ecb_params = PORT_New(CK_RC5_PARAMS); |
|
1208 if (rc5_ecb_params == NULL) { |
|
1209 goto loser; |
|
1210 } |
|
1211 rc5_ecb_params->ulRounds = DER_GetInteger(&rc5.rounds); |
|
1212 rc5_ecb_params->ulWordsize = DER_GetInteger(&rc5.blockSizeInBits)/8; |
|
1213 mech->data = (unsigned char *) rc5_ecb_params; |
|
1214 mech->len = sizeof *rc5_ecb_params; |
|
1215 break; |
|
1216 case CKM_RC5_CBC: |
|
1217 case CKM_RC5_CBC_PAD: |
|
1218 rv = SEC_ASN1DecodeItem(arena, &rc5 ,sec_rc5cbc_parameter_template, |
|
1219 &(algid->parameters)); |
|
1220 if (rv != SECSuccess) { |
|
1221 goto loser; |
|
1222 } |
|
1223 rc5_cbc_params = (CK_RC5_CBC_PARAMS *) |
|
1224 PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + rc5.iv.len); |
|
1225 if (rc5_cbc_params == NULL) { |
|
1226 goto loser; |
|
1227 } |
|
1228 mech->data = (unsigned char *) rc5_cbc_params; |
|
1229 mech->len = sizeof *rc5_cbc_params; |
|
1230 rc5_cbc_params->ulRounds = DER_GetInteger(&rc5.rounds); |
|
1231 rc5_cbc_params->ulWordsize = DER_GetInteger(&rc5.blockSizeInBits)/8; |
|
1232 rc5_cbc_params->pIv = ((CK_BYTE_PTR)rc5_cbc_params) |
|
1233 + sizeof(CK_RC5_CBC_PARAMS); |
|
1234 rc5_cbc_params->ulIvLen = rc5.iv.len; |
|
1235 PORT_Memcpy(rc5_cbc_params->pIv, rc5.iv.data, rc5.iv.len); |
|
1236 break; |
|
1237 case CKM_PBE_MD2_DES_CBC: |
|
1238 case CKM_PBE_MD5_DES_CBC: |
|
1239 case CKM_NETSCAPE_PBE_SHA1_DES_CBC: |
|
1240 case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC: |
|
1241 case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC: |
|
1242 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC: |
|
1243 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC: |
|
1244 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4: |
|
1245 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4: |
|
1246 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
1247 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
1248 case CKM_PBE_SHA1_RC2_40_CBC: |
|
1249 case CKM_PBE_SHA1_RC2_128_CBC: |
|
1250 case CKM_PBE_SHA1_RC4_40: |
|
1251 case CKM_PBE_SHA1_RC4_128: |
|
1252 case CKM_PKCS5_PBKD2: |
|
1253 rv = pbe_PK11AlgidToParam(algid,mech); |
|
1254 if (rv != SECSuccess) { |
|
1255 goto loser; |
|
1256 } |
|
1257 break; |
|
1258 case CKM_RC4: |
|
1259 case CKM_SEED_ECB: |
|
1260 case CKM_CAMELLIA_ECB: |
|
1261 case CKM_AES_ECB: |
|
1262 case CKM_DES_ECB: |
|
1263 case CKM_DES3_ECB: |
|
1264 case CKM_IDEA_ECB: |
|
1265 case CKM_CDMF_ECB: |
|
1266 case CKM_CAST_ECB: |
|
1267 case CKM_CAST3_ECB: |
|
1268 case CKM_CAST5_ECB: |
|
1269 break; |
|
1270 |
|
1271 default: |
|
1272 if (pk11_lookup(type)->iv == 0) { |
|
1273 break; |
|
1274 } |
|
1275 /* FALL THROUGH */ |
|
1276 case CKM_SEED_CBC: |
|
1277 case CKM_CAMELLIA_CBC: |
|
1278 case CKM_AES_CBC: |
|
1279 case CKM_DES_CBC: |
|
1280 case CKM_DES3_CBC: |
|
1281 case CKM_IDEA_CBC: |
|
1282 case CKM_CDMF_CBC: |
|
1283 case CKM_CAST_CBC: |
|
1284 case CKM_CAST3_CBC: |
|
1285 case CKM_CAST5_CBC: |
|
1286 case CKM_SEED_CBC_PAD: |
|
1287 case CKM_CAMELLIA_CBC_PAD: |
|
1288 case CKM_AES_CBC_PAD: |
|
1289 case CKM_DES_CBC_PAD: |
|
1290 case CKM_DES3_CBC_PAD: |
|
1291 case CKM_IDEA_CBC_PAD: |
|
1292 case CKM_CDMF_CBC_PAD: |
|
1293 case CKM_CAST_CBC_PAD: |
|
1294 case CKM_CAST3_CBC_PAD: |
|
1295 case CKM_CAST5_CBC_PAD: |
|
1296 case CKM_SKIPJACK_CBC64: |
|
1297 case CKM_SKIPJACK_ECB64: |
|
1298 case CKM_SKIPJACK_OFB64: |
|
1299 case CKM_SKIPJACK_CFB64: |
|
1300 case CKM_SKIPJACK_CFB32: |
|
1301 case CKM_SKIPJACK_CFB16: |
|
1302 case CKM_SKIPJACK_CFB8: |
|
1303 case CKM_BATON_ECB128: |
|
1304 case CKM_BATON_ECB96: |
|
1305 case CKM_BATON_CBC128: |
|
1306 case CKM_BATON_COUNTER: |
|
1307 case CKM_BATON_SHUFFLE: |
|
1308 case CKM_JUNIPER_ECB128: |
|
1309 case CKM_JUNIPER_CBC128: |
|
1310 case CKM_JUNIPER_COUNTER: |
|
1311 case CKM_JUNIPER_SHUFFLE: |
|
1312 /* simple cases are simply octet string encoded IVs */ |
|
1313 rv = SEC_ASN1DecodeItem(arena, &iv, |
|
1314 SEC_ASN1_GET(SEC_OctetStringTemplate), |
|
1315 &(algid->parameters)); |
|
1316 if (rv != SECSuccess || iv.data == NULL) { |
|
1317 goto loser; |
|
1318 } |
|
1319 /* XXX Should be some IV length sanity check here. */ |
|
1320 mech->data = (unsigned char*)PORT_Alloc(iv.len); |
|
1321 if (mech->data == NULL) { |
|
1322 goto loser; |
|
1323 } |
|
1324 PORT_Memcpy(mech->data, iv.data, iv.len); |
|
1325 mech->len = iv.len; |
|
1326 break; |
|
1327 } |
|
1328 PORT_FreeArena(arena, PR_FALSE); |
|
1329 return mech; |
|
1330 |
|
1331 loser: |
|
1332 if (arena) |
|
1333 PORT_FreeArena(arena, PR_FALSE); |
|
1334 SECITEM_FreeItem(mech,PR_TRUE); |
|
1335 return NULL; |
|
1336 } |
|
1337 |
|
1338 /* |
|
1339 * Generate an IV for the given mechanism |
|
1340 */ |
|
1341 static SECStatus |
|
1342 pk11_GenIV(CK_MECHANISM_TYPE type, SECItem *iv) { |
|
1343 int iv_size = PK11_GetIVLength(type); |
|
1344 SECStatus rv; |
|
1345 |
|
1346 iv->len = iv_size; |
|
1347 if (iv_size == 0) { |
|
1348 iv->data = NULL; |
|
1349 return SECSuccess; |
|
1350 } |
|
1351 |
|
1352 iv->data = (unsigned char *) PORT_Alloc(iv_size); |
|
1353 if (iv->data == NULL) { |
|
1354 iv->len = 0; |
|
1355 return SECFailure; |
|
1356 } |
|
1357 |
|
1358 rv = PK11_GenerateRandom(iv->data,iv->len); |
|
1359 if (rv != SECSuccess) { |
|
1360 PORT_Free(iv->data); |
|
1361 iv->data = NULL; iv->len = 0; |
|
1362 return SECFailure; |
|
1363 } |
|
1364 return SECSuccess; |
|
1365 } |
|
1366 |
|
1367 |
|
1368 /* |
|
1369 * create a new parameter block from the passed in MECHANISM and the |
|
1370 * key. Use Netscape's S/MIME Rules for the New param block. |
|
1371 */ |
|
1372 SECItem * |
|
1373 pk11_GenerateNewParamWithKeyLen(CK_MECHANISM_TYPE type, int keyLen) |
|
1374 { |
|
1375 CK_RC2_CBC_PARAMS *rc2_params; |
|
1376 CK_RC2_PARAMS *rc2_ecb_params; |
|
1377 SECItem *mech; |
|
1378 SECItem iv; |
|
1379 SECStatus rv; |
|
1380 |
|
1381 |
|
1382 mech = (SECItem *) PORT_Alloc(sizeof(SECItem)); |
|
1383 if (mech == NULL) return NULL; |
|
1384 |
|
1385 rv = SECSuccess; |
|
1386 mech->type = siBuffer; |
|
1387 switch (type) { |
|
1388 case CKM_RC4: |
|
1389 case CKM_SEED_ECB: |
|
1390 case CKM_CAMELLIA_ECB: |
|
1391 case CKM_AES_ECB: |
|
1392 case CKM_DES_ECB: |
|
1393 case CKM_DES3_ECB: |
|
1394 case CKM_IDEA_ECB: |
|
1395 case CKM_CDMF_ECB: |
|
1396 case CKM_CAST_ECB: |
|
1397 case CKM_CAST3_ECB: |
|
1398 case CKM_CAST5_ECB: |
|
1399 mech->data = NULL; |
|
1400 mech->len = 0; |
|
1401 break; |
|
1402 case CKM_RC2_ECB: |
|
1403 rc2_ecb_params = (CK_RC2_PARAMS *)PORT_Alloc(sizeof(CK_RC2_PARAMS)); |
|
1404 if (rc2_ecb_params == NULL) { |
|
1405 rv = SECFailure; |
|
1406 break; |
|
1407 } |
|
1408 /* NOTE PK11_GetKeyLength can return -1 if the key isn't and RC2, RC5, |
|
1409 * or RC4 key. Of course that wouldn't happen here doing RC2:).*/ |
|
1410 *rc2_ecb_params = keyLen ? keyLen*8 : 128; |
|
1411 mech->data = (unsigned char *) rc2_ecb_params; |
|
1412 mech->len = sizeof(CK_RC2_PARAMS); |
|
1413 break; |
|
1414 case CKM_RC2_CBC: |
|
1415 case CKM_RC2_CBC_PAD: |
|
1416 rv = pk11_GenIV(type,&iv); |
|
1417 if (rv != SECSuccess) { |
|
1418 break; |
|
1419 } |
|
1420 rc2_params = (CK_RC2_CBC_PARAMS *)PORT_Alloc(sizeof(CK_RC2_CBC_PARAMS)); |
|
1421 if (rc2_params == NULL) { |
|
1422 PORT_Free(iv.data); |
|
1423 rv = SECFailure; |
|
1424 break; |
|
1425 } |
|
1426 /* NOTE PK11_GetKeyLength can return -1 if the key isn't and RC2, RC5, |
|
1427 * or RC4 key. Of course that wouldn't happen here doing RC2:).*/ |
|
1428 rc2_params->ulEffectiveBits = keyLen ? keyLen*8 : 128; |
|
1429 if (iv.data) |
|
1430 PORT_Memcpy(rc2_params->iv,iv.data,sizeof(rc2_params->iv)); |
|
1431 mech->data = (unsigned char *) rc2_params; |
|
1432 mech->len = sizeof(CK_RC2_CBC_PARAMS); |
|
1433 PORT_Free(iv.data); |
|
1434 break; |
|
1435 case CKM_RC5_ECB: |
|
1436 PORT_Free(mech); |
|
1437 return PK11_ParamFromIV(type,NULL); |
|
1438 case CKM_RC5_CBC: |
|
1439 case CKM_RC5_CBC_PAD: |
|
1440 rv = pk11_GenIV(type,&iv); |
|
1441 if (rv != SECSuccess) { |
|
1442 break; |
|
1443 } |
|
1444 PORT_Free(mech); |
|
1445 return PK11_ParamFromIV(type,&iv); |
|
1446 default: |
|
1447 if (pk11_lookup(type)->iv == 0) { |
|
1448 mech->data = NULL; |
|
1449 mech->len = 0; |
|
1450 break; |
|
1451 } |
|
1452 case CKM_SEED_CBC: |
|
1453 case CKM_CAMELLIA_CBC: |
|
1454 case CKM_AES_CBC: |
|
1455 case CKM_DES_CBC: |
|
1456 case CKM_DES3_CBC: |
|
1457 case CKM_IDEA_CBC: |
|
1458 case CKM_CDMF_CBC: |
|
1459 case CKM_CAST_CBC: |
|
1460 case CKM_CAST3_CBC: |
|
1461 case CKM_CAST5_CBC: |
|
1462 case CKM_DES_CBC_PAD: |
|
1463 case CKM_DES3_CBC_PAD: |
|
1464 case CKM_IDEA_CBC_PAD: |
|
1465 case CKM_CDMF_CBC_PAD: |
|
1466 case CKM_CAST_CBC_PAD: |
|
1467 case CKM_CAST3_CBC_PAD: |
|
1468 case CKM_CAST5_CBC_PAD: |
|
1469 case CKM_SKIPJACK_CBC64: |
|
1470 case CKM_SKIPJACK_ECB64: |
|
1471 case CKM_SKIPJACK_OFB64: |
|
1472 case CKM_SKIPJACK_CFB64: |
|
1473 case CKM_SKIPJACK_CFB32: |
|
1474 case CKM_SKIPJACK_CFB16: |
|
1475 case CKM_SKIPJACK_CFB8: |
|
1476 case CKM_BATON_ECB128: |
|
1477 case CKM_BATON_ECB96: |
|
1478 case CKM_BATON_CBC128: |
|
1479 case CKM_BATON_COUNTER: |
|
1480 case CKM_BATON_SHUFFLE: |
|
1481 case CKM_JUNIPER_ECB128: |
|
1482 case CKM_JUNIPER_CBC128: |
|
1483 case CKM_JUNIPER_COUNTER: |
|
1484 case CKM_JUNIPER_SHUFFLE: |
|
1485 rv = pk11_GenIV(type,&iv); |
|
1486 if (rv != SECSuccess) { |
|
1487 break; |
|
1488 } |
|
1489 mech->data = (unsigned char*)PORT_Alloc(iv.len); |
|
1490 if (mech->data == NULL) { |
|
1491 PORT_Free(iv.data); |
|
1492 rv = SECFailure; |
|
1493 break; |
|
1494 } |
|
1495 PORT_Memcpy(mech->data,iv.data,iv.len); |
|
1496 mech->len = iv.len; |
|
1497 PORT_Free(iv.data); |
|
1498 break; |
|
1499 } |
|
1500 if (rv != SECSuccess) { |
|
1501 SECITEM_FreeItem(mech,PR_TRUE); |
|
1502 return NULL; |
|
1503 } |
|
1504 return mech; |
|
1505 |
|
1506 } |
|
1507 |
|
1508 SECItem * |
|
1509 PK11_GenerateNewParam(CK_MECHANISM_TYPE type, PK11SymKey *key) |
|
1510 { |
|
1511 int keyLen = key ? PK11_GetKeyLength(key) : 0; |
|
1512 |
|
1513 return pk11_GenerateNewParamWithKeyLen(type, keyLen); |
|
1514 } |
|
1515 |
|
1516 #define RC5_V10 0x10 |
|
1517 |
|
1518 /* turn a PKCS #11 parameter into a DER Encoded Algorithm ID */ |
|
1519 SECStatus |
|
1520 PK11_ParamToAlgid(SECOidTag algTag, SECItem *param, |
|
1521 PLArenaPool *arena, SECAlgorithmID *algid) { |
|
1522 CK_RC2_CBC_PARAMS *rc2_params; |
|
1523 sec_rc2cbcParameter rc2; |
|
1524 CK_RC5_CBC_PARAMS *rc5_params; |
|
1525 sec_rc5cbcParameter rc5; |
|
1526 CK_MECHANISM_TYPE type = PK11_AlgtagToMechanism(algTag); |
|
1527 SECItem *newParams = NULL; |
|
1528 SECStatus rv = SECFailure; |
|
1529 unsigned long rc2version; |
|
1530 |
|
1531 switch (type) { |
|
1532 case CKM_RC4: |
|
1533 case CKM_SEED_ECB: |
|
1534 case CKM_CAMELLIA_ECB: |
|
1535 case CKM_AES_ECB: |
|
1536 case CKM_DES_ECB: |
|
1537 case CKM_DES3_ECB: |
|
1538 case CKM_IDEA_ECB: |
|
1539 case CKM_CDMF_ECB: |
|
1540 case CKM_CAST_ECB: |
|
1541 case CKM_CAST3_ECB: |
|
1542 case CKM_CAST5_ECB: |
|
1543 newParams = NULL; |
|
1544 rv = SECSuccess; |
|
1545 break; |
|
1546 case CKM_RC2_ECB: |
|
1547 break; |
|
1548 case CKM_RC2_CBC: |
|
1549 case CKM_RC2_CBC_PAD: |
|
1550 rc2_params = (CK_RC2_CBC_PARAMS *)param->data; |
|
1551 rc2version = rc2_unmap(rc2_params->ulEffectiveBits); |
|
1552 if (SEC_ASN1EncodeUnsignedInteger (NULL, &(rc2.rc2ParameterVersion), |
|
1553 rc2version) == NULL) |
|
1554 break; |
|
1555 rc2.iv.data = rc2_params->iv; |
|
1556 rc2.iv.len = sizeof(rc2_params->iv); |
|
1557 newParams = SEC_ASN1EncodeItem (NULL, NULL, &rc2, |
|
1558 sec_rc2cbc_parameter_template); |
|
1559 PORT_Free(rc2.rc2ParameterVersion.data); |
|
1560 if (newParams == NULL) |
|
1561 break; |
|
1562 rv = SECSuccess; |
|
1563 break; |
|
1564 |
|
1565 case CKM_RC5_ECB: /* well not really... */ |
|
1566 break; |
|
1567 case CKM_RC5_CBC: |
|
1568 case CKM_RC5_CBC_PAD: |
|
1569 rc5_params = (CK_RC5_CBC_PARAMS *)param->data; |
|
1570 if (SEC_ASN1EncodeUnsignedInteger (NULL, &rc5.version, RC5_V10) == NULL) |
|
1571 break; |
|
1572 if (SEC_ASN1EncodeUnsignedInteger (NULL, &rc5.blockSizeInBits, |
|
1573 rc5_params->ulWordsize*8) == NULL) { |
|
1574 PORT_Free(rc5.version.data); |
|
1575 break; |
|
1576 } |
|
1577 if (SEC_ASN1EncodeUnsignedInteger (NULL, &rc5.rounds, |
|
1578 rc5_params->ulWordsize*8) == NULL) { |
|
1579 PORT_Free(rc5.blockSizeInBits.data); |
|
1580 PORT_Free(rc5.version.data); |
|
1581 break; |
|
1582 } |
|
1583 rc5.iv.data = rc5_params->pIv; |
|
1584 rc5.iv.len = rc5_params->ulIvLen; |
|
1585 newParams = SEC_ASN1EncodeItem (NULL, NULL, &rc5, |
|
1586 sec_rc5cbc_parameter_template); |
|
1587 PORT_Free(rc5.version.data); |
|
1588 PORT_Free(rc5.blockSizeInBits.data); |
|
1589 PORT_Free(rc5.rounds.data); |
|
1590 if (newParams == NULL) |
|
1591 break; |
|
1592 rv = SECSuccess; |
|
1593 break; |
|
1594 case CKM_PBE_MD2_DES_CBC: |
|
1595 case CKM_PBE_MD5_DES_CBC: |
|
1596 case CKM_NETSCAPE_PBE_SHA1_DES_CBC: |
|
1597 case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC: |
|
1598 case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC: |
|
1599 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC: |
|
1600 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC: |
|
1601 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4: |
|
1602 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4: |
|
1603 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
1604 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
1605 case CKM_PBE_SHA1_RC2_40_CBC: |
|
1606 case CKM_PBE_SHA1_RC2_128_CBC: |
|
1607 case CKM_PBE_SHA1_RC4_40: |
|
1608 case CKM_PBE_SHA1_RC4_128: |
|
1609 return PBE_PK11ParamToAlgid(algTag, param, arena, algid); |
|
1610 default: |
|
1611 if (pk11_lookup(type)->iv == 0) { |
|
1612 rv = SECSuccess; |
|
1613 newParams = NULL; |
|
1614 break; |
|
1615 } |
|
1616 case CKM_SEED_CBC: |
|
1617 case CKM_CAMELLIA_CBC: |
|
1618 case CKM_AES_CBC: |
|
1619 case CKM_DES_CBC: |
|
1620 case CKM_DES3_CBC: |
|
1621 case CKM_IDEA_CBC: |
|
1622 case CKM_CDMF_CBC: |
|
1623 case CKM_CAST_CBC: |
|
1624 case CKM_CAST3_CBC: |
|
1625 case CKM_CAST5_CBC: |
|
1626 case CKM_DES_CBC_PAD: |
|
1627 case CKM_DES3_CBC_PAD: |
|
1628 case CKM_IDEA_CBC_PAD: |
|
1629 case CKM_CDMF_CBC_PAD: |
|
1630 case CKM_CAST_CBC_PAD: |
|
1631 case CKM_CAST3_CBC_PAD: |
|
1632 case CKM_CAST5_CBC_PAD: |
|
1633 case CKM_SKIPJACK_CBC64: |
|
1634 case CKM_SKIPJACK_ECB64: |
|
1635 case CKM_SKIPJACK_OFB64: |
|
1636 case CKM_SKIPJACK_CFB64: |
|
1637 case CKM_SKIPJACK_CFB32: |
|
1638 case CKM_SKIPJACK_CFB16: |
|
1639 case CKM_SKIPJACK_CFB8: |
|
1640 case CKM_BATON_ECB128: |
|
1641 case CKM_BATON_ECB96: |
|
1642 case CKM_BATON_CBC128: |
|
1643 case CKM_BATON_COUNTER: |
|
1644 case CKM_BATON_SHUFFLE: |
|
1645 case CKM_JUNIPER_ECB128: |
|
1646 case CKM_JUNIPER_CBC128: |
|
1647 case CKM_JUNIPER_COUNTER: |
|
1648 case CKM_JUNIPER_SHUFFLE: |
|
1649 newParams = SEC_ASN1EncodeItem(NULL,NULL,param, |
|
1650 SEC_ASN1_GET(SEC_OctetStringTemplate) ); |
|
1651 if (newParams == NULL) |
|
1652 break; |
|
1653 rv = SECSuccess; |
|
1654 break; |
|
1655 } |
|
1656 |
|
1657 if (rv != SECSuccess) { |
|
1658 if (newParams) SECITEM_FreeItem(newParams,PR_TRUE); |
|
1659 return rv; |
|
1660 } |
|
1661 |
|
1662 rv = SECOID_SetAlgorithmID(arena, algid, algTag, newParams); |
|
1663 SECITEM_FreeItem(newParams,PR_TRUE); |
|
1664 return rv; |
|
1665 } |
|
1666 |
|
1667 /* turn an OID algorithm tag into a PKCS #11 mechanism. This allows us to |
|
1668 * map OID's directly into the PKCS #11 mechanism we want to call. We find |
|
1669 * this mapping in our standard OID table */ |
|
1670 CK_MECHANISM_TYPE |
|
1671 PK11_AlgtagToMechanism(SECOidTag algTag) { |
|
1672 SECOidData *oid = SECOID_FindOIDByTag(algTag); |
|
1673 |
|
1674 if (oid) return (CK_MECHANISM_TYPE) oid->mechanism; |
|
1675 return CKM_INVALID_MECHANISM; |
|
1676 } |
|
1677 |
|
1678 /* turn a mechanism into an oid. */ |
|
1679 SECOidTag |
|
1680 PK11_MechanismToAlgtag(CK_MECHANISM_TYPE type) { |
|
1681 SECOidData *oid = SECOID_FindOIDByMechanism((unsigned long)type); |
|
1682 |
|
1683 if (oid) return oid->offset; |
|
1684 return SEC_OID_UNKNOWN; |
|
1685 } |
|
1686 |
|
1687 /* Determine appropriate blocking mechanism, used when wrapping private keys |
|
1688 * which require PKCS padding. If the mechanism does not map to a padding |
|
1689 * mechanism, we simply return the mechanism. |
|
1690 */ |
|
1691 CK_MECHANISM_TYPE |
|
1692 PK11_GetPadMechanism(CK_MECHANISM_TYPE type) { |
|
1693 switch(type) { |
|
1694 case CKM_SEED_CBC: |
|
1695 return CKM_SEED_CBC_PAD; |
|
1696 case CKM_CAMELLIA_CBC: |
|
1697 return CKM_CAMELLIA_CBC_PAD; |
|
1698 case CKM_AES_CBC: |
|
1699 return CKM_AES_CBC_PAD; |
|
1700 case CKM_DES_CBC: |
|
1701 return CKM_DES_CBC_PAD; |
|
1702 case CKM_DES3_CBC: |
|
1703 return CKM_DES3_CBC_PAD; |
|
1704 case CKM_RC2_CBC: |
|
1705 return CKM_RC2_CBC_PAD; |
|
1706 case CKM_CDMF_CBC: |
|
1707 return CKM_CDMF_CBC_PAD; |
|
1708 case CKM_CAST_CBC: |
|
1709 return CKM_CAST_CBC_PAD; |
|
1710 case CKM_CAST3_CBC: |
|
1711 return CKM_CAST3_CBC_PAD; |
|
1712 case CKM_CAST5_CBC: |
|
1713 return CKM_CAST5_CBC_PAD; |
|
1714 case CKM_RC5_CBC: |
|
1715 return CKM_RC5_CBC_PAD; |
|
1716 case CKM_IDEA_CBC: |
|
1717 return CKM_IDEA_CBC_PAD; |
|
1718 default: |
|
1719 break; |
|
1720 } |
|
1721 |
|
1722 return type; |
|
1723 } |
|
1724 |
|
1725 static PRBool |
|
1726 pk11_isAllZero(unsigned char *data,int len) { |
|
1727 while (len--) { |
|
1728 if (*data++) { |
|
1729 return PR_FALSE; |
|
1730 } |
|
1731 } |
|
1732 return PR_TRUE; |
|
1733 } |
|
1734 |
|
1735 CK_RV |
|
1736 PK11_MapPBEMechanismToCryptoMechanism(CK_MECHANISM_PTR pPBEMechanism, |
|
1737 CK_MECHANISM_PTR pCryptoMechanism, |
|
1738 SECItem *pbe_pwd, PRBool faulty3DES) |
|
1739 { |
|
1740 int iv_len = 0; |
|
1741 CK_PBE_PARAMS_PTR pPBEparams; |
|
1742 CK_RC2_CBC_PARAMS_PTR rc2_params; |
|
1743 CK_ULONG rc2_key_len; |
|
1744 |
|
1745 if((pPBEMechanism == CK_NULL_PTR) || (pCryptoMechanism == CK_NULL_PTR)) { |
|
1746 return CKR_HOST_MEMORY; |
|
1747 } |
|
1748 |
|
1749 /* pkcs5 v2 cannot be supported by this interface. |
|
1750 * use PK11_GetPBECryptoMechanism instead. |
|
1751 */ |
|
1752 if ((pPBEMechanism->mechanism == CKM_INVALID_MECHANISM) || |
|
1753 (pPBEMechanism->mechanism == CKM_PKCS5_PBKD2)) { |
|
1754 return CKR_MECHANISM_INVALID; |
|
1755 } |
|
1756 |
|
1757 pPBEparams = (CK_PBE_PARAMS_PTR)pPBEMechanism->pParameter; |
|
1758 iv_len = PK11_GetIVLength(pPBEMechanism->mechanism); |
|
1759 |
|
1760 if (iv_len) { |
|
1761 if (pk11_isAllZero(pPBEparams->pInitVector,iv_len)) { |
|
1762 SECItem param; |
|
1763 PK11SymKey *symKey; |
|
1764 PK11SlotInfo *intSlot = PK11_GetInternalSlot(); |
|
1765 |
|
1766 if (intSlot == NULL) { |
|
1767 return CKR_DEVICE_ERROR; |
|
1768 } |
|
1769 |
|
1770 param.data = pPBEMechanism->pParameter; |
|
1771 param.len = pPBEMechanism->ulParameterLen; |
|
1772 |
|
1773 symKey = PK11_RawPBEKeyGen(intSlot, |
|
1774 pPBEMechanism->mechanism, ¶m, pbe_pwd, faulty3DES, NULL); |
|
1775 PK11_FreeSlot(intSlot); |
|
1776 if (symKey== NULL) { |
|
1777 return CKR_DEVICE_ERROR; /* sigh */ |
|
1778 } |
|
1779 PK11_FreeSymKey(symKey); |
|
1780 } |
|
1781 } |
|
1782 |
|
1783 switch(pPBEMechanism->mechanism) { |
|
1784 case CKM_PBE_MD2_DES_CBC: |
|
1785 case CKM_PBE_MD5_DES_CBC: |
|
1786 case CKM_NETSCAPE_PBE_SHA1_DES_CBC: |
|
1787 pCryptoMechanism->mechanism = CKM_DES_CBC; |
|
1788 goto have_crypto_mechanism; |
|
1789 case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC: |
|
1790 case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC: |
|
1791 case CKM_PBE_SHA1_DES3_EDE_CBC: |
|
1792 case CKM_PBE_SHA1_DES2_EDE_CBC: |
|
1793 pCryptoMechanism->mechanism = CKM_DES3_CBC; |
|
1794 have_crypto_mechanism: |
|
1795 pCryptoMechanism->pParameter = PORT_Alloc(iv_len); |
|
1796 pCryptoMechanism->ulParameterLen = (CK_ULONG)iv_len; |
|
1797 if(pCryptoMechanism->pParameter == NULL) { |
|
1798 return CKR_HOST_MEMORY; |
|
1799 } |
|
1800 PORT_Memcpy((unsigned char *)(pCryptoMechanism->pParameter), |
|
1801 (unsigned char *)(pPBEparams->pInitVector), |
|
1802 iv_len); |
|
1803 break; |
|
1804 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4: |
|
1805 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4: |
|
1806 case CKM_PBE_SHA1_RC4_40: |
|
1807 case CKM_PBE_SHA1_RC4_128: |
|
1808 pCryptoMechanism->mechanism = CKM_RC4; |
|
1809 pCryptoMechanism->ulParameterLen = 0; |
|
1810 pCryptoMechanism->pParameter = CK_NULL_PTR; |
|
1811 break; |
|
1812 case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC: |
|
1813 case CKM_PBE_SHA1_RC2_40_CBC: |
|
1814 rc2_key_len = 40; |
|
1815 goto have_key_len; |
|
1816 case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC: |
|
1817 rc2_key_len = 128; |
|
1818 have_key_len: |
|
1819 pCryptoMechanism->mechanism = CKM_RC2_CBC; |
|
1820 pCryptoMechanism->ulParameterLen = (CK_ULONG) |
|
1821 sizeof(CK_RC2_CBC_PARAMS); |
|
1822 pCryptoMechanism->pParameter = (CK_RC2_CBC_PARAMS_PTR) |
|
1823 PORT_ZAlloc(sizeof(CK_RC2_CBC_PARAMS)); |
|
1824 if(pCryptoMechanism->pParameter == NULL) { |
|
1825 return CKR_HOST_MEMORY; |
|
1826 } |
|
1827 rc2_params = (CK_RC2_CBC_PARAMS_PTR)pCryptoMechanism->pParameter; |
|
1828 PORT_Memcpy((unsigned char *)rc2_params->iv, |
|
1829 (unsigned char *)pPBEparams->pInitVector, |
|
1830 iv_len); |
|
1831 rc2_params->ulEffectiveBits = rc2_key_len; |
|
1832 break; |
|
1833 default: |
|
1834 return CKR_MECHANISM_INVALID; |
|
1835 } |
|
1836 |
|
1837 return CKR_OK; |
|
1838 } |
|
1839 |
|
1840 /* Make a Key type to an appropriate signing/verification mechanism */ |
|
1841 CK_MECHANISM_TYPE |
|
1842 PK11_MapSignKeyType(KeyType keyType) |
|
1843 { |
|
1844 switch (keyType) { |
|
1845 case rsaKey: |
|
1846 return CKM_RSA_PKCS; |
|
1847 case fortezzaKey: |
|
1848 case dsaKey: |
|
1849 return CKM_DSA; |
|
1850 case ecKey: |
|
1851 return CKM_ECDSA; |
|
1852 case dhKey: |
|
1853 default: |
|
1854 break; |
|
1855 } |
|
1856 return CKM_INVALID_MECHANISM; |
|
1857 } |
|
1858 |
|
1859 CK_MECHANISM_TYPE |
|
1860 pk11_mapWrapKeyType(KeyType keyType) |
|
1861 { |
|
1862 switch (keyType) { |
|
1863 case rsaKey: |
|
1864 return CKM_RSA_PKCS; |
|
1865 /* Add fortezza?? */ |
|
1866 default: |
|
1867 break; |
|
1868 } |
|
1869 return CKM_INVALID_MECHANISM; |
|
1870 } |
|
1871 |
|
1872 SECOidTag |
|
1873 PK11_FortezzaMapSig(SECOidTag algTag) |
|
1874 { |
|
1875 switch (algTag) { |
|
1876 case SEC_OID_MISSI_KEA_DSS: |
|
1877 case SEC_OID_MISSI_DSS: |
|
1878 case SEC_OID_MISSI_DSS_OLD: |
|
1879 case SEC_OID_MISSI_KEA_DSS_OLD: |
|
1880 case SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST: |
|
1881 return SEC_OID_ANSIX9_DSA_SIGNATURE; |
|
1882 default: |
|
1883 break; |
|
1884 } |
|
1885 return algTag; |
|
1886 } |