1 /* 2 * COPYRIGHT (c) International Business Machines Corp. 2001-2017 3 * 4 * This program is provided under the terms of the Common Public License, 5 * version 1.0 (CPL-1.0). Any use, reproduction or distribution for this 6 * software constitutes recipient's acceptance of CPL-1.0 terms which can be 7 * found in the file LICENSE file or at 8 * https://opensource.org/licenses/cpl1.0.php 9 */ 10 11 // 12 // API Local control blocks within the PKCS11 Meta API 13 // 14 // 15 16 17 #include <pkcs11types.h> 18 #include <limits.h> 19 #include <local_types.h> 20 #include <slotmgr.h> 21 22 #include "local_types.h" 23 24 #ifndef _STDLL_H 25 #define _STDLL_H 26 27 28 typedef struct { 29 CK_SLOT_ID slotID; 30 CK_SESSION_HANDLE sessionh; 31 } ST_SESSION_T; 32 33 typedef struct trace_handle_t trace_handle; 34 typedef ST_SESSION_T ST_SESSION_HANDLE; 35 36 /* CK_FUNCTION_LIST is a structure holding a Cryptoki spec 37 * version and pointers of appropriate types to all the 38 * Cryptoki functions 39 * CK_FUNCTION_LIST is new for v2.0 40 */ 41 42 typedef CK_RV (CK_PTR ST_C_Initialize) (API_Slot_t *sltp, CK_SLOT_ID slotID, 43 SLOT_INFO *sinfp, trace_handle t); 44 45 typedef CK_RV (CK_PTR ST_C_Finalize) (CK_VOID_PTR pReserved); 46 typedef CK_RV (CK_PTR ST_C_Terminate) (void); 47 typedef CK_RV (CK_PTR ST_C_GetInfo) (CK_INFO_PTR pInfo); 48 typedef CK_RV (CK_PTR ST_C_GetFunctionList) (CK_FUNCTION_LIST_PTR_PTR 49 ppFunctionList); 50 typedef CK_RV (CK_PTR ST_C_GetSlotList) (CK_BBOOL tokenPresent, 51 CK_SLOT_ID_PTR pSlotList, 52 CK_ULONG_PTR pusCount); 53 typedef CK_RV (CK_PTR ST_C_GetSlotInfo) (CK_SLOT_ID slotID, 54 CK_SLOT_INFO_PTR pInfo); 55 typedef CK_RV (CK_PTR ST_C_GetTokenInfo) (STDLL_TokData_t *tokdata, 56 CK_SLOT_ID slotID, 57 CK_TOKEN_INFO_PTR pInfo); 58 typedef CK_RV (CK_PTR ST_C_GetMechanismList) (STDLL_TokData_t *tokdata, 59 CK_SLOT_ID slotID, 60 CK_MECHANISM_TYPE_PTR 61 pMechanismList, 62 CK_ULONG_PTR pusCount); 63 typedef CK_RV (CK_PTR ST_C_GetMechanismInfo) (STDLL_TokData_t *tokdata, 64 CK_SLOT_ID slotID, 65 CK_MECHANISM_TYPE type, 66 CK_MECHANISM_INFO_PTR pInfo); 67 typedef CK_RV (CK_PTR ST_C_InitToken) (STDLL_TokData_t *tokdata, 68 CK_SLOT_ID slotID, CK_CHAR_PTR pPin, 69 CK_ULONG usPinLen, CK_CHAR_PTR pLabel); 70 typedef CK_RV (CK_PTR ST_C_InitPIN) (STDLL_TokData_t *tokdata, 71 ST_SESSION_T *hSession, CK_CHAR_PTR pPin, 72 CK_ULONG usPinLen); 73 typedef CK_RV (CK_PTR ST_C_SetPIN) (STDLL_TokData_t *tokdata, 74 ST_SESSION_T *hSession, CK_CHAR_PTR pOldPin, 75 CK_ULONG usOldLen, CK_CHAR_PTR pNewPin, 76 CK_ULONG usNewLen); 77 78 // typedef CK_RV (CK_PTR ST_C_OpenSession) 79 // (CK_SLOT_ID slotID, CK_FLAGS flags, 80 // CK_VOID_PTR pApplication, 81 // CK_RV (*Notify) (CK_SESSION_HANDLE hSession, 82 // CK_NOTIFICATION event, CK_VOID_PTR pApplication), 83 // CK_SESSION_HANDLE_PTR phSession); 84 85 typedef CK_RV (CK_PTR ST_C_OpenSession) (STDLL_TokData_t *tokdata, 86 CK_SLOT_ID slotID, CK_FLAGS flags, 87 CK_SESSION_HANDLE_PTR phSession); 88 89 typedef CK_RV (CK_PTR ST_C_CloseSession) (STDLL_TokData_t *tokdata, 90 ST_SESSION_T *hSession); 91 typedef CK_RV (CK_PTR ST_C_CloseAllSessions) (STDLL_TokData_t *tokdata, 92 CK_SLOT_ID slotID); 93 typedef CK_RV (CK_PTR ST_C_GetSessionInfo) (STDLL_TokData_t *tokdata, 94 ST_SESSION_T *hSession, 95 CK_SESSION_INFO_PTR pInfo); 96 typedef CK_RV (CK_PTR ST_C_GetOperationState) (STDLL_TokData_t *tokdata, 97 ST_SESSION_T *hSession, 98 CK_BYTE_PTR pOperationState, 99 CK_ULONG_PTR 100 pulOperationStateLen); 101 typedef CK_RV (CK_PTR ST_C_SetOperationState) (STDLL_TokData_t *tokdata, 102 ST_SESSION_T *hSession, 103 CK_BYTE_PTR pOperationState, 104 CK_ULONG ulOperationStateLen, 105 CK_OBJECT_HANDLE hEncryptionKey, 106 CK_OBJECT_HANDLE 107 hAuthenticationKey); 108 typedef CK_RV (CK_PTR ST_C_Login) (STDLL_TokData_t *tokdata, 109 ST_SESSION_T *hSession, 110 CK_USER_TYPE userType, CK_CHAR_PTR pPin, 111 CK_ULONG usPinLen); 112 typedef CK_RV (CK_PTR ST_C_Logout) (STDLL_TokData_t *tokdata, 113 ST_SESSION_T *hSession); 114 typedef CK_RV (CK_PTR ST_C_CreateObject) (STDLL_TokData_t *tokdata, 115 ST_SESSION_T *hSession, 116 CK_ATTRIBUTE_PTR pTemplate, 117 CK_ULONG usCount, 118 CK_OBJECT_HANDLE_PTR phObject); 119 120 typedef CK_RV (CK_PTR ST_C_CopyObject) (STDLL_TokData_t *tokdata, 121 ST_SESSION_T *hSession, 122 CK_OBJECT_HANDLE hObject, 123 CK_ATTRIBUTE_PTR pTemplate, 124 CK_ULONG usCount, 125 CK_OBJECT_HANDLE_PTR phNewObject); 126 typedef CK_RV (CK_PTR ST_C_DestroyObject) (STDLL_TokData_t *tokdata, 127 ST_SESSION_T *hSession, 128 CK_OBJECT_HANDLE hObject); 129 typedef CK_RV (CK_PTR ST_C_GetObjectSize) (STDLL_TokData_t *tokdata, 130 ST_SESSION_T *hSession, 131 CK_OBJECT_HANDLE hObject, 132 CK_ULONG_PTR pusSize); 133 typedef CK_RV (CK_PTR ST_C_GetAttributeValue) (STDLL_TokData_t *tokdata, 134 ST_SESSION_T *hSession, 135 CK_OBJECT_HANDLE hObject, 136 CK_ATTRIBUTE_PTR pTemplate, 137 CK_ULONG usCount); 138 typedef CK_RV (CK_PTR ST_C_SetAttributeValue) (STDLL_TokData_t *tokdata, 139 ST_SESSION_T *hSession, 140 CK_OBJECT_HANDLE hObject, 141 CK_ATTRIBUTE_PTR pTemplate, 142 CK_ULONG usCount); 143 typedef CK_RV (CK_PTR ST_C_FindObjectsInit) (STDLL_TokData_t *tokdata, 144 ST_SESSION_T *hSession, 145 CK_ATTRIBUTE_PTR pTemplate, 146 CK_ULONG usCount); 147 typedef CK_RV (CK_PTR ST_C_FindObjects) (STDLL_TokData_t *tokdata, 148 ST_SESSION_T *hSession, 149 CK_OBJECT_HANDLE_PTR phObject, 150 CK_ULONG usMaxObjectCount, 151 CK_ULONG_PTR pusObjectCount); 152 typedef CK_RV (CK_PTR ST_C_FindObjectsFinal) (STDLL_TokData_t *tokdata, 153 ST_SESSION_T *hSession); 154 typedef CK_RV (CK_PTR ST_C_EncryptInit) (STDLL_TokData_t *tokdata, 155 ST_SESSION_T *hSession, 156 CK_MECHANISM_PTR pMechanism, 157 CK_OBJECT_HANDLE hKey); 158 typedef CK_RV (CK_PTR ST_C_Encrypt) (STDLL_TokData_t *tokdata, 159 ST_SESSION_T *hSession, CK_BYTE_PTR pData, 160 CK_ULONG usDataLen, 161 CK_BYTE_PTR pEncryptedData, 162 CK_ULONG_PTR pusEncryptedDataLen); 163 typedef CK_RV (CK_PTR ST_C_EncryptUpdate) (STDLL_TokData_t *tokdata, 164 ST_SESSION_T *hSession, 165 CK_BYTE_PTR pPart, CK_ULONG usPartLen, 166 CK_BYTE_PTR pEncryptedPart, 167 CK_ULONG_PTR pusEncryptedPartLen); 168 typedef CK_RV (CK_PTR ST_C_EncryptFinal) (STDLL_TokData_t *tokdata, 169 ST_SESSION_T *hSession, 170 CK_BYTE_PTR pLastEncryptedPart, 171 CK_ULONG_PTR pusLastEncryptedPartLen); 172 typedef CK_RV (CK_PTR ST_C_DecryptInit) (STDLL_TokData_t *tokdata, 173 ST_SESSION_T *hSession, 174 CK_MECHANISM_PTR pMechanism, 175 CK_OBJECT_HANDLE hKey); 176 typedef CK_RV (CK_PTR ST_C_Decrypt) (STDLL_TokData_t *tokdata, 177 ST_SESSION_T *hSession, 178 CK_BYTE_PTR pEncryptedData, 179 CK_ULONG usEncryptedDataLen, 180 CK_BYTE_PTR pData, CK_ULONG_PTR pusDataLen); 181 typedef CK_RV (CK_PTR ST_C_DecryptUpdate) (STDLL_TokData_t *tokdata, 182 ST_SESSION_T *hSession, 183 CK_BYTE_PTR pEncryptedPart, 184 CK_ULONG usEncryptedPartLen, 185 CK_BYTE_PTR pPart, 186 CK_ULONG_PTR pusPartLen); 187 typedef CK_RV (CK_PTR ST_C_DecryptFinal) (STDLL_TokData_t *tokdata, 188 ST_SESSION_T *hSession, 189 CK_BYTE_PTR pLastPart, 190 CK_ULONG_PTR pusLastPartLen); 191 typedef CK_RV (CK_PTR ST_C_DigestInit) (STDLL_TokData_t *tokdata, 192 ST_SESSION_T *hSession, 193 CK_MECHANISM_PTR pMechanism); 194 typedef CK_RV (CK_PTR ST_C_Digest) (STDLL_TokData_t *tokdata, 195 ST_SESSION_T *hSession, CK_BYTE_PTR pData, 196 CK_ULONG usDataLen, CK_BYTE_PTR pDigest, 197 CK_ULONG_PTR pusDigestLen); 198 typedef CK_RV (CK_PTR ST_C_DigestUpdate) (STDLL_TokData_t *tokdata, 199 ST_SESSION_T *hSession, 200 CK_BYTE_PTR pPart, CK_ULONG usPartLen); 201 typedef CK_RV (CK_PTR ST_C_DigestKey) (STDLL_TokData_t *tokdata, 202 ST_SESSION_T *hSession, 203 CK_OBJECT_HANDLE hKey); 204 typedef CK_RV (CK_PTR ST_C_DigestFinal) (STDLL_TokData_t *tokdata, 205 ST_SESSION_T *hSession, 206 CK_BYTE_PTR pDigest, 207 CK_ULONG_PTR pusDigestLen); 208 typedef CK_RV (CK_PTR ST_C_SignInit) (STDLL_TokData_t *tokdata, 209 ST_SESSION_T *hSession, 210 CK_MECHANISM_PTR pMechanism, 211 CK_OBJECT_HANDLE hKey); 212 typedef CK_RV (CK_PTR ST_C_Sign) (STDLL_TokData_t *tokdata, 213 ST_SESSION_T *hSession, CK_BYTE_PTR pData, 214 CK_ULONG usDataLen, CK_BYTE_PTR pSignature, 215 CK_ULONG_PTR pusSignatureLen); 216 typedef CK_RV (CK_PTR ST_C_SignUpdate) (STDLL_TokData_t *tokdata, 217 ST_SESSION_T *hSession, 218 CK_BYTE_PTR pPart, CK_ULONG usPartLen); 219 typedef CK_RV (CK_PTR ST_C_SignFinal) (STDLL_TokData_t *tokdata, 220 ST_SESSION_T *hSession, 221 CK_BYTE_PTR pSignature, 222 CK_ULONG_PTR pusSignatureLen); 223 typedef CK_RV (CK_PTR ST_C_SignRecoverInit) (STDLL_TokData_t *tokdata, 224 ST_SESSION_T *hSession, 225 CK_MECHANISM_PTR pMechanism, 226 CK_OBJECT_HANDLE hKey); 227 typedef CK_RV (CK_PTR ST_C_SignRecover) (STDLL_TokData_t *tokdata, 228 ST_SESSION_T *hSession, 229 CK_BYTE_PTR pData, CK_ULONG usDataLen, 230 CK_BYTE_PTR pSignature, 231 CK_ULONG_PTR pusSignatureLen); 232 typedef CK_RV (CK_PTR ST_C_VerifyInit) (STDLL_TokData_t *tokdata, 233 ST_SESSION_T *hSession, 234 CK_MECHANISM_PTR pMechanism, 235 CK_OBJECT_HANDLE hKey); 236 typedef CK_RV (CK_PTR ST_C_Verify) (STDLL_TokData_t *tokdata, 237 ST_SESSION_T *hSession, CK_BYTE_PTR pData, 238 CK_ULONG usDataLen, CK_BYTE_PTR pSignature, 239 CK_ULONG usSignatureLen); 240 typedef CK_RV (CK_PTR ST_C_VerifyUpdate) (STDLL_TokData_t *tokdata, 241 ST_SESSION_T *hSession, 242 CK_BYTE_PTR pPart, CK_ULONG usPartLen); 243 typedef CK_RV (CK_PTR ST_C_VerifyFinal) (STDLL_TokData_t *tokdata, 244 ST_SESSION_T *hSession, 245 CK_BYTE_PTR pSignature, 246 CK_ULONG usSignatureLen); 247 typedef CK_RV (CK_PTR ST_C_VerifyRecoverInit) (STDLL_TokData_t *tokdata, 248 ST_SESSION_T *hSession, 249 CK_MECHANISM_PTR pMechanism, 250 CK_OBJECT_HANDLE hKey); 251 typedef CK_RV (CK_PTR ST_C_VerifyRecover) (STDLL_TokData_t *tokdata, 252 ST_SESSION_T *hSession, 253 CK_BYTE_PTR pSignature, 254 CK_ULONG usSignatureLen, 255 CK_BYTE_PTR pData, 256 CK_ULONG_PTR pusDataLen); 257 typedef CK_RV (CK_PTR ST_C_DigestEncryptUpdate) (STDLL_TokData_t *tokdata, 258 ST_SESSION_T *hSession, 259 CK_BYTE_PTR pPart, 260 CK_ULONG ulPartLen, 261 CK_BYTE_PTR pEncryptedPart, 262 CK_ULONG_PTR 263 pulEncryptedPartLen); 264 typedef CK_RV (CK_PTR ST_C_DecryptDigestUpdate) (STDLL_TokData_t *tokdata, 265 ST_SESSION_T *hSession, 266 CK_BYTE_PTR pEncryptedPart, 267 CK_ULONG ulEncryptedPartLen, 268 CK_BYTE_PTR pPart, 269 CK_ULONG_PTR pulPartLen); 270 typedef CK_RV (CK_PTR ST_C_SignEncryptUpdate) (STDLL_TokData_t *tokdata, 271 ST_SESSION_T *hSession, 272 CK_BYTE_PTR pPart, 273 CK_ULONG ulPartLen, 274 CK_BYTE_PTR pEncryptedPart, 275 CK_ULONG_PTR pulEncryptedPartLen); 276 typedef CK_RV (CK_PTR ST_C_DecryptVerifyUpdate) (STDLL_TokData_t *tokdata, 277 ST_SESSION_T *hSession, 278 CK_BYTE_PTR pEncryptedPart, 279 CK_ULONG ulEncryptedPartLen, 280 CK_BYTE_PTR pPart, 281 CK_ULONG_PTR pulPartLen); 282 typedef CK_RV (CK_PTR ST_C_GenerateKey) (STDLL_TokData_t *tokdata, 283 ST_SESSION_T *hSession, 284 CK_MECHANISM_PTR pMechanism, 285 CK_ATTRIBUTE_PTR pTemplate, 286 CK_ULONG usCount, 287 CK_OBJECT_HANDLE_PTR phKey); 288 typedef CK_RV (CK_PTR ST_C_GenerateKeyPair) (STDLL_TokData_t *tokdata, 289 ST_SESSION_T *hSession, 290 CK_MECHANISM_PTR pMechanism, 291 CK_ATTRIBUTE_PTR pPublicKeyTemplate, 292 CK_ULONG usPublicKeyAttributeCount, 293 CK_ATTRIBUTE_PTR 294 pPrivateKeyTemplate, 295 CK_ULONG usPrivateKeyAttributeCount, 296 CK_OBJECT_HANDLE_PTR phPrivateKey, 297 CK_OBJECT_HANDLE_PTR phPublicKey); 298 typedef CK_RV (CK_PTR ST_C_WrapKey) (STDLL_TokData_t *tokdata, 299 ST_SESSION_T *hSession, 300 CK_MECHANISM_PTR pMechanism, 301 CK_OBJECT_HANDLE hWrappingKey, 302 CK_OBJECT_HANDLE hKey, 303 CK_BYTE_PTR pWrappedKey, 304 CK_ULONG_PTR pusWrappedKeyLen); 305 typedef CK_RV (CK_PTR ST_C_UnwrapKey) (STDLL_TokData_t *tokdata, 306 ST_SESSION_T *hSession, 307 CK_MECHANISM_PTR pMechanism, 308 CK_OBJECT_HANDLE hUnwrappingKey, 309 CK_BYTE_PTR pWrappedKey, 310 CK_ULONG usWrappedKeyLen, 311 CK_ATTRIBUTE_PTR pTemplate, 312 CK_ULONG usAttributeCount, 313 CK_OBJECT_HANDLE_PTR phKey); 314 typedef CK_RV (CK_PTR ST_C_DeriveKey) (STDLL_TokData_t *tokdata, 315 ST_SESSION_T *hSession, 316 CK_MECHANISM_PTR pMechanism, 317 CK_OBJECT_HANDLE hBaseKey, 318 CK_ATTRIBUTE_PTR pTemplate, 319 CK_ULONG usAttributeCount, 320 CK_OBJECT_HANDLE_PTR phKey); 321 typedef CK_RV (CK_PTR ST_C_SeedRandom) (STDLL_TokData_t *tokdata, 322 ST_SESSION_T *hSession, 323 CK_BYTE_PTR pSeed, CK_ULONG usSeedLen); 324 typedef CK_RV (CK_PTR ST_C_GenerateRandom) (STDLL_TokData_t *tokdata, 325 ST_SESSION_T *hSession, 326 CK_BYTE_PTR pRandomData, 327 CK_ULONG usRandomLen); 328 typedef CK_RV (CK_PTR ST_C_GetFunctionStatus) (STDLL_TokData_t *tokdata, 329 ST_SESSION_T *hSession); 330 typedef CK_RV (CK_PTR ST_C_CancelFunction) (STDLL_TokData_t *tokdata, 331 ST_SESSION_T *hSession); 332 typedef CK_RV (CK_PTR ST_Notify) (ST_SESSION_T *hSession, 333 CK_NOTIFICATION event, 334 CK_VOID_PTR pApplication); 335 typedef CK_RV (CK_PTR ST_C_WaitForSlotEvent) (STDLL_TokData_t *tokdata, 336 CK_FLAGS flags, 337 CK_SLOT_ID_PTR pSlot, 338 CK_VOID_PTR pReserved); 339 340 341 342 struct ST_FCN_LIST { 343 344 // Need initialization function But it is different than 345 // the C_Initialize 346 ST_C_Initialize ST_Initialize; 347 348 ST_C_GetTokenInfo ST_GetTokenInfo; 349 ST_C_GetMechanismList ST_GetMechanismList; 350 ST_C_GetMechanismInfo ST_GetMechanismInfo; 351 ST_C_InitToken ST_InitToken; 352 ST_C_InitPIN ST_InitPIN; 353 ST_C_SetPIN ST_SetPIN; 354 355 ST_C_OpenSession ST_OpenSession; 356 ST_C_CloseSession ST_CloseSession; 357 ST_C_GetSessionInfo ST_GetSessionInfo; 358 ST_C_GetOperationState ST_GetOperationState; // Not used by Netscape 359 ST_C_SetOperationState ST_SetOperationState; // Not used by Netscape 360 ST_C_Login ST_Login; 361 ST_C_Logout ST_Logout; 362 363 ST_C_CreateObject ST_CreateObject; 364 ST_C_CopyObject ST_CopyObject; 365 ST_C_DestroyObject ST_DestroyObject; 366 ST_C_GetObjectSize ST_GetObjectSize; 367 ST_C_GetAttributeValue ST_GetAttributeValue; 368 ST_C_SetAttributeValue ST_SetAttributeValue; 369 ST_C_FindObjectsInit ST_FindObjectsInit; 370 ST_C_FindObjects ST_FindObjects; 371 ST_C_FindObjectsFinal ST_FindObjectsFinal; 372 373 374 ST_C_EncryptInit ST_EncryptInit; 375 ST_C_Encrypt ST_Encrypt; 376 ST_C_EncryptUpdate ST_EncryptUpdate; // Not used by Netscape 377 ST_C_EncryptFinal ST_EncryptFinal; // Not used by Netscape 378 ST_C_DecryptInit ST_DecryptInit; 379 ST_C_Decrypt ST_Decrypt; 380 ST_C_DecryptUpdate ST_DecryptUpdate; // Not used by Netscape 381 ST_C_DecryptFinal ST_DecryptFinal; // Not used by Netscape 382 ST_C_DigestInit ST_DigestInit; 383 ST_C_Digest ST_Digest; 384 ST_C_DigestUpdate ST_DigestUpdate; 385 ST_C_DigestKey ST_DigestKey; 386 ST_C_DigestFinal ST_DigestFinal; 387 ST_C_SignInit ST_SignInit; 388 ST_C_Sign ST_Sign; 389 ST_C_SignUpdate ST_SignUpdate; 390 ST_C_SignFinal ST_SignFinal; 391 ST_C_SignRecoverInit ST_SignRecoverInit; 392 ST_C_SignRecover ST_SignRecover; 393 ST_C_VerifyInit ST_VerifyInit; 394 ST_C_Verify ST_Verify; 395 ST_C_VerifyUpdate ST_VerifyUpdate; 396 ST_C_VerifyFinal ST_VerifyFinal; 397 ST_C_VerifyRecoverInit ST_VerifyRecoverInit; 398 ST_C_VerifyRecover ST_VerifyRecover; 399 ST_C_DigestEncryptUpdate ST_DigestEncryptUpdate; 400 ST_C_DecryptDigestUpdate ST_DecryptDigestUpdate; 401 ST_C_SignEncryptUpdate ST_SignEncryptUpdate; 402 ST_C_DecryptVerifyUpdate ST_DecryptVerifyUpdate; 403 ST_C_GenerateKey ST_GenerateKey; 404 ST_C_GenerateKeyPair ST_GenerateKeyPair; 405 ST_C_WrapKey ST_WrapKey; // Netscape optionsl will use En/Decrypt 406 ST_C_UnwrapKey ST_UnwrapKey; 407 ST_C_DeriveKey ST_DeriveKey; 408 ST_C_SeedRandom ST_SeedRandom; 409 ST_C_GenerateRandom ST_GenerateRandom; 410 // Question if these have to be implemented for Netscape support 411 ST_C_GetFunctionStatus ST_GetFunctionStatus; 412 ST_C_CancelFunction ST_CancelFunction; 413 414 }; 415 416 typedef struct ST_FCN_LIST STDLL_FcnList_t; 417 418 #endif 419