1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792 |
- /* 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/. */
- /*
- * token.c
- *
- * This file implements the NSSCKFWToken type and methods.
- */
- #ifndef CK_T
- #include "ck.h"
- #endif /* CK_T */
- /*
- * NSSCKFWToken
- *
- * -- create/destroy --
- * nssCKFWToken_Create
- * nssCKFWToken_Destroy
- *
- * -- public accessors --
- * NSSCKFWToken_GetMDToken
- * NSSCKFWToken_GetFWSlot
- * NSSCKFWToken_GetMDSlot
- * NSSCKFWToken_GetSessionState
- *
- * -- implement public accessors --
- * nssCKFWToken_GetMDToken
- * nssCKFWToken_GetFWSlot
- * nssCKFWToken_GetMDSlot
- * nssCKFWToken_GetSessionState
- * nssCKFWToken_SetSessionState
- *
- * -- private accessors --
- * nssCKFWToken_SetSessionState
- * nssCKFWToken_RemoveSession
- * nssCKFWToken_CloseAllSessions
- * nssCKFWToken_GetSessionCount
- * nssCKFWToken_GetRwSessionCount
- * nssCKFWToken_GetRoSessionCount
- * nssCKFWToken_GetSessionObjectHash
- * nssCKFWToken_GetMDObjectHash
- * nssCKFWToken_GetObjectHandleHash
- *
- * -- module fronts --
- * nssCKFWToken_InitToken
- * nssCKFWToken_GetLabel
- * nssCKFWToken_GetManufacturerID
- * nssCKFWToken_GetModel
- * nssCKFWToken_GetSerialNumber
- * nssCKFWToken_GetHasRNG
- * nssCKFWToken_GetIsWriteProtected
- * nssCKFWToken_GetLoginRequired
- * nssCKFWToken_GetUserPinInitialized
- * nssCKFWToken_GetRestoreKeyNotNeeded
- * nssCKFWToken_GetHasClockOnToken
- * nssCKFWToken_GetHasProtectedAuthenticationPath
- * nssCKFWToken_GetSupportsDualCryptoOperations
- * nssCKFWToken_GetMaxSessionCount
- * nssCKFWToken_GetMaxRwSessionCount
- * nssCKFWToken_GetMaxPinLen
- * nssCKFWToken_GetMinPinLen
- * nssCKFWToken_GetTotalPublicMemory
- * nssCKFWToken_GetFreePublicMemory
- * nssCKFWToken_GetTotalPrivateMemory
- * nssCKFWToken_GetFreePrivateMemory
- * nssCKFWToken_GetHardwareVersion
- * nssCKFWToken_GetFirmwareVersion
- * nssCKFWToken_GetUTCTime
- * nssCKFWToken_OpenSession
- * nssCKFWToken_GetMechanismCount
- * nssCKFWToken_GetMechanismTypes
- * nssCKFWToken_GetMechanism
- */
- struct NSSCKFWTokenStr {
- NSSCKFWMutex *mutex;
- NSSArena *arena;
- NSSCKMDToken *mdToken;
- NSSCKFWSlot *fwSlot;
- NSSCKMDSlot *mdSlot;
- NSSCKFWInstance *fwInstance;
- NSSCKMDInstance *mdInstance;
- /*
- * Everything above is set at creation time, and then not modified.
- * The invariants the mutex protects are:
- *
- * 1) Each of the cached descriptions (versions, etc.) are in an
- * internally consistant state.
- *
- * 2) The session counts and hashes are consistant.
- *
- * 3) The object hashes are consistant.
- *
- * Note that the calls accessing the cached descriptions will call
- * the NSSCKMDToken methods with the mutex locked. Those methods
- * may then call the public NSSCKFWToken routines. Those public
- * routines only access the constant data above and the atomic
- * CK_STATE session state variable below, so there's no problem.
- * But be careful if you add to this object; mutexes are in
- * general not reentrant, so don't create deadlock situations.
- */
- NSSUTF8 *label;
- NSSUTF8 *manufacturerID;
- NSSUTF8 *model;
- NSSUTF8 *serialNumber;
- CK_VERSION hardwareVersion;
- CK_VERSION firmwareVersion;
- CK_ULONG sessionCount;
- CK_ULONG rwSessionCount;
- nssCKFWHash *sessions;
- nssCKFWHash *sessionObjectHash;
- nssCKFWHash *mdObjectHash;
- nssCKFWHash *mdMechanismHash;
- CK_STATE state;
- };
- #ifdef DEBUG
- /*
- * But first, the pointer-tracking stuff.
- *
- * NOTE: the pointer-tracking support in NSS/base currently relies
- * upon NSPR's CallOnce support. That, however, relies upon NSPR's
- * locking, which is tied into the runtime. We need a pointer-tracker
- * implementation that uses the locks supplied through C_Initialize.
- * That support, however, can be filled in later. So for now, I'll
- * just do this routines as no-ops.
- */
- static CK_RV
- token_add_pointer(
- const NSSCKFWToken *fwToken)
- {
- return CKR_OK;
- }
- static CK_RV
- token_remove_pointer(
- const NSSCKFWToken *fwToken)
- {
- return CKR_OK;
- }
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_verifyPointer(
- const NSSCKFWToken *fwToken)
- {
- return CKR_OK;
- }
- #endif /* DEBUG */
- /*
- * nssCKFWToken_Create
- *
- */
- NSS_IMPLEMENT NSSCKFWToken *
- nssCKFWToken_Create(
- NSSCKFWSlot *fwSlot,
- NSSCKMDToken *mdToken,
- CK_RV *pError)
- {
- NSSArena *arena = (NSSArena *)NULL;
- NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
- CK_BBOOL called_setup = CK_FALSE;
- /*
- * We have already verified the arguments in nssCKFWSlot_GetToken.
- */
- arena = NSSArena_Create();
- if (!arena) {
- *pError = CKR_HOST_MEMORY;
- goto loser;
- }
- fwToken = nss_ZNEW(arena, NSSCKFWToken);
- if (!fwToken) {
- *pError = CKR_HOST_MEMORY;
- goto loser;
- }
- fwToken->arena = arena;
- fwToken->mdToken = mdToken;
- fwToken->fwSlot = fwSlot;
- fwToken->fwInstance = nssCKFWSlot_GetFWInstance(fwSlot);
- fwToken->mdInstance = nssCKFWSlot_GetMDInstance(fwSlot);
- fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
- fwToken->sessionCount = 0;
- fwToken->rwSessionCount = 0;
- fwToken->mutex = nssCKFWInstance_CreateMutex(fwToken->fwInstance, arena, pError);
- if (!fwToken->mutex) {
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto loser;
- }
- fwToken->sessions = nssCKFWHash_Create(fwToken->fwInstance, arena, pError);
- if (!fwToken->sessions) {
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto loser;
- }
- if (CK_TRUE != nssCKFWInstance_GetModuleHandlesSessionObjects(
- fwToken->fwInstance)) {
- fwToken->sessionObjectHash = nssCKFWHash_Create(fwToken->fwInstance,
- arena, pError);
- if (!fwToken->sessionObjectHash) {
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto loser;
- }
- }
- fwToken->mdObjectHash = nssCKFWHash_Create(fwToken->fwInstance,
- arena, pError);
- if (!fwToken->mdObjectHash) {
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto loser;
- }
- fwToken->mdMechanismHash = nssCKFWHash_Create(fwToken->fwInstance,
- arena, pError);
- if (!fwToken->mdMechanismHash) {
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto loser;
- }
- /* More here */
- if (mdToken->Setup) {
- *pError = mdToken->Setup(mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance);
- if (CKR_OK != *pError) {
- goto loser;
- }
- }
- called_setup = CK_TRUE;
- #ifdef DEBUG
- *pError = token_add_pointer(fwToken);
- if (CKR_OK != *pError) {
- goto loser;
- }
- #endif /* DEBUG */
- *pError = CKR_OK;
- return fwToken;
- loser:
- if (CK_TRUE == called_setup) {
- if (mdToken->Invalidate) {
- mdToken->Invalidate(mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance);
- }
- }
- if (arena) {
- (void)NSSArena_Destroy(arena);
- }
- return (NSSCKFWToken *)NULL;
- }
- static void
- nss_ckfwtoken_session_iterator(
- const void *key,
- void *value,
- void *closure)
- {
- /*
- * Remember that the fwToken->mutex is locked
- */
- NSSCKFWSession *fwSession = (NSSCKFWSession *)value;
- (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
- return;
- }
- static void
- nss_ckfwtoken_object_iterator(
- const void *key,
- void *value,
- void *closure)
- {
- /*
- * Remember that the fwToken->mutex is locked
- */
- NSSCKFWObject *fwObject = (NSSCKFWObject *)value;
- (void)nssCKFWObject_Finalize(fwObject, CK_FALSE);
- return;
- }
- /*
- * nssCKFWToken_Destroy
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_Destroy(
- NSSCKFWToken *fwToken)
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- (void)nssCKFWMutex_Destroy(fwToken->mutex);
- if (fwToken->mdToken->Invalidate) {
- fwToken->mdToken->Invalidate(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /* we can destroy the list without locking now because no one else is
- * referencing us (or _Destroy was invalidly called!)
- */
- nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator,
- (void *)NULL);
- nssCKFWHash_Destroy(fwToken->sessions);
- /* session objects go away when their sessions are removed */
- if (fwToken->sessionObjectHash) {
- nssCKFWHash_Destroy(fwToken->sessionObjectHash);
- }
- /* free up the token objects */
- if (fwToken->mdObjectHash) {
- nssCKFWHash_Iterate(fwToken->mdObjectHash, nss_ckfwtoken_object_iterator,
- (void *)NULL);
- nssCKFWHash_Destroy(fwToken->mdObjectHash);
- }
- if (fwToken->mdMechanismHash) {
- nssCKFWHash_Destroy(fwToken->mdMechanismHash);
- }
- nssCKFWSlot_ClearToken(fwToken->fwSlot);
- #ifdef DEBUG
- error = token_remove_pointer(fwToken);
- #endif /* DEBUG */
- (void)NSSArena_Destroy(fwToken->arena);
- return error;
- }
- /*
- * nssCKFWToken_GetMDToken
- *
- */
- NSS_IMPLEMENT NSSCKMDToken *
- nssCKFWToken_GetMDToken(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (NSSCKMDToken *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->mdToken;
- }
- /*
- * nssCKFWToken_GetArena
- *
- */
- NSS_IMPLEMENT NSSArena *
- nssCKFWToken_GetArena(
- NSSCKFWToken *fwToken,
- CK_RV *pError)
- {
- #ifdef NSSDEBUG
- if (!pError) {
- return (NSSArena *)NULL;
- }
- *pError = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != *pError) {
- return (NSSArena *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->arena;
- }
- /*
- * nssCKFWToken_GetFWSlot
- *
- */
- NSS_IMPLEMENT NSSCKFWSlot *
- nssCKFWToken_GetFWSlot(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (NSSCKFWSlot *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->fwSlot;
- }
- /*
- * nssCKFWToken_GetMDSlot
- *
- */
- NSS_IMPLEMENT NSSCKMDSlot *
- nssCKFWToken_GetMDSlot(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (NSSCKMDSlot *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->mdSlot;
- }
- /*
- * nssCKFWToken_GetSessionState
- *
- */
- NSS_IMPLEMENT CK_STATE
- nssCKFWToken_GetSessionState(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CKS_RO_PUBLIC_SESSION; /* whatever */
- }
- #endif /* NSSDEBUG */
- /*
- * BTW, do not lock the token in this method.
- */
- /*
- * Theoretically, there is no state if there aren't any
- * sessions open. But then we'd need to worry about
- * reporting an error, etc. What the heck-- let's just
- * revert to CKR_RO_PUBLIC_SESSION as the "default."
- */
- return fwToken->state;
- }
- /*
- * nssCKFWToken_InitToken
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_InitToken(
- NSSCKFWToken *fwToken,
- NSSItem *pin,
- NSSUTF8 *label)
- {
- CK_RV error;
- #ifdef NSSDEBUG
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return CKR_ARGUMENTS_BAD;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- if (fwToken->sessionCount > 0) {
- error = CKR_SESSION_EXISTS;
- goto done;
- }
- if (!fwToken->mdToken->InitToken) {
- error = CKR_DEVICE_ERROR;
- goto done;
- }
- if (!pin) {
- if (nssCKFWToken_GetHasProtectedAuthenticationPath(fwToken)) {
- ; /* okay */
- } else {
- error = CKR_PIN_INCORRECT;
- goto done;
- }
- }
- if (!label) {
- label = (NSSUTF8 *)"";
- }
- error = fwToken->mdToken->InitToken(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, pin, label);
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_GetLabel
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_GetLabel(
- NSSCKFWToken *fwToken,
- CK_CHAR label[32])
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- if ((CK_CHAR_PTR)NULL == label) {
- return CKR_ARGUMENTS_BAD;
- }
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- if (!fwToken->label) {
- if (fwToken->mdToken->GetLabel) {
- fwToken->label = fwToken->mdToken->GetLabel(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, &error);
- if ((!fwToken->label) && (CKR_OK != error)) {
- goto done;
- }
- } else {
- fwToken->label = (NSSUTF8 *)"";
- }
- }
- (void)nssUTF8_CopyIntoFixedBuffer(fwToken->label, (char *)label, 32, ' ');
- error = CKR_OK;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_GetManufacturerID
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_GetManufacturerID(
- NSSCKFWToken *fwToken,
- CK_CHAR manufacturerID[32])
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- if ((CK_CHAR_PTR)NULL == manufacturerID) {
- return CKR_ARGUMENTS_BAD;
- }
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- if (!fwToken->manufacturerID) {
- if (fwToken->mdToken->GetManufacturerID) {
- fwToken->manufacturerID = fwToken->mdToken->GetManufacturerID(fwToken->mdToken,
- fwToken, fwToken->mdInstance, fwToken->fwInstance, &error);
- if ((!fwToken->manufacturerID) && (CKR_OK != error)) {
- goto done;
- }
- } else {
- fwToken->manufacturerID = (NSSUTF8 *)"";
- }
- }
- (void)nssUTF8_CopyIntoFixedBuffer(fwToken->manufacturerID, (char *)manufacturerID, 32, ' ');
- error = CKR_OK;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_GetModel
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_GetModel(
- NSSCKFWToken *fwToken,
- CK_CHAR model[16])
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- if ((CK_CHAR_PTR)NULL == model) {
- return CKR_ARGUMENTS_BAD;
- }
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- if (!fwToken->model) {
- if (fwToken->mdToken->GetModel) {
- fwToken->model = fwToken->mdToken->GetModel(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, &error);
- if ((!fwToken->model) && (CKR_OK != error)) {
- goto done;
- }
- } else {
- fwToken->model = (NSSUTF8 *)"";
- }
- }
- (void)nssUTF8_CopyIntoFixedBuffer(fwToken->model, (char *)model, 16, ' ');
- error = CKR_OK;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_GetSerialNumber
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_GetSerialNumber(
- NSSCKFWToken *fwToken,
- CK_CHAR serialNumber[16])
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- if ((CK_CHAR_PTR)NULL == serialNumber) {
- return CKR_ARGUMENTS_BAD;
- }
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- if (!fwToken->serialNumber) {
- if (fwToken->mdToken->GetSerialNumber) {
- fwToken->serialNumber = fwToken->mdToken->GetSerialNumber(fwToken->mdToken,
- fwToken, fwToken->mdInstance, fwToken->fwInstance, &error);
- if ((!fwToken->serialNumber) && (CKR_OK != error)) {
- goto done;
- }
- } else {
- fwToken->serialNumber = (NSSUTF8 *)"";
- }
- }
- (void)nssUTF8_CopyIntoFixedBuffer(fwToken->serialNumber, (char *)serialNumber, 16, ' ');
- error = CKR_OK;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_GetHasRNG
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetHasRNG(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetHasRNG) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetHasRNG(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetIsWriteProtected
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetIsWriteProtected(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetIsWriteProtected) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetIsWriteProtected(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetLoginRequired
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetLoginRequired(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetLoginRequired) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetLoginRequired(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetUserPinInitialized
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetUserPinInitialized(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetUserPinInitialized) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetUserPinInitialized(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetRestoreKeyNotNeeded
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetRestoreKeyNotNeeded(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetRestoreKeyNotNeeded) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetRestoreKeyNotNeeded(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetHasClockOnToken
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetHasClockOnToken(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetHasClockOnToken) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetHasClockOnToken(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetHasProtectedAuthenticationPath
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetHasProtectedAuthenticationPath(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetHasProtectedAuthenticationPath) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetHasProtectedAuthenticationPath(fwToken->mdToken,
- fwToken, fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetSupportsDualCryptoOperations
- *
- */
- NSS_IMPLEMENT CK_BBOOL
- nssCKFWToken_GetSupportsDualCryptoOperations(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_FALSE;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetSupportsDualCryptoOperations) {
- return CK_FALSE;
- }
- return fwToken->mdToken->GetSupportsDualCryptoOperations(fwToken->mdToken,
- fwToken, fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetMaxSessionCount
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetMaxSessionCount(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetMaxSessionCount) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetMaxSessionCount(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetMaxRwSessionCount
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetMaxRwSessionCount(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetMaxRwSessionCount) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetMaxRwSessionCount(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetMaxPinLen
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetMaxPinLen(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetMaxPinLen) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetMaxPinLen(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetMinPinLen
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetMinPinLen(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetMinPinLen) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetMinPinLen(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetTotalPublicMemory
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetTotalPublicMemory(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetTotalPublicMemory) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetTotalPublicMemory(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetFreePublicMemory
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetFreePublicMemory(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetFreePublicMemory) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetFreePublicMemory(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetTotalPrivateMemory
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetTotalPrivateMemory(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetTotalPrivateMemory) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetTotalPrivateMemory(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetFreePrivateMemory
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetFreePrivateMemory(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetFreePrivateMemory) {
- return CK_UNAVAILABLE_INFORMATION;
- }
- return fwToken->mdToken->GetFreePrivateMemory(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetHardwareVersion
- *
- */
- NSS_IMPLEMENT CK_VERSION
- nssCKFWToken_GetHardwareVersion(
- NSSCKFWToken *fwToken)
- {
- CK_VERSION rv;
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- rv.major = rv.minor = 0;
- return rv;
- }
- #endif /* NSSDEBUG */
- if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
- rv.major = rv.minor = 0;
- return rv;
- }
- if ((0 != fwToken->hardwareVersion.major) ||
- (0 != fwToken->hardwareVersion.minor)) {
- rv = fwToken->hardwareVersion;
- goto done;
- }
- if (fwToken->mdToken->GetHardwareVersion) {
- fwToken->hardwareVersion = fwToken->mdToken->GetHardwareVersion(
- fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance);
- } else {
- fwToken->hardwareVersion.major = 0;
- fwToken->hardwareVersion.minor = 1;
- }
- rv = fwToken->hardwareVersion;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return rv;
- }
- /*
- * nssCKFWToken_GetFirmwareVersion
- *
- */
- NSS_IMPLEMENT CK_VERSION
- nssCKFWToken_GetFirmwareVersion(
- NSSCKFWToken *fwToken)
- {
- CK_VERSION rv;
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- rv.major = rv.minor = 0;
- return rv;
- }
- #endif /* NSSDEBUG */
- if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
- rv.major = rv.minor = 0;
- return rv;
- }
- if ((0 != fwToken->firmwareVersion.major) ||
- (0 != fwToken->firmwareVersion.minor)) {
- rv = fwToken->firmwareVersion;
- goto done;
- }
- if (fwToken->mdToken->GetFirmwareVersion) {
- fwToken->firmwareVersion = fwToken->mdToken->GetFirmwareVersion(
- fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance);
- } else {
- fwToken->firmwareVersion.major = 0;
- fwToken->firmwareVersion.minor = 1;
- }
- rv = fwToken->firmwareVersion;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return rv;
- }
- /*
- * nssCKFWToken_GetUTCTime
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_GetUTCTime(
- NSSCKFWToken *fwToken,
- CK_CHAR utcTime[16])
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- if ((CK_CHAR_PTR)NULL == utcTime) {
- return CKR_ARGUMENTS_BAD;
- }
- #endif /* DEBUG */
- if (CK_TRUE != nssCKFWToken_GetHasClockOnToken(fwToken)) {
- /* return CKR_DEVICE_ERROR; */
- (void)nssUTF8_CopyIntoFixedBuffer((NSSUTF8 *)NULL, (char *)utcTime, 16, ' ');
- return CKR_OK;
- }
- if (!fwToken->mdToken->GetUTCTime) {
- /* It said it had one! */
- return CKR_GENERAL_ERROR;
- }
- error = fwToken->mdToken->GetUTCTime(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, utcTime);
- if (CKR_OK != error) {
- return error;
- }
- /* Sanity-check the data */
- {
- /* Format is YYYYMMDDhhmmss00 */
- int i;
- int Y, M, D, h, m, s;
- static int dims[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- for (i = 0; i < 16; i++) {
- if ((utcTime[i] < '0') || (utcTime[i] > '9')) {
- goto badtime;
- }
- }
- Y = ((utcTime[0] - '0') * 1000) + ((utcTime[1] - '0') * 100) +
- ((utcTime[2] - '0') * 10) + (utcTime[3] - '0');
- M = ((utcTime[4] - '0') * 10) + (utcTime[5] - '0');
- D = ((utcTime[6] - '0') * 10) + (utcTime[7] - '0');
- h = ((utcTime[8] - '0') * 10) + (utcTime[9] - '0');
- m = ((utcTime[10] - '0') * 10) + (utcTime[11] - '0');
- s = ((utcTime[12] - '0') * 10) + (utcTime[13] - '0');
- if ((Y < 1990) || (Y > 3000))
- goto badtime; /* Y3K problem. heh heh heh */
- if ((M < 1) || (M > 12))
- goto badtime;
- if ((D < 1) || (D > 31))
- goto badtime;
- if (D > dims[M - 1])
- goto badtime; /* per-month check */
- if ((2 == M) && (((Y % 4) || !(Y % 100)) &&
- (Y % 400)) &&
- (D > 28))
- goto badtime; /* leap years */
- if ((h < 0) || (h > 23))
- goto badtime;
- if ((m < 0) || (m > 60))
- goto badtime;
- if ((s < 0) || (s > 61))
- goto badtime;
- /* 60m and 60 or 61s is only allowed for leap seconds. */
- if ((60 == m) || (s >= 60)) {
- if ((23 != h) || (60 != m) || (s < 60))
- goto badtime;
- /* leap seconds can only happen on June 30 or Dec 31.. I think */
- /* if( ((6 != M) || (30 != D)) && ((12 != M) || (31 != D)) ) goto badtime; */
- }
- }
- return CKR_OK;
- badtime:
- return CKR_GENERAL_ERROR;
- }
- /*
- * nssCKFWToken_OpenSession
- *
- */
- NSS_IMPLEMENT NSSCKFWSession *
- nssCKFWToken_OpenSession(
- NSSCKFWToken *fwToken,
- CK_BBOOL rw,
- CK_VOID_PTR pApplication,
- CK_NOTIFY Notify,
- CK_RV *pError)
- {
- NSSCKFWSession *fwSession = (NSSCKFWSession *)NULL;
- NSSCKMDSession *mdSession;
- #ifdef NSSDEBUG
- if (!pError) {
- return (NSSCKFWSession *)NULL;
- }
- *pError = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != *pError) {
- return (NSSCKFWSession *)NULL;
- }
- switch (rw) {
- case CK_TRUE:
- case CK_FALSE:
- break;
- default:
- *pError = CKR_ARGUMENTS_BAD;
- return (NSSCKFWSession *)NULL;
- }
- #endif /* NSSDEBUG */
- *pError = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != *pError) {
- return (NSSCKFWSession *)NULL;
- }
- if (CK_TRUE == rw) {
- /* Read-write session desired */
- if (CK_TRUE == nssCKFWToken_GetIsWriteProtected(fwToken)) {
- *pError = CKR_TOKEN_WRITE_PROTECTED;
- goto done;
- }
- } else {
- /* Read-only session desired */
- if (CKS_RW_SO_FUNCTIONS == nssCKFWToken_GetSessionState(fwToken)) {
- *pError = CKR_SESSION_READ_WRITE_SO_EXISTS;
- goto done;
- }
- }
- /* We could compare sesion counts to any limits we know of, I guess.. */
- if (!fwToken->mdToken->OpenSession) {
- /*
- * I'm not sure that the Module actually needs to implement
- * mdSessions -- the Framework can keep track of everything
- * needed, really. But I'll sort out that detail later..
- */
- *pError = CKR_GENERAL_ERROR;
- goto done;
- }
- fwSession = nssCKFWSession_Create(fwToken, rw, pApplication, Notify, pError);
- if (!fwSession) {
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto done;
- }
- mdSession = fwToken->mdToken->OpenSession(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, fwSession,
- rw, pError);
- if (!mdSession) {
- (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- goto done;
- }
- *pError = nssCKFWSession_SetMDSession(fwSession, mdSession);
- if (CKR_OK != *pError) {
- if (mdSession->Close) {
- mdSession->Close(mdSession, fwSession, fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
- goto done;
- }
- *pError = nssCKFWHash_Add(fwToken->sessions, fwSession, fwSession);
- if (CKR_OK != *pError) {
- (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
- fwSession = (NSSCKFWSession *)NULL;
- goto done;
- }
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return fwSession;
- }
- /*
- * nssCKFWToken_GetMechanismCount
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetMechanismCount(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return 0;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetMechanismCount) {
- return 0;
- }
- return fwToken->mdToken->GetMechanismCount(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- /*
- * nssCKFWToken_GetMechanismTypes
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_GetMechanismTypes(
- NSSCKFWToken *fwToken,
- CK_MECHANISM_TYPE types[])
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CKR_ARGUMENTS_BAD;
- }
- if (!types) {
- return CKR_ARGUMENTS_BAD;
- }
- #endif /* NSSDEBUG */
- if (!fwToken->mdToken->GetMechanismTypes) {
- /*
- * This should only be called with a sufficiently-large
- * "types" array, which can only be done if GetMechanismCount
- * is implemented. If that's implemented (and returns nonzero),
- * then this should be too. So return an error.
- */
- return CKR_GENERAL_ERROR;
- }
- return fwToken->mdToken->GetMechanismTypes(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, types);
- }
- /*
- * nssCKFWToken_GetMechanism
- *
- */
- NSS_IMPLEMENT NSSCKFWMechanism *
- nssCKFWToken_GetMechanism(
- NSSCKFWToken *fwToken,
- CK_MECHANISM_TYPE which,
- CK_RV *pError)
- {
- NSSCKMDMechanism *mdMechanism;
- if (!fwToken->mdMechanismHash) {
- *pError = CKR_GENERAL_ERROR;
- return (NSSCKFWMechanism *)NULL;
- }
- if (!fwToken->mdToken->GetMechanism) {
- /*
- * If we don't implement any GetMechanism function, then we must
- * not support any.
- */
- *pError = CKR_MECHANISM_INVALID;
- return (NSSCKFWMechanism *)NULL;
- }
- /* lookup in hash table */
- mdMechanism = fwToken->mdToken->GetMechanism(fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance, which, pError);
- if (!mdMechanism) {
- return (NSSCKFWMechanism *)NULL;
- }
- /* store in hash table */
- return nssCKFWMechanism_Create(mdMechanism, fwToken->mdToken, fwToken,
- fwToken->mdInstance, fwToken->fwInstance);
- }
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_SetSessionState(
- NSSCKFWToken *fwToken,
- CK_STATE newState)
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- switch (newState) {
- case CKS_RO_PUBLIC_SESSION:
- case CKS_RO_USER_FUNCTIONS:
- case CKS_RW_PUBLIC_SESSION:
- case CKS_RW_USER_FUNCTIONS:
- case CKS_RW_SO_FUNCTIONS:
- break;
- default:
- return CKR_ARGUMENTS_BAD;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- fwToken->state = newState;
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return CKR_OK;
- }
- /*
- * nssCKFWToken_RemoveSession
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_RemoveSession(
- NSSCKFWToken *fwToken,
- NSSCKFWSession *fwSession)
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- error = nssCKFWSession_verifyPointer(fwSession);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- if (CK_TRUE != nssCKFWHash_Exists(fwToken->sessions, fwSession)) {
- error = CKR_SESSION_HANDLE_INVALID;
- goto done;
- }
- nssCKFWHash_Remove(fwToken->sessions, fwSession);
- fwToken->sessionCount--;
- if (nssCKFWSession_IsRWSession(fwSession)) {
- fwToken->rwSessionCount--;
- }
- if (0 == fwToken->sessionCount) {
- fwToken->rwSessionCount = 0; /* sanity */
- fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
- }
- error = CKR_OK;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_CloseAllSessions
- *
- */
- NSS_IMPLEMENT CK_RV
- nssCKFWToken_CloseAllSessions(
- NSSCKFWToken *fwToken)
- {
- CK_RV error = CKR_OK;
- #ifdef NSSDEBUG
- error = nssCKFWToken_verifyPointer(fwToken);
- if (CKR_OK != error) {
- return error;
- }
- #endif /* NSSDEBUG */
- error = nssCKFWMutex_Lock(fwToken->mutex);
- if (CKR_OK != error) {
- return error;
- }
- nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator, (void *)NULL);
- nssCKFWHash_Destroy(fwToken->sessions);
- fwToken->sessions = nssCKFWHash_Create(fwToken->fwInstance, fwToken->arena, &error);
- if (!fwToken->sessions) {
- if (CKR_OK == error) {
- error = CKR_GENERAL_ERROR;
- }
- goto done;
- }
- fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
- fwToken->sessionCount = 0;
- fwToken->rwSessionCount = 0;
- error = CKR_OK;
- done:
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return error;
- }
- /*
- * nssCKFWToken_GetSessionCount
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetSessionCount(
- NSSCKFWToken *fwToken)
- {
- CK_ULONG rv;
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (CK_ULONG)0;
- }
- #endif /* NSSDEBUG */
- if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
- return (CK_ULONG)0;
- }
- rv = fwToken->sessionCount;
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return rv;
- }
- /*
- * nssCKFWToken_GetRwSessionCount
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetRwSessionCount(
- NSSCKFWToken *fwToken)
- {
- CK_ULONG rv;
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (CK_ULONG)0;
- }
- #endif /* NSSDEBUG */
- if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
- return (CK_ULONG)0;
- }
- rv = fwToken->rwSessionCount;
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return rv;
- }
- /*
- * nssCKFWToken_GetRoSessionCount
- *
- */
- NSS_IMPLEMENT CK_ULONG
- nssCKFWToken_GetRoSessionCount(
- NSSCKFWToken *fwToken)
- {
- CK_ULONG rv;
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (CK_ULONG)0;
- }
- #endif /* NSSDEBUG */
- if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
- return (CK_ULONG)0;
- }
- rv = fwToken->sessionCount - fwToken->rwSessionCount;
- (void)nssCKFWMutex_Unlock(fwToken->mutex);
- return rv;
- }
- /*
- * nssCKFWToken_GetSessionObjectHash
- *
- */
- NSS_IMPLEMENT nssCKFWHash *
- nssCKFWToken_GetSessionObjectHash(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (nssCKFWHash *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->sessionObjectHash;
- }
- /*
- * nssCKFWToken_GetMDObjectHash
- *
- */
- NSS_IMPLEMENT nssCKFWHash *
- nssCKFWToken_GetMDObjectHash(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (nssCKFWHash *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->mdObjectHash;
- }
- /*
- * nssCKFWToken_GetObjectHandleHash
- *
- */
- NSS_IMPLEMENT nssCKFWHash *
- nssCKFWToken_GetObjectHandleHash(
- NSSCKFWToken *fwToken)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (nssCKFWHash *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwToken->mdObjectHash;
- }
- /*
- * NSSCKFWToken_GetMDToken
- *
- */
- NSS_IMPLEMENT NSSCKMDToken *
- NSSCKFWToken_GetMDToken(
- NSSCKFWToken *fwToken)
- {
- #ifdef DEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (NSSCKMDToken *)NULL;
- }
- #endif /* DEBUG */
- return nssCKFWToken_GetMDToken(fwToken);
- }
- /*
- * NSSCKFWToken_GetArena
- *
- */
- NSS_IMPLEMENT NSSArena *
- NSSCKFWToken_GetArena(
- NSSCKFWToken *fwToken,
- CK_RV *pError)
- {
- #ifdef DEBUG
- if (!pError) {
- return (NSSArena *)NULL;
- }
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- *pError = CKR_ARGUMENTS_BAD;
- return (NSSArena *)NULL;
- }
- #endif /* DEBUG */
- return nssCKFWToken_GetArena(fwToken, pError);
- }
- /*
- * NSSCKFWToken_GetFWSlot
- *
- */
- NSS_IMPLEMENT NSSCKFWSlot *
- NSSCKFWToken_GetFWSlot(
- NSSCKFWToken *fwToken)
- {
- #ifdef DEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (NSSCKFWSlot *)NULL;
- }
- #endif /* DEBUG */
- return nssCKFWToken_GetFWSlot(fwToken);
- }
- /*
- * NSSCKFWToken_GetMDSlot
- *
- */
- NSS_IMPLEMENT NSSCKMDSlot *
- NSSCKFWToken_GetMDSlot(
- NSSCKFWToken *fwToken)
- {
- #ifdef DEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return (NSSCKMDSlot *)NULL;
- }
- #endif /* DEBUG */
- return nssCKFWToken_GetMDSlot(fwToken);
- }
- /*
- * NSSCKFWToken_GetSessionState
- *
- */
- NSS_IMPLEMENT CK_STATE
- NSSCKFWSession_GetSessionState(
- NSSCKFWToken *fwToken)
- {
- #ifdef DEBUG
- if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
- return CKS_RO_PUBLIC_SESSION;
- }
- #endif /* DEBUG */
- return nssCKFWToken_GetSessionState(fwToken);
- }
|