# 
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# This file is in part derived from a file "pkcs11f.h" made available
# by RSA Security at ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-11/pkcs11f.h

# Fields
#  FUNCTION introduces a Cryptoki function
#  CK_type specifies and introduces an argument
#

# General-purpose

# C_Initialize initializes the Cryptoki library.
FUNCTION C_Initialize
CK_VOID_PTR pInitArgs   # if this is not NULL_PTR, it gets
                        # cast to CK_C_INITIALIZE_ARGS_PTR
                        # and dereferenced

# C_Finalize indicates that an application is done with the
# Cryptoki library.
FUNCTION C_Finalize
CK_VOID_PTR pReserved   # reserved.  Should be NULL_PTR

# C_GetInfo returns general information about Cryptoki. 
FUNCTION C_GetInfo
CK_INFO_PTR pInfo       # location that receives information

# C_GetFunctionList returns the function list. 
FUNCTION C_GetFunctionList
CK_FUNCTION_LIST_PTR_PTR ppFunctionList # receives pointer to function 
                                        # list


# Slot and token management 

# C_GetSlotList obtains a list of slots in the system. 
FUNCTION C_GetSlotList
CK_BBOOL       tokenPresent # only slots with tokens? 
CK_SLOT_ID_PTR pSlotList    # receives array of slot IDs 
CK_ULONG_PTR   pulCount     # receives number of slots 

# C_GetSlotInfo obtains information about a particular slot in the 
# system.
FUNCTION C_GetSlotInfo
CK_SLOT_ID       slotID     # the ID of the slot 
CK_SLOT_INFO_PTR pInfo      # receives the slot information 

# C_GetTokenInfo obtains information about a particular token in the 
# system. 
FUNCTION C_GetTokenInfo
CK_SLOT_ID        slotID    # ID of the token's slot 
CK_TOKEN_INFO_PTR pInfo     # receives the token information 

# C_GetMechanismList obtains a list of mechanism types supported by a 
# token. 
FUNCTION C_GetMechanismList
CK_SLOT_ID            slotID            # ID of token's slot 
CK_MECHANISM_TYPE_PTR pMechanismList    # gets mech. array 
CK_ULONG_PTR          pulCount          # gets # of mechs. 

# C_GetMechanismInfo obtains information about a particular mechanism 
# possibly supported by a token. 
FUNCTION C_GetMechanismInfo
CK_SLOT_ID            slotID    # ID of the token's slot 
CK_MECHANISM_TYPE     type      # type of mechanism 
CK_MECHANISM_INFO_PTR pInfo     # receives mechanism info 

# C_InitToken initializes a token. 
FUNCTION C_InitToken
CK_SLOT_ID  slotID      # ID of the token's slot 
CK_CHAR_PTR pPin        # the SO's initial PIN 
CK_ULONG    ulPinLen    # length in bytes of the PIN 
CK_CHAR_PTR pLabel      # 32-byte token label (blank padded) 

# C_InitPIN initializes the normal user's PIN. 
FUNCTION C_InitPIN
CK_SESSION_HANDLE hSession  # the session's handle 
CK_CHAR_PTR       pPin      # the normal user's PIN 
CK_ULONG          ulPinLen  # length in bytes of the PIN 

# C_SetPIN modifies the PIN of the user who is logged in. 
FUNCTION C_SetPIN
CK_SESSION_HANDLE hSession  # the session's handle 
CK_CHAR_PTR       pOldPin   # the old PIN 
CK_ULONG          ulOldLen  # length of the old PIN 
CK_CHAR_PTR       pNewPin   # the new PIN 
CK_ULONG          ulNewLen  # length of the new PIN 


# Session management 

# C_OpenSession opens a session between an application and a token. 
FUNCTION C_OpenSession
CK_SLOT_ID            slotID        # the slot's ID 
CK_FLAGS              flags         # from CK_SESSION_INFO 
CK_VOID_PTR           pApplication  # passed to callback 
CK_NOTIFY             Notify        # callback function 
CK_SESSION_HANDLE_PTR phSession     # gets session handle 

# C_CloseSession closes a session between an application and a token. 
FUNCTION C_CloseSession
CK_SESSION_HANDLE hSession  # the session's handle 

# C_CloseAllSessions closes all sessions with a token. 
FUNCTION C_CloseAllSessions
CK_SLOT_ID slotID   # the token's slot 

# C_GetSessionInfo obtains information about the session. 
FUNCTION C_GetSessionInfo
CK_SESSION_HANDLE   hSession    # the session's handle 
CK_SESSION_INFO_PTR pInfo       # receives session info 

# C_GetOperationState obtains the state of the cryptographic 
# operation in a session. 
FUNCTION C_GetOperationState
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pOperationState       # gets state 
CK_ULONG_PTR      pulOperationStateLen  # gets state length 

# C_SetOperationState restores the state of the cryptographic 
# operation in a session. 
FUNCTION C_SetOperationState
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR      pOperationState        # holds state 
CK_ULONG         ulOperationStateLen    # holds state length 
CK_OBJECT_HANDLE hEncryptionKey         # en/decryption key 
CK_OBJECT_HANDLE hAuthenticationKey     # sign/verify key 

# C_Login logs a user into a token. 
FUNCTION C_Login
CK_SESSION_HANDLE hSession  # the session's handle 
CK_USER_TYPE      userType  # the user type 
CK_CHAR_PTR       pPin      # the user's PIN 
CK_ULONG          ulPinLen  # the length of the PIN 

# C_Logout logs a user out from a token. 
FUNCTION C_Logout
CK_SESSION_HANDLE hSession  # the session's handle 


# Object management 

# C_CreateObject creates a new object. 
FUNCTION C_CreateObject
CK_SESSION_HANDLE    hSession   # the session's handle 
CK_ATTRIBUTE_PTR     pTemplate  # the object's template 
CK_ULONG             ulCount    # attributes in template 
CK_OBJECT_HANDLE_PTR phObject   # gets new object's handle. 

# C_CopyObject copies an object, creating a new object for the copy.
FUNCTION C_CopyObject
CK_SESSION_HANDLE    hSession       # the session's handle 
CK_OBJECT_HANDLE     hObject        # the object's handle 
CK_ATTRIBUTE_PTR     pTemplate      # template for new object 
CK_ULONG             ulCount        # attributes in template 
CK_OBJECT_HANDLE_PTR phNewObject    # receives handle of copy 

# C_DestroyObject destroys an object. 
FUNCTION C_DestroyObject
CK_SESSION_HANDLE hSession  # the session's handle 
CK_OBJECT_HANDLE  hObject   # the object's handle 

# C_GetObjectSize gets the size of an object in bytes. 
FUNCTION C_GetObjectSize
CK_SESSION_HANDLE hSession  # the session's handle 
CK_OBJECT_HANDLE  hObject   # the object's handle 
CK_ULONG_PTR      pulSize   # receives size of object 

# C_GetAttributeValue obtains the value of one or more object 
# attributes. 
FUNCTION C_GetAttributeValue
CK_SESSION_HANDLE hSession    # the session's handle 
CK_OBJECT_HANDLE  hObject     # the object's handle 
CK_ATTRIBUTE_PTR  pTemplate   # specifies attrs; gets vals 
CK_ULONG          ulCount     # attributes in template 

# C_SetAttributeValue modifies the value of one or more object 
# attributes 
FUNCTION C_SetAttributeValue
CK_SESSION_HANDLE hSession    # the session's handle 
CK_OBJECT_HANDLE  hObject     # the object's handle 
CK_ATTRIBUTE_PTR  pTemplate   # specifies attrs and values 
CK_ULONG          ulCount     # attributes in template 

# C_FindObjectsInit initializes a search for token and session 
# objects that match a template. 
FUNCTION C_FindObjectsInit
CK_SESSION_HANDLE hSession    # the session's handle 
CK_ATTRIBUTE_PTR  pTemplate   # attribute values to match 
CK_ULONG          ulCount     # attrs in search template 

# C_FindObjects continues a search for token and session objects that 
# match a template, obtaining additional object handles. 
FUNCTION C_FindObjects
CK_SESSION_HANDLE    hSession           # session's handle 
CK_OBJECT_HANDLE_PTR phObject           # gets obj. handles 
CK_ULONG             ulMaxObjectCount   # max handles to get 
CK_ULONG_PTR         pulObjectCount     # actual # returned 

# C_FindObjectsFinal finishes a search for token and session objects. 
FUNCTION C_FindObjectsFinal
CK_SESSION_HANDLE hSession  # the session's handle 


# Encryption and decryption 

# C_EncryptInit initializes an encryption operation. 
FUNCTION C_EncryptInit
CK_SESSION_HANDLE hSession    # the session's handle 
CK_MECHANISM_PTR  pMechanism  # the encryption mechanism 
CK_OBJECT_HANDLE  hKey        # handle of encryption key 

# C_Encrypt encrypts single-part data. 
FUNCTION C_Encrypt
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pData                 # the plaintext data 
CK_ULONG          ulDataLen             # bytes of plaintext 
CK_BYTE_PTR       pEncryptedData        # gets ciphertext 
CK_ULONG_PTR      pulEncryptedDataLen   # gets c-text size 

# C_EncryptUpdate continues a multiple-part encryption operation. 
FUNCTION C_EncryptUpdate
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pPart                 # the plaintext data 
CK_ULONG          ulPartLen             # plaintext data len 
CK_BYTE_PTR       pEncryptedPart        # gets ciphertext 
CK_ULONG_PTR      pulEncryptedPartLen   # gets c-text size 

# C_EncryptFinal finishes a multiple-part encryption operation. 
FUNCTION C_EncryptFinal
CK_SESSION_HANDLE hSession                  # session handle 
CK_BYTE_PTR       pLastEncryptedPart        # last c-text 
CK_ULONG_PTR      pulLastEncryptedPartLen   # gets last size 

# C_DecryptInit initializes a decryption operation. 
FUNCTION C_DecryptInit
CK_SESSION_HANDLE hSession      # the session's handle 
CK_MECHANISM_PTR  pMechanism    # the decryption mechanism 
CK_OBJECT_HANDLE  hKey          # handle of decryption key 

# C_Decrypt decrypts encrypted data in a single part. 
FUNCTION C_Decrypt
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pEncryptedData        # ciphertext 
CK_ULONG          ulEncryptedDataLen    # ciphertext length 
CK_BYTE_PTR       pData                 # gets plaintext 
CK_ULONG_PTR      pulDataLen            # gets p-text size 

# C_DecryptUpdate continues a multiple-part decryption operation. 
FUNCTION C_DecryptUpdate
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pEncryptedPart        # encrypted data 
CK_ULONG          ulEncryptedPartLen    # input length 
CK_BYTE_PTR       pPart                 # gets plaintext 
CK_ULONG_PTR      pulPartLen            # p-text size 

# C_DecryptFinal finishes a multiple-part decryption operation. 
FUNCTION C_DecryptFinal
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pLastPart         # gets plaintext 
CK_ULONG_PTR      pulLastPartLen    # p-text size 


# Message digesting 

# C_DigestInit initializes a message-digesting operation. 
FUNCTION C_DigestInit
CK_SESSION_HANDLE hSession      # the session's handle 
CK_MECHANISM_PTR  pMechanism    # the digesting mechanism 

# C_Digest digests data in a single part. 
FUNCTION C_Digest
CK_SESSION_HANDLE hSession      # the session's handle 
CK_BYTE_PTR       pData         # data to be digested 
CK_ULONG          ulDataLen     # bytes of data to digest 
CK_BYTE_PTR       pDigest       # gets the message digest 
CK_ULONG_PTR      pulDigestLen  # gets digest length 

# C_DigestUpdate continues a multiple-part message-digesting operation.
FUNCTION C_DigestUpdate
CK_SESSION_HANDLE hSession  # the session's handle 
CK_BYTE_PTR       pPart     # data to be digested 
CK_ULONG          ulPartLen # bytes of data to be digested 

# C_DigestKey continues a multi-part message-digesting operation, by 
# digesting the value of a secret key as part of the data already 
# digested. 
FUNCTION C_DigestKey
CK_SESSION_HANDLE hSession  # the session's handle 
CK_OBJECT_HANDLE  hKey      # secret key to digest 

# C_DigestFinal finishes a multiple-part message-digesting operation. 
FUNCTION C_DigestFinal
CK_SESSION_HANDLE hSession      # the session's handle 
CK_BYTE_PTR       pDigest       # gets the message digest 
CK_ULONG_PTR      pulDigestLen  # gets byte count of digest 


# Signing and MACing 

# C_SignInit initializes a signature (private key encryption) 
# operation, where the signature is (will be) an appendix to the 
# data, and plaintext cannot be recovered from the signature. 
FUNCTION C_SignInit
CK_SESSION_HANDLE hSession      # the session's handle 
CK_MECHANISM_PTR  pMechanism    # the signature mechanism 
CK_OBJECT_HANDLE  hKey          # handle of signature key 

# C_Sign signs (encrypts with private key) data in a single part, 
# where the signature is (will be) an appendix to the data, and 
# plaintext cannot be recovered from the signature. 
FUNCTION C_Sign
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pData             # the data to sign 
CK_ULONG          ulDataLen         # count of bytes to sign 
CK_BYTE_PTR       pSignature        # gets the signature 
CK_ULONG_PTR      pulSignatureLen   # gets signature length 

# C_SignUpdate continues a multiple-part signature operation, where 
# the signature is (will be) an appendix to the data, and plaintext 
# cannot be recovered from the signature. 
FUNCTION C_SignUpdate
CK_SESSION_HANDLE hSession  # the session's handle 
CK_BYTE_PTR       pPart     # the data to sign 
CK_ULONG          ulPartLen # count of bytes to sign 

# C_SignFinal finishes a multiple-part signature operation, returning 
# the signature. 
FUNCTION C_SignFinal
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pSignature        # gets the signature 
CK_ULONG_PTR      pulSignatureLen   # gets signature length 

# C_SignRecoverInit initializes a signature operation, where the data 
# can be recovered from the signature. 
FUNCTION C_SignRecoverInit
CK_SESSION_HANDLE hSession      # the session's handle 
CK_MECHANISM_PTR  pMechanism    # the signature mechanism 
CK_OBJECT_HANDLE  hKey          # handle of the signature key 

# C_SignRecover signs data in a single operation, where the data can 
# be recovered from the signature. 
FUNCTION C_SignRecover
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pData             # the data to sign 
CK_ULONG          ulDataLen         # count of bytes to sign 
CK_BYTE_PTR       pSignature        # gets the signature 
CK_ULONG_PTR      pulSignatureLen   # gets signature length 


# Verifying signatures and MACs 

# C_VerifyInit initializes a verification operation, where the 
# signature is an appendix to the data, and plaintext cannot cannot 
# be recovered from the signature (e.g. DSA). 
FUNCTION C_VerifyInit
CK_SESSION_HANDLE hSession      # the session's handle 
CK_MECHANISM_PTR  pMechanism    # the verification mechanism 
CK_OBJECT_HANDLE  hKey          # verification key  

# C_Verify verifies a signature in a single-part operation, where the 
# signature is an appendix to the data, and plaintext cannot be 
# recovered from the signature. 
FUNCTION C_Verify
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pData             # signed data 
CK_ULONG          ulDataLen         # length of signed data 
CK_BYTE_PTR       pSignature        # signature 
CK_ULONG          ulSignatureLen    # signature length

# C_VerifyUpdate continues a multiple-part verification operation, 
# where the signature is an appendix to the data, and plaintext cannot be 
# recovered from the signature. 
FUNCTION C_VerifyUpdate
CK_SESSION_HANDLE hSession  # the session's handle 
CK_BYTE_PTR       pPart     # signed data 
CK_ULONG          ulPartLen # length of signed data 

# C_VerifyFinal finishes a multiple-part verification operation, 
# checking the signature. 
FUNCTION C_VerifyFinal
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pSignature        # signature to verify 
CK_ULONG          ulSignatureLen    # signature length 

# C_VerifyRecoverInit initializes a signature verification operation, 
# where the data is recovered from the signature. 
FUNCTION C_VerifyRecoverInit
CK_SESSION_HANDLE hSession      # the session's handle 
CK_MECHANISM_PTR  pMechanism    # the verification mechanism 
CK_OBJECT_HANDLE  hKey          # verification key 

# C_VerifyRecover verifies a signature in a single-part operation, 
# where the data is recovered from the signature. 
FUNCTION C_VerifyRecover
CK_SESSION_HANDLE hSession          # the session's handle 
CK_BYTE_PTR       pSignature        # signature to verify 
CK_ULONG          ulSignatureLen    # signature length 
CK_BYTE_PTR       pData             # gets signed data 
CK_ULONG_PTR      pulDataLen        # gets signed data len 


# Dual-function cryptographic operations 

# C_DigestEncryptUpdate continues a multiple-part digesting and 
# encryption operation. 
FUNCTION C_DigestEncryptUpdate
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pPart                 # the plaintext data 
CK_ULONG          ulPartLen             # plaintext length 
CK_BYTE_PTR       pEncryptedPart        # gets ciphertext 
CK_ULONG_PTR      pulEncryptedPartLen   # gets c-text length 

# C_DecryptDigestUpdate continues a multiple-part decryption and 
# digesting operation. 
FUNCTION C_DecryptDigestUpdate
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pEncryptedPart        # ciphertext 
CK_ULONG          ulEncryptedPartLen    # ciphertext length 
CK_BYTE_PTR       pPart                 # gets plaintext 
CK_ULONG_PTR      pulPartLen            # gets plaintext len 

# C_SignEncryptUpdate continues a multiple-part signing and 
# encryption operation. 
FUNCTION C_SignEncryptUpdate
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pPart                 # the plaintext data 
CK_ULONG          ulPartLen             # plaintext length 
CK_BYTE_PTR       pEncryptedPart        # gets ciphertext 
CK_ULONG_PTR      pulEncryptedPartLen   # gets c-text length 

# C_DecryptVerifyUpdate continues a multiple-part decryption and 
# verify operation. 
FUNCTION C_DecryptVerifyUpdate
CK_SESSION_HANDLE hSession              # session's handle 
CK_BYTE_PTR       pEncryptedPart        # ciphertext 
CK_ULONG          ulEncryptedPartLen    # ciphertext length 
CK_BYTE_PTR       pPart                 # gets plaintext 
CK_ULONG_PTR      pulPartLen            # gets p-text length 


# Key management 

# C_GenerateKey generates a secret key, creating a new key object. 
FUNCTION C_GenerateKey
CK_SESSION_HANDLE    hSession   # the session's handle 
CK_MECHANISM_PTR     pMechanism # key generation mech. 
CK_ATTRIBUTE_PTR     pTemplate  # template for new key 
CK_ULONG             ulCount    # # of attrs in template 
CK_OBJECT_HANDLE_PTR phKey      # gets handle of new key 

# C_GenerateKeyPair generates a public-key/private-key pair, creating 
# new key objects. 
FUNCTION C_GenerateKeyPair
CK_SESSION_HANDLE    hSession                   # session handle
CK_MECHANISM_PTR     pMechanism                 # key-gen mech.
CK_ATTRIBUTE_PTR     pPublicKeyTemplate         # template for pub. key
CK_ULONG             ulPublicKeyAttributeCount  # # pub. attrs.
CK_ATTRIBUTE_PTR     pPrivateKeyTemplate        # template for priv. key
CK_ULONG             ulPrivateKeyAttributeCount # # priv. attrs.
CK_OBJECT_HANDLE_PTR phPublicKey                # gets pub. key handle
CK_OBJECT_HANDLE_PTR phPrivateKey               # gets priv. key handle

# C_WrapKey wraps (i.e., encrypts) a key. 
FUNCTION C_WrapKey
CK_SESSION_HANDLE hSession         # the session's handle 
CK_MECHANISM_PTR  pMechanism       # the wrapping mechanism 
CK_OBJECT_HANDLE  hWrappingKey     # wrapping key 
CK_OBJECT_HANDLE  hKey             # key to be wrapped 
CK_BYTE_PTR       pWrappedKey      # gets wrapped key 
CK_ULONG_PTR      pulWrappedKeyLen # gets wrapped key size 

# C_UnwrapKey unwraps (decrypts) a wrapped key, creating a new key 
# object. 
FUNCTION C_UnwrapKey
CK_SESSION_HANDLE    hSession           # session's handle 
CK_MECHANISM_PTR     pMechanism         # unwrapping mech. 
CK_OBJECT_HANDLE     hUnwrappingKey     # unwrapping key 
CK_BYTE_PTR          pWrappedKey        # the wrapped key 
CK_ULONG             ulWrappedKeyLen    # wrapped key len 
CK_ATTRIBUTE_PTR     pTemplate          # new key template 
CK_ULONG             ulAttributeCount   # template length 
CK_OBJECT_HANDLE_PTR phKey              # gets new handle 

# C_DeriveKey derives a key from a base key, creating a new key object.
FUNCTION C_DeriveKey
CK_SESSION_HANDLE    hSession           # session's handle 
CK_MECHANISM_PTR     pMechanism         # key deriv. mech. 
CK_OBJECT_HANDLE     hBaseKey           # base key 
CK_ATTRIBUTE_PTR     pTemplate          # new key template 
CK_ULONG             ulAttributeCount   # template length 
CK_OBJECT_HANDLE_PTR phKey              # gets new handle 


# Random number generation 

# C_SeedRandom mixes additional seed material into the token's random 
# number generator. 
FUNCTION C_SeedRandom
CK_SESSION_HANDLE hSession  # the session's handle 
CK_BYTE_PTR       pSeed     # the seed material 
CK_ULONG          ulSeedLen # length of seed material 

# C_GenerateRandom generates random data. 
FUNCTION C_GenerateRandom
CK_SESSION_HANDLE hSession      # the session's handle 
CK_BYTE_PTR       RandomData    # receives the random data 
CK_ULONG          ulRandomLen   # # of bytes to generate 


# Parallel function management 

# C_GetFunctionStatus is a legacy function; it obtains an updated 
# status of a function running in parallel with an application.
FUNCTION C_GetFunctionStatus
CK_SESSION_HANDLE hSession  # the session's handle 

# C_CancelFunction is a legacy function; it cancels a function running 
# in parallel. 
FUNCTION C_CancelFunction
CK_SESSION_HANDLE hSession  # the session's handle 


# Functions added in for Cryptoki Version 2.01 or later 

# C_WaitForSlotEvent waits for a slot event (token insertion, removal, 
# etc.) to occur. 
FUNCTION C_WaitForSlotEvent
CK_FLAGS       flags    # blocking/nonblocking flag 
CK_SLOT_ID_PTR pSlot    # location that receives the slot ID 
CK_VOID_PTR    pRserved # reserved.  Should be NULL_PTR 

## C_ConfigureSlot passes an installation-specified bytestring to a 
## slot. 
#FUNCTION C_ConfigureSlot
#CK_SLOT_ID slotID      # the slot to configure 
#CK_BYTE_PTR pConfig    # the configuration string 
#CK_ULONG ulConfigLen   # length of the config string