/* 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/. */ /* * Internal header file included only by files in pkcs11 dir, or in * pkcs11 specific client and server files. */ #ifndef _SECMODTI_H_ #define _SECMODTI_H_ 1 #include "prmon.h" #include "prtypes.h" #include "nssilckt.h" #include "secmodt.h" #include "pkcs11t.h" #include "nssdevt.h" /* internal data structures */ /* Traverse slots callback */ typedef struct pk11TraverseSlotStr { SECStatus (*callback)(PK11SlotInfo *, CK_OBJECT_HANDLE, void *); void *callbackArg; CK_ATTRIBUTE *findTemplate; int templateCount; } pk11TraverseSlot; /* represent a pkcs#11 slot reference counted. */ struct PK11SlotInfoStr { /* the PKCS11 function list for this slot */ void *functionList; SECMODModule *module; /* our parent module */ /* Boolean to indicate the current state of this slot */ PRBool needTest; /* Has this slot been tested for Export complience */ PRBool isPerm; /* is this slot a permanment device */ PRBool isHW; /* is this slot a hardware device */ PRBool isInternal; /* is this slot one of our internal PKCS #11 devices */ PRBool disabled; /* is this slot disabled... */ PK11DisableReasons reason; /* Why this slot is disabled */ PRBool readOnly; /* is the token in this slot read-only */ PRBool needLogin; /* does the token of the type that needs * authentication (still true even if token is logged * in) */ PRBool hasRandom; /* can this token generated random numbers */ PRBool defRWSession; /* is the default session RW (we open our default * session rw if the token can only handle one session * at a time. */ PRBool isThreadSafe; /* copied from the module */ /* The actual flags (many of which are distilled into the above PRBools) */ CK_FLAGS flags; /* flags from PKCS #11 token Info */ /* a default session handle to do quick and dirty functions */ CK_SESSION_HANDLE session; PZLock *sessionLock; /* lock for this session */ /* our ID */ CK_SLOT_ID slotID; /* persistant flags saved from startup to startup */ unsigned long defaultFlags; /* keep track of who is using us so we don't accidently get freed while * still in use */ PRInt32 refCount; /* to be in/decremented by atomic calls ONLY! */ PZLock *freeListLock; PK11SymKey *freeSymKeysWithSessionHead; PK11SymKey *freeSymKeysHead; int keyCount; int maxKeyCount; /* Password control functions for this slot. many of these are only * active if the appropriate flag is on in defaultFlags */ int askpw; /* what our password options are */ int timeout; /* If we're ask_timeout, what is our timeout time is * seconds */ int authTransact; /* allow multiple authentications off one password if * they are all part of the same transaction */ PRTime authTime; /* when were we last authenticated */ int minPassword; /* smallest legal password */ int maxPassword; /* largest legal password */ PRUint16 series; /* break up the slot info into various groups of * inserted tokens so that keys and certs can be * invalidated */ PRUint16 flagSeries; /* record the last series for the last event * returned for this slot */ PRBool flagState; /* record the state of the last event returned for this * slot. */ PRUint16 wrapKey; /* current wrapping key for SSL master secrets */ CK_MECHANISM_TYPE wrapMechanism; /* current wrapping mechanism for current wrapKey */ CK_OBJECT_HANDLE refKeys[1]; /* array of existing wrapping keys for */ CK_MECHANISM_TYPE *mechanismList; /* list of mechanism supported by this * token */ int mechanismCount; /* cache the certificates stored on the token of this slot */ CERTCertificate **cert_array; int array_size; int cert_count; char serial[16]; /* since these are odd sizes, keep them last. They are odd sizes to * allow them to become null terminated strings */ char slot_name[65]; char token_name[33]; PRBool hasRootCerts; PRBool hasRootTrust; PRBool hasRSAInfo; CK_FLAGS RSAInfoFlags; PRBool protectedAuthPath; PRBool isActiveCard; PRIntervalTime lastLoginCheck; unsigned int lastState; /* for Stan */ NSSToken *nssToken; PZLock *nssTokenLock; /* the tokeninfo struct */ CK_TOKEN_INFO tokenInfo; /* fast mechanism lookup */ char mechanismBits[256]; CK_PROFILE_ID *profileList; int profileCount; }; /* Symetric Key structure. Reference Counted */ struct PK11SymKeyStr { CK_MECHANISM_TYPE type; /* type of operation this key was created for*/ CK_OBJECT_HANDLE objectID; /* object id of this key in the slot */ PK11SlotInfo *slot; /* Slot this key is loaded into */ void *cx; /* window context in case we need to loggin */ PK11SymKey *next; PRBool owner; SECItem data; /* raw key data if available */ CK_SESSION_HANDLE session; PRBool sessionOwner; PRInt32 refCount; /* number of references to this key */ int size; /* key size in bytes */ PK11Origin origin; /* where this key came from * (see def in secmodt.h) */ PK11SymKey *parent; /* potential owner key of the session */ PRUint16 series; /* break up the slot info into various groups * of inserted tokens so that keys and certs * can be invalidated */ void *userData; /* random data the application can attach to * this key */ PK11FreeDataFunc freeFunc; /* function to free the user data */ }; /* * hold a hash, encryption or signing context for multi-part operations. * hold enough information so that multiple contexts can be interleaved * if necessary. ... Not RefCounted. */ struct PK11ContextStr { CK_ATTRIBUTE_TYPE operation; /* type of operation this context is * doing (CKA_ENCRYPT, CKA_SIGN, * CKA_HASH, etc.) */ PK11SymKey *key; /* symetric key for this context */ CK_OBJECT_HANDLE objectID; /* object handle to key */ PK11SlotInfo *slot; /* slot this context is using */ CK_SESSION_HANDLE session; /* session this context is using */ PZLock *sessionLock; /* lock before accessing a PKCS #11 * session */ PRBool ownSession; /* do we own the session? */ void *pwArg; /* applicaton specific passwd arg */ void *savedData; /* save data when we are * multiplexing on a single context */ unsigned long savedLength; /* length of the saved context */ SECItem *param; /* mechanism parameters used to * build this context */ PRBool init; /* this contexted been initialized? */ CK_MECHANISM_TYPE type; /* what is the PKCS #11 this context * is representing (usually what * algorithm is being used * (CKM_RSA_PKCS, CKM_DES, CKM_SHA, * etc. */ PRBool fortezzaHack; /* Fortezza SSL has some special * non-standard semantics*/ PRBool simulate_message; /* We are initializing a message * interface but the underlying * PKCS #11 module does not support * it. We simulate the interface with * the PCKS #11 v2 interface */ CK_MECHANISM_TYPE simulate_mechanism; /* The mechanism we are simulating */ PRUint64 ivCounter; /* iv counter for simulated message */ PRUint64 ivMaxCount; /* total number of IVs valid for * this key */ unsigned long ivLen; /* length of the iv in bytes */ unsigned int ivFixedBits; /* number of bits not generated * for the iv */ CK_GENERATOR_FUNCTION ivGen; /* PKCS #11 iv generator value */ }; /* * structure to hold a pointer to a unique PKCS #11 object * (pointer to the slot and the object id). */ struct PK11GenericObjectStr { PK11GenericObject *prev; PK11GenericObject *next; PK11SlotInfo *slot; CK_OBJECT_HANDLE objectID; PRBool owner; }; #define MAX_TEMPL_ATTRS 16 /* maximum attributes in template */ /* This mask includes all CK_FLAGs with an equivalent CKA_ attribute. */ #define CKF_KEY_OPERATION_FLAGS 0x000e7b00UL #endif /* _SECMODTI_H_ */