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