Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: mozilla/security/nss/lib/ckfw/mechanism.c

Issue 14249009: Change the NSS and NSPR source tree to the new directory structure to be (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mozilla/security/nss/lib/ckfw/instance.c ('k') | mozilla/security/nss/lib/ckfw/mutex.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « mozilla/security/nss/lib/ckfw/instance.c ('k') | mozilla/security/nss/lib/ckfw/mutex.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698