OLD | NEW |
| (Empty) |
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 #ifdef DEBUG | |
6 static const char CVS_ID[] = "@(#) $RCSfile: mechanism.c,v $ $Revision: 1.8 $ $D
ate: 2012/04/25 14:49:28 $"; | |
7 #endif /* DEBUG */ | |
8 | |
9 /* | |
10 * mechanism.c | |
11 * | |
12 * This file implements the NSSCKFWMechanism type and methods. | |
13 */ | |
14 | |
15 #ifndef CK_T | |
16 #include "ck.h" | |
17 #endif /* CK_T */ | |
18 | |
19 /* | |
20 * NSSCKFWMechanism | |
21 * | |
22 * -- create/destroy -- | |
23 * nssCKFWMechanism_Create | |
24 * nssCKFWMechanism_Destroy | |
25 * | |
26 * -- implement public accessors -- | |
27 * nssCKFWMechanism_GetMDMechanism | |
28 * nssCKFWMechanism_GetParameter | |
29 * | |
30 * -- private accessors -- | |
31 * | |
32 * -- module fronts -- | |
33 * nssCKFWMechanism_GetMinKeySize | |
34 * nssCKFWMechanism_GetMaxKeySize | |
35 * nssCKFWMechanism_GetInHardware | |
36 * nssCKFWMechanism_GetCanEncrypt | |
37 * nssCKFWMechanism_GetCanDecrypt | |
38 * nssCKFWMechanism_GetCanDigest | |
39 * nssCKFWMechanism_GetCanSign | |
40 * nssCKFWMechanism_GetCanSignRecover | |
41 * nssCKFWMechanism_GetCanVerify | |
42 * nssCKFWMechanism_GetCanGenerate | |
43 * nssCKFWMechanism_GetCanGenerateKeyPair | |
44 * nssCKFWMechanism_GetCanUnwrap | |
45 * nssCKFWMechanism_GetCanWrap | |
46 * nssCKFWMechanism_GetCanDerive | |
47 * nssCKFWMechanism_EncryptInit | |
48 * nssCKFWMechanism_DecryptInit | |
49 * nssCKFWMechanism_DigestInit | |
50 * nssCKFWMechanism_SignInit | |
51 * nssCKFWMechanism_VerifyInit | |
52 * nssCKFWMechanism_SignRecoverInit | |
53 * nssCKFWMechanism_VerifyRecoverInit | |
54 * nssCKFWMechanism_GenerateKey | |
55 * nssCKFWMechanism_GenerateKeyPair | |
56 * nssCKFWMechanism_GetWrapKeyLength | |
57 * nssCKFWMechanism_WrapKey | |
58 * nssCKFWMechanism_UnwrapKey | |
59 * nssCKFWMechanism_DeriveKey | |
60 */ | |
61 | |
62 | |
63 struct NSSCKFWMechanismStr { | |
64 NSSCKMDMechanism *mdMechanism; | |
65 NSSCKMDToken *mdToken; | |
66 NSSCKFWToken *fwToken; | |
67 NSSCKMDInstance *mdInstance; | |
68 NSSCKFWInstance *fwInstance; | |
69 }; | |
70 | |
71 /* | |
72 * nssCKFWMechanism_Create | |
73 * | |
74 */ | |
75 NSS_IMPLEMENT NSSCKFWMechanism * | |
76 nssCKFWMechanism_Create | |
77 ( | |
78 NSSCKMDMechanism *mdMechanism, | |
79 NSSCKMDToken *mdToken, | |
80 NSSCKFWToken *fwToken, | |
81 NSSCKMDInstance *mdInstance, | |
82 NSSCKFWInstance *fwInstance | |
83 ) | |
84 { | |
85 NSSCKFWMechanism *fwMechanism; | |
86 | |
87 | |
88 fwMechanism = nss_ZNEW(NULL, NSSCKFWMechanism); | |
89 if (!fwMechanism) { | |
90 return (NSSCKFWMechanism *)NULL; | |
91 } | |
92 fwMechanism->mdMechanism = mdMechanism; | |
93 fwMechanism->mdToken = mdToken; | |
94 fwMechanism->fwToken = fwToken; | |
95 fwMechanism->mdInstance = mdInstance; | |
96 fwMechanism->fwInstance = fwInstance; | |
97 return fwMechanism; | |
98 } | |
99 | |
100 /* | |
101 * nssCKFWMechanism_Destroy | |
102 * | |
103 */ | |
104 NSS_IMPLEMENT void | |
105 nssCKFWMechanism_Destroy | |
106 ( | |
107 NSSCKFWMechanism *fwMechanism | |
108 ) | |
109 { | |
110 /* destroy any fw resources held by nssCKFWMechanism (currently none) */ | |
111 | |
112 if (!fwMechanism->mdMechanism->Destroy) { | |
113 /* destroys it's parent as well */ | |
114 fwMechanism->mdMechanism->Destroy( | |
115 fwMechanism->mdMechanism, | |
116 fwMechanism, | |
117 fwMechanism->mdInstance, | |
118 fwMechanism->fwInstance); | |
119 } | |
120 /* if the Destroy function wasn't supplied, then the mechanism is 'static', | |
121 * and there is nothing to destroy */ | |
122 return; | |
123 } | |
124 | |
125 /* | |
126 * nssCKFWMechanism_GetMDMechanism | |
127 * | |
128 */ | |
129 NSS_IMPLEMENT NSSCKMDMechanism * | |
130 nssCKFWMechanism_GetMDMechanism | |
131 ( | |
132 NSSCKFWMechanism *fwMechanism | |
133 ) | |
134 { | |
135 return fwMechanism->mdMechanism; | |
136 } | |
137 | |
138 /* | |
139 * nssCKFWMechanism_GetMinKeySize | |
140 * | |
141 */ | |
142 NSS_IMPLEMENT CK_ULONG | |
143 nssCKFWMechanism_GetMinKeySize | |
144 ( | |
145 NSSCKFWMechanism *fwMechanism, | |
146 CK_RV *pError | |
147 ) | |
148 { | |
149 if (!fwMechanism->mdMechanism->GetMinKeySize) { | |
150 return 0; | |
151 } | |
152 | |
153 return fwMechanism->mdMechanism->GetMinKeySize(fwMechanism->mdMechanism, | |
154 fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken, | |
155 fwMechanism->mdInstance, fwMechanism->fwInstance, pError); | |
156 } | |
157 | |
158 /* | |
159 * nssCKFWMechanism_GetMaxKeySize | |
160 * | |
161 */ | |
162 NSS_IMPLEMENT CK_ULONG | |
163 nssCKFWMechanism_GetMaxKeySize | |
164 ( | |
165 NSSCKFWMechanism *fwMechanism, | |
166 CK_RV *pError | |
167 ) | |
168 { | |
169 if (!fwMechanism->mdMechanism->GetMaxKeySize) { | |
170 return 0; | |
171 } | |
172 | |
173 return fwMechanism->mdMechanism->GetMaxKeySize(fwMechanism->mdMechanism, | |
174 fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken, | |
175 fwMechanism->mdInstance, fwMechanism->fwInstance, pError); | |
176 } | |
177 | |
178 /* | |
179 * nssCKFWMechanism_GetInHardware | |
180 * | |
181 */ | |
182 NSS_IMPLEMENT CK_BBOOL | |
183 nssCKFWMechanism_GetInHardware | |
184 ( | |
185 NSSCKFWMechanism *fwMechanism, | |
186 CK_RV *pError | |
187 ) | |
188 { | |
189 if (!fwMechanism->mdMechanism->GetInHardware) { | |
190 return CK_FALSE; | |
191 } | |
192 | |
193 return fwMechanism->mdMechanism->GetInHardware(fwMechanism->mdMechanism, | |
194 fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken, | |
195 fwMechanism->mdInstance, fwMechanism->fwInstance, pError); | |
196 } | |
197 | |
198 | |
199 /* | |
200 * the following are determined automatically by which of the cryptographic | |
201 * functions are defined for this mechanism. | |
202 */ | |
203 /* | |
204 * nssCKFWMechanism_GetCanEncrypt | |
205 * | |
206 */ | |
207 NSS_EXTERN CK_BBOOL | |
208 nssCKFWMechanism_GetCanEncrypt | |
209 ( | |
210 NSSCKFWMechanism *fwMechanism, | |
211 CK_RV *pError | |
212 ) | |
213 { | |
214 if (!fwMechanism->mdMechanism->EncryptInit) { | |
215 return CK_FALSE; | |
216 } | |
217 return CK_TRUE; | |
218 } | |
219 | |
220 /* | |
221 * nssCKFWMechanism_GetCanDecrypt | |
222 * | |
223 */ | |
224 NSS_EXTERN CK_BBOOL | |
225 nssCKFWMechanism_GetCanDecrypt | |
226 ( | |
227 NSSCKFWMechanism *fwMechanism, | |
228 CK_RV *pError | |
229 ) | |
230 { | |
231 if (!fwMechanism->mdMechanism->DecryptInit) { | |
232 return CK_FALSE; | |
233 } | |
234 return CK_TRUE; | |
235 } | |
236 | |
237 /* | |
238 * nssCKFWMechanism_GetCanDigest | |
239 * | |
240 */ | |
241 NSS_EXTERN CK_BBOOL | |
242 nssCKFWMechanism_GetCanDigest | |
243 ( | |
244 NSSCKFWMechanism *fwMechanism, | |
245 CK_RV *pError | |
246 ) | |
247 { | |
248 if (!fwMechanism->mdMechanism->DigestInit) { | |
249 return CK_FALSE; | |
250 } | |
251 return CK_TRUE; | |
252 } | |
253 | |
254 /* | |
255 * nssCKFWMechanism_GetCanSign | |
256 * | |
257 */ | |
258 NSS_EXTERN CK_BBOOL | |
259 nssCKFWMechanism_GetCanSign | |
260 ( | |
261 NSSCKFWMechanism *fwMechanism, | |
262 CK_RV *pError | |
263 ) | |
264 { | |
265 if (!fwMechanism->mdMechanism->SignInit) { | |
266 return CK_FALSE; | |
267 } | |
268 return CK_TRUE; | |
269 } | |
270 | |
271 /* | |
272 * nssCKFWMechanism_GetCanSignRecover | |
273 * | |
274 */ | |
275 NSS_EXTERN CK_BBOOL | |
276 nssCKFWMechanism_GetCanSignRecover | |
277 ( | |
278 NSSCKFWMechanism *fwMechanism, | |
279 CK_RV *pError | |
280 ) | |
281 { | |
282 if (!fwMechanism->mdMechanism->SignRecoverInit) { | |
283 return CK_FALSE; | |
284 } | |
285 return CK_TRUE; | |
286 } | |
287 | |
288 /* | |
289 * nssCKFWMechanism_GetCanVerify | |
290 * | |
291 */ | |
292 NSS_EXTERN CK_BBOOL | |
293 nssCKFWMechanism_GetCanVerify | |
294 ( | |
295 NSSCKFWMechanism *fwMechanism, | |
296 CK_RV *pError | |
297 ) | |
298 { | |
299 if (!fwMechanism->mdMechanism->VerifyInit) { | |
300 return CK_FALSE; | |
301 } | |
302 return CK_TRUE; | |
303 } | |
304 | |
305 /* | |
306 * nssCKFWMechanism_GetCanVerifyRecover | |
307 * | |
308 */ | |
309 NSS_EXTERN CK_BBOOL | |
310 nssCKFWMechanism_GetCanVerifyRecover | |
311 ( | |
312 NSSCKFWMechanism *fwMechanism, | |
313 CK_RV *pError | |
314 ) | |
315 { | |
316 if (!fwMechanism->mdMechanism->VerifyRecoverInit) { | |
317 return CK_FALSE; | |
318 } | |
319 return CK_TRUE; | |
320 } | |
321 | |
322 /* | |
323 * nssCKFWMechanism_GetCanGenerate | |
324 * | |
325 */ | |
326 NSS_EXTERN CK_BBOOL | |
327 nssCKFWMechanism_GetCanGenerate | |
328 ( | |
329 NSSCKFWMechanism *fwMechanism, | |
330 CK_RV *pError | |
331 ) | |
332 { | |
333 if (!fwMechanism->mdMechanism->GenerateKey) { | |
334 return CK_FALSE; | |
335 } | |
336 return CK_TRUE; | |
337 } | |
338 | |
339 /* | |
340 * nssCKFWMechanism_GetCanGenerateKeyPair | |
341 * | |
342 */ | |
343 NSS_EXTERN CK_BBOOL | |
344 nssCKFWMechanism_GetCanGenerateKeyPair | |
345 ( | |
346 NSSCKFWMechanism *fwMechanism, | |
347 CK_RV *pError | |
348 ) | |
349 { | |
350 if (!fwMechanism->mdMechanism->GenerateKeyPair) { | |
351 return CK_FALSE; | |
352 } | |
353 return CK_TRUE; | |
354 } | |
355 | |
356 /* | |
357 * nssCKFWMechanism_GetCanUnwrap | |
358 * | |
359 */ | |
360 NSS_EXTERN CK_BBOOL | |
361 nssCKFWMechanism_GetCanUnwrap | |
362 ( | |
363 NSSCKFWMechanism *fwMechanism, | |
364 CK_RV *pError | |
365 ) | |
366 { | |
367 if (!fwMechanism->mdMechanism->UnwrapKey) { | |
368 return CK_FALSE; | |
369 } | |
370 return CK_TRUE; | |
371 } | |
372 | |
373 /* | |
374 * nssCKFWMechanism_GetCanWrap | |
375 * | |
376 */ | |
377 NSS_EXTERN CK_BBOOL | |
378 nssCKFWMechanism_GetCanWrap | |
379 ( | |
380 NSSCKFWMechanism *fwMechanism, | |
381 CK_RV *pError | |
382 ) | |
383 { | |
384 if (!fwMechanism->mdMechanism->WrapKey) { | |
385 return CK_FALSE; | |
386 } | |
387 return CK_TRUE; | |
388 } | |
389 | |
390 /* | |
391 * nssCKFWMechanism_GetCanDerive | |
392 * | |
393 */ | |
394 NSS_EXTERN CK_BBOOL | |
395 nssCKFWMechanism_GetCanDerive | |
396 ( | |
397 NSSCKFWMechanism *fwMechanism, | |
398 CK_RV *pError | |
399 ) | |
400 { | |
401 if (!fwMechanism->mdMechanism->DeriveKey) { | |
402 return CK_FALSE; | |
403 } | |
404 return CK_TRUE; | |
405 } | |
406 | |
407 /* | |
408 * These are the actual crypto operations | |
409 */ | |
410 | |
411 /* | |
412 * nssCKFWMechanism_EncryptInit | |
413 * Start an encryption session. | |
414 */ | |
415 NSS_EXTERN CK_RV | |
416 nssCKFWMechanism_EncryptInit | |
417 ( | |
418 NSSCKFWMechanism *fwMechanism, | |
419 CK_MECHANISM *pMechanism, | |
420 NSSCKFWSession *fwSession, | |
421 NSSCKFWObject *fwObject | |
422 ) | |
423 { | |
424 NSSCKFWCryptoOperation *fwOperation; | |
425 NSSCKMDCryptoOperation *mdOperation; | |
426 NSSCKMDSession *mdSession; | |
427 NSSCKMDObject *mdObject; | |
428 CK_RV error = CKR_OK; | |
429 | |
430 | |
431 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
432 NSSCKFWCryptoOperationState_EncryptDecrypt); | |
433 if (fwOperation) { | |
434 return CKR_OPERATION_ACTIVE; | |
435 } | |
436 | |
437 if (!fwMechanism->mdMechanism->EncryptInit) { | |
438 return CKR_FUNCTION_FAILED; | |
439 } | |
440 | |
441 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
442 mdObject = nssCKFWObject_GetMDObject(fwObject); | |
443 mdOperation = fwMechanism->mdMechanism->EncryptInit( | |
444 fwMechanism->mdMechanism, | |
445 fwMechanism, | |
446 pMechanism, | |
447 mdSession, | |
448 fwSession, | |
449 fwMechanism->mdToken, | |
450 fwMechanism->fwToken, | |
451 fwMechanism->mdInstance, | |
452 fwMechanism->fwInstance, | |
453 mdObject, | |
454 fwObject, | |
455 &error | |
456 ); | |
457 if (!mdOperation) { | |
458 goto loser; | |
459 } | |
460 | |
461 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
462 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
463 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
464 NSSCKFWCryptoOperationType_Encrypt, &error); | |
465 if (fwOperation) { | |
466 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
467 NSSCKFWCryptoOperationState_EncryptDecrypt); | |
468 } | |
469 | |
470 loser: | |
471 return error; | |
472 } | |
473 | |
474 /* | |
475 * nssCKFWMechanism_DecryptInit | |
476 * Start an encryption session. | |
477 */ | |
478 NSS_EXTERN CK_RV | |
479 nssCKFWMechanism_DecryptInit | |
480 ( | |
481 NSSCKFWMechanism *fwMechanism, | |
482 CK_MECHANISM *pMechanism, | |
483 NSSCKFWSession *fwSession, | |
484 NSSCKFWObject *fwObject | |
485 ) | |
486 { | |
487 NSSCKFWCryptoOperation *fwOperation; | |
488 NSSCKMDCryptoOperation *mdOperation; | |
489 NSSCKMDSession *mdSession; | |
490 NSSCKMDObject *mdObject; | |
491 CK_RV error = CKR_OK; | |
492 | |
493 | |
494 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
495 NSSCKFWCryptoOperationState_EncryptDecrypt); | |
496 if (fwOperation) { | |
497 return CKR_OPERATION_ACTIVE; | |
498 } | |
499 | |
500 if (!fwMechanism->mdMechanism->DecryptInit) { | |
501 return CKR_FUNCTION_FAILED; | |
502 } | |
503 | |
504 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
505 mdObject = nssCKFWObject_GetMDObject(fwObject); | |
506 mdOperation = fwMechanism->mdMechanism->DecryptInit( | |
507 fwMechanism->mdMechanism, | |
508 fwMechanism, | |
509 pMechanism, | |
510 mdSession, | |
511 fwSession, | |
512 fwMechanism->mdToken, | |
513 fwMechanism->fwToken, | |
514 fwMechanism->mdInstance, | |
515 fwMechanism->fwInstance, | |
516 mdObject, | |
517 fwObject, | |
518 &error | |
519 ); | |
520 if (!mdOperation) { | |
521 goto loser; | |
522 } | |
523 | |
524 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
525 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
526 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
527 NSSCKFWCryptoOperationType_Decrypt, &error); | |
528 if (fwOperation) { | |
529 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
530 NSSCKFWCryptoOperationState_EncryptDecrypt); | |
531 } | |
532 | |
533 loser: | |
534 return error; | |
535 } | |
536 | |
537 /* | |
538 * nssCKFWMechanism_DigestInit | |
539 * Start an encryption session. | |
540 */ | |
541 NSS_EXTERN CK_RV | |
542 nssCKFWMechanism_DigestInit | |
543 ( | |
544 NSSCKFWMechanism *fwMechanism, | |
545 CK_MECHANISM *pMechanism, | |
546 NSSCKFWSession *fwSession | |
547 ) | |
548 { | |
549 NSSCKFWCryptoOperation *fwOperation; | |
550 NSSCKMDCryptoOperation *mdOperation; | |
551 NSSCKMDSession *mdSession; | |
552 CK_RV error = CKR_OK; | |
553 | |
554 | |
555 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
556 NSSCKFWCryptoOperationState_Digest); | |
557 if (fwOperation) { | |
558 return CKR_OPERATION_ACTIVE; | |
559 } | |
560 | |
561 if (!fwMechanism->mdMechanism->DigestInit) { | |
562 return CKR_FUNCTION_FAILED; | |
563 } | |
564 | |
565 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
566 mdOperation = fwMechanism->mdMechanism->DigestInit( | |
567 fwMechanism->mdMechanism, | |
568 fwMechanism, | |
569 pMechanism, | |
570 mdSession, | |
571 fwSession, | |
572 fwMechanism->mdToken, | |
573 fwMechanism->fwToken, | |
574 fwMechanism->mdInstance, | |
575 fwMechanism->fwInstance, | |
576 &error | |
577 ); | |
578 if (!mdOperation) { | |
579 goto loser; | |
580 } | |
581 | |
582 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
583 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
584 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
585 NSSCKFWCryptoOperationType_Digest, &error); | |
586 if (fwOperation) { | |
587 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
588 NSSCKFWCryptoOperationState_Digest); | |
589 } | |
590 | |
591 loser: | |
592 return error; | |
593 } | |
594 | |
595 /* | |
596 * nssCKFWMechanism_SignInit | |
597 * Start an encryption session. | |
598 */ | |
599 NSS_EXTERN CK_RV | |
600 nssCKFWMechanism_SignInit | |
601 ( | |
602 NSSCKFWMechanism *fwMechanism, | |
603 CK_MECHANISM *pMechanism, | |
604 NSSCKFWSession *fwSession, | |
605 NSSCKFWObject *fwObject | |
606 ) | |
607 { | |
608 NSSCKFWCryptoOperation *fwOperation; | |
609 NSSCKMDCryptoOperation *mdOperation; | |
610 NSSCKMDSession *mdSession; | |
611 NSSCKMDObject *mdObject; | |
612 CK_RV error = CKR_OK; | |
613 | |
614 | |
615 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
616 NSSCKFWCryptoOperationState_SignVerify); | |
617 if (fwOperation) { | |
618 return CKR_OPERATION_ACTIVE; | |
619 } | |
620 | |
621 if (!fwMechanism->mdMechanism->SignInit) { | |
622 return CKR_FUNCTION_FAILED; | |
623 } | |
624 | |
625 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
626 mdObject = nssCKFWObject_GetMDObject(fwObject); | |
627 mdOperation = fwMechanism->mdMechanism->SignInit( | |
628 fwMechanism->mdMechanism, | |
629 fwMechanism, | |
630 pMechanism, | |
631 mdSession, | |
632 fwSession, | |
633 fwMechanism->mdToken, | |
634 fwMechanism->fwToken, | |
635 fwMechanism->mdInstance, | |
636 fwMechanism->fwInstance, | |
637 mdObject, | |
638 fwObject, | |
639 &error | |
640 ); | |
641 if (!mdOperation) { | |
642 goto loser; | |
643 } | |
644 | |
645 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
646 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
647 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
648 NSSCKFWCryptoOperationType_Sign, &error); | |
649 if (fwOperation) { | |
650 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
651 NSSCKFWCryptoOperationState_SignVerify); | |
652 } | |
653 | |
654 loser: | |
655 return error; | |
656 } | |
657 | |
658 /* | |
659 * nssCKFWMechanism_VerifyInit | |
660 * Start an encryption session. | |
661 */ | |
662 NSS_EXTERN CK_RV | |
663 nssCKFWMechanism_VerifyInit | |
664 ( | |
665 NSSCKFWMechanism *fwMechanism, | |
666 CK_MECHANISM *pMechanism, | |
667 NSSCKFWSession *fwSession, | |
668 NSSCKFWObject *fwObject | |
669 ) | |
670 { | |
671 NSSCKFWCryptoOperation *fwOperation; | |
672 NSSCKMDCryptoOperation *mdOperation; | |
673 NSSCKMDSession *mdSession; | |
674 NSSCKMDObject *mdObject; | |
675 CK_RV error = CKR_OK; | |
676 | |
677 | |
678 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
679 NSSCKFWCryptoOperationState_SignVerify); | |
680 if (fwOperation) { | |
681 return CKR_OPERATION_ACTIVE; | |
682 } | |
683 | |
684 if (!fwMechanism->mdMechanism->VerifyInit) { | |
685 return CKR_FUNCTION_FAILED; | |
686 } | |
687 | |
688 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
689 mdObject = nssCKFWObject_GetMDObject(fwObject); | |
690 mdOperation = fwMechanism->mdMechanism->VerifyInit( | |
691 fwMechanism->mdMechanism, | |
692 fwMechanism, | |
693 pMechanism, | |
694 mdSession, | |
695 fwSession, | |
696 fwMechanism->mdToken, | |
697 fwMechanism->fwToken, | |
698 fwMechanism->mdInstance, | |
699 fwMechanism->fwInstance, | |
700 mdObject, | |
701 fwObject, | |
702 &error | |
703 ); | |
704 if (!mdOperation) { | |
705 goto loser; | |
706 } | |
707 | |
708 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
709 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
710 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
711 NSSCKFWCryptoOperationType_Verify, &error); | |
712 if (fwOperation) { | |
713 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
714 NSSCKFWCryptoOperationState_SignVerify); | |
715 } | |
716 | |
717 loser: | |
718 return error; | |
719 } | |
720 | |
721 /* | |
722 * nssCKFWMechanism_SignRecoverInit | |
723 * Start an encryption session. | |
724 */ | |
725 NSS_EXTERN CK_RV | |
726 nssCKFWMechanism_SignRecoverInit | |
727 ( | |
728 NSSCKFWMechanism *fwMechanism, | |
729 CK_MECHANISM *pMechanism, | |
730 NSSCKFWSession *fwSession, | |
731 NSSCKFWObject *fwObject | |
732 ) | |
733 { | |
734 NSSCKFWCryptoOperation *fwOperation; | |
735 NSSCKMDCryptoOperation *mdOperation; | |
736 NSSCKMDSession *mdSession; | |
737 NSSCKMDObject *mdObject; | |
738 CK_RV error = CKR_OK; | |
739 | |
740 | |
741 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
742 NSSCKFWCryptoOperationState_SignVerify); | |
743 if (fwOperation) { | |
744 return CKR_OPERATION_ACTIVE; | |
745 } | |
746 | |
747 if (!fwMechanism->mdMechanism->SignRecoverInit) { | |
748 return CKR_FUNCTION_FAILED; | |
749 } | |
750 | |
751 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
752 mdObject = nssCKFWObject_GetMDObject(fwObject); | |
753 mdOperation = fwMechanism->mdMechanism->SignRecoverInit( | |
754 fwMechanism->mdMechanism, | |
755 fwMechanism, | |
756 pMechanism, | |
757 mdSession, | |
758 fwSession, | |
759 fwMechanism->mdToken, | |
760 fwMechanism->fwToken, | |
761 fwMechanism->mdInstance, | |
762 fwMechanism->fwInstance, | |
763 mdObject, | |
764 fwObject, | |
765 &error | |
766 ); | |
767 if (!mdOperation) { | |
768 goto loser; | |
769 } | |
770 | |
771 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
772 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
773 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
774 NSSCKFWCryptoOperationType_SignRecover, &error); | |
775 if (fwOperation) { | |
776 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
777 NSSCKFWCryptoOperationState_SignVerify); | |
778 } | |
779 | |
780 loser: | |
781 return error; | |
782 } | |
783 | |
784 /* | |
785 * nssCKFWMechanism_VerifyRecoverInit | |
786 * Start an encryption session. | |
787 */ | |
788 NSS_EXTERN CK_RV | |
789 nssCKFWMechanism_VerifyRecoverInit | |
790 ( | |
791 NSSCKFWMechanism *fwMechanism, | |
792 CK_MECHANISM *pMechanism, | |
793 NSSCKFWSession *fwSession, | |
794 NSSCKFWObject *fwObject | |
795 ) | |
796 { | |
797 NSSCKFWCryptoOperation *fwOperation; | |
798 NSSCKMDCryptoOperation *mdOperation; | |
799 NSSCKMDSession *mdSession; | |
800 NSSCKMDObject *mdObject; | |
801 CK_RV error = CKR_OK; | |
802 | |
803 | |
804 fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, | |
805 NSSCKFWCryptoOperationState_SignVerify); | |
806 if (fwOperation) { | |
807 return CKR_OPERATION_ACTIVE; | |
808 } | |
809 | |
810 if (!fwMechanism->mdMechanism->VerifyRecoverInit) { | |
811 return CKR_FUNCTION_FAILED; | |
812 } | |
813 | |
814 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
815 mdObject = nssCKFWObject_GetMDObject(fwObject); | |
816 mdOperation = fwMechanism->mdMechanism->VerifyRecoverInit( | |
817 fwMechanism->mdMechanism, | |
818 fwMechanism, | |
819 pMechanism, | |
820 mdSession, | |
821 fwSession, | |
822 fwMechanism->mdToken, | |
823 fwMechanism->fwToken, | |
824 fwMechanism->mdInstance, | |
825 fwMechanism->fwInstance, | |
826 mdObject, | |
827 fwObject, | |
828 &error | |
829 ); | |
830 if (!mdOperation) { | |
831 goto loser; | |
832 } | |
833 | |
834 fwOperation = nssCKFWCryptoOperation_Create(mdOperation, | |
835 mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, | |
836 fwMechanism->mdInstance, fwMechanism->fwInstance, | |
837 NSSCKFWCryptoOperationType_VerifyRecover, &error); | |
838 if (fwOperation) { | |
839 nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, | |
840 NSSCKFWCryptoOperationState_SignVerify); | |
841 } | |
842 | |
843 loser: | |
844 return error; | |
845 } | |
846 | |
847 /* | |
848 * nssCKFWMechanism_GenerateKey | |
849 */ | |
850 NSS_EXTERN NSSCKFWObject * | |
851 nssCKFWMechanism_GenerateKey | |
852 ( | |
853 NSSCKFWMechanism *fwMechanism, | |
854 CK_MECHANISM_PTR pMechanism, | |
855 NSSCKFWSession *fwSession, | |
856 CK_ATTRIBUTE_PTR pTemplate, | |
857 CK_ULONG ulAttributeCount, | |
858 CK_RV *pError | |
859 ) | |
860 { | |
861 NSSCKMDSession *mdSession; | |
862 NSSCKMDObject *mdObject; | |
863 NSSCKFWObject *fwObject = NULL; | |
864 NSSArena *arena; | |
865 | |
866 if (!fwMechanism->mdMechanism->GenerateKey) { | |
867 *pError = CKR_FUNCTION_FAILED; | |
868 return (NSSCKFWObject *)NULL; | |
869 } | |
870 | |
871 arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError); | |
872 if (!arena) { | |
873 if (CKR_OK == *pError) { | |
874 *pError = CKR_GENERAL_ERROR; | |
875 } | |
876 return (NSSCKFWObject *)NULL; | |
877 } | |
878 | |
879 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
880 mdObject = fwMechanism->mdMechanism->GenerateKey( | |
881 fwMechanism->mdMechanism, | |
882 fwMechanism, | |
883 pMechanism, | |
884 mdSession, | |
885 fwSession, | |
886 fwMechanism->mdToken, | |
887 fwMechanism->fwToken, | |
888 fwMechanism->mdInstance, | |
889 fwMechanism->fwInstance, | |
890 pTemplate, | |
891 ulAttributeCount, | |
892 pError); | |
893 | |
894 if (!mdObject) { | |
895 return (NSSCKFWObject *)NULL; | |
896 } | |
897 | |
898 fwObject = nssCKFWObject_Create(arena, mdObject, | |
899 fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError); | |
900 | |
901 return fwObject; | |
902 } | |
903 | |
904 /* | |
905 * nssCKFWMechanism_GenerateKeyPair | |
906 */ | |
907 NSS_EXTERN CK_RV | |
908 nssCKFWMechanism_GenerateKeyPair | |
909 ( | |
910 NSSCKFWMechanism *fwMechanism, | |
911 CK_MECHANISM_PTR pMechanism, | |
912 NSSCKFWSession *fwSession, | |
913 CK_ATTRIBUTE_PTR pPublicKeyTemplate, | |
914 CK_ULONG ulPublicKeyAttributeCount, | |
915 CK_ATTRIBUTE_PTR pPrivateKeyTemplate, | |
916 CK_ULONG ulPrivateKeyAttributeCount, | |
917 NSSCKFWObject **fwPublicKeyObject, | |
918 NSSCKFWObject **fwPrivateKeyObject | |
919 ) | |
920 { | |
921 NSSCKMDSession *mdSession; | |
922 NSSCKMDObject *mdPublicKeyObject; | |
923 NSSCKMDObject *mdPrivateKeyObject; | |
924 NSSArena *arena; | |
925 CK_RV error = CKR_OK; | |
926 | |
927 if (!fwMechanism->mdMechanism->GenerateKeyPair) { | |
928 return CKR_FUNCTION_FAILED; | |
929 } | |
930 | |
931 arena = nssCKFWToken_GetArena(fwMechanism->fwToken, &error); | |
932 if (!arena) { | |
933 if (CKR_OK == error) { | |
934 error = CKR_GENERAL_ERROR; | |
935 } | |
936 return error; | |
937 } | |
938 | |
939 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
940 error = fwMechanism->mdMechanism->GenerateKeyPair( | |
941 fwMechanism->mdMechanism, | |
942 fwMechanism, | |
943 pMechanism, | |
944 mdSession, | |
945 fwSession, | |
946 fwMechanism->mdToken, | |
947 fwMechanism->fwToken, | |
948 fwMechanism->mdInstance, | |
949 fwMechanism->fwInstance, | |
950 pPublicKeyTemplate, | |
951 ulPublicKeyAttributeCount, | |
952 pPrivateKeyTemplate, | |
953 ulPrivateKeyAttributeCount, | |
954 &mdPublicKeyObject, | |
955 &mdPrivateKeyObject); | |
956 | |
957 if (CKR_OK != error) { | |
958 return error; | |
959 } | |
960 | |
961 *fwPublicKeyObject = nssCKFWObject_Create(arena, mdPublicKeyObject, | |
962 fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, &error); | |
963 if (!*fwPublicKeyObject) { | |
964 return error; | |
965 } | |
966 *fwPrivateKeyObject = nssCKFWObject_Create(arena, mdPrivateKeyObject, | |
967 fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, &error); | |
968 | |
969 return error; | |
970 } | |
971 | |
972 /* | |
973 * nssCKFWMechanism_GetWrapKeyLength | |
974 */ | |
975 NSS_EXTERN CK_ULONG | |
976 nssCKFWMechanism_GetWrapKeyLength | |
977 ( | |
978 NSSCKFWMechanism *fwMechanism, | |
979 CK_MECHANISM_PTR pMechanism, | |
980 NSSCKFWSession *fwSession, | |
981 NSSCKFWObject *fwWrappingKeyObject, | |
982 NSSCKFWObject *fwKeyObject, | |
983 CK_RV *pError | |
984 ) | |
985 { | |
986 NSSCKMDSession *mdSession; | |
987 NSSCKMDObject *mdWrappingKeyObject; | |
988 NSSCKMDObject *mdKeyObject; | |
989 | |
990 if (!fwMechanism->mdMechanism->WrapKey) { | |
991 *pError = CKR_FUNCTION_FAILED; | |
992 return (CK_ULONG) 0; | |
993 } | |
994 | |
995 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
996 mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject); | |
997 mdKeyObject = nssCKFWObject_GetMDObject(fwKeyObject); | |
998 return fwMechanism->mdMechanism->GetWrapKeyLength( | |
999 fwMechanism->mdMechanism, | |
1000 fwMechanism, | |
1001 pMechanism, | |
1002 mdSession, | |
1003 fwSession, | |
1004 fwMechanism->mdToken, | |
1005 fwMechanism->fwToken, | |
1006 fwMechanism->mdInstance, | |
1007 fwMechanism->fwInstance, | |
1008 mdWrappingKeyObject, | |
1009 fwWrappingKeyObject, | |
1010 mdKeyObject, | |
1011 fwKeyObject, | |
1012 pError); | |
1013 } | |
1014 | |
1015 /* | |
1016 * nssCKFWMechanism_WrapKey | |
1017 */ | |
1018 NSS_EXTERN CK_RV | |
1019 nssCKFWMechanism_WrapKey | |
1020 ( | |
1021 NSSCKFWMechanism *fwMechanism, | |
1022 CK_MECHANISM_PTR pMechanism, | |
1023 NSSCKFWSession *fwSession, | |
1024 NSSCKFWObject *fwWrappingKeyObject, | |
1025 NSSCKFWObject *fwKeyObject, | |
1026 NSSItem *wrappedKey | |
1027 ) | |
1028 { | |
1029 NSSCKMDSession *mdSession; | |
1030 NSSCKMDObject *mdWrappingKeyObject; | |
1031 NSSCKMDObject *mdKeyObject; | |
1032 | |
1033 if (!fwMechanism->mdMechanism->WrapKey) { | |
1034 return CKR_FUNCTION_FAILED; | |
1035 } | |
1036 | |
1037 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
1038 mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject); | |
1039 mdKeyObject = nssCKFWObject_GetMDObject(fwKeyObject); | |
1040 return fwMechanism->mdMechanism->WrapKey( | |
1041 fwMechanism->mdMechanism, | |
1042 fwMechanism, | |
1043 pMechanism, | |
1044 mdSession, | |
1045 fwSession, | |
1046 fwMechanism->mdToken, | |
1047 fwMechanism->fwToken, | |
1048 fwMechanism->mdInstance, | |
1049 fwMechanism->fwInstance, | |
1050 mdWrappingKeyObject, | |
1051 fwWrappingKeyObject, | |
1052 mdKeyObject, | |
1053 fwKeyObject, | |
1054 wrappedKey); | |
1055 } | |
1056 | |
1057 /* | |
1058 * nssCKFWMechanism_UnwrapKey | |
1059 */ | |
1060 NSS_EXTERN NSSCKFWObject * | |
1061 nssCKFWMechanism_UnwrapKey | |
1062 ( | |
1063 NSSCKFWMechanism *fwMechanism, | |
1064 CK_MECHANISM_PTR pMechanism, | |
1065 NSSCKFWSession *fwSession, | |
1066 NSSCKFWObject *fwWrappingKeyObject, | |
1067 NSSItem *wrappedKey, | |
1068 CK_ATTRIBUTE_PTR pTemplate, | |
1069 CK_ULONG ulAttributeCount, | |
1070 CK_RV *pError | |
1071 ) | |
1072 { | |
1073 NSSCKMDSession *mdSession; | |
1074 NSSCKMDObject *mdObject; | |
1075 NSSCKMDObject *mdWrappingKeyObject; | |
1076 NSSCKFWObject *fwObject = NULL; | |
1077 NSSArena *arena; | |
1078 | |
1079 if (!fwMechanism->mdMechanism->UnwrapKey) { | |
1080 /* we could simulate UnwrapKey using Decrypt and Create object, but | |
1081 * 1) it's not clear that would work well, and 2) the low level token | |
1082 * may want to restrict unwrap key for a reason, so just fail it it | |
1083 * can't be done */ | |
1084 *pError = CKR_FUNCTION_FAILED; | |
1085 return (NSSCKFWObject *)NULL; | |
1086 } | |
1087 | |
1088 arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError); | |
1089 if (!arena) { | |
1090 if (CKR_OK == *pError) { | |
1091 *pError = CKR_GENERAL_ERROR; | |
1092 } | |
1093 return (NSSCKFWObject *)NULL; | |
1094 } | |
1095 | |
1096 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
1097 mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject); | |
1098 mdObject = fwMechanism->mdMechanism->UnwrapKey( | |
1099 fwMechanism->mdMechanism, | |
1100 fwMechanism, | |
1101 pMechanism, | |
1102 mdSession, | |
1103 fwSession, | |
1104 fwMechanism->mdToken, | |
1105 fwMechanism->fwToken, | |
1106 fwMechanism->mdInstance, | |
1107 fwMechanism->fwInstance, | |
1108 mdWrappingKeyObject, | |
1109 fwWrappingKeyObject, | |
1110 wrappedKey, | |
1111 pTemplate, | |
1112 ulAttributeCount, | |
1113 pError); | |
1114 | |
1115 if (!mdObject) { | |
1116 return (NSSCKFWObject *)NULL; | |
1117 } | |
1118 | |
1119 fwObject = nssCKFWObject_Create(arena, mdObject, | |
1120 fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError); | |
1121 | |
1122 return fwObject; | |
1123 } | |
1124 | |
1125 /* | |
1126 * nssCKFWMechanism_DeriveKey | |
1127 */ | |
1128 NSS_EXTERN NSSCKFWObject * | |
1129 nssCKFWMechanism_DeriveKey | |
1130 ( | |
1131 NSSCKFWMechanism *fwMechanism, | |
1132 CK_MECHANISM_PTR pMechanism, | |
1133 NSSCKFWSession *fwSession, | |
1134 NSSCKFWObject *fwBaseKeyObject, | |
1135 CK_ATTRIBUTE_PTR pTemplate, | |
1136 CK_ULONG ulAttributeCount, | |
1137 CK_RV *pError | |
1138 ) | |
1139 { | |
1140 NSSCKMDSession *mdSession; | |
1141 NSSCKMDObject *mdObject; | |
1142 NSSCKMDObject *mdBaseKeyObject; | |
1143 NSSCKFWObject *fwObject = NULL; | |
1144 NSSArena *arena; | |
1145 | |
1146 if (!fwMechanism->mdMechanism->DeriveKey) { | |
1147 *pError = CKR_FUNCTION_FAILED; | |
1148 return (NSSCKFWObject *)NULL; | |
1149 } | |
1150 | |
1151 arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError); | |
1152 if (!arena) { | |
1153 if (CKR_OK == *pError) { | |
1154 *pError = CKR_GENERAL_ERROR; | |
1155 } | |
1156 return (NSSCKFWObject *)NULL; | |
1157 } | |
1158 | |
1159 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
1160 mdBaseKeyObject = nssCKFWObject_GetMDObject(fwBaseKeyObject); | |
1161 mdObject = fwMechanism->mdMechanism->DeriveKey( | |
1162 fwMechanism->mdMechanism, | |
1163 fwMechanism, | |
1164 pMechanism, | |
1165 mdSession, | |
1166 fwSession, | |
1167 fwMechanism->mdToken, | |
1168 fwMechanism->fwToken, | |
1169 fwMechanism->mdInstance, | |
1170 fwMechanism->fwInstance, | |
1171 mdBaseKeyObject, | |
1172 fwBaseKeyObject, | |
1173 pTemplate, | |
1174 ulAttributeCount, | |
1175 pError); | |
1176 | |
1177 if (!mdObject) { | |
1178 return (NSSCKFWObject *)NULL; | |
1179 } | |
1180 | |
1181 fwObject = nssCKFWObject_Create(arena, mdObject, | |
1182 fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError); | |
1183 | |
1184 return fwObject; | |
1185 } | |
1186 | |
OLD | NEW |