#ifndef _METAGLOBAL_H
#define _METAGLOBAL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <assert.h>
#include <pthread.h>
#include <synch.h>
#include <unistd.h>
#include <security/cryptoki.h>
#include <stdio.h>
#include <cryptoutil.h>
#include <pkcs11Session.h>
#include <pkcs11Slot.h>
#include <sys/crypto/ioctl.h>
#define INITIAL_ATTR_LEN 16
#define METASLOT_SLOTID 42
#define METASLOT_FRAMEWORK_ID 0
#define TRUE_STRING "true"
#define FALSE_STRING "false"
#define METASLOT_SESSION_MAGIC 0xECF00004
#define METASLOT_SESSION_BADMAGIC 0xBAD00004
#define METASLOT_OBJECT_MAGIC 0xECF0B004
#define METASLOT_OBJECT_BADMAGIC 0xBAD0B004
#define METASLOT_OPSTATE_MAGIC 0xECF09004
#define METASLOT_OPSTATE_BADMAGIC 0xBAD09004
#define IS_READ_ONLY_SESSION(session_flag) \
(!(session_flag & CKF_RW_SESSION))
#define MODE_SINGLE 0x0100
#define MODE_UPDATE 0x0200
#define MODE_UPDATE_WITHKEY 0x0400
#define MODE_FINAL 0x1000
#define METASLOT_CRYPTOKI_VERSION_MAJOR 2
#define METASLOT_CRYPTOKI_VERSION_MINOR 40
#define METASLOT_MANUFACTURER_ID "Sun Microsystems, Inc. "
#define METASLOT_LIBRARY_DESCRIPTION "Sun Metaslot "
#define METASLOT_LIBRARY_VERSION_MAJOR 1
#define METASLOT_LIBRARY_VERSION_MINOR 1
#define METASLOT_SLOT_DESCRIPTION "Sun Metaslot " \
" "
#define METASLOT_HARDWARE_VERSION_MAJOR 0
#define METASLOT_HARDWARE_VERSION_MINOR 0
#define METASLOT_FIRMWARE_VERSION_MAJOR 0
#define METASLOT_FIRMWARE_VERSION_MINOR 0
#define METASLOT_TOKEN_LABEL "Sun Metaslot "
#define METASLOT_TOKEN_MODEL "1.0 "
#define MAX_OBJ_TO_BE_FREED 300
#define MAX_SESSION_TO_BE_FREED 300
#define INSERT_INTO_LIST(list, item) \
{ \
if ((list) == NULL) { \
(item)->prev = NULL; \
(item)->next = NULL; \
(list) = (item); \
} else { \
(item)->next = (list); \
(item)->prev = NULL; \
(list)->prev = (item); \
(list) = (item); \
} \
}
#define REMOVE_FROM_LIST(list, item) \
{ \
\
if ((list) == item) { \
if ((item)->next == NULL) { \
(list) = NULL; \
} else { \
(item)->next->prev = NULL; \
(list) = (item)->next; \
} \
} else { \
\
if ((item)->next) { \
(item)->next->prev = item->prev; \
assert((item)->prev != NULL); \
(item)->prev->next = (item)->next; \
} else { \
assert((item)->prev != NULL); \
(item)->prev->next = NULL; \
} \
} \
}
#define OBJRELEASE(object) \
if (object != NULL) { \
(void) pthread_rwlock_unlock(&object->object_lock); \
}
#define REFRELEASE(session) \
if (session != NULL) { \
(void) pthread_rwlock_unlock(&session->session_lock); \
}
typedef enum {
FREE_UNCHECKED = 0,
FREE_DISABLED = 1,
FREE_ALLOWED_KEY = 2,
FREE_ENABLED = 3
} freeobject_state_t;
typedef struct _attr {
CK_ATTRIBUTE attribute;
boolean_t isMalloced;
boolean_t isCloneAttr;
boolean_t canBeEmptyValue;
boolean_t hasValueForClone;
CK_BBOOL generic_bbool;
CK_ULONG generic_ulong;
CK_BYTE generic_data[INITIAL_ATTR_LEN];
} generic_attr_t;
typedef struct slotobject slot_object_t;
typedef struct metasession meta_session_t;
typedef struct metaobject meta_object_t;
typedef struct metaopstate meta_opstate_t;
typedef struct slotsession {
CK_ULONG slotnum;
CK_SLOT_ID fw_st_id;
CK_SESSION_HANDLE hSession;
boolean_t is_dualop_capable;
CK_FLAGS session_flags;
struct slotsession *next;
struct slotsession *prev;
pthread_rwlock_t object_list_lock;
slot_object_t *object_list_head;
} slot_session_t;
struct slotobject {
CK_OBJECT_HANDLE hObject;
struct slotobject *next;
struct slotobject *prev;
slot_session_t *creator_session;
boolean_t isToken;
};
typedef struct mechinfo {
CK_ULONG slotnum;
boolean_t initialized;
boolean_t supported;
CK_MECHANISM_INFO mechanism_info;
} mechinfo_t;
typedef struct opinfo {
CK_FLAGS type;
slot_session_t *session;
mechinfo_t *stats;
} operation_info_t;
typedef struct find_objs_info {
boolean_t op_active;
meta_object_t **matched_objs;
int num_matched_objs;
int next_result_index;
} find_objs_info_t;
typedef struct mech_support_info {
CK_MECHANISM_TYPE mech;
mechinfo_t **supporting_slots;
unsigned long num_supporting_slots;
} mech_support_info_t;
typedef struct crypto_init {
CK_FLAGS optype;
struct metasession *session;
CK_MECHANISM *pMech;
struct metaobject *key;
CK_ULONG slotnum;
boolean_t done;
boolean_t app;
} crypto_init_t;
struct metasession {
ulong_t magic_marker;
pthread_rwlock_t session_lock;
pthread_mutex_t isClosingSession_lock;
boolean_t isClosingSession;
struct metasession *next;
struct metasession *prev;
CK_FLAGS session_flags;
operation_info_t op1;
mech_support_info_t mech_support_info;
pthread_rwlock_t object_list_lock;
meta_object_t *object_list_head;
find_objs_info_t find_objs_info;
crypto_init_t init;
};
struct metaobject {
ulong_t magic_marker;
pthread_rwlock_t object_lock;
pthread_mutex_t isClosingObject_lock;
boolean_t isClosingObject;
struct metaobject *next;
struct metaobject *prev;
meta_session_t *creator_session;
boolean_t isToken;
boolean_t isPrivate;
boolean_t isSensitive;
boolean_t isExtractable;
freeobject_state_t isFreeToken;
freeobject_state_t isFreeObject;
CK_ULONG master_clone_slotnum;
slot_object_t **clones;
boolean_t *tried_create_clone;
pthread_rwlock_t attribute_lock;
size_t num_attributes;
generic_attr_t *attributes;
pthread_mutex_t clone_create_lock;
size_t clone_template_size;
CK_ATTRIBUTE *clone_template;
};
typedef struct opstate_data {
CK_FLAGS op_type;
CK_ULONG op_slotnum;
CK_ULONG op_state_len;
boolean_t op_init_app;
boolean_t op_init_done;
} opstate_data_t;
struct metaopstate {
ulong_t magic_marker;
struct opstate_data state[1];
};
typedef struct sessionpool {
pthread_mutex_t list_lock;
slot_session_t *active_list_head;
slot_session_t *persist_list_head;
slot_session_t *idle_list_head;
boolean_t keep_one_alive;
int num_idle_sessions;
} session_pool_t;
typedef struct slotdata {
CK_SLOT_ID fw_st_id;
session_pool_t session_pool;
pthread_rwlock_t tokenobject_list_lock;
slot_object_t *tokenobject_list_head;
} slot_data_t;
typedef enum {
ALL_TOKEN = 0,
PUBLIC_TOKEN = 1,
PRIVATE_TOKEN = 2
} token_obj_type_t;
typedef struct _metaslot_config {
boolean_t keystore_token_specified;
CK_UTF8CHAR keystore_token[TOKEN_LABEL_SIZE + 1];
boolean_t keystore_slot_specified;
CK_UTF8CHAR keystore_slot[SLOT_DESCRIPTION_SIZE + 1];
boolean_t enabled_specified;
boolean_t enabled;
boolean_t auto_key_migrate_specified;
boolean_t auto_key_migrate;
} metaslot_config_t;
typedef struct obj_to_be_freed_list {
meta_object_t *first;
meta_object_t *last;
uint32_t count;
pthread_mutex_t obj_to_be_free_mutex;
} object_to_be_freed_list_t;
typedef struct ses_to_be_freed_list {
meta_session_t *first;
meta_session_t *last;
uint32_t count;
pthread_mutex_t ses_to_be_free_mutex;
} ses_to_be_freed_list_t;
typedef struct cipher_mechs_threshold {
int mech_type;
uint32_t mech_threshold;
} cipher_mechs_threshold_t;
extern metaslot_config_t metaslot_config;
extern boolean_t metaslot_enabled;
extern CK_SLOT_ID metaslot_keystore_slotid;
extern boolean_t metaslot_auto_key_migrate;
extern struct CK_FUNCTION_LIST metaslot_functionList;
extern pthread_mutex_t initmutex;
extern ses_to_be_freed_list_t ses_delay_freed;
extern object_to_be_freed_list_t obj_delay_freed;
extern void (*Tmp_GetThreshold)(void *);
extern CK_BBOOL falsevalue;
extern CK_BBOOL truevalue;
CK_RV meta_slotManager_initialize();
void meta_slotManager_finalize();
void meta_slotManager_find_object_token();
CK_RV meta_get_slot_session(CK_ULONG slotnum, slot_session_t **session,
CK_FLAGS flags);
void meta_release_slot_session(slot_session_t *session);
CK_RV meta_mechManager_initialize();
void meta_mechManager_finalize();
CK_RV meta_mechManager_get_mechs(CK_MECHANISM_TYPE *list, CK_ULONG *listsize);
CK_RV meta_mechManager_get_slots(mech_support_info_t *mech_support_info,
boolean_t force_update, CK_MECHANISM_INFO *mech_info);
CK_RV meta_mechManager_slot_supports_mech(CK_MECHANISM_TYPE mechanism,
CK_ULONG slotnum, boolean_t *supports, mechinfo_t **slot_info,
boolean_t force_update, CK_MECHANISM_INFO *mech_info);
CK_RV meta_operation_init(CK_FLAGS optype, meta_session_t *session,
CK_MECHANISM *pMechanism, meta_object_t *key);
CK_RV meta_operation_init_defer(CK_FLAGS optype, meta_session_t *session,
CK_MECHANISM *pMechanism, meta_object_t *key);
CK_RV meta_do_operation(CK_FLAGS optype, int mode,
meta_session_t *session, meta_object_t *object,
CK_BYTE *in, CK_ULONG inLen, CK_BYTE *out, CK_ULONG *outLen);
void meta_operation_cleanup(meta_session_t *session, CK_FLAGS optype,
boolean_t finished_normally);
CK_RV meta_generate_keys(meta_session_t *session, CK_MECHANISM *pMechanism,
CK_ATTRIBUTE *k1Template, CK_ULONG k1AttrCount, meta_object_t *key1,
CK_ATTRIBUTE *k2Template, CK_ULONG k2AttrCount, meta_object_t *key2);
CK_RV meta_wrap_key(meta_session_t *session,
CK_MECHANISM *pMechanism, meta_object_t *wrappingkey,
meta_object_t *inputkey,
CK_BYTE *wrapped_key, CK_ULONG *wrapped_key_len);
CK_RV meta_unwrap_key(meta_session_t *session,
CK_MECHANISM *pMechanism, meta_object_t *unwrapping_key,
CK_BYTE *wrapped_key, CK_ULONG wrapped_key_len,
CK_ATTRIBUTE *template, CK_ULONG template_size,
meta_object_t *unwrapped_key);
CK_RV meta_derive_key(meta_session_t *session, CK_MECHANISM *pMech,
meta_object_t *basekey1, meta_object_t *basekey2,
CK_OBJECT_HANDLE *phBaseKey2,
CK_ATTRIBUTE *pTemplate, CK_ULONG ulAttributeCount,
meta_object_t *newKey1, meta_object_t *newKey2,
meta_object_t *newKey3, meta_object_t *newKey4);
void get_user_metaslot_config();
CK_RV meta_sessionManager_initialize();
void meta_sessionManager_finalize();
CK_RV meta_handle2session(CK_SESSION_HANDLE hSession,
meta_session_t **session_p);
CK_RV meta_session_alloc(meta_session_t **newSession);
CK_RV meta_session_activate(meta_session_t *session);
CK_RV meta_session_deactivate(meta_session_t *session,
boolean_t have_sessionlist_lock);
void meta_session_dealloc(meta_session_t *session);
void meta_session_delay_free(meta_session_t *sp);
CK_RV meta_objectManager_initialize();
void meta_objectManager_finalize();
CK_RV meta_handle2object(CK_OBJECT_HANDLE hObject, meta_object_t **object);
CK_RV meta_object_alloc(meta_session_t *session, meta_object_t **object);
CK_RV meta_object_get_attr(slot_session_t *slot_session,
CK_OBJECT_HANDLE hObject, meta_object_t *object);
void meta_object_activate(meta_object_t *object);
CK_RV meta_object_deactivate(meta_object_t *object, boolean_t have_list_lock,
boolean_t have_object_lock);
CK_RV meta_object_dealloc(meta_session_t *session, meta_object_t *object,
boolean_t nukeSourceObj);
CK_RV meta_slot_object_alloc(slot_object_t **object);
void meta_slot_object_activate(slot_object_t *object, slot_session_t *session,
boolean_t isToken);
void meta_slot_object_deactivate(slot_object_t *object);
void meta_slot_object_dealloc(slot_object_t *object);
CK_RV meta_object_copyin(meta_object_t *object);
CK_RV meta_object_get_clone(meta_object_t *object,
CK_ULONG slot_num, slot_session_t *slot_session,
slot_object_t **clone);
meta_object_t *meta_object_find_by_handle(CK_OBJECT_HANDLE hObject,
CK_ULONG slotnum, boolean_t token_only);
CK_RV meta_token_object_deactivate(token_obj_type_t token_type);
void meta_object_delay_free(meta_object_t *objp);
boolean_t meta_freeobject_set(meta_object_t *object, CK_ATTRIBUTE *tmpl,
CK_ULONG tmpl_len, boolean_t create);
CK_RV meta_freetoken_set(CK_ULONG slot_num, CK_BBOOL *current_value,
CK_ATTRIBUTE *tmpl, CK_ULONG tmpl_len);
boolean_t meta_freeobject_check(meta_session_t *session, meta_object_t *obj,
CK_MECHANISM *pMech, CK_ATTRIBUTE *tmpl, CK_ULONG tmpl_len,
CK_KEY_TYPE keytype);
boolean_t meta_freeobject_clone(meta_session_t *session, meta_object_t *object);
CK_RV get_master_attributes_by_object(slot_session_t *session,
slot_object_t *slot_object, generic_attr_t **attributes,
size_t *num_attributes);
CK_RV get_master_attributes_by_template(
CK_ATTRIBUTE *template, CK_ULONG template_size,
generic_attr_t **attributes, size_t *num_attributes);
CK_RV get_master_template_by_type(CK_OBJECT_CLASS class, CK_ULONG subtype,
generic_attr_t **attributes, size_t *num_attributes);
CK_RV get_master_attributes_by_type(CK_OBJECT_CLASS class, CK_ULONG subtype,
generic_attr_t **attributes, size_t *num_attributes);
CK_RV get_master_attributes_by_duplication(
generic_attr_t *src_attrs, size_t num_src_attrs,
generic_attr_t **dst_attrs, size_t *num_dst_attrs);
void dealloc_attributes(generic_attr_t *attributes, size_t num_attributes);
CK_RV attribute_set_value(CK_ATTRIBUTE *new_attr,
generic_attr_t *attributes, size_t num_attributes);
boolean_t get_template_ulong(CK_ATTRIBUTE_TYPE type, CK_ATTRIBUTE *attributes,
CK_ULONG num_attributes, CK_ULONG *result);
boolean_t get_template_boolean(CK_ATTRIBUTE_TYPE type,
CK_ATTRIBUTE *attributes, CK_ULONG num_attributes, boolean_t *result);
int set_template_boolean(CK_ATTRIBUTE_TYPE type,
CK_ATTRIBUTE *attributes, CK_ULONG num_attributes, boolean_t local,
CK_BBOOL *value);
CK_ULONG get_keystore_slotnum(void);
CK_ULONG get_softtoken_slotnum(void);
CK_SLOT_ID meta_slotManager_get_framework_table_id(CK_ULONG slotnum);
CK_ULONG meta_slotManager_get_slotcount(void);
boolean_t meta_slotManager_token_write_protected(void);
boolean_t metaslot_logged_in();
void metaslot_set_logged_in_flag(boolean_t value);
CK_RV meta_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList);
CK_RV meta_Initialize(CK_VOID_PTR pInitArgs);
CK_RV meta_Finalize(CK_VOID_PTR pReserved);
CK_RV meta_GetInfo(CK_INFO_PTR pInfo);
CK_RV meta_GetSlotList(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList,
CK_ULONG_PTR pulCount);
CK_RV meta_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo);
CK_RV meta_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo);
CK_RV meta_GetMechanismList(CK_SLOT_ID slotID,
CK_MECHANISM_TYPE_PTR pMechanismList, CK_ULONG_PTR pulCount);
CK_RV meta_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type,
CK_MECHANISM_INFO_PTR pInfo);
CK_RV meta_InitToken(CK_SLOT_ID slotID, CK_UTF8CHAR_PTR pPin,
CK_ULONG ulPinLen, CK_UTF8CHAR_PTR pLabel);
CK_RV meta_InitPIN(CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pPin,
CK_ULONG ulPinLen);
CK_RV meta_SetPIN(CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pOldPin,
CK_ULONG ulOldPinLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewPinLen);
CK_RV meta_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags,
CK_VOID_PTR pApplication, CK_NOTIFY Notify,
CK_SESSION_HANDLE_PTR phSession);
CK_RV meta_CloseSession(CK_SESSION_HANDLE hSession);
CK_RV meta_CloseAllSessions(CK_SLOT_ID slotID);
CK_RV meta_GetSessionInfo(CK_SESSION_HANDLE hSession,
CK_SESSION_INFO_PTR pInfo);
CK_RV meta_GetOperationState(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pOperationState, CK_ULONG_PTR pulOperationStateLen);
CK_RV meta_SetOperationState(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pOperationState, CK_ULONG ulOperationStateLen,
CK_OBJECT_HANDLE hEncryptionKey, CK_OBJECT_HANDLE hAuthenticationKey);
CK_RV meta_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen);
CK_RV meta_Logout(CK_SESSION_HANDLE hSession);
CK_RV meta_CreateObject(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject);
CK_RV meta_CopyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount,
CK_OBJECT_HANDLE_PTR phNewObject);
CK_RV meta_DestroyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject);
CK_RV meta_GetObjectSize(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
CK_ULONG_PTR pulSize);
CK_RV meta_GetAttributeValue(CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
CK_RV meta_SetAttributeValue(CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
CK_RV meta_FindObjectsInit(CK_SESSION_HANDLE hSession,
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
CK_RV meta_FindObjects(CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE_PTR phObject, CK_ULONG ulMaxObjectCount,
CK_ULONG_PTR pulObjectCount);
CK_RV meta_FindObjectsFinal(CK_SESSION_HANDLE hSession);
CK_RV meta_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey);
CK_RV meta_Encrypt(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData, CK_ULONG ulDataLen,
CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen);
CK_RV meta_EncryptUpdate(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart, CK_ULONG ulPartLen,
CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen);
CK_RV meta_EncryptFinal(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen);
CK_RV meta_DecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey);
CK_RV meta_Decrypt(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen,
CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen);
CK_RV meta_DecryptUpdate(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen,
CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen);
CK_RV meta_DecryptFinal(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen);
CK_RV meta_DigestInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism);
CK_RV meta_Digest(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen);
CK_RV meta_DigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
CK_ULONG ulPartLen);
CK_RV meta_DigestKey(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey);
CK_RV meta_DigestFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest,
CK_ULONG_PTR pulDigestLen);
CK_RV meta_SignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey);
CK_RV meta_Sign(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData, CK_ULONG ulDataLen,
CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen);
CK_RV meta_SignUpdate(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart, CK_ULONG ulPartLen);
CK_RV meta_SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
CK_ULONG_PTR pulSignatureLen);
CK_RV meta_SignRecoverInit(CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey);
CK_RV meta_SignRecover(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen);
CK_RV meta_VerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey);
CK_RV meta_Verify(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen);
CK_RV meta_VerifyUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
CK_ULONG ulPartLen);
CK_RV meta_VerifyFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
CK_ULONG ulSignatureLen);
CK_RV meta_VerifyRecoverInit(CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey);
CK_RV meta_VerifyRecover(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
CK_ULONG ulSignatureLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen);
CK_RV meta_DigestEncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
CK_ULONG_PTR pulEncryptedPartLen);
CK_RV meta_DecryptDigestUpdate(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen,
CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen);
CK_RV meta_SignEncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
CK_ULONG_PTR pulEncryptedPartLen);
CK_RV meta_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen,
CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen);
CK_RV meta_GenerateKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey);
CK_RV meta_GenerateKeyPair(CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pPublicKeyTemplate,
CK_ULONG ulPublicKeyAttributeCount, CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
CK_ULONG ulPrivateKeyAttributeCount, CK_OBJECT_HANDLE_PTR phPublicKey,
CK_OBJECT_HANDLE_PTR phPrivateKey);
CK_RV meta_WrapKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey,
CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen);
CK_RV meta_UnwrapKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey,
CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey);
CK_RV meta_DeriveKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey);
CK_RV meta_SeedRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed,
CK_ULONG ulSeedLen);
CK_RV meta_GenerateRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pRandomData,
CK_ULONG ulRandomLen);
CK_RV meta_GetFunctionStatus(CK_SESSION_HANDLE hSession);
CK_RV meta_CancelFunction(CK_SESSION_HANDLE hSession);
CK_RV meta_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot,
CK_VOID_PTR pReserved);
#ifdef __cplusplus
}
#endif
#endif