1 /* Copyright (c) OASIS Open 2016. All Rights Reserved./
2  * /Distributed under the terms of the OASIS IPR Policy,
3  * [http://www.oasis-open.org/policies-guidelines/ipr], AS-IS, WITHOUT ANY
4  * IMPLIED OR EXPRESS WARRANTY; there is no warranty of MERCHANTABILITY, FITNESS FOR A
5  * PARTICULAR PURPOSE or NONINFRINGEMENT of the rights of others.
6  */
7 
8 /* Latest version of the specification:
9  * http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.html
10  */
11 
12 /* This header file contains pretty much everything about all the
13  * Cryptoki function prototypes.  Because this information is
14  * used for more than just declaring function prototypes, the
15  * order of the functions appearing herein is important, and
16  * should not be altered.
17  */
18 
19 /* General-purpose */
20 
21 /* C_Initialize initializes the Cryptoki library. */
22 CK_PKCS11_FUNCTION_INFO(C_Initialize)
23 #ifdef CK_NEED_ARG_LIST
24 (
25   CK_VOID_PTR   pInitArgs  /* if this is not NULL_PTR, it gets
26                             * cast to CK_C_INITIALIZE_ARGS_PTR
27                             * and dereferenced
28                             */
29 );
30 #endif
31 
32 
33 /* C_Finalize indicates that an application is done with the
34  * Cryptoki library.
35  */
36 CK_PKCS11_FUNCTION_INFO(C_Finalize)
37 #ifdef CK_NEED_ARG_LIST
38 (
39   CK_VOID_PTR   pReserved  /* reserved.  Should be NULL_PTR */
40 );
41 #endif
42 
43 
44 /* C_GetInfo returns general information about Cryptoki. */
45 CK_PKCS11_FUNCTION_INFO(C_GetInfo)
46 #ifdef CK_NEED_ARG_LIST
47 (
48   CK_INFO_PTR   pInfo  /* location that receives information */
49 );
50 #endif
51 
52 
53 /* C_GetFunctionList returns the function list. */
54 CK_PKCS11_FUNCTION_INFO(C_GetFunctionList)
55 #ifdef CK_NEED_ARG_LIST
56 (
57   CK_FUNCTION_LIST_PTR_PTR ppFunctionList  /* receives pointer to
58                                             * function list
59                                             */
60 );
61 #endif
62 
63 
64 
65 /* Slot and token management */
66 
67 /* C_GetSlotList obtains a list of slots in the system. */
68 CK_PKCS11_FUNCTION_INFO(C_GetSlotList)
69 #ifdef CK_NEED_ARG_LIST
70 (
71   CK_BBOOL       tokenPresent,  /* only slots with tokens */
72   CK_SLOT_ID_PTR pSlotList,     /* receives array of slot IDs */
73   CK_ULONG_PTR   pulCount       /* receives number of slots */
74 );
75 #endif
76 
77 
78 /* C_GetSlotInfo obtains information about a particular slot in
79  * the system.
80  */
81 CK_PKCS11_FUNCTION_INFO(C_GetSlotInfo)
82 #ifdef CK_NEED_ARG_LIST
83 (
84   CK_SLOT_ID       slotID,  /* the ID of the slot */
85   CK_SLOT_INFO_PTR pInfo    /* receives the slot information */
86 );
87 #endif
88 
89 
90 /* C_GetTokenInfo obtains information about a particular token
91  * in the system.
92  */
93 CK_PKCS11_FUNCTION_INFO(C_GetTokenInfo)
94 #ifdef CK_NEED_ARG_LIST
95 (
96   CK_SLOT_ID        slotID,  /* ID of the token's slot */
97   CK_TOKEN_INFO_PTR pInfo    /* receives the token information */
98 );
99 #endif
100 
101 
102 /* C_GetMechanismList obtains a list of mechanism types
103  * supported by a token.
104  */
105 CK_PKCS11_FUNCTION_INFO(C_GetMechanismList)
106 #ifdef CK_NEED_ARG_LIST
107 (
108   CK_SLOT_ID            slotID,          /* ID of token's slot */
109   CK_MECHANISM_TYPE_PTR pMechanismList,  /* gets mech. array */
110   CK_ULONG_PTR          pulCount         /* gets # of mechs. */
111 );
112 #endif
113 
114 
115 /* C_GetMechanismInfo obtains information about a particular
116  * mechanism possibly supported by a token.
117  */
118 CK_PKCS11_FUNCTION_INFO(C_GetMechanismInfo)
119 #ifdef CK_NEED_ARG_LIST
120 (
121   CK_SLOT_ID            slotID,  /* ID of the token's slot */
122   CK_MECHANISM_TYPE     type,    /* type of mechanism */
123   CK_MECHANISM_INFO_PTR pInfo    /* receives mechanism info */
124 );
125 #endif
126 
127 
128 /* C_InitToken initializes a token. */
129 CK_PKCS11_FUNCTION_INFO(C_InitToken)
130 #ifdef CK_NEED_ARG_LIST
131 (
132   CK_SLOT_ID      slotID,    /* ID of the token's slot */
133   CK_UTF8CHAR_PTR pPin,      /* the SO's initial PIN */
134   CK_ULONG        ulPinLen,  /* length in bytes of the PIN */
135   CK_UTF8CHAR_PTR pLabel     /* 32-byte token label (blank padded) */
136 );
137 #endif
138 
139 
140 /* C_InitPIN initializes the normal user's PIN. */
141 CK_PKCS11_FUNCTION_INFO(C_InitPIN)
142 #ifdef CK_NEED_ARG_LIST
143 (
144   CK_SESSION_HANDLE hSession,  /* the session's handle */
145   CK_UTF8CHAR_PTR   pPin,      /* the normal user's PIN */
146   CK_ULONG          ulPinLen   /* length in bytes of the PIN */
147 );
148 #endif
149 
150 
151 /* C_SetPIN modifies the PIN of the user who is logged in. */
152 CK_PKCS11_FUNCTION_INFO(C_SetPIN)
153 #ifdef CK_NEED_ARG_LIST
154 (
155   CK_SESSION_HANDLE hSession,  /* the session's handle */
156   CK_UTF8CHAR_PTR   pOldPin,   /* the old PIN */
157   CK_ULONG          ulOldLen,  /* length of the old PIN */
158   CK_UTF8CHAR_PTR   pNewPin,   /* the new PIN */
159   CK_ULONG          ulNewLen   /* length of the new PIN */
160 );
161 #endif
162 
163 
164 
165 /* Session management */
166 
167 /* C_OpenSession opens a session between an application and a
168  * token.
169  */
170 CK_PKCS11_FUNCTION_INFO(C_OpenSession)
171 #ifdef CK_NEED_ARG_LIST
172 (
173   CK_SLOT_ID            slotID,        /* the slot's ID */
174   CK_FLAGS              flags,         /* from CK_SESSION_INFO */
175   CK_VOID_PTR           pApplication,  /* passed to callback */
176   CK_NOTIFY             Notify,        /* callback function */
177   CK_SESSION_HANDLE_PTR phSession      /* gets session handle */
178 );
179 #endif
180 
181 
182 /* C_CloseSession closes a session between an application and a
183  * token.
184  */
185 CK_PKCS11_FUNCTION_INFO(C_CloseSession)
186 #ifdef CK_NEED_ARG_LIST
187 (
188   CK_SESSION_HANDLE hSession  /* the session's handle */
189 );
190 #endif
191 
192 
193 /* C_CloseAllSessions closes all sessions with a token. */
194 CK_PKCS11_FUNCTION_INFO(C_CloseAllSessions)
195 #ifdef CK_NEED_ARG_LIST
196 (
197   CK_SLOT_ID     slotID  /* the token's slot */
198 );
199 #endif
200 
201 
202 /* C_GetSessionInfo obtains information about the session. */
203 CK_PKCS11_FUNCTION_INFO(C_GetSessionInfo)
204 #ifdef CK_NEED_ARG_LIST
205 (
206   CK_SESSION_HANDLE   hSession,  /* the session's handle */
207   CK_SESSION_INFO_PTR pInfo      /* receives session info */
208 );
209 #endif
210 
211 
212 /* C_GetOperationState obtains the state of the cryptographic operation
213  * in a session.
214  */
215 CK_PKCS11_FUNCTION_INFO(C_GetOperationState)
216 #ifdef CK_NEED_ARG_LIST
217 (
218   CK_SESSION_HANDLE hSession,             /* session's handle */
219   CK_BYTE_PTR       pOperationState,      /* gets state */
220   CK_ULONG_PTR      pulOperationStateLen  /* gets state length */
221 );
222 #endif
223 
224 
225 /* C_SetOperationState restores the state of the cryptographic
226  * operation in a session.
227  */
228 CK_PKCS11_FUNCTION_INFO(C_SetOperationState)
229 #ifdef CK_NEED_ARG_LIST
230 (
231   CK_SESSION_HANDLE hSession,            /* session's handle */
232   CK_BYTE_PTR      pOperationState,      /* holds state */
233   CK_ULONG         ulOperationStateLen,  /* holds state length */
234   CK_OBJECT_HANDLE hEncryptionKey,       /* en/decryption key */
235   CK_OBJECT_HANDLE hAuthenticationKey    /* sign/verify key */
236 );
237 #endif
238 
239 
240 /* C_Login logs a user into a token. */
241 CK_PKCS11_FUNCTION_INFO(C_Login)
242 #ifdef CK_NEED_ARG_LIST
243 (
244   CK_SESSION_HANDLE hSession,  /* the session's handle */
245   CK_USER_TYPE      userType,  /* the user type */
246   CK_UTF8CHAR_PTR   pPin,      /* the user's PIN */
247   CK_ULONG          ulPinLen   /* the length of the PIN */
248 );
249 #endif
250 
251 
252 /* C_Logout logs a user out from a token. */
253 CK_PKCS11_FUNCTION_INFO(C_Logout)
254 #ifdef CK_NEED_ARG_LIST
255 (
256   CK_SESSION_HANDLE hSession  /* the session's handle */
257 );
258 #endif
259 
260 
261 
262 /* Object management */
263 
264 /* C_CreateObject creates a new object. */
265 CK_PKCS11_FUNCTION_INFO(C_CreateObject)
266 #ifdef CK_NEED_ARG_LIST
267 (
268   CK_SESSION_HANDLE hSession,    /* the session's handle */
269   CK_ATTRIBUTE_PTR  pTemplate,   /* the object's template */
270   CK_ULONG          ulCount,     /* attributes in template */
271   CK_OBJECT_HANDLE_PTR phObject  /* gets new object's handle. */
272 );
273 #endif
274 
275 
276 /* C_CopyObject copies an object, creating a new object for the
277  * copy.
278  */
279 CK_PKCS11_FUNCTION_INFO(C_CopyObject)
280 #ifdef CK_NEED_ARG_LIST
281 (
282   CK_SESSION_HANDLE    hSession,    /* the session's handle */
283   CK_OBJECT_HANDLE     hObject,     /* the object's handle */
284   CK_ATTRIBUTE_PTR     pTemplate,   /* template for new object */
285   CK_ULONG             ulCount,     /* attributes in template */
286   CK_OBJECT_HANDLE_PTR phNewObject  /* receives handle of copy */
287 );
288 #endif
289 
290 
291 /* C_DestroyObject destroys an object. */
292 CK_PKCS11_FUNCTION_INFO(C_DestroyObject)
293 #ifdef CK_NEED_ARG_LIST
294 (
295   CK_SESSION_HANDLE hSession,  /* the session's handle */
296   CK_OBJECT_HANDLE  hObject    /* the object's handle */
297 );
298 #endif
299 
300 
301 /* C_GetObjectSize gets the size of an object in bytes. */
302 CK_PKCS11_FUNCTION_INFO(C_GetObjectSize)
303 #ifdef CK_NEED_ARG_LIST
304 (
305   CK_SESSION_HANDLE hSession,  /* the session's handle */
306   CK_OBJECT_HANDLE  hObject,   /* the object's handle */
307   CK_ULONG_PTR      pulSize    /* receives size of object */
308 );
309 #endif
310 
311 
312 /* C_GetAttributeValue obtains the value of one or more object
313  * attributes.
314  */
315 CK_PKCS11_FUNCTION_INFO(C_GetAttributeValue)
316 #ifdef CK_NEED_ARG_LIST
317 (
318   CK_SESSION_HANDLE hSession,   /* the session's handle */
319   CK_OBJECT_HANDLE  hObject,    /* the object's handle */
320   CK_ATTRIBUTE_PTR  pTemplate,  /* specifies attrs; gets vals */
321   CK_ULONG          ulCount     /* attributes in template */
322 );
323 #endif
324 
325 
326 /* C_SetAttributeValue modifies the value of one or more object
327  * attributes.
328  */
329 CK_PKCS11_FUNCTION_INFO(C_SetAttributeValue)
330 #ifdef CK_NEED_ARG_LIST
331 (
332   CK_SESSION_HANDLE hSession,   /* the session's handle */
333   CK_OBJECT_HANDLE  hObject,    /* the object's handle */
334   CK_ATTRIBUTE_PTR  pTemplate,  /* specifies attrs and values */
335   CK_ULONG          ulCount     /* attributes in template */
336 );
337 #endif
338 
339 
340 /* C_FindObjectsInit initializes a search for token and session
341  * objects that match a template.
342  */
343 CK_PKCS11_FUNCTION_INFO(C_FindObjectsInit)
344 #ifdef CK_NEED_ARG_LIST
345 (
346   CK_SESSION_HANDLE hSession,   /* the session's handle */
347   CK_ATTRIBUTE_PTR  pTemplate,  /* attribute values to match */
348   CK_ULONG          ulCount     /* attrs in search template */
349 );
350 #endif
351 
352 
353 /* C_FindObjects continues a search for token and session
354  * objects that match a template, obtaining additional object
355  * handles.
356  */
357 CK_PKCS11_FUNCTION_INFO(C_FindObjects)
358 #ifdef CK_NEED_ARG_LIST
359 (
360  CK_SESSION_HANDLE    hSession,          /* session's handle */
361  CK_OBJECT_HANDLE_PTR phObject,          /* gets obj. handles */
362  CK_ULONG             ulMaxObjectCount,  /* max handles to get */
363  CK_ULONG_PTR         pulObjectCount     /* actual # returned */
364 );
365 #endif
366 
367 
368 /* C_FindObjectsFinal finishes a search for token and session
369  * objects.
370  */
371 CK_PKCS11_FUNCTION_INFO(C_FindObjectsFinal)
372 #ifdef CK_NEED_ARG_LIST
373 (
374   CK_SESSION_HANDLE hSession  /* the session's handle */
375 );
376 #endif
377 
378 
379 
380 /* Encryption and decryption */
381 
382 /* C_EncryptInit initializes an encryption operation. */
383 CK_PKCS11_FUNCTION_INFO(C_EncryptInit)
384 #ifdef CK_NEED_ARG_LIST
385 (
386   CK_SESSION_HANDLE hSession,    /* the session's handle */
387   CK_MECHANISM_PTR  pMechanism,  /* the encryption mechanism */
388   CK_OBJECT_HANDLE  hKey         /* handle of encryption key */
389 );
390 #endif
391 
392 
393 /* C_Encrypt encrypts single-part data. */
394 CK_PKCS11_FUNCTION_INFO(C_Encrypt)
395 #ifdef CK_NEED_ARG_LIST
396 (
397   CK_SESSION_HANDLE hSession,            /* session's handle */
398   CK_BYTE_PTR       pData,               /* the plaintext data */
399   CK_ULONG          ulDataLen,           /* bytes of plaintext */
400   CK_BYTE_PTR       pEncryptedData,      /* gets ciphertext */
401   CK_ULONG_PTR      pulEncryptedDataLen  /* gets c-text size */
402 );
403 #endif
404 
405 
406 /* C_EncryptUpdate continues a multiple-part encryption
407  * operation.
408  */
409 CK_PKCS11_FUNCTION_INFO(C_EncryptUpdate)
410 #ifdef CK_NEED_ARG_LIST
411 (
412   CK_SESSION_HANDLE hSession,           /* session's handle */
413   CK_BYTE_PTR       pPart,              /* the plaintext data */
414   CK_ULONG          ulPartLen,          /* plaintext data len */
415   CK_BYTE_PTR       pEncryptedPart,     /* gets ciphertext */
416   CK_ULONG_PTR      pulEncryptedPartLen /* gets c-text size */
417 );
418 #endif
419 
420 
421 /* C_EncryptFinal finishes a multiple-part encryption
422  * operation.
423  */
424 CK_PKCS11_FUNCTION_INFO(C_EncryptFinal)
425 #ifdef CK_NEED_ARG_LIST
426 (
427   CK_SESSION_HANDLE hSession,                /* session handle */
428   CK_BYTE_PTR       pLastEncryptedPart,      /* last c-text */
429   CK_ULONG_PTR      pulLastEncryptedPartLen  /* gets last size */
430 );
431 #endif
432 
433 
434 /* C_DecryptInit initializes a decryption operation. */
435 CK_PKCS11_FUNCTION_INFO(C_DecryptInit)
436 #ifdef CK_NEED_ARG_LIST
437 (
438   CK_SESSION_HANDLE hSession,    /* the session's handle */
439   CK_MECHANISM_PTR  pMechanism,  /* the decryption mechanism */
440   CK_OBJECT_HANDLE  hKey         /* handle of decryption key */
441 );
442 #endif
443 
444 
445 /* C_Decrypt decrypts encrypted data in a single part. */
446 CK_PKCS11_FUNCTION_INFO(C_Decrypt)
447 #ifdef CK_NEED_ARG_LIST
448 (
449   CK_SESSION_HANDLE hSession,           /* session's handle */
450   CK_BYTE_PTR       pEncryptedData,     /* ciphertext */
451   CK_ULONG          ulEncryptedDataLen, /* ciphertext length */
452   CK_BYTE_PTR       pData,              /* gets plaintext */
453   CK_ULONG_PTR      pulDataLen          /* gets p-text size */
454 );
455 #endif
456 
457 
458 /* C_DecryptUpdate continues a multiple-part decryption
459  * operation.
460  */
461 CK_PKCS11_FUNCTION_INFO(C_DecryptUpdate)
462 #ifdef CK_NEED_ARG_LIST
463 (
464   CK_SESSION_HANDLE hSession,            /* session's handle */
465   CK_BYTE_PTR       pEncryptedPart,      /* encrypted data */
466   CK_ULONG          ulEncryptedPartLen,  /* input length */
467   CK_BYTE_PTR       pPart,               /* gets plaintext */
468   CK_ULONG_PTR      pulPartLen           /* p-text size */
469 );
470 #endif
471 
472 
473 /* C_DecryptFinal finishes a multiple-part decryption
474  * operation.
475  */
476 CK_PKCS11_FUNCTION_INFO(C_DecryptFinal)
477 #ifdef CK_NEED_ARG_LIST
478 (
479   CK_SESSION_HANDLE hSession,       /* the session's handle */
480   CK_BYTE_PTR       pLastPart,      /* gets plaintext */
481   CK_ULONG_PTR      pulLastPartLen  /* p-text size */
482 );
483 #endif
484 
485 
486 
487 /* Message digesting */
488 
489 /* C_DigestInit initializes a message-digesting operation. */
490 CK_PKCS11_FUNCTION_INFO(C_DigestInit)
491 #ifdef CK_NEED_ARG_LIST
492 (
493   CK_SESSION_HANDLE hSession,   /* the session's handle */
494   CK_MECHANISM_PTR  pMechanism  /* the digesting mechanism */
495 );
496 #endif
497 
498 
499 /* C_Digest digests data in a single part. */
500 CK_PKCS11_FUNCTION_INFO(C_Digest)
501 #ifdef CK_NEED_ARG_LIST
502 (
503   CK_SESSION_HANDLE hSession,     /* the session's handle */
504   CK_BYTE_PTR       pData,        /* data to be digested */
505   CK_ULONG          ulDataLen,    /* bytes of data to digest */
506   CK_BYTE_PTR       pDigest,      /* gets the message digest */
507   CK_ULONG_PTR      pulDigestLen  /* gets digest length */
508 );
509 #endif
510 
511 
512 /* C_DigestUpdate continues a multiple-part message-digesting
513  * operation.
514  */
515 CK_PKCS11_FUNCTION_INFO(C_DigestUpdate)
516 #ifdef CK_NEED_ARG_LIST
517 (
518   CK_SESSION_HANDLE hSession,  /* the session's handle */
519   CK_BYTE_PTR       pPart,     /* data to be digested */
520   CK_ULONG          ulPartLen  /* bytes of data to be digested */
521 );
522 #endif
523 
524 
525 /* C_DigestKey continues a multi-part message-digesting
526  * operation, by digesting the value of a secret key as part of
527  * the data already digested.
528  */
529 CK_PKCS11_FUNCTION_INFO(C_DigestKey)
530 #ifdef CK_NEED_ARG_LIST
531 (
532   CK_SESSION_HANDLE hSession,  /* the session's handle */
533   CK_OBJECT_HANDLE  hKey       /* secret key to digest */
534 );
535 #endif
536 
537 
538 /* C_DigestFinal finishes a multiple-part message-digesting
539  * operation.
540  */
541 CK_PKCS11_FUNCTION_INFO(C_DigestFinal)
542 #ifdef CK_NEED_ARG_LIST
543 (
544   CK_SESSION_HANDLE hSession,     /* the session's handle */
545   CK_BYTE_PTR       pDigest,      /* gets the message digest */
546   CK_ULONG_PTR      pulDigestLen  /* gets byte count of digest */
547 );
548 #endif
549 
550 
551 
552 /* Signing and MACing */
553 
554 /* C_SignInit initializes a signature (private key encryption)
555  * operation, where the signature is (will be) an appendix to
556  * the data, and plaintext cannot be recovered from the
557  * signature.
558  */
559 CK_PKCS11_FUNCTION_INFO(C_SignInit)
560 #ifdef CK_NEED_ARG_LIST
561 (
562   CK_SESSION_HANDLE hSession,    /* the session's handle */
563   CK_MECHANISM_PTR  pMechanism,  /* the signature mechanism */
564   CK_OBJECT_HANDLE  hKey         /* handle of signature key */
565 );
566 #endif
567 
568 
569 /* C_Sign signs (encrypts with private key) data in a single
570  * part, where the signature is (will be) an appendix to the
571  * data, and plaintext cannot be recovered from the signature.
572  */
573 CK_PKCS11_FUNCTION_INFO(C_Sign)
574 #ifdef CK_NEED_ARG_LIST
575 (
576   CK_SESSION_HANDLE hSession,        /* the session's handle */
577   CK_BYTE_PTR       pData,           /* the data to sign */
578   CK_ULONG          ulDataLen,       /* count of bytes to sign */
579   CK_BYTE_PTR       pSignature,      /* gets the signature */
580   CK_ULONG_PTR      pulSignatureLen  /* gets signature length */
581 );
582 #endif
583 
584 
585 /* C_SignUpdate continues a multiple-part signature operation,
586  * where the signature is (will be) an appendix to the data,
587  * and plaintext cannot be recovered from the signature.
588  */
589 CK_PKCS11_FUNCTION_INFO(C_SignUpdate)
590 #ifdef CK_NEED_ARG_LIST
591 (
592   CK_SESSION_HANDLE hSession,  /* the session's handle */
593   CK_BYTE_PTR       pPart,     /* the data to sign */
594   CK_ULONG          ulPartLen  /* count of bytes to sign */
595 );
596 #endif
597 
598 
599 /* C_SignFinal finishes a multiple-part signature operation,
600  * returning the signature.
601  */
602 CK_PKCS11_FUNCTION_INFO(C_SignFinal)
603 #ifdef CK_NEED_ARG_LIST
604 (
605   CK_SESSION_HANDLE hSession,        /* the session's handle */
606   CK_BYTE_PTR       pSignature,      /* gets the signature */
607   CK_ULONG_PTR      pulSignatureLen  /* gets signature length */
608 );
609 #endif
610 
611 
612 /* C_SignRecoverInit initializes a signature operation, where
613  * the data can be recovered from the signature.
614  */
615 CK_PKCS11_FUNCTION_INFO(C_SignRecoverInit)
616 #ifdef CK_NEED_ARG_LIST
617 (
618   CK_SESSION_HANDLE hSession,   /* the session's handle */
619   CK_MECHANISM_PTR  pMechanism, /* the signature mechanism */
620   CK_OBJECT_HANDLE  hKey        /* handle of the signature key */
621 );
622 #endif
623 
624 
625 /* C_SignRecover signs data in a single operation, where the
626  * data can be recovered from the signature.
627  */
628 CK_PKCS11_FUNCTION_INFO(C_SignRecover)
629 #ifdef CK_NEED_ARG_LIST
630 (
631   CK_SESSION_HANDLE hSession,        /* the session's handle */
632   CK_BYTE_PTR       pData,           /* the data to sign */
633   CK_ULONG          ulDataLen,       /* count of bytes to sign */
634   CK_BYTE_PTR       pSignature,      /* gets the signature */
635   CK_ULONG_PTR      pulSignatureLen  /* gets signature length */
636 );
637 #endif
638 
639 
640 
641 /* Verifying signatures and MACs */
642 
643 /* C_VerifyInit initializes a verification operation, where the
644  * signature is an appendix to the data, and plaintext cannot
645  * cannot be recovered from the signature (e.g. DSA).
646  */
647 CK_PKCS11_FUNCTION_INFO(C_VerifyInit)
648 #ifdef CK_NEED_ARG_LIST
649 (
650   CK_SESSION_HANDLE hSession,    /* the session's handle */
651   CK_MECHANISM_PTR  pMechanism,  /* the verification mechanism */
652   CK_OBJECT_HANDLE  hKey         /* verification key */
653 );
654 #endif
655 
656 
657 /* C_Verify verifies a signature in a single-part operation,
658  * where the signature is an appendix to the data, and plaintext
659  * cannot be recovered from the signature.
660  */
661 CK_PKCS11_FUNCTION_INFO(C_Verify)
662 #ifdef CK_NEED_ARG_LIST
663 (
664   CK_SESSION_HANDLE hSession,       /* the session's handle */
665   CK_BYTE_PTR       pData,          /* signed data */
666   CK_ULONG          ulDataLen,      /* length of signed data */
667   CK_BYTE_PTR       pSignature,     /* signature */
668   CK_ULONG          ulSignatureLen  /* signature length*/
669 );
670 #endif
671 
672 
673 /* C_VerifyUpdate continues a multiple-part verification
674  * operation, where the signature is an appendix to the data,
675  * and plaintext cannot be recovered from the signature.
676  */
677 CK_PKCS11_FUNCTION_INFO(C_VerifyUpdate)
678 #ifdef CK_NEED_ARG_LIST
679 (
680   CK_SESSION_HANDLE hSession,  /* the session's handle */
681   CK_BYTE_PTR       pPart,     /* signed data */
682   CK_ULONG          ulPartLen  /* length of signed data */
683 );
684 #endif
685 
686 
687 /* C_VerifyFinal finishes a multiple-part verification
688  * operation, checking the signature.
689  */
690 CK_PKCS11_FUNCTION_INFO(C_VerifyFinal)
691 #ifdef CK_NEED_ARG_LIST
692 (
693   CK_SESSION_HANDLE hSession,       /* the session's handle */
694   CK_BYTE_PTR       pSignature,     /* signature to verify */
695   CK_ULONG          ulSignatureLen  /* signature length */
696 );
697 #endif
698 
699 
700 /* C_VerifyRecoverInit initializes a signature verification
701  * operation, where the data is recovered from the signature.
702  */
703 CK_PKCS11_FUNCTION_INFO(C_VerifyRecoverInit)
704 #ifdef CK_NEED_ARG_LIST
705 (
706   CK_SESSION_HANDLE hSession,    /* the session's handle */
707   CK_MECHANISM_PTR  pMechanism,  /* the verification mechanism */
708   CK_OBJECT_HANDLE  hKey         /* verification key */
709 );
710 #endif
711 
712 
713 /* C_VerifyRecover verifies a signature in a single-part
714  * operation, where the data is recovered from the signature.
715  */
716 CK_PKCS11_FUNCTION_INFO(C_VerifyRecover)
717 #ifdef CK_NEED_ARG_LIST
718 (
719   CK_SESSION_HANDLE hSession,        /* the session's handle */
720   CK_BYTE_PTR       pSignature,      /* signature to verify */
721   CK_ULONG          ulSignatureLen,  /* signature length */
722   CK_BYTE_PTR       pData,           /* gets signed data */
723   CK_ULONG_PTR      pulDataLen       /* gets signed data len */
724 );
725 #endif
726 
727 
728 
729 /* Dual-function cryptographic operations */
730 
731 /* C_DigestEncryptUpdate continues a multiple-part digesting
732  * and encryption operation.
733  */
734 CK_PKCS11_FUNCTION_INFO(C_DigestEncryptUpdate)
735 #ifdef CK_NEED_ARG_LIST
736 (
737   CK_SESSION_HANDLE hSession,            /* session's handle */
738   CK_BYTE_PTR       pPart,               /* the plaintext data */
739   CK_ULONG          ulPartLen,           /* plaintext length */
740   CK_BYTE_PTR       pEncryptedPart,      /* gets ciphertext */
741   CK_ULONG_PTR      pulEncryptedPartLen  /* gets c-text length */
742 );
743 #endif
744 
745 
746 /* C_DecryptDigestUpdate continues a multiple-part decryption and
747  * digesting operation.
748  */
749 CK_PKCS11_FUNCTION_INFO(C_DecryptDigestUpdate)
750 #ifdef CK_NEED_ARG_LIST
751 (
752   CK_SESSION_HANDLE hSession,            /* session's handle */
753   CK_BYTE_PTR       pEncryptedPart,      /* ciphertext */
754   CK_ULONG          ulEncryptedPartLen,  /* ciphertext length */
755   CK_BYTE_PTR       pPart,               /* gets plaintext */
756   CK_ULONG_PTR      pulPartLen           /* gets plaintext len */
757 );
758 #endif
759 
760 
761 /* C_SignEncryptUpdate continues a multiple-part signing and
762  * encryption operation.
763  */
764 CK_PKCS11_FUNCTION_INFO(C_SignEncryptUpdate)
765 #ifdef CK_NEED_ARG_LIST
766 (
767   CK_SESSION_HANDLE hSession,            /* session's handle */
768   CK_BYTE_PTR       pPart,               /* the plaintext data */
769   CK_ULONG          ulPartLen,           /* plaintext length */
770   CK_BYTE_PTR       pEncryptedPart,      /* gets ciphertext */
771   CK_ULONG_PTR      pulEncryptedPartLen  /* gets c-text length */
772 );
773 #endif
774 
775 
776 /* C_DecryptVerifyUpdate continues a multiple-part decryption and
777  * verify operation.
778  */
779 CK_PKCS11_FUNCTION_INFO(C_DecryptVerifyUpdate)
780 #ifdef CK_NEED_ARG_LIST
781 (
782   CK_SESSION_HANDLE hSession,            /* session's handle */
783   CK_BYTE_PTR       pEncryptedPart,      /* ciphertext */
784   CK_ULONG          ulEncryptedPartLen,  /* ciphertext length */
785   CK_BYTE_PTR       pPart,               /* gets plaintext */
786   CK_ULONG_PTR      pulPartLen           /* gets p-text length */
787 );
788 #endif
789 
790 
791 
792 /* Key management */
793 
794 /* C_GenerateKey generates a secret key, creating a new key
795  * object.
796  */
797 CK_PKCS11_FUNCTION_INFO(C_GenerateKey)
798 #ifdef CK_NEED_ARG_LIST
799 (
800   CK_SESSION_HANDLE    hSession,    /* the session's handle */
801   CK_MECHANISM_PTR     pMechanism,  /* key generation mech. */
802   CK_ATTRIBUTE_PTR     pTemplate,   /* template for new key */
803   CK_ULONG             ulCount,     /* # of attrs in template */
804   CK_OBJECT_HANDLE_PTR phKey        /* gets handle of new key */
805 );
806 #endif
807 
808 
809 /* C_GenerateKeyPair generates a public-key/private-key pair,
810  * creating new key objects.
811  */
812 CK_PKCS11_FUNCTION_INFO(C_GenerateKeyPair)
813 #ifdef CK_NEED_ARG_LIST
814 (
815   CK_SESSION_HANDLE    hSession,                    /* session handle */
816   CK_MECHANISM_PTR     pMechanism,                  /* key-gen mech. */
817   CK_ATTRIBUTE_PTR     pPublicKeyTemplate,          /* template for pub. key */
818   CK_ULONG             ulPublicKeyAttributeCount,   /* # pub. attrs. */
819   CK_ATTRIBUTE_PTR     pPrivateKeyTemplate,         /* template for priv. key */
820   CK_ULONG             ulPrivateKeyAttributeCount,  /* # priv.  attrs. */
821   CK_OBJECT_HANDLE_PTR phPublicKey,                 /* gets pub. key handle */
822   CK_OBJECT_HANDLE_PTR phPrivateKey                 /* gets priv. key handle */
823 );
824 #endif
825 
826 
827 /* C_WrapKey wraps (i.e., encrypts) a key. */
828 CK_PKCS11_FUNCTION_INFO(C_WrapKey)
829 #ifdef CK_NEED_ARG_LIST
830 (
831   CK_SESSION_HANDLE hSession,        /* the session's handle */
832   CK_MECHANISM_PTR  pMechanism,      /* the wrapping mechanism */
833   CK_OBJECT_HANDLE  hWrappingKey,    /* wrapping key */
834   CK_OBJECT_HANDLE  hKey,            /* key to be wrapped */
835   CK_BYTE_PTR       pWrappedKey,     /* gets wrapped key */
836   CK_ULONG_PTR      pulWrappedKeyLen /* gets wrapped key size */
837 );
838 #endif
839 
840 
841 /* C_UnwrapKey unwraps (decrypts) a wrapped key, creating a new
842  * key object.
843  */
844 CK_PKCS11_FUNCTION_INFO(C_UnwrapKey)
845 #ifdef CK_NEED_ARG_LIST
846 (
847   CK_SESSION_HANDLE    hSession,          /* session's handle */
848   CK_MECHANISM_PTR     pMechanism,        /* unwrapping mech. */
849   CK_OBJECT_HANDLE     hUnwrappingKey,    /* unwrapping key */
850   CK_BYTE_PTR          pWrappedKey,       /* the wrapped key */
851   CK_ULONG             ulWrappedKeyLen,   /* wrapped key len */
852   CK_ATTRIBUTE_PTR     pTemplate,         /* new key template */
853   CK_ULONG             ulAttributeCount,  /* template length */
854   CK_OBJECT_HANDLE_PTR phKey              /* gets new handle */
855 );
856 #endif
857 
858 
859 /* C_DeriveKey derives a key from a base key, creating a new key
860  * object.
861  */
862 CK_PKCS11_FUNCTION_INFO(C_DeriveKey)
863 #ifdef CK_NEED_ARG_LIST
864 (
865   CK_SESSION_HANDLE    hSession,          /* session's handle */
866   CK_MECHANISM_PTR     pMechanism,        /* key deriv. mech. */
867   CK_OBJECT_HANDLE     hBaseKey,          /* base key */
868   CK_ATTRIBUTE_PTR     pTemplate,         /* new key template */
869   CK_ULONG             ulAttributeCount,  /* template length */
870   CK_OBJECT_HANDLE_PTR phKey              /* gets new handle */
871 );
872 #endif
873 
874 
875 
876 /* Random number generation */
877 
878 /* C_SeedRandom mixes additional seed material into the token's
879  * random number generator.
880  */
881 CK_PKCS11_FUNCTION_INFO(C_SeedRandom)
882 #ifdef CK_NEED_ARG_LIST
883 (
884   CK_SESSION_HANDLE hSession,  /* the session's handle */
885   CK_BYTE_PTR       pSeed,     /* the seed material */
886   CK_ULONG          ulSeedLen  /* length of seed material */
887 );
888 #endif
889 
890 
891 /* C_GenerateRandom generates random data. */
892 CK_PKCS11_FUNCTION_INFO(C_GenerateRandom)
893 #ifdef CK_NEED_ARG_LIST
894 (
895   CK_SESSION_HANDLE hSession,    /* the session's handle */
896   CK_BYTE_PTR       RandomData,  /* receives the random data */
897   CK_ULONG          ulRandomLen  /* # of bytes to generate */
898 );
899 #endif
900 
901 
902 
903 /* Parallel function management */
904 
905 /* C_GetFunctionStatus is a legacy function; it obtains an
906  * updated status of a function running in parallel with an
907  * application.
908  */
909 CK_PKCS11_FUNCTION_INFO(C_GetFunctionStatus)
910 #ifdef CK_NEED_ARG_LIST
911 (
912   CK_SESSION_HANDLE hSession  /* the session's handle */
913 );
914 #endif
915 
916 
917 /* C_CancelFunction is a legacy function; it cancels a function
918  * running in parallel.
919  */
920 CK_PKCS11_FUNCTION_INFO(C_CancelFunction)
921 #ifdef CK_NEED_ARG_LIST
922 (
923   CK_SESSION_HANDLE hSession  /* the session's handle */
924 );
925 #endif
926 
927 
928 /* C_WaitForSlotEvent waits for a slot event (token insertion,
929  * removal, etc.) to occur.
930  */
931 CK_PKCS11_FUNCTION_INFO(C_WaitForSlotEvent)
932 #ifdef CK_NEED_ARG_LIST
933 (
934   CK_FLAGS flags,        /* blocking/nonblocking flag */
935   CK_SLOT_ID_PTR pSlot,  /* location that receives the slot ID */
936   CK_VOID_PTR pRserved   /* reserved.  Should be NULL_PTR */
937 );
938 #endif
939