1*00b67f09SDavid van Moolenbroek /* $NetBSD: pk11.h,v 1.1.1.4 2014/12/10 03:34:44 christos Exp $ */ 2*00b67f09SDavid van Moolenbroek 3*00b67f09SDavid van Moolenbroek /* 4*00b67f09SDavid van Moolenbroek * Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC") 5*00b67f09SDavid van Moolenbroek * 6*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any 7*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 8*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 9*00b67f09SDavid van Moolenbroek * 10*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 11*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 13*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE. 17*00b67f09SDavid van Moolenbroek */ 18*00b67f09SDavid van Moolenbroek 19*00b67f09SDavid van Moolenbroek #ifndef PK11_PK11_H 20*00b67f09SDavid van Moolenbroek #define PK11_PK11_H 1 21*00b67f09SDavid van Moolenbroek 22*00b67f09SDavid van Moolenbroek /*! \file pk11/pk11.h */ 23*00b67f09SDavid van Moolenbroek 24*00b67f09SDavid van Moolenbroek #include <isc/lang.h> 25*00b67f09SDavid van Moolenbroek #include <isc/magic.h> 26*00b67f09SDavid van Moolenbroek #include <isc/types.h> 27*00b67f09SDavid van Moolenbroek 28*00b67f09SDavid van Moolenbroek #define PK11_FATALCHECK(func, args) \ 29*00b67f09SDavid van Moolenbroek ((void) (((rv = (func) args) == CKR_OK) || \ 30*00b67f09SDavid van Moolenbroek ((pk11_error_fatalcheck)(__FILE__, __LINE__, #func, rv), 0))) 31*00b67f09SDavid van Moolenbroek 32*00b67f09SDavid van Moolenbroek #include <pkcs11/cryptoki.h> 33*00b67f09SDavid van Moolenbroek 34*00b67f09SDavid van Moolenbroek ISC_LANG_BEGINDECLS 35*00b67f09SDavid van Moolenbroek 36*00b67f09SDavid van Moolenbroek #define SES_MAGIC ISC_MAGIC('P','K','S','S') 37*00b67f09SDavid van Moolenbroek #define TOK_MAGIC ISC_MAGIC('P','K','T','K') 38*00b67f09SDavid van Moolenbroek 39*00b67f09SDavid van Moolenbroek #define VALID_SES(x) ISC_MAGIC_VALID(x, SES_MAGIC) 40*00b67f09SDavid van Moolenbroek #define VALID_TOK(x) ISC_MAGIC_VALID(x, TOK_MAGIC) 41*00b67f09SDavid van Moolenbroek 42*00b67f09SDavid van Moolenbroek typedef struct pk11_context pk11_context_t; 43*00b67f09SDavid van Moolenbroek 44*00b67f09SDavid van Moolenbroek struct pk11_object { 45*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE object; 46*00b67f09SDavid van Moolenbroek CK_SLOT_ID slot; 47*00b67f09SDavid van Moolenbroek CK_BBOOL ontoken; 48*00b67f09SDavid van Moolenbroek CK_BBOOL reqlogon; 49*00b67f09SDavid van Moolenbroek CK_BYTE attrcnt; 50*00b67f09SDavid van Moolenbroek CK_ATTRIBUTE *repr; 51*00b67f09SDavid van Moolenbroek }; 52*00b67f09SDavid van Moolenbroek 53*00b67f09SDavid van Moolenbroek struct pk11_context { 54*00b67f09SDavid van Moolenbroek void *handle; 55*00b67f09SDavid van Moolenbroek CK_SESSION_HANDLE session; 56*00b67f09SDavid van Moolenbroek CK_BBOOL ontoken; 57*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE object; 58*00b67f09SDavid van Moolenbroek #ifndef PKCS11CRYPTOWITHHMAC 59*00b67f09SDavid van Moolenbroek unsigned char *key; 60*00b67f09SDavid van Moolenbroek #endif 61*00b67f09SDavid van Moolenbroek }; 62*00b67f09SDavid van Moolenbroek 63*00b67f09SDavid van Moolenbroek typedef struct pk11_object pk11_object_t; 64*00b67f09SDavid van Moolenbroek 65*00b67f09SDavid van Moolenbroek typedef enum { 66*00b67f09SDavid van Moolenbroek OP_ANY = 0, 67*00b67f09SDavid van Moolenbroek OP_RAND = 1, 68*00b67f09SDavid van Moolenbroek OP_RSA = 2, 69*00b67f09SDavid van Moolenbroek OP_DSA = 3, 70*00b67f09SDavid van Moolenbroek OP_DH = 4, 71*00b67f09SDavid van Moolenbroek OP_DIGEST = 5, 72*00b67f09SDavid van Moolenbroek OP_EC = 6, 73*00b67f09SDavid van Moolenbroek OP_GOST = 7, 74*00b67f09SDavid van Moolenbroek OP_AES = 8, 75*00b67f09SDavid van Moolenbroek OP_MAX = 9 76*00b67f09SDavid van Moolenbroek } pk11_optype_t; 77*00b67f09SDavid van Moolenbroek 78*00b67f09SDavid van Moolenbroek /*% 79*00b67f09SDavid van Moolenbroek * Function prototypes 80*00b67f09SDavid van Moolenbroek */ 81*00b67f09SDavid van Moolenbroek 82*00b67f09SDavid van Moolenbroek void pk11_set_lib_name(const char *lib_name); 83*00b67f09SDavid van Moolenbroek /*%< 84*00b67f09SDavid van Moolenbroek * Set the PKCS#11 provider (aka library) path/name. 85*00b67f09SDavid van Moolenbroek */ 86*00b67f09SDavid van Moolenbroek 87*00b67f09SDavid van Moolenbroek isc_result_t pk11_initialize(isc_mem_t *mctx, const char *engine); 88*00b67f09SDavid van Moolenbroek /*%< 89*00b67f09SDavid van Moolenbroek * Initialize PKCS#11 device 90*00b67f09SDavid van Moolenbroek * 91*00b67f09SDavid van Moolenbroek * mctx: memory context to attach to pk11_mctx. 92*00b67f09SDavid van Moolenbroek * engine: PKCS#11 provider (aka library) path/name. 93*00b67f09SDavid van Moolenbroek * 94*00b67f09SDavid van Moolenbroek * returns: 95*00b67f09SDavid van Moolenbroek * ISC_R_SUCCESS 96*00b67f09SDavid van Moolenbroek * PK11_R_NOPROVIDER: can't load the provider 97*00b67f09SDavid van Moolenbroek * PK11_R_INITFAILED: C_Initialize() failed 98*00b67f09SDavid van Moolenbroek * PK11_R_NORANDOMSERVICE: can't find required random service 99*00b67f09SDavid van Moolenbroek * PK11_R_NODIGESTSERVICE: can't find required digest service 100*00b67f09SDavid van Moolenbroek * PK11_R_NOAESSERVICE: can't find required AES service 101*00b67f09SDavid van Moolenbroek */ 102*00b67f09SDavid van Moolenbroek 103*00b67f09SDavid van Moolenbroek isc_result_t pk11_get_session(pk11_context_t *ctx, 104*00b67f09SDavid van Moolenbroek pk11_optype_t optype, 105*00b67f09SDavid van Moolenbroek isc_boolean_t need_services, 106*00b67f09SDavid van Moolenbroek isc_boolean_t rw, 107*00b67f09SDavid van Moolenbroek isc_boolean_t logon, 108*00b67f09SDavid van Moolenbroek const char *pin, 109*00b67f09SDavid van Moolenbroek CK_SLOT_ID slot); 110*00b67f09SDavid van Moolenbroek /*%< 111*00b67f09SDavid van Moolenbroek * Initialize PKCS#11 device and acquire a session. 112*00b67f09SDavid van Moolenbroek * 113*00b67f09SDavid van Moolenbroek * need_services: 114*00b67f09SDavid van Moolenbroek * if ISC_TRUE, this session requires full PKCS#11 API 115*00b67f09SDavid van Moolenbroek * support including random and digest services, and 116*00b67f09SDavid van Moolenbroek * the lack of these services will cause the session not 117*00b67f09SDavid van Moolenbroek * to be initialized. If ISC_FALSE, the function will return 118*00b67f09SDavid van Moolenbroek * an error code indicating the missing service, but the 119*00b67f09SDavid van Moolenbroek * session will be usable for other purposes. 120*00b67f09SDavid van Moolenbroek * rw: if ISC_TRUE, session will be read/write (useful for 121*00b67f09SDavid van Moolenbroek * generating or destroying keys); otherwise read-only. 122*00b67f09SDavid van Moolenbroek * login: indicates whether to log in to the device 123*00b67f09SDavid van Moolenbroek * pin: optional PIN, overriding any PIN currently associated 124*00b67f09SDavid van Moolenbroek * with the 125*00b67f09SDavid van Moolenbroek * slot: device slot ID 126*00b67f09SDavid van Moolenbroek */ 127*00b67f09SDavid van Moolenbroek 128*00b67f09SDavid van Moolenbroek void pk11_return_session(pk11_context_t *ctx); 129*00b67f09SDavid van Moolenbroek /*%< 130*00b67f09SDavid van Moolenbroek * Release an active PKCS#11 session for reuse. 131*00b67f09SDavid van Moolenbroek */ 132*00b67f09SDavid van Moolenbroek 133*00b67f09SDavid van Moolenbroek isc_result_t pk11_finalize(void); 134*00b67f09SDavid van Moolenbroek /*%< 135*00b67f09SDavid van Moolenbroek * Shut down PKCS#11 device and free all sessions. 136*00b67f09SDavid van Moolenbroek */ 137*00b67f09SDavid van Moolenbroek 138*00b67f09SDavid van Moolenbroek isc_result_t pk11_rand_bytes(unsigned char *buf, int num); 139*00b67f09SDavid van Moolenbroek 140*00b67f09SDavid van Moolenbroek void pk11_rand_seed_fromfile(const char *randomfile); 141*00b67f09SDavid van Moolenbroek 142*00b67f09SDavid van Moolenbroek isc_result_t pk11_parse_uri(pk11_object_t *obj, const char *label, 143*00b67f09SDavid van Moolenbroek isc_mem_t *mctx, pk11_optype_t optype); 144*00b67f09SDavid van Moolenbroek 145*00b67f09SDavid van Moolenbroek ISC_PLATFORM_NORETURN_PRE void 146*00b67f09SDavid van Moolenbroek pk11_error_fatalcheck(const char *file, int line, 147*00b67f09SDavid van Moolenbroek const char *funcname, CK_RV rv) 148*00b67f09SDavid van Moolenbroek ISC_PLATFORM_NORETURN_POST; 149*00b67f09SDavid van Moolenbroek 150*00b67f09SDavid van Moolenbroek void pk11_dump_tokens(void); 151*00b67f09SDavid van Moolenbroek 152*00b67f09SDavid van Moolenbroek CK_RV 153*00b67f09SDavid van Moolenbroek pkcs_C_Initialize(CK_VOID_PTR pReserved); 154*00b67f09SDavid van Moolenbroek 155*00b67f09SDavid van Moolenbroek CK_RV 156*00b67f09SDavid van Moolenbroek pkcs_C_Finalize(CK_VOID_PTR pReserved); 157*00b67f09SDavid van Moolenbroek 158*00b67f09SDavid van Moolenbroek CK_RV 159*00b67f09SDavid van Moolenbroek pkcs_C_GetSlotList(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, 160*00b67f09SDavid van Moolenbroek CK_ULONG_PTR pulCount); 161*00b67f09SDavid van Moolenbroek 162*00b67f09SDavid van Moolenbroek CK_RV 163*00b67f09SDavid van Moolenbroek pkcs_C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo); 164*00b67f09SDavid van Moolenbroek 165*00b67f09SDavid van Moolenbroek CK_RV 166*00b67f09SDavid van Moolenbroek pkcs_C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, 167*00b67f09SDavid van Moolenbroek CK_MECHANISM_INFO_PTR pInfo); 168*00b67f09SDavid van Moolenbroek 169*00b67f09SDavid van Moolenbroek CK_RV 170*00b67f09SDavid van Moolenbroek pkcs_C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags, 171*00b67f09SDavid van Moolenbroek CK_VOID_PTR pApplication, 172*00b67f09SDavid van Moolenbroek CK_RV (*Notify) (CK_SESSION_HANDLE hSession, 173*00b67f09SDavid van Moolenbroek CK_NOTIFICATION event, 174*00b67f09SDavid van Moolenbroek CK_VOID_PTR pApplication), 175*00b67f09SDavid van Moolenbroek CK_SESSION_HANDLE_PTR phSession); 176*00b67f09SDavid van Moolenbroek 177*00b67f09SDavid van Moolenbroek CK_RV 178*00b67f09SDavid van Moolenbroek pkcs_C_CloseSession(CK_SESSION_HANDLE hSession); 179*00b67f09SDavid van Moolenbroek 180*00b67f09SDavid van Moolenbroek CK_RV 181*00b67f09SDavid van Moolenbroek pkcs_C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, 182*00b67f09SDavid van Moolenbroek CK_CHAR_PTR pPin, CK_ULONG usPinLen); 183*00b67f09SDavid van Moolenbroek 184*00b67f09SDavid van Moolenbroek CK_RV 185*00b67f09SDavid van Moolenbroek pkcs_C_Logout(CK_SESSION_HANDLE hSession); 186*00b67f09SDavid van Moolenbroek 187*00b67f09SDavid van Moolenbroek CK_RV 188*00b67f09SDavid van Moolenbroek pkcs_C_CreateObject(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, 189*00b67f09SDavid van Moolenbroek CK_ULONG usCount, CK_OBJECT_HANDLE_PTR phObject); 190*00b67f09SDavid van Moolenbroek 191*00b67f09SDavid van Moolenbroek CK_RV 192*00b67f09SDavid van Moolenbroek pkcs_C_DestroyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject); 193*00b67f09SDavid van Moolenbroek 194*00b67f09SDavid van Moolenbroek CK_RV 195*00b67f09SDavid van Moolenbroek pkcs_C_GetAttributeValue(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, 196*00b67f09SDavid van Moolenbroek CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount); 197*00b67f09SDavid van Moolenbroek 198*00b67f09SDavid van Moolenbroek CK_RV 199*00b67f09SDavid van Moolenbroek pkcs_C_SetAttributeValue(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, 200*00b67f09SDavid van Moolenbroek CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount); 201*00b67f09SDavid van Moolenbroek 202*00b67f09SDavid van Moolenbroek CK_RV 203*00b67f09SDavid van Moolenbroek pkcs_C_FindObjectsInit(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, 204*00b67f09SDavid van Moolenbroek CK_ULONG usCount); 205*00b67f09SDavid van Moolenbroek 206*00b67f09SDavid van Moolenbroek CK_RV 207*00b67f09SDavid van Moolenbroek pkcs_C_FindObjects(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject, 208*00b67f09SDavid van Moolenbroek CK_ULONG usMaxObjectCount, CK_ULONG_PTR pusObjectCount); 209*00b67f09SDavid van Moolenbroek 210*00b67f09SDavid van Moolenbroek CK_RV 211*00b67f09SDavid van Moolenbroek pkcs_C_FindObjectsFinal(CK_SESSION_HANDLE hSession); 212*00b67f09SDavid van Moolenbroek 213*00b67f09SDavid van Moolenbroek CK_RV 214*00b67f09SDavid van Moolenbroek pkcs_C_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 215*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE hKey); 216*00b67f09SDavid van Moolenbroek 217*00b67f09SDavid van Moolenbroek CK_RV 218*00b67f09SDavid van Moolenbroek pkcs_C_Encrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, 219*00b67f09SDavid van Moolenbroek CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, 220*00b67f09SDavid van Moolenbroek CK_ULONG_PTR pulEncryptedDataLen); 221*00b67f09SDavid van Moolenbroek 222*00b67f09SDavid van Moolenbroek CK_RV 223*00b67f09SDavid van Moolenbroek pkcs_C_DigestInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism); 224*00b67f09SDavid van Moolenbroek 225*00b67f09SDavid van Moolenbroek CK_RV 226*00b67f09SDavid van Moolenbroek pkcs_C_DigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, 227*00b67f09SDavid van Moolenbroek CK_ULONG ulPartLen); 228*00b67f09SDavid van Moolenbroek 229*00b67f09SDavid van Moolenbroek CK_RV 230*00b67f09SDavid van Moolenbroek pkcs_C_DigestFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest, 231*00b67f09SDavid van Moolenbroek CK_ULONG_PTR pulDigestLen); 232*00b67f09SDavid van Moolenbroek 233*00b67f09SDavid van Moolenbroek CK_RV 234*00b67f09SDavid van Moolenbroek pkcs_C_SignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 235*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE hKey); 236*00b67f09SDavid van Moolenbroek 237*00b67f09SDavid van Moolenbroek CK_RV 238*00b67f09SDavid van Moolenbroek pkcs_C_Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, 239*00b67f09SDavid van Moolenbroek CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, 240*00b67f09SDavid van Moolenbroek CK_ULONG_PTR pulSignatureLen); 241*00b67f09SDavid van Moolenbroek 242*00b67f09SDavid van Moolenbroek CK_RV 243*00b67f09SDavid van Moolenbroek pkcs_C_SignUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, 244*00b67f09SDavid van Moolenbroek CK_ULONG ulPartLen); 245*00b67f09SDavid van Moolenbroek 246*00b67f09SDavid van Moolenbroek CK_RV 247*00b67f09SDavid van Moolenbroek pkcs_C_SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, 248*00b67f09SDavid van Moolenbroek CK_ULONG_PTR pulSignatureLen); 249*00b67f09SDavid van Moolenbroek 250*00b67f09SDavid van Moolenbroek CK_RV 251*00b67f09SDavid van Moolenbroek pkcs_C_VerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 252*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE hKey); 253*00b67f09SDavid van Moolenbroek 254*00b67f09SDavid van Moolenbroek CK_RV 255*00b67f09SDavid van Moolenbroek pkcs_C_Verify(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, 256*00b67f09SDavid van Moolenbroek CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, 257*00b67f09SDavid van Moolenbroek CK_ULONG ulSignatureLen); 258*00b67f09SDavid van Moolenbroek 259*00b67f09SDavid van Moolenbroek CK_RV 260*00b67f09SDavid van Moolenbroek pkcs_C_VerifyUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, 261*00b67f09SDavid van Moolenbroek CK_ULONG ulPartLen); 262*00b67f09SDavid van Moolenbroek 263*00b67f09SDavid van Moolenbroek CK_RV 264*00b67f09SDavid van Moolenbroek pkcs_C_VerifyFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, 265*00b67f09SDavid van Moolenbroek CK_ULONG ulSignatureLen); 266*00b67f09SDavid van Moolenbroek 267*00b67f09SDavid van Moolenbroek CK_RV 268*00b67f09SDavid van Moolenbroek pkcs_C_GenerateKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 269*00b67f09SDavid van Moolenbroek CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 270*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE_PTR phKey); 271*00b67f09SDavid van Moolenbroek 272*00b67f09SDavid van Moolenbroek CK_RV 273*00b67f09SDavid van Moolenbroek pkcs_C_GenerateKeyPair(CK_SESSION_HANDLE hSession, 274*00b67f09SDavid van Moolenbroek CK_MECHANISM_PTR pMechanism, 275*00b67f09SDavid van Moolenbroek CK_ATTRIBUTE_PTR pPublicKeyTemplate, 276*00b67f09SDavid van Moolenbroek CK_ULONG usPublicKeyAttributeCount, 277*00b67f09SDavid van Moolenbroek CK_ATTRIBUTE_PTR pPrivateKeyTemplate, 278*00b67f09SDavid van Moolenbroek CK_ULONG usPrivateKeyAttributeCount, 279*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE_PTR phPrivateKey, 280*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE_PTR phPublicKey); 281*00b67f09SDavid van Moolenbroek 282*00b67f09SDavid van Moolenbroek CK_RV 283*00b67f09SDavid van Moolenbroek pkcs_C_DeriveKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 284*00b67f09SDavid van Moolenbroek CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, 285*00b67f09SDavid van Moolenbroek CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey); 286*00b67f09SDavid van Moolenbroek 287*00b67f09SDavid van Moolenbroek CK_RV 288*00b67f09SDavid van Moolenbroek pkcs_C_SeedRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed, 289*00b67f09SDavid van Moolenbroek CK_ULONG ulSeedLen); 290*00b67f09SDavid van Moolenbroek 291*00b67f09SDavid van Moolenbroek CK_RV 292*00b67f09SDavid van Moolenbroek pkcs_C_GenerateRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR RandomData, 293*00b67f09SDavid van Moolenbroek CK_ULONG ulRandomLen); 294*00b67f09SDavid van Moolenbroek 295*00b67f09SDavid van Moolenbroek ISC_LANG_ENDDECLS 296*00b67f09SDavid van Moolenbroek 297*00b67f09SDavid van Moolenbroek #endif /* PK11_PK11_H */ 298