summaryrefslogtreecommitdiff
path: root/security/nss/lib/dev/devmod.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/nss/lib/dev/devmod.c')
-rw-r--r--security/nss/lib/dev/devmod.c878
1 files changed, 0 insertions, 878 deletions
diff --git a/security/nss/lib/dev/devmod.c b/security/nss/lib/dev/devmod.c
deleted file mode 100644
index 85e5c9dda..000000000
--- a/security/nss/lib/dev/devmod.c
+++ /dev/null
@@ -1,878 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Netscape security libraries.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1994-2000
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifdef DEBUG
-static const char CVS_ID[] = "@(#) $RCSfile$ $Revision$ $Date$";
-#endif /* DEBUG */
-
-#ifndef NSSCKEPV_H
-#include "nssckepv.h"
-#endif /* NSSCKEPV_H */
-
-#ifndef DEVM_H
-#include "devm.h"
-#endif /* DEVM_H */
-
-#ifndef CKHELPER_H
-#include "ckhelper.h"
-#endif /* CKHELPER_H */
-
-#ifdef PURE_STAN_CODE
-
-extern void FC_GetFunctionList(void);
-extern void NSC_GetFunctionList(void);
-extern void NSC_ModuleDBFunc(void);
-
-/* The list of boolean flags used to describe properties of a
- * module.
- */
-#define NSSMODULE_FLAGS_NOT_THREADSAFE 0x0001 /* isThreadSafe */
-#define NSSMODULE_FLAGS_INTERNAL 0x0002 /* isInternal */
-#define NSSMODULE_FLAGS_FIPS 0x0004 /* isFIPS */
-#define NSSMODULE_FLAGS_MODULE_DB 0x0008 /* isModuleDB */
-#define NSSMODULE_FLAGS_MODULE_DB_ONLY 0x0010 /* moduleDBOnly */
-#define NSSMODULE_FLAGS_CRITICAL 0x0020 /* isCritical */
-
-struct NSSModuleStr {
- struct nssDeviceBaseStr base;
- NSSUTF8 *libraryName;
- PRLibrary *library;
- char *libraryParams;
- void *moduleDBFunc;
- void *epv;
- CK_INFO info;
- NSSSlot **slots;
- PRUint32 numSlots;
- PRBool isLoaded;
- struct {
- PRInt32 trust;
- PRInt32 cipher;
- PRInt32 certStorage;
- } order;
-};
-
-#define NSSMODULE_IS_THREADSAFE(module) \
- (!(module->base.flags & NSSMODULE_FLAGS_NOT_THREADSAFE))
-
-#define NSSMODULE_IS_INTERNAL(module) \
- (module->base.flags & NSSMODULE_FLAGS_INTERNAL)
-
-#define NSSMODULE_IS_FIPS(module) \
- (module->base.flags & NSSMODULE_FLAGS_FIPS)
-
-#define NSSMODULE_IS_MODULE_DB(module) \
- (module->base.flags & NSSMODULE_FLAGS_MODULE_DB)
-
-#define NSSMODULE_IS_MODULE_DB_ONLY(module) \
- (module->base.flags & NSSMODULE_FLAGS_MODULE_DB_ONLY)
-
-#define NSSMODULE_IS_CRITICAL(module) \
- (module->base.flags & NSSMODULE_FLAGS_CRITICAL)
-
-/* Threading callbacks for C_Initialize. Use NSPR threads. */
-
-CK_RV PR_CALLBACK
-nss_ck_CreateMutex(CK_VOID_PTR_PTR pMutex)
-{
- CK_VOID_PTR mutex = (CK_VOID_PTR)PZ_NewLock(nssILockOther);
- if (mutex != NULL) {
- *pMutex = (CK_VOID_PTR)mutex;
- return CKR_OK;
- }
- return CKR_HOST_MEMORY;
-}
-
-CK_RV PR_CALLBACK
-nss_ck_DestroyMutex(CK_VOID_PTR mutex)
-{
- PZ_DestroyLock((PZLock *)mutex);
- return CKR_OK;
-}
-
-CK_RV PR_CALLBACK
-nss_ck_LockMutex(CK_VOID_PTR mutex)
-{
- PZ_Lock((PZLock *)mutex);
- return CKR_OK;
-}
-
-CK_RV PR_CALLBACK
-nss_ck_UnlockMutex(CK_VOID_PTR mutex)
-{
- return (PZ_Unlock((PZLock *)mutex) == PR_SUCCESS) ?
- CKR_OK : CKR_MUTEX_NOT_LOCKED;
-}
-
-/* Default callback args to C_Initialize */
-/* XXX not const because we are modifying the pReserved argument in order
- * to use the libraryParams extension.
- */
-static CK_C_INITIALIZE_ARGS
-s_ck_initialize_args = {
- nss_ck_CreateMutex, /* CreateMutex */
- nss_ck_DestroyMutex, /* DestroyMutex */
- nss_ck_LockMutex, /* LockMutex */
- nss_ck_UnlockMutex, /* UnlockMutex */
- CKF_LIBRARY_CANT_CREATE_OS_THREADS |
- CKF_OS_LOCKING_OK, /* flags */
- NULL /* pReserved */
-};
-
-/* load all slots in a module. */
-static PRStatus
-module_load_slots(NSSModule *mod)
-{
- CK_ULONG i, ulNumSlots;
- CK_SLOT_ID *slotIDs;
- nssArenaMark *mark = NULL;
- NSSSlot **slots;
- PRStatus nssrv;
- CK_RV ckrv;
- /* Get the number of slots */
- ckrv = CKAPI(mod->epv)->C_GetSlotList(CK_FALSE, NULL, &ulNumSlots);
- if (ckrv != CKR_OK) {
- /* what is the error? */
- return PR_FAILURE;
- }
- /* Alloc memory for the array of slot ID's */
- slotIDs = nss_ZNEWARRAY(NULL, CK_SLOT_ID, ulNumSlots);
- if (!slotIDs) {
- goto loser;
- }
- /* Get the actual slot list */
- ckrv = CKAPI(mod->epv)->C_GetSlotList(CK_FALSE, slotIDs, &ulNumSlots);
- if (ckrv != CKR_OK) {
- /* what is the error? */
- goto loser;
- }
- /* Alloc memory for the array of slots, in the module's arena */
- mark = nssArena_Mark(mod->base.arena); /* why mark? it'll be destroyed */
- if (!mark) {
- return PR_FAILURE;
- }
- slots = nss_ZNEWARRAY(mod->base.arena, NSSSlot *, ulNumSlots);
- if (!slots) {
- goto loser;
- }
- /* Initialize each slot */
- for (i=0; i<ulNumSlots; i++) {
- slots[i] = nssSlot_Create(slotIDs[i], mod);
- }
- nss_ZFreeIf(slotIDs);
- nssrv = nssArena_Unmark(mod->base.arena, mark);
- if (nssrv != PR_SUCCESS) {
- goto loser;
- }
- mod->slots = slots;
- mod->numSlots = ulNumSlots;
- return PR_SUCCESS;
-loser:
- if (mark) {
- nssArena_Release(mod->base.arena, mark);
- }
- nss_ZFreeIf(slotIDs);
- return PR_FAILURE;
-}
-
-NSS_IMPLEMENT PRStatus
-nssModule_Load (
- NSSModule *mod
-)
-{
- PRLibrary *library = NULL;
- CK_C_GetFunctionList epv;
- CK_RV ckrv;
- if (NSSMODULE_IS_INTERNAL(mod)) {
- /* internal, statically get the C_GetFunctionList function */
- if (NSSMODULE_IS_FIPS(mod)) {
- epv = (CK_C_GetFunctionList) FC_GetFunctionList;
- } else {
- epv = (CK_C_GetFunctionList) NSC_GetFunctionList;
- }
- if (NSSMODULE_IS_MODULE_DB(mod)) {
- mod->moduleDBFunc = (void *) NSC_ModuleDBFunc;
- }
- if (NSSMODULE_IS_MODULE_DB_ONLY(mod)) {
- mod->isLoaded = PR_TRUE; /* XXX needed? */
- return PR_SUCCESS;
- }
- } else {
- /* Use NSPR to load the library */
- library = PR_LoadLibrary(mod->libraryName);
- if (!library) {
- /* what's the error to set? */
- return PR_FAILURE;
- }
- mod->library = library;
- /* Skip if only getting the db loader function */
- if (!NSSMODULE_IS_MODULE_DB_ONLY(mod)) {
- /* Load the cryptoki entry point function */
- epv = (CK_C_GetFunctionList)PR_FindSymbol(library,
- "C_GetFunctionList");
- }
- /* Load the module database loader function */
- if (NSSMODULE_IS_MODULE_DB(mod)) {
- mod->moduleDBFunc = (void *)PR_FindSymbol(library,
- "NSS_ReturnModuleSpecData");
- }
- }
- if (epv == NULL) {
- goto loser;
- }
- /* Load the cryptoki entry point vector (function list) */
- ckrv = (*epv)((CK_FUNCTION_LIST_PTR *)&mod->epv);
- if (ckrv != CKR_OK) {
- goto loser;
- }
- /* Initialize the module */
- if (mod->libraryParams) {
- s_ck_initialize_args.LibraryParameters = (void *)mod->libraryParams;
- } else {
- s_ck_initialize_args.LibraryParameters = NULL;
- }
- ckrv = CKAPI(mod->epv)->C_Initialize(&s_ck_initialize_args);
- if (ckrv != CKR_OK) {
- /* Apparently the token is not thread safe. Retry without
- * threading parameters.
- */
- mod->base.flags |= NSSMODULE_FLAGS_NOT_THREADSAFE;
- ckrv = CKAPI(mod->epv)->C_Initialize((CK_VOID_PTR)NULL);
- if (ckrv != CKR_OK) {
- goto loser;
- }
- }
- /* TODO: check the version # using C_GetInfo */
- ckrv = CKAPI(mod->epv)->C_GetInfo(&mod->info);
- if (ckrv != CKR_OK) {
- goto loser;
- }
- /* TODO: if the name is not set, get it from info.libraryDescription */
- /* Now load the slots */
- if (module_load_slots(mod) != PR_SUCCESS) {
- goto loser;
- }
- /* Module has successfully loaded */
- mod->isLoaded = PR_TRUE;
- return PR_SUCCESS;
-loser:
- if (library) {
- PR_UnloadLibrary(library);
- }
- /* clear all values set above, they are invalid now */
- mod->library = NULL;
- mod->epv = NULL;
- return PR_FAILURE;
-}
-
-NSS_IMPLEMENT PRStatus
-nssModule_Unload (
- NSSModule *mod
-)
-{
- PRStatus nssrv = PR_SUCCESS;
- if (mod->library) {
- (void)CKAPI(mod->epv)->C_Finalize(NULL);
- nssrv = PR_UnloadLibrary(mod->library);
- }
- /* Free the slots, yes? */
- mod->library = NULL;
- mod->epv = NULL;
- mod->isLoaded = PR_FALSE;
- return nssrv;
-}
-
-/* Alloc memory for a module. Copy in the module name and library path
- * if provided. XXX use the opaque arg also, right?
- */
-NSS_IMPLEMENT NSSModule *
-nssModule_Create (
- NSSUTF8 *moduleOpt,
- NSSUTF8 *uriOpt,
- NSSUTF8 *opaqueOpt,
- void *reserved
-)
-{
- NSSArena *arena;
- NSSModule *rvMod;
- arena = NSSArena_Create();
- if(!arena) {
- return (NSSModule *)NULL;
- }
- rvMod = nss_ZNEW(arena, NSSModule);
- if (!rvMod) {
- goto loser;
- }
- if (moduleOpt) {
- /* XXX making the gross assumption this is just the module name */
- /* if the name is a duplicate, should that be tested here? or
- * wait for Load?
- */
- rvMod->base.name = nssUTF8_Duplicate(moduleOpt, arena);
- if (!rvMod->base.name) {
- goto loser;
- }
- }
- if (uriOpt) {
- /* Load the module from a URI. */
- /* XXX at this time - only file URI (even worse, no file:// for now) */
- rvMod->libraryName = nssUTF8_Duplicate(uriOpt, arena);
- if (!rvMod->libraryName) {
- goto loser;
- }
- }
- rvMod->base.arena = arena;
- rvMod->base.refCount = 1;
- rvMod->base.lock = PZ_NewLock(nssNSSILockOther);
- if (!rvMod->base.lock) {
- goto loser;
- }
- /* everything else is 0/NULL at this point. */
- return rvMod;
-loser:
- nssArena_Destroy(arena);
- return (NSSModule *)NULL;
-}
-
-NSS_EXTERN PRStatus
-nssCryptokiArgs_ParseNextPair (
- NSSUTF8 *start,
- NSSUTF8 **attrib,
- NSSUTF8 **value,
- NSSUTF8 **remainder,
- NSSArena *arenaOpt
-);
-
-static PRStatus
-parse_slot_flags (
- NSSSlot *slot,
- NSSUTF8 *slotFlags
-)
-{
- PRStatus nssrv = PR_SUCCESS;
-#if 0
- PRBool done = PR_FALSE;
- NSSUTF8 *mark, *last;
- last = mark = slotFlags;
- while (PR_TRUE) {
- while (*mark && *mark != ',') ++mark;
- if (!*mark) done = PR_TRUE;
- *mark = '\0';
- if (nssUTF8_Equal(last, "RANDOM", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_HAS_RANDOM;
- } else if (nssUTF8_Equal(last, "RSA", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_RSA;
- } else if (nssUTF8_Equal(last, "DSA", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_DSA;
- } else if (nssUTF8_Equal(last, "DH", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_DH;
- } else if (nssUTF8_Equal(last, "RC2", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_RC2;
- } else if (nssUTF8_Equal(last, "RC4", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_RC4;
- } else if (nssUTF8_Equal(last, "RC5", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_RC5;
- } else if (nssUTF8_Equal(last, "DES", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_DES;
- } else if (nssUTF8_Equal(last, "AES", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_AES;
- } else if (nssUTF8_Equal(last, "SHA1", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_SHA1;
- } else if (nssUTF8_Equal(last, "MD2", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_MD2;
- } else if (nssUTF8_Equal(last, "MD5", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_MD5;
- } else if (nssUTF8_Equal(last, "SSL", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_SSL;
- } else if (nssUTF8_Equal(last, "TLS", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_TLS;
- } else if (nssUTF8_Equal(last, "PublicCerts", &nssrv)) {
- slot->base.flags |= NSSSLOT_FLAGS_FRIENDLY;
- } else {
- return PR_FAILURE;
- }
- if (done) break;
- last = ++mark;
- }
-#endif
- return nssrv;
-}
-
-static PRStatus
-parse_slot_parameters (
- NSSSlot *slot,
- NSSUTF8 *slotParams,
- NSSArena *tmparena
-)
-{
- PRStatus nssrv = PR_SUCCESS;
- NSSUTF8 *current, *remainder;
- NSSUTF8 *attrib, *value;
- current = slotParams;
- while (nssrv == PR_SUCCESS) {
- nssrv = nssCryptokiArgs_ParseNextPair(current,
- &attrib, &value,
- &remainder, tmparena);
- if (nssrv != PR_SUCCESS) break;
- if (value) {
- if (nssUTF8_Equal(attrib, "slotFlags", &nssrv)) {
- nssrv = parse_slot_flags(slot, value);
- } else if (nssUTF8_Equal(attrib, "askpw", &nssrv)) {
- } else if (nssUTF8_Equal(attrib, "timeout", &nssrv)) {
- }
- }
- if (*remainder == '\0') break;
- current = remainder;
- }
- return nssrv;
-}
-
-/* softoken seems to use "0x0000001", but no standard yet... perhaps this
- * should store the number as an ID, in case the input isn't 1,2,3,...?
- */
-static PRIntn
-get_slot_number(NSSUTF8* snString)
-{
- /* XXX super big hack */
- return atoi(&snString[strlen(snString)-1]);
-}
-
-static PRStatus
-parse_module_slot_parameters (
- NSSModule *mod,
- NSSUTF8 *slotParams
-)
-{
- PRStatus nssrv = PR_SUCCESS;
- NSSUTF8 *current, *remainder;
- NSSUTF8 *attrib, *value;
- NSSArena *tmparena;
- PRIntn slotNum;
- tmparena = nssArena_Create();
- if (!tmparena) {
- return PR_FAILURE;
- }
- current = slotParams;
- while (nssrv == PR_SUCCESS) {
- nssrv = nssCryptokiArgs_ParseNextPair(current,
- &attrib, &value,
- &remainder, tmparena);
- if (nssrv != PR_SUCCESS) break;
- if (value) {
- slotNum = get_slot_number(attrib);
- if (slotNum < 0 || slotNum > mod->numSlots) {
- return PR_FAILURE;
- }
- nssrv = parse_slot_parameters(mod->slots[slotNum],
- value, tmparena);
- if (nssrv != PR_SUCCESS) break;
- }
- if (*remainder == '\0') break;
- current = remainder;
- }
- return nssrv;
-}
-
-static PRStatus
-parse_nss_flags (
- NSSModule *mod,
- NSSUTF8 *nssFlags
-)
-{
- PRStatus nssrv = PR_SUCCESS;
- PRBool done = PR_FALSE;
- NSSUTF8 *mark, *last;
- last = mark = nssFlags;
- while (PR_TRUE) {
- while (*mark && *mark != ',') ++mark;
- if (!*mark) done = PR_TRUE;
- *mark = '\0';
- if (nssUTF8_Equal(last, "internal", &nssrv)) {
- mod->base.flags |= NSSMODULE_FLAGS_INTERNAL;
- } else if (nssUTF8_Equal(last, "moduleDB", &nssrv)) {
- mod->base.flags |= NSSMODULE_FLAGS_MODULE_DB;
- } else if (nssUTF8_Equal(last, "moduleDBOnly", &nssrv)) {
- mod->base.flags |= NSSMODULE_FLAGS_MODULE_DB_ONLY;
- } else if (nssUTF8_Equal(last, "critical", &nssrv)) {
- mod->base.flags |= NSSMODULE_FLAGS_CRITICAL;
- } else {
- return PR_FAILURE;
- }
- if (done) break;
- last = ++mark;
- }
- return nssrv;
-}
-
-static PRStatus
-parse_nss_parameters (
- NSSModule *mod,
- NSSUTF8 *nssParams,
- NSSArena *tmparena,
- NSSUTF8 **slotParams
-)
-{
- PRStatus nssrv = PR_SUCCESS;
- NSSUTF8 *current, *remainder;
- NSSUTF8 *attrib, *value;
- current = nssParams;
- while (nssrv == PR_SUCCESS) {
- nssrv = nssCryptokiArgs_ParseNextPair(current,
- &attrib, &value,
- &remainder, tmparena);
- if (nssrv != PR_SUCCESS) break;
- if (value) {
- if (nssUTF8_Equal(attrib, "flags", &nssrv) ||
- nssUTF8_Equal(attrib, "Flags", &nssrv)) {
- nssrv = parse_nss_flags(mod, value);
- } else if (nssUTF8_Equal(attrib, "trustOrder", &nssrv)) {
- mod->order.trust = atoi(value);
- } else if (nssUTF8_Equal(attrib, "cipherOrder", &nssrv)) {
- mod->order.cipher = atoi(value);
- } else if (nssUTF8_Equal(attrib, "ciphers", &nssrv)) {
- } else if (nssUTF8_Equal(attrib, "slotParams", &nssrv)) {
- /* slotParams doesn't get an arena, it is handled separately */
- *slotParams = nssUTF8_Duplicate(value, NULL);
- }
- }
- if (*remainder == '\0') break;
- current = remainder;
- }
- return nssrv;
-}
-
-static PRStatus
-parse_module_parameters (
- NSSModule *mod,
- NSSUTF8 *moduleParams,
- NSSUTF8 **slotParams
-)
-{
- PRStatus nssrv = PR_SUCCESS;
- NSSUTF8 *current, *remainder;
- NSSUTF8 *attrib, *value;
- NSSArena *arena = mod->base.arena;
- NSSArena *tmparena;
- current = moduleParams;
- tmparena = nssArena_Create();
- if (!tmparena) {
- return PR_FAILURE;
- }
- while (nssrv == PR_SUCCESS) {
- nssrv = nssCryptokiArgs_ParseNextPair(current,
- &attrib, &value,
- &remainder, tmparena);
- if (nssrv != PR_SUCCESS) break;
- if (value) {
- if (nssUTF8_Equal(attrib, "name", &nssrv)) {
- mod->base.name = nssUTF8_Duplicate(value, arena);
- } else if (nssUTF8_Equal(attrib, "library", &nssrv)) {
- mod->libraryName = nssUTF8_Duplicate(value, arena);
- } else if (nssUTF8_Equal(attrib, "parameters", &nssrv)) {
- mod->libraryParams = nssUTF8_Duplicate(value, arena);
- } else if (nssUTF8_Equal(attrib, "NSS", &nssrv)) {
- parse_nss_parameters(mod, value, tmparena, slotParams);
- }
- }
- if (*remainder == '\0') break;
- current = remainder;
- }
- nssArena_Destroy(tmparena);
- return nssrv;
-}
-
-static NSSUTF8 **
-get_module_specs (
- NSSModule *mod
-)
-{
- SECMODModuleDBFunc func = (SECMODModuleDBFunc)mod->moduleDBFunc;
- if (func) {
- return (*func)(SECMOD_MODULE_DB_FUNCTION_FIND,
- mod->libraryParams,
- NULL);
- }
- return NULL;
-}
-
-/* XXX continue working on */
-NSS_IMPLEMENT NSSModule *
-nssModule_CreateFromSpec (
- NSSUTF8 *moduleSpec,
- NSSModule *parent,
- PRBool loadSubModules
-)
-{
- PRStatus nssrv;
- NSSModule *thisModule;
- NSSArena *arena;
- NSSUTF8 *slotParams = NULL;
- arena = nssArena_Create();
- if (!arena) {
- return NULL;
- }
- thisModule = nss_ZNEW(arena, NSSModule);
- if (!thisModule) {
- goto loser;
- }
- thisModule->base.lock = PZ_NewLock(nssILockOther);
- if (!thisModule->base.lock) {
- goto loser;
- }
- PR_AtomicIncrement(&thisModule->base.refCount);
- thisModule->base.arena = arena;
- thisModule->base.lock = PZ_NewLock(nssNSSILockOther);
- if (!thisModule->base.lock) {
- goto loser;
- }
- nssrv = parse_module_parameters(thisModule, moduleSpec, &slotParams);
- if (nssrv != PR_SUCCESS) {
- goto loser;
- }
- nssrv = nssModule_Load(thisModule);
- if (nssrv != PR_SUCCESS) {
- goto loser;
- }
- if (slotParams) {
- nssrv = parse_module_slot_parameters(thisModule, slotParams);
- nss_ZFreeIf(slotParams);
- if (nssrv != PR_SUCCESS) {
- goto loser;
- }
- }
- if (loadSubModules && NSSMODULE_IS_MODULE_DB(thisModule)) {
- NSSUTF8 **moduleSpecs;
- NSSUTF8 **index;
- /* get the array of sub modules one level below this module */
- moduleSpecs = get_module_specs(thisModule);
- /* iterate over the array */
- for (index = moduleSpecs; index && *index; index++) {
- NSSModule *child;
- /* load the child recursively */
- child = nssModule_CreateFromSpec(*index, thisModule, PR_TRUE);
- if (!child) {
- /* when children fail, does the parent? */
- nssrv = PR_FAILURE;
- break;
- }
- if (NSSMODULE_IS_CRITICAL(child) && !child->isLoaded) {
- nssrv = PR_FAILURE;
- nssModule_Destroy(child);
- break;
- }
- nssModule_Destroy(child);
- /*nss_ZFreeIf(*index);*/
- }
- /*nss_ZFreeIf(moduleSpecs);*/
- }
- /* The global list inherits the reference */
- nssrv = nssGlobalModuleList_Add(thisModule);
- if (nssrv != PR_SUCCESS) {
- goto loser;
- }
- return thisModule;
-loser:
- if (thisModule->base.lock) {
- PZ_DestroyLock(thisModule->base.lock);
- }
- nssArena_Destroy(arena);
- return (NSSModule *)NULL;
-}
-
-NSS_IMPLEMENT PRStatus
-nssModule_Destroy (
- NSSModule *mod
-)
-{
- PRUint32 i, numSlots;
- if (PR_AtomicDecrement(&mod->base.refCount) == 0) {
- if (mod->numSlots == 0) {
- (void)nssModule_Unload(mod);
- return nssArena_Destroy(mod->base.arena);
- } else {
- numSlots = mod->numSlots;
- for (i=0; i<numSlots; i++) {
- nssSlot_Destroy(mod->slots[i]);
- }
- }
- }
- return PR_SUCCESS;
-}
-
-NSS_IMPLEMENT PRStatus
-nssModule_DestroyFromSlot (
- NSSModule *mod,
- NSSSlot *slot
-)
-{
- PRUint32 i, numSlots = 0;
- PR_ASSERT(mod->base.refCount == 0);
- for (i=0; i<mod->numSlots; i++) {
- if (mod->slots[i] == slot) {
- mod->slots[i] = NULL;
- } else if (mod->slots[i]) {
- numSlots++;
- }
- }
- if (numSlots == 0) {
- (void)nssModule_Unload(mod);
- return nssArena_Destroy(mod->base.arena);
- }
- return PR_SUCCESS;
-}
-
-NSS_IMPLEMENT NSSModule *
-nssModule_AddRef (
- NSSModule *mod
-)
-{
- PR_AtomicIncrement(&mod->base.refCount);
- return mod;
-}
-
-NSS_IMPLEMENT NSSUTF8 *
-nssModule_GetName (
- NSSModule *mod
-)
-{
- return mod->base.name;
-}
-
-NSS_IMPLEMENT PRBool
-nssModule_IsThreadSafe (
- NSSModule *module
-)
-{
- return NSSMODULE_IS_THREADSAFE(module);
-}
-
-NSS_IMPLEMENT PRBool
-nssModule_IsInternal (
- NSSModule *mod
-)
-{
- return NSSMODULE_IS_INTERNAL(mod);
-}
-
-NSS_IMPLEMENT PRBool
-nssModule_IsModuleDBOnly (
- NSSModule *mod
-)
-{
- return NSSMODULE_IS_MODULE_DB_ONLY(mod);
-}
-
-NSS_IMPLEMENT void *
-nssModule_GetCryptokiEPV (
- NSSModule *mod
-)
-{
- return mod->epv;
-}
-
-NSS_IMPLEMENT NSSSlot **
-nssModule_GetSlots (
- NSSModule *mod
-)
-{
- PRUint32 i;
- NSSSlot **rvSlots;
- rvSlots = nss_ZNEWARRAY(NULL, NSSSlot *, mod->numSlots + 1);
- if (rvSlots) {
- for (i=0; i<mod->numSlots; i++) {
- rvSlots[i] = nssSlot_AddRef(mod->slots[i]);
- }
- }
- return rvSlots;
-}
-
-NSS_IMPLEMENT NSSSlot *
-nssModule_FindSlotByName (
- NSSModule *mod,
- NSSUTF8 *slotName
-)
-{
- PRUint32 i;
- PRStatus nssrv;
- NSSSlot *slot;
- NSSUTF8 *name;
- for (i=0; i<mod->numSlots; i++) {
- slot = mod->slots[i];
- name = nssSlot_GetName(slot);
- if (nssUTF8_Equal(name, slotName, &nssrv)) {
- return nssSlot_AddRef(slot);
- }
- if (nssrv != PR_SUCCESS) {
- break;
- }
- }
- return (NSSSlot *)NULL;
-}
-
-NSS_IMPLEMENT NSSToken *
-nssModule_FindTokenByName (
- NSSModule *mod,
- NSSUTF8 *tokenName
-)
-{
- PRUint32 i;
- PRStatus nssrv;
- NSSToken *tok;
- NSSUTF8 *name;
- for (i=0; i<mod->numSlots; i++) {
- tok = nssSlot_GetToken(mod->slots[i]);
- if (tok) {
- name = nssToken_GetName(tok);
- if (nssUTF8_Equal(name, tokenName, &nssrv)) {
- return tok;
- }
- if (nssrv != PR_SUCCESS) {
- break;
- }
- }
- }
- return (NSSToken *)NULL;
-}
-
-NSS_IMPLEMENT PRInt32
-nssModule_GetCertOrder (
- NSSModule *module
-)
-{
- return 1; /* XXX */
-}
-
-#endif /* PURE_STAN_BUILD */
-