Index: mozilla/security/nss/lib/pki/trustdomain.c |
=================================================================== |
--- mozilla/security/nss/lib/pki/trustdomain.c (revision 191424) |
+++ mozilla/security/nss/lib/pki/trustdomain.c (working copy) |
@@ -1,1258 +0,0 @@ |
-/* 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/. */ |
- |
-#ifdef DEBUG |
-static const char CVS_ID[] = "@(#) $RCSfile: trustdomain.c,v $ $Revision: 1.63 $ $Date: 2012/04/25 14:50:07 $"; |
-#endif /* DEBUG */ |
- |
-#ifndef DEV_H |
-#include "dev.h" |
-#endif /* DEV_H */ |
- |
-#ifndef PKIM_H |
-#include "pkim.h" |
-#endif /* PKIM_H */ |
- |
-#include "cert.h" |
-#include "pki3hack.h" |
-#include "pk11pub.h" |
-#include "nssrwlk.h" |
- |
-#define NSSTRUSTDOMAIN_DEFAULT_CACHE_SIZE 32 |
- |
-extern const NSSError NSS_ERROR_NOT_FOUND; |
- |
-typedef PRUint32 nssUpdateLevel; |
- |
-NSS_IMPLEMENT NSSTrustDomain * |
-NSSTrustDomain_Create ( |
- NSSUTF8 *moduleOpt, |
- NSSUTF8 *uriOpt, |
- NSSUTF8 *opaqueOpt, |
- void *reserved |
-) |
-{ |
- NSSArena *arena; |
- NSSTrustDomain *rvTD; |
- arena = NSSArena_Create(); |
- if(!arena) { |
- return (NSSTrustDomain *)NULL; |
- } |
- rvTD = nss_ZNEW(arena, NSSTrustDomain); |
- if (!rvTD) { |
- goto loser; |
- } |
- /* protect the token list and the token iterator */ |
- rvTD->tokensLock = NSSRWLock_New(100, "tokens"); |
- if (!rvTD->tokensLock) { |
- goto loser; |
- } |
- nssTrustDomain_InitializeCache(rvTD, NSSTRUSTDOMAIN_DEFAULT_CACHE_SIZE); |
- rvTD->arena = arena; |
- rvTD->refCount = 1; |
- rvTD->statusConfig = NULL; |
- return rvTD; |
-loser: |
- if (rvTD && rvTD->tokensLock) { |
- NSSRWLock_Destroy(rvTD->tokensLock); |
- } |
- nssArena_Destroy(arena); |
- return (NSSTrustDomain *)NULL; |
-} |
- |
-static void |
-token_destructor(void *t) |
-{ |
- NSSToken *tok = (NSSToken *)t; |
- /* The token holds the first/last reference to the slot. |
- * When the token is actually destroyed (ref count == 0), |
- * the slot will also be destroyed. |
- */ |
- nssToken_Destroy(tok); |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_Destroy ( |
- NSSTrustDomain *td |
-) |
-{ |
- PRStatus status = PR_SUCCESS; |
- if (--td->refCount == 0) { |
- /* Destroy each token in the list of tokens */ |
- if (td->tokens) { |
- nssListIterator_Destroy(td->tokens); |
- td->tokens = NULL; |
- } |
- if (td->tokenList) { |
- nssList_Clear(td->tokenList, token_destructor); |
- nssList_Destroy(td->tokenList); |
- td->tokenList = NULL; |
- } |
- NSSRWLock_Destroy(td->tokensLock); |
- td->tokensLock = NULL; |
- status = nssTrustDomain_DestroyCache(td); |
- if (status == PR_FAILURE) { |
- return status; |
- } |
- if (td->statusConfig) { |
- td->statusConfig->statusDestroy(td->statusConfig); |
- td->statusConfig = NULL; |
- } |
- /* Destroy the trust domain */ |
- nssArena_Destroy(td->arena); |
- } |
- return status; |
-} |
- |
-/* XXX uses tokens until slot list is in place */ |
-static NSSSlot ** |
-nssTrustDomain_GetActiveSlots ( |
- NSSTrustDomain *td, |
- nssUpdateLevel *updateLevel |
-) |
-{ |
- PRUint32 count; |
- NSSSlot **slots = NULL; |
- NSSToken **tp, **tokens; |
- *updateLevel = 1; |
- NSSRWLock_LockRead(td->tokensLock); |
- count = nssList_Count(td->tokenList); |
- tokens = nss_ZNEWARRAY(NULL, NSSToken *, count + 1); |
- if (!tokens) { |
- NSSRWLock_UnlockRead(td->tokensLock); |
- return NULL; |
- } |
- slots = nss_ZNEWARRAY(NULL, NSSSlot *, count + 1); |
- if (!slots) { |
- NSSRWLock_UnlockRead(td->tokensLock); |
- nss_ZFreeIf(tokens); |
- return NULL; |
- } |
- nssList_GetArray(td->tokenList, (void **)tokens, count); |
- NSSRWLock_UnlockRead(td->tokensLock); |
- count = 0; |
- for (tp = tokens; *tp; tp++) { |
- NSSSlot * slot = nssToken_GetSlot(*tp); |
- if (!PK11_IsDisabled(slot->pk11slot)) { |
- slots[count++] = slot; |
- } else { |
- nssSlot_Destroy(slot); |
- } |
- } |
- nss_ZFreeIf(tokens); |
- if (!count) { |
- nss_ZFreeIf(slots); |
- slots = NULL; |
- } |
- return slots; |
-} |
- |
-/* XXX */ |
-static nssSession * |
-nssTrustDomain_GetSessionForToken ( |
- NSSTrustDomain *td, |
- NSSToken *token |
-) |
-{ |
- return nssToken_GetDefaultSession(token); |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_SetDefaultCallback ( |
- NSSTrustDomain *td, |
- NSSCallback *newCallback, |
- NSSCallback **oldCallbackOpt |
-) |
-{ |
- if (oldCallbackOpt) { |
- *oldCallbackOpt = td->defaultCallback; |
- } |
- td->defaultCallback = newCallback; |
- return PR_SUCCESS; |
-} |
- |
-NSS_IMPLEMENT NSSCallback * |
-nssTrustDomain_GetDefaultCallback ( |
- NSSTrustDomain *td, |
- PRStatus *statusOpt |
-) |
-{ |
- if (statusOpt) { |
- *statusOpt = PR_SUCCESS; |
- } |
- return td->defaultCallback; |
-} |
- |
-NSS_IMPLEMENT NSSCallback * |
-NSSTrustDomain_GetDefaultCallback ( |
- NSSTrustDomain *td, |
- PRStatus *statusOpt |
-) |
-{ |
- return nssTrustDomain_GetDefaultCallback(td, statusOpt); |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_LoadModule ( |
- NSSTrustDomain *td, |
- NSSUTF8 *moduleOpt, |
- NSSUTF8 *uriOpt, |
- NSSUTF8 *opaqueOpt, |
- void *reserved |
-) |
-{ |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_DisableToken ( |
- NSSTrustDomain *td, |
- NSSToken *token, |
- NSSError why |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_EnableToken ( |
- NSSTrustDomain *td, |
- NSSToken *token |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_IsTokenEnabled ( |
- NSSTrustDomain *td, |
- NSSToken *token, |
- NSSError *whyOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT NSSSlot * |
-NSSTrustDomain_FindSlotByName ( |
- NSSTrustDomain *td, |
- NSSUTF8 *slotName |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSToken * |
-NSSTrustDomain_FindTokenByName ( |
- NSSTrustDomain *td, |
- NSSUTF8 *tokenName |
-) |
-{ |
- PRStatus nssrv; |
- NSSUTF8 *myName; |
- NSSToken *tok = NULL; |
- NSSRWLock_LockRead(td->tokensLock); |
- for (tok = (NSSToken *)nssListIterator_Start(td->tokens); |
- tok != (NSSToken *)NULL; |
- tok = (NSSToken *)nssListIterator_Next(td->tokens)) |
- { |
- if (nssToken_IsPresent(tok)) { |
- myName = nssToken_GetName(tok); |
- if (nssUTF8_Equal(tokenName, myName, &nssrv)) break; |
- } |
- } |
- nssListIterator_Finish(td->tokens); |
- NSSRWLock_UnlockRead(td->tokensLock); |
- return tok; |
-} |
- |
-NSS_IMPLEMENT NSSToken * |
-NSSTrustDomain_FindTokenBySlotName ( |
- NSSTrustDomain *td, |
- NSSUTF8 *slotName |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSToken * |
-NSSTrustDomain_FindTokenForAlgorithm ( |
- NSSTrustDomain *td, |
- NSSOID *algorithm |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSToken * |
-NSSTrustDomain_FindBestTokenForAlgorithms ( |
- NSSTrustDomain *td, |
- NSSOID *algorithms[], /* may be null-terminated */ |
- PRUint32 nAlgorithmsOpt /* limits the array if nonzero */ |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_Login ( |
- NSSTrustDomain *td, |
- NSSCallback *uhhOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_Logout ( |
- NSSTrustDomain *td |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_ImportCertificate ( |
- NSSTrustDomain *td, |
- NSSCertificate *c |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_ImportPKIXCertificate ( |
- NSSTrustDomain *td, |
- /* declared as a struct until these "data types" are defined */ |
- struct NSSPKIXCertificateStr *pc |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_ImportEncodedCertificate ( |
- NSSTrustDomain *td, |
- NSSBER *ber |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_ImportEncodedCertificateChain ( |
- NSSTrustDomain *td, |
- NSSBER *ber, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, /* 0 for no max */ |
- NSSArena *arenaOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSPrivateKey * |
-NSSTrustDomain_ImportEncodedPrivateKey ( |
- NSSTrustDomain *td, |
- NSSBER *ber, |
- NSSItem *passwordOpt, /* NULL will cause a callback */ |
- NSSCallback *uhhOpt, |
- NSSToken *destination |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSPublicKey * |
-NSSTrustDomain_ImportEncodedPublicKey ( |
- NSSTrustDomain *td, |
- NSSBER *ber |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-static NSSCertificate ** |
-get_certs_from_list(nssList *list) |
-{ |
- PRUint32 count = nssList_Count(list); |
- NSSCertificate **certs = NULL; |
- if (count > 0) { |
- certs = nss_ZNEWARRAY(NULL, NSSCertificate *, count + 1); |
- if (certs) { |
- nssList_GetArray(list, (void **)certs, count); |
- } |
- } |
- return certs; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-nssTrustDomain_FindCertificatesByNickname ( |
- NSSTrustDomain *td, |
- const NSSUTF8 *name, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, /* 0 for no max */ |
- NSSArena *arenaOpt |
-) |
-{ |
- NSSToken *token = NULL; |
- NSSSlot **slots = NULL; |
- NSSSlot **slotp; |
- NSSCertificate **rvCerts = NULL; |
- nssPKIObjectCollection *collection = NULL; |
- nssUpdateLevel updateLevel; |
- nssList *nameList; |
- PRUint32 numRemaining = maximumOpt; |
- PRUint32 collectionCount = 0; |
- PRUint32 errors = 0; |
- |
- /* First, grab from the cache */ |
- nameList = nssList_Create(NULL, PR_FALSE); |
- if (!nameList) { |
- return NULL; |
- } |
- (void)nssTrustDomain_GetCertsForNicknameFromCache(td, name, nameList); |
- rvCerts = get_certs_from_list(nameList); |
- /* initialize the collection of token certificates with the set of |
- * cached certs (if any). |
- */ |
- collection = nssCertificateCollection_Create(td, rvCerts); |
- nssCertificateArray_Destroy(rvCerts); |
- nssList_Destroy(nameList); |
- if (!collection) { |
- return (NSSCertificate **)NULL; |
- } |
- /* obtain the current set of active slots in the trust domain */ |
- slots = nssTrustDomain_GetActiveSlots(td, &updateLevel); |
- if (!slots) { |
- goto loser; |
- } |
- /* iterate over the slots */ |
- for (slotp = slots; *slotp; slotp++) { |
- token = nssSlot_GetToken(*slotp); |
- if (token) { |
- nssSession *session; |
- nssCryptokiObject **instances = NULL; |
- nssTokenSearchType tokenOnly = nssTokenSearchType_TokenOnly; |
- PRStatus status = PR_FAILURE; |
- |
- session = nssTrustDomain_GetSessionForToken(td, token); |
- if (session) { |
- instances = nssToken_FindCertificatesByNickname(token, |
- session, |
- name, |
- tokenOnly, |
- numRemaining, |
- &status); |
- } |
- nssToken_Destroy(token); |
- if (status != PR_SUCCESS) { |
- errors++; |
- continue; |
- } |
- if (instances) { |
- status = nssPKIObjectCollection_AddInstances(collection, |
- instances, 0); |
- nss_ZFreeIf(instances); |
- if (status != PR_SUCCESS) { |
- errors++; |
- continue; |
- } |
- collectionCount = nssPKIObjectCollection_Count(collection); |
- if (maximumOpt > 0) { |
- if (collectionCount >= maximumOpt) |
- break; |
- numRemaining = maximumOpt - collectionCount; |
- } |
- } |
- } |
- } |
- if (!collectionCount && errors) |
- goto loser; |
- /* Grab the certs collected in the search. */ |
- rvCerts = nssPKIObjectCollection_GetCertificates(collection, |
- rvOpt, maximumOpt, |
- arenaOpt); |
- /* clean up */ |
- nssPKIObjectCollection_Destroy(collection); |
- nssSlotArray_Destroy(slots); |
- return rvCerts; |
-loser: |
- if (slots) { |
- nssSlotArray_Destroy(slots); |
- } |
- if (collection) { |
- nssPKIObjectCollection_Destroy(collection); |
- } |
- return (NSSCertificate **)NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindCertificatesByNickname ( |
- NSSTrustDomain *td, |
- NSSUTF8 *name, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, /* 0 for no max */ |
- NSSArena *arenaOpt |
-) |
-{ |
- return nssTrustDomain_FindCertificatesByNickname(td, |
- name, |
- rvOpt, |
- maximumOpt, |
- arenaOpt); |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-nssTrustDomain_FindBestCertificateByNickname ( |
- NSSTrustDomain *td, |
- const NSSUTF8 *name, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- NSSCertificate **nicknameCerts; |
- NSSCertificate *rvCert = NULL; |
- nicknameCerts = nssTrustDomain_FindCertificatesByNickname(td, name, |
- NULL, |
- 0, |
- NULL); |
- if (nicknameCerts) { |
- rvCert = nssCertificateArray_FindBestCertificate(nicknameCerts, |
- timeOpt, |
- usage, |
- policiesOpt); |
- nssCertificateArray_Destroy(nicknameCerts); |
- } |
- return rvCert; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestCertificateByNickname ( |
- NSSTrustDomain *td, |
- const NSSUTF8 *name, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- return nssTrustDomain_FindBestCertificateByNickname(td, |
- name, |
- timeOpt, |
- usage, |
- policiesOpt); |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-nssTrustDomain_FindCertificatesBySubject ( |
- NSSTrustDomain *td, |
- NSSDER *subject, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, /* 0 for no max */ |
- NSSArena *arenaOpt |
-) |
-{ |
- NSSToken *token = NULL; |
- NSSSlot **slots = NULL; |
- NSSSlot **slotp; |
- NSSCertificate **rvCerts = NULL; |
- nssPKIObjectCollection *collection = NULL; |
- nssUpdateLevel updateLevel; |
- nssList *subjectList; |
- PRUint32 numRemaining = maximumOpt; |
- PRUint32 collectionCount = 0; |
- PRUint32 errors = 0; |
- |
- /* look in cache */ |
- subjectList = nssList_Create(NULL, PR_FALSE); |
- if (!subjectList) { |
- return NULL; |
- } |
- (void)nssTrustDomain_GetCertsForSubjectFromCache(td, subject, subjectList); |
- rvCerts = get_certs_from_list(subjectList); |
- collection = nssCertificateCollection_Create(td, rvCerts); |
- nssCertificateArray_Destroy(rvCerts); |
- nssList_Destroy(subjectList); |
- if (!collection) { |
- return (NSSCertificate **)NULL; |
- } |
- slots = nssTrustDomain_GetActiveSlots(td, &updateLevel); |
- if (!slots) { |
- goto loser; |
- } |
- for (slotp = slots; *slotp; slotp++) { |
- token = nssSlot_GetToken(*slotp); |
- if (token) { |
- nssSession *session; |
- nssCryptokiObject **instances = NULL; |
- nssTokenSearchType tokenOnly = nssTokenSearchType_TokenOnly; |
- PRStatus status = PR_FAILURE; |
- |
- session = nssTrustDomain_GetSessionForToken(td, token); |
- if (session) { |
- instances = nssToken_FindCertificatesBySubject(token, |
- session, |
- subject, |
- tokenOnly, |
- numRemaining, |
- &status); |
- } |
- nssToken_Destroy(token); |
- if (status != PR_SUCCESS) { |
- errors++; |
- continue; |
- } |
- if (instances) { |
- status = nssPKIObjectCollection_AddInstances(collection, |
- instances, 0); |
- nss_ZFreeIf(instances); |
- if (status != PR_SUCCESS) { |
- errors++; |
- continue; |
- } |
- collectionCount = nssPKIObjectCollection_Count(collection); |
- if (maximumOpt > 0) { |
- if (collectionCount >= maximumOpt) |
- break; |
- numRemaining = maximumOpt - collectionCount; |
- } |
- } |
- } |
- } |
- if (!collectionCount && errors) |
- goto loser; |
- rvCerts = nssPKIObjectCollection_GetCertificates(collection, |
- rvOpt, maximumOpt, |
- arenaOpt); |
- nssPKIObjectCollection_Destroy(collection); |
- nssSlotArray_Destroy(slots); |
- return rvCerts; |
-loser: |
- if (slots) { |
- nssSlotArray_Destroy(slots); |
- } |
- if (collection) { |
- nssPKIObjectCollection_Destroy(collection); |
- } |
- return (NSSCertificate **)NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindCertificatesBySubject ( |
- NSSTrustDomain *td, |
- NSSDER *subject, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, |
- NSSArena *arenaOpt |
-) |
-{ |
- return nssTrustDomain_FindCertificatesBySubject(td, |
- subject, |
- rvOpt, |
- maximumOpt, |
- arenaOpt); |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-nssTrustDomain_FindBestCertificateBySubject ( |
- NSSTrustDomain *td, |
- NSSDER *subject, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- NSSCertificate **subjectCerts; |
- NSSCertificate *rvCert = NULL; |
- subjectCerts = nssTrustDomain_FindCertificatesBySubject(td, subject, |
- NULL, |
- 0, |
- NULL); |
- if (subjectCerts) { |
- rvCert = nssCertificateArray_FindBestCertificate(subjectCerts, |
- timeOpt, |
- usage, |
- policiesOpt); |
- nssCertificateArray_Destroy(subjectCerts); |
- } |
- return rvCert; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestCertificateBySubject ( |
- NSSTrustDomain *td, |
- NSSDER *subject, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- return nssTrustDomain_FindBestCertificateBySubject(td, |
- subject, |
- timeOpt, |
- usage, |
- policiesOpt); |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestCertificateByNameComponents ( |
- NSSTrustDomain *td, |
- NSSUTF8 *nameComponents, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindCertificatesByNameComponents ( |
- NSSTrustDomain *td, |
- NSSUTF8 *nameComponents, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, /* 0 for no max */ |
- NSSArena *arenaOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-/* This returns at most a single certificate, so it can stop the loop |
- * when one is found. |
- */ |
-NSS_IMPLEMENT NSSCertificate * |
-nssTrustDomain_FindCertificateByIssuerAndSerialNumber ( |
- NSSTrustDomain *td, |
- NSSDER *issuer, |
- NSSDER *serial |
-) |
-{ |
- NSSSlot **slots = NULL; |
- NSSSlot **slotp; |
- NSSCertificate *rvCert = NULL; |
- nssPKIObjectCollection *collection = NULL; |
- nssUpdateLevel updateLevel; |
- |
- /* see if this search is already cached */ |
- rvCert = nssTrustDomain_GetCertForIssuerAndSNFromCache(td, |
- issuer, |
- serial); |
- if (rvCert) { |
- return rvCert; |
- } |
- slots = nssTrustDomain_GetActiveSlots(td, &updateLevel); |
- if (slots) { |
- for (slotp = slots; *slotp; slotp++) { |
- NSSToken *token = nssSlot_GetToken(*slotp); |
- nssSession *session; |
- nssCryptokiObject *instance; |
- nssTokenSearchType tokenOnly = nssTokenSearchType_TokenOnly; |
- PRStatus status = PR_FAILURE; |
- |
- if (!token) |
- continue; |
- session = nssTrustDomain_GetSessionForToken(td, token); |
- if (session) { |
- instance = nssToken_FindCertificateByIssuerAndSerialNumber( |
- token, |
- session, |
- issuer, |
- serial, |
- tokenOnly, |
- &status); |
- } |
- nssToken_Destroy(token); |
- if (status != PR_SUCCESS) { |
- continue; |
- } |
- if (instance) { |
- if (!collection) { |
- collection = nssCertificateCollection_Create(td, NULL); |
- if (!collection) { |
- break; /* don't keep looping if out if memory */ |
- } |
- } |
- status = nssPKIObjectCollection_AddInstances(collection, |
- &instance, 1); |
- if (status == PR_SUCCESS) { |
- (void)nssPKIObjectCollection_GetCertificates( |
- collection, &rvCert, 1, NULL); |
- } |
- if (rvCert) { |
- break; /* found one cert, all done */ |
- } |
- } |
- } |
- } |
- if (collection) { |
- nssPKIObjectCollection_Destroy(collection); |
- } |
- if (slots) { |
- nssSlotArray_Destroy(slots); |
- } |
- return rvCert; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindCertificateByIssuerAndSerialNumber ( |
- NSSTrustDomain *td, |
- NSSDER *issuer, |
- NSSDER *serial |
-) |
-{ |
- return nssTrustDomain_FindCertificateByIssuerAndSerialNumber(td, |
- issuer, |
- serial); |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-nssTrustDomain_FindCertificateByEncodedCertificate ( |
- NSSTrustDomain *td, |
- NSSBER *ber |
-) |
-{ |
- PRStatus status; |
- NSSCertificate *rvCert = NULL; |
- NSSDER issuer = { 0 }; |
- NSSDER serial = { 0 }; |
- NSSArena *arena = nssArena_Create(); |
- if (!arena) { |
- return (NSSCertificate *)NULL; |
- } |
- /* XXX this is not generic... will any cert crack into issuer/serial? */ |
- status = nssPKIX509_GetIssuerAndSerialFromDER(ber, arena, &issuer, &serial); |
- if (status != PR_SUCCESS) { |
- goto finish; |
- } |
- rvCert = nssTrustDomain_FindCertificateByIssuerAndSerialNumber(td, |
- &issuer, |
- &serial); |
-finish: |
- nssArena_Destroy(arena); |
- return rvCert; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindCertificateByEncodedCertificate ( |
- NSSTrustDomain *td, |
- NSSBER *ber |
-) |
-{ |
- return nssTrustDomain_FindCertificateByEncodedCertificate(td, ber); |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestCertificateByEmail ( |
- NSSTrustDomain *td, |
- NSSASCII7 *email, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- return 0; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindCertificatesByEmail ( |
- NSSTrustDomain *td, |
- NSSASCII7 *email, |
- NSSCertificate *rvOpt[], |
- PRUint32 maximumOpt, /* 0 for no max */ |
- NSSArena *arenaOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindCertificateByOCSPHash ( |
- NSSTrustDomain *td, |
- NSSItem *hash |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestUserCertificate ( |
- NSSTrustDomain *td, |
- NSSTime *timeOpt, |
- NSSUsage *usage, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindUserCertificates ( |
- NSSTrustDomain *td, |
- NSSTime *timeOpt, |
- NSSUsage *usageOpt, |
- NSSPolicies *policiesOpt, |
- NSSCertificate **rvOpt, |
- PRUint32 rvLimit, /* zero for no limit */ |
- NSSArena *arenaOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestUserCertificateForSSLClientAuth ( |
- NSSTrustDomain *td, |
- NSSUTF8 *sslHostOpt, |
- NSSDER *rootCAsOpt[], /* null pointer for none */ |
- PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */ |
- NSSAlgorithmAndParameters *apOpt, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindUserCertificatesForSSLClientAuth ( |
- NSSTrustDomain *td, |
- NSSUTF8 *sslHostOpt, |
- NSSDER *rootCAsOpt[], /* null pointer for none */ |
- PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */ |
- NSSAlgorithmAndParameters *apOpt, |
- NSSPolicies *policiesOpt, |
- NSSCertificate **rvOpt, |
- PRUint32 rvLimit, /* zero for no limit */ |
- NSSArena *arenaOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate * |
-NSSTrustDomain_FindBestUserCertificateForEmailSigning ( |
- NSSTrustDomain *td, |
- NSSASCII7 *signerOpt, |
- NSSASCII7 *recipientOpt, |
- /* anything more here? */ |
- NSSAlgorithmAndParameters *apOpt, |
- NSSPolicies *policiesOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCertificate ** |
-NSSTrustDomain_FindUserCertificatesForEmailSigning ( |
- NSSTrustDomain *td, |
- NSSASCII7 *signerOpt, |
- NSSASCII7 *recipientOpt, |
- /* anything more here? */ |
- NSSAlgorithmAndParameters *apOpt, |
- NSSPolicies *policiesOpt, |
- NSSCertificate **rvOpt, |
- PRUint32 rvLimit, /* zero for no limit */ |
- NSSArena *arenaOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-static PRStatus |
-collector(nssCryptokiObject *instance, void *arg) |
-{ |
- nssPKIObjectCollection *collection = (nssPKIObjectCollection *)arg; |
- return nssPKIObjectCollection_AddInstanceAsObject(collection, instance); |
-} |
- |
-NSS_IMPLEMENT PRStatus * |
-NSSTrustDomain_TraverseCertificates ( |
- NSSTrustDomain *td, |
- PRStatus (*callback)(NSSCertificate *c, void *arg), |
- void *arg |
-) |
-{ |
- PRStatus status = PR_FAILURE; |
- NSSToken *token = NULL; |
- NSSSlot **slots = NULL; |
- NSSSlot **slotp; |
- nssPKIObjectCollection *collection = NULL; |
- nssPKIObjectCallback pkiCallback; |
- nssUpdateLevel updateLevel; |
- NSSCertificate **cached = NULL; |
- nssList *certList; |
- |
- certList = nssList_Create(NULL, PR_FALSE); |
- if (!certList) |
- return NULL; |
- (void)nssTrustDomain_GetCertsFromCache(td, certList); |
- cached = get_certs_from_list(certList); |
- collection = nssCertificateCollection_Create(td, cached); |
- nssCertificateArray_Destroy(cached); |
- nssList_Destroy(certList); |
- if (!collection) { |
- return (PRStatus *)NULL; |
- } |
- /* obtain the current set of active slots in the trust domain */ |
- slots = nssTrustDomain_GetActiveSlots(td, &updateLevel); |
- if (!slots) { |
- goto loser; |
- } |
- /* iterate over the slots */ |
- for (slotp = slots; *slotp; slotp++) { |
- /* get the token for the slot, if present */ |
- token = nssSlot_GetToken(*slotp); |
- if (token) { |
- nssSession *session; |
- nssTokenSearchType tokenOnly = nssTokenSearchType_TokenOnly; |
- /* get a session for the token */ |
- session = nssTrustDomain_GetSessionForToken(td, token); |
- if (session) { |
- /* perform the traversal */ |
- status = nssToken_TraverseCertificates(token, |
- session, |
- tokenOnly, |
- collector, |
- collection); |
- } |
- nssToken_Destroy(token); |
- } |
- } |
- |
- /* Traverse the collection */ |
- pkiCallback.func.cert = callback; |
- pkiCallback.arg = arg; |
- status = nssPKIObjectCollection_Traverse(collection, &pkiCallback); |
-loser: |
- if (slots) { |
- nssSlotArray_Destroy(slots); |
- } |
- if (collection) { |
- nssPKIObjectCollection_Destroy(collection); |
- } |
- return NULL; |
-} |
- |
- |
-NSS_IMPLEMENT NSSTrust * |
-nssTrustDomain_FindTrustForCertificate ( |
- NSSTrustDomain *td, |
- NSSCertificate *c |
-) |
-{ |
- NSSSlot **slots; |
- NSSSlot **slotp; |
- nssCryptokiObject *to = NULL; |
- nssPKIObject *pkio = NULL; |
- NSSTrust *rvt = NULL; |
- nssUpdateLevel updateLevel; |
- slots = nssTrustDomain_GetActiveSlots(td, &updateLevel); |
- if (!slots) { |
- return (NSSTrust *)NULL; |
- } |
- for (slotp = slots; *slotp; slotp++) { |
- NSSToken *token = nssSlot_GetToken(*slotp); |
- |
- if (token) { |
- to = nssToken_FindTrustForCertificate(token, NULL, |
- &c->encoding, |
- &c->issuer, |
- &c->serial, |
- nssTokenSearchType_TokenOnly); |
- if (to) { |
- PRStatus status; |
- if (!pkio) { |
- pkio = nssPKIObject_Create(NULL, to, td, NULL, nssPKILock); |
- status = pkio ? PR_SUCCESS : PR_FAILURE; |
- } else { |
- status = nssPKIObject_AddInstance(pkio, to); |
- } |
- if (status != PR_SUCCESS) { |
- nssCryptokiObject_Destroy(to); |
- } |
- } |
- nssToken_Destroy(token); |
- } |
- } |
- if (pkio) { |
- rvt = nssTrust_Create(pkio, &c->encoding); |
- if (rvt) { |
- pkio = NULL; /* rvt object now owns the pkio reference */ |
- } |
- } |
- nssSlotArray_Destroy(slots); |
- if (pkio) { |
- nssPKIObject_Destroy(pkio); |
- } |
- return rvt; |
-} |
- |
-NSS_IMPLEMENT NSSCRL ** |
-nssTrustDomain_FindCRLsBySubject ( |
- NSSTrustDomain *td, |
- NSSDER *subject |
-) |
-{ |
- NSSSlot **slots; |
- NSSSlot **slotp; |
- NSSToken *token; |
- nssUpdateLevel updateLevel; |
- nssPKIObjectCollection *collection; |
- NSSCRL **rvCRLs = NULL; |
- collection = nssCRLCollection_Create(td, NULL); |
- if (!collection) { |
- return (NSSCRL **)NULL; |
- } |
- slots = nssTrustDomain_GetActiveSlots(td, &updateLevel); |
- if (!slots) { |
- goto loser; |
- } |
- for (slotp = slots; *slotp; slotp++) { |
- token = nssSlot_GetToken(*slotp); |
- if (token) { |
- PRStatus status = PR_FAILURE; |
- nssSession *session; |
- nssCryptokiObject **instances = NULL; |
- nssTokenSearchType tokenOnly = nssTokenSearchType_TokenOnly; |
- |
- /* get a session for the token */ |
- session = nssTrustDomain_GetSessionForToken(td, token); |
- if (session) { |
- /* perform the traversal */ |
- instances = nssToken_FindCRLsBySubject(token, session, subject, |
- tokenOnly, 0, &status); |
- } |
- nssToken_Destroy(token); |
- if (status == PR_SUCCESS) { |
- /* add the found CRL's to the collection */ |
- status = nssPKIObjectCollection_AddInstances(collection, |
- instances, 0); |
- } |
- nss_ZFreeIf(instances); |
- } |
- } |
- rvCRLs = nssPKIObjectCollection_GetCRLs(collection, NULL, 0, NULL); |
-loser: |
- nssPKIObjectCollection_Destroy(collection); |
- nssSlotArray_Destroy(slots); |
- return rvCRLs; |
-} |
- |
-NSS_IMPLEMENT PRStatus |
-NSSTrustDomain_GenerateKeyPair ( |
- NSSTrustDomain *td, |
- NSSAlgorithmAndParameters *ap, |
- NSSPrivateKey **pvkOpt, |
- NSSPublicKey **pbkOpt, |
- PRBool privateKeyIsSensitive, |
- NSSToken *destination, |
- NSSCallback *uhhOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return PR_FAILURE; |
-} |
- |
-NSS_IMPLEMENT NSSSymmetricKey * |
-NSSTrustDomain_GenerateSymmetricKey ( |
- NSSTrustDomain *td, |
- NSSAlgorithmAndParameters *ap, |
- PRUint32 keysize, |
- NSSToken *destination, |
- NSSCallback *uhhOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSSymmetricKey * |
-NSSTrustDomain_GenerateSymmetricKeyFromPassword ( |
- NSSTrustDomain *td, |
- NSSAlgorithmAndParameters *ap, |
- NSSUTF8 *passwordOpt, /* if null, prompt */ |
- NSSToken *destinationOpt, |
- NSSCallback *uhhOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSSymmetricKey * |
-NSSTrustDomain_FindSymmetricKeyByAlgorithmAndKeyID ( |
- NSSTrustDomain *td, |
- NSSOID *algorithm, |
- NSSItem *keyID, |
- NSSCallback *uhhOpt |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCryptoContext * |
-nssTrustDomain_CreateCryptoContext ( |
- NSSTrustDomain *td, |
- NSSCallback *uhhOpt |
-) |
-{ |
- return nssCryptoContext_Create(td, uhhOpt); |
-} |
- |
-NSS_IMPLEMENT NSSCryptoContext * |
-NSSTrustDomain_CreateCryptoContext ( |
- NSSTrustDomain *td, |
- NSSCallback *uhhOpt |
-) |
-{ |
- return nssTrustDomain_CreateCryptoContext(td, uhhOpt); |
-} |
- |
-NSS_IMPLEMENT NSSCryptoContext * |
-NSSTrustDomain_CreateCryptoContextForAlgorithm ( |
- NSSTrustDomain *td, |
- NSSOID *algorithm |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |
-NSS_IMPLEMENT NSSCryptoContext * |
-NSSTrustDomain_CreateCryptoContextForAlgorithmAndParameters ( |
- NSSTrustDomain *td, |
- NSSAlgorithmAndParameters *ap |
-) |
-{ |
- nss_SetError(NSS_ERROR_NOT_FOUND); |
- return NULL; |
-} |
- |