diff options
author | kaie%kuix.de <devnull@localhost> | 2006-08-04 19:10:54 +0000 |
---|---|---|
committer | kaie%kuix.de <devnull@localhost> | 2006-08-04 19:10:54 +0000 |
commit | ddaea507f54f66053182664fa2da68a7b734146a (patch) | |
tree | 47b7e88bb5165cd36fb07c297975e64a4b2a79f9 | |
parent | 4c54109352c9d7fbb2d4ff2fd381a40355dcaf03 (diff) | |
download | nss-hg-FIREFOX_2_0b2_RC1.tar.gz |
Bug 340724, Upgrade NSS on Mozilla 1.8 branch for 1.8.1 finalSEAMONKEY_1_1a_RELEASEFIREFOX_2_0b2_RELEASEFIREFOX_2_0b2_RC1
r=wtchang, a=mtschrep
29 files changed, 385 insertions, 182 deletions
diff --git a/security/nss/lib/base/arena.c b/security/nss/lib/base/arena.c index 61fb07147..18238ee91 100644 --- a/security/nss/lib/base/arena.c +++ b/security/nss/lib/base/arena.c @@ -520,12 +520,12 @@ nssArena_Destroy } #endif /* NSSDEBUG */ - PR_Lock(arena->lock); if( (PRLock *)NULL == arena->lock ) { /* Just got destroyed */ nss_SetError(NSS_ERROR_INVALID_ARENA); return PR_FAILURE; } + PR_Lock(arena->lock); #ifdef DEBUG if( PR_SUCCESS != arena_remove_pointer(arena) ) { @@ -585,12 +585,12 @@ nssArena_Mark } #endif /* NSSDEBUG */ - PR_Lock(arena->lock); if( (PRLock *)NULL == arena->lock ) { /* Just got destroyed */ nss_SetError(NSS_ERROR_INVALID_ARENA); return (nssArenaMark *)NULL; } + PR_Lock(arena->lock); #ifdef ARENA_THREADMARK if( (PRThread *)NULL == arena->marking_thread ) { @@ -668,12 +668,12 @@ nss_arena_unmark_release return PR_FAILURE; } - PR_Lock(arena->lock); if( (PRLock *)NULL == arena->lock ) { /* Just got destroyed */ nss_SetError(NSS_ERROR_INVALID_ARENA); return PR_FAILURE; } + PR_Lock(arena->lock); #ifdef ARENA_THREADMARK if( (PRThread *)NULL != arena->marking_thread ) { @@ -908,12 +908,12 @@ nss_ZAlloc } #endif /* NSSDEBUG */ - PR_Lock(arenaOpt->lock); if( (PRLock *)NULL == arenaOpt->lock ) { /* Just got destroyed */ nss_SetError(NSS_ERROR_INVALID_ARENA); return (void *)NULL; } + PR_Lock(arenaOpt->lock); #ifdef ARENA_THREADMARK if( (PRThread *)NULL != arenaOpt->marking_thread ) { diff --git a/security/nss/lib/certhigh/ocsp.c b/security/nss/lib/certhigh/ocsp.c index 12a059c76..145751b65 100644 --- a/security/nss/lib/certhigh/ocsp.c +++ b/security/nss/lib/certhigh/ocsp.c @@ -854,6 +854,7 @@ ocsp_AddServiceLocatorExtension(ocspSingleRequest *singleRequest, /* prepare for following loser gotos */ rv = SECFailure; + PORT_SetError(0); extensionHandle = cert_StartExtensions(singleRequest, singleRequest->arena, SetSingleReqExts); @@ -2442,6 +2443,7 @@ ocsp_CertIsOCSPSigner(CERTCertificate *cert) loser: retval = PR_FALSE; + PORT_SetError(SEC_ERROR_OCSP_INVALID_SIGNING_CERT); goto done; success: retval = PR_TRUE; @@ -2627,7 +2629,7 @@ ocsp_CheckSignature(ocspSignature *signature, void *tbs, rv = SECFailure; if (PORT_GetError() == SEC_ERROR_UNKNOWN_CERT) { /* Make the error a little more specific. */ - PORT_SetError(SEC_ERROR_UNKNOWN_SIGNER); + PORT_SetError(SEC_ERROR_OCSP_INVALID_SIGNING_CERT); } goto finish; } @@ -3199,7 +3201,7 @@ ocsp_VerifySingleResponse(CERTOCSPSingleResponse *single, * char * * A copy of the URI for the OCSP method, if found. If either the * extension is not present or it does not contain an entry for OCSP, - * SEC_ERROR_EXTENSION_NOT_FOUND will be set and a NULL returned. + * SEC_ERROR_CERT_BAD_ACCESS_LOCATION will be set and a NULL returned. * Any other error will also result in a NULL being returned. * * This result should be freed (via PORT_Free) when no longer in use. @@ -3227,8 +3229,10 @@ CERT_GetOCSPAuthorityInfoAccessLocation(CERTCertificate *cert) rv = CERT_FindCertExtension(cert, SEC_OID_X509_AUTH_INFO_ACCESS, encodedAuthInfoAccess); - if (rv == SECFailure) + if (rv == SECFailure) { + PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION); goto loser; + } /* * The rest of the things allocated in the routine will come out of @@ -3258,7 +3262,7 @@ CERT_GetOCSPAuthorityInfoAccessLocation(CERTCertificate *cert) * not there at all. */ if (locname == NULL) { - PORT_SetError(SEC_ERROR_EXTENSION_NOT_FOUND); + PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION); goto loser; } @@ -3275,7 +3279,7 @@ CERT_GetOCSPAuthorityInfoAccessLocation(CERTCertificate *cert) * this should probably be something more like the extension was * badly formed. */ - PORT_SetError(SEC_ERROR_EXTENSION_NOT_FOUND); + PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION); goto loser; } @@ -3481,10 +3485,13 @@ CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert, */ location = ocsp_GetResponderLocation(handle, cert, &locationIsDefault); if (location == NULL) { - if (PORT_GetError() == SEC_ERROR_EXTENSION_NOT_FOUND) + int err = PORT_GetError(); + if (err == SEC_ERROR_EXTENSION_NOT_FOUND || + err == SEC_ERROR_CERT_BAD_ACCESS_LOCATION) { + PORT_SetError(0); return SECSuccess; - else - return SECFailure; + } + return SECFailure; } /* diff --git a/security/nss/lib/ckfw/builtins/binst.c b/security/nss/lib/ckfw/builtins/binst.c index 2df0777a0..2d912f4a4 100644 --- a/security/nss/lib/ckfw/builtins/binst.c +++ b/security/nss/lib/ckfw/builtins/binst.c @@ -101,6 +101,11 @@ builtins_mdInstance_GetLibraryVersion NSSCKFWInstance *fwInstance ) { + extern const char __nss_builtins_rcsid[]; + extern const char __nss_builtins_sccsid[]; + volatile char c; /* force a reference that won't get optimized away */ + + c = __nss_builtins_rcsid[0] + __nss_builtins_sccsid[0]; return nss_builtins_LibraryVersion; } diff --git a/security/nss/lib/ckfw/wrap.c b/security/nss/lib/ckfw/wrap.c index b9af321a3..3ffded1f0 100644 --- a/security/nss/lib/ckfw/wrap.c +++ b/security/nss/lib/ckfw/wrap.c @@ -647,7 +647,8 @@ NSSCKFWC_GetTokenInfo switch( error ) { case CKR_DEVICE_REMOVED: case CKR_TOKEN_NOT_PRESENT: - (void)nssCKFWToken_Destroy(fwToken); + if (fwToken) + nssCKFWToken_Destroy(fwToken); break; case CKR_CRYPTOKI_NOT_INITIALIZED: case CKR_DEVICE_ERROR: @@ -841,7 +842,8 @@ NSSCKFWC_GetMechanismList switch( error ) { case CKR_DEVICE_REMOVED: case CKR_TOKEN_NOT_PRESENT: - (void)nssCKFWToken_Destroy(fwToken); + if (fwToken) + nssCKFWToken_Destroy(fwToken); break; case CKR_BUFFER_TOO_SMALL: case CKR_CRYPTOKI_NOT_INITIALIZED: @@ -944,7 +946,8 @@ NSSCKFWC_GetMechanismInfo switch( error ) { case CKR_DEVICE_REMOVED: case CKR_TOKEN_NOT_PRESENT: - (void)nssCKFWToken_Destroy(fwToken); + if (fwToken) + nssCKFWToken_Destroy(fwToken); break; case CKR_CRYPTOKI_NOT_INITIALIZED: case CKR_DEVICE_ERROR: @@ -1034,7 +1037,8 @@ NSSCKFWC_InitToken switch( error ) { case CKR_DEVICE_REMOVED: case CKR_TOKEN_NOT_PRESENT: - (void)nssCKFWToken_Destroy(fwToken); + if (fwToken) + nssCKFWToken_Destroy(fwToken); break; case CKR_CRYPTOKI_NOT_INITIALIZED: case CKR_DEVICE_ERROR: diff --git a/security/nss/lib/crmf/challcli.c b/security/nss/lib/crmf/challcli.c index 47b390917..a567452d5 100644 --- a/security/nss/lib/crmf/challcli.c +++ b/security/nss/lib/crmf/challcli.c @@ -122,54 +122,39 @@ CMMF_POPODecKeyChallContDecryptChallenge(CMMFPOPODecKeyChallContent *inChalCont, { CMMFChallenge *challenge; SECItem *decryptedRand=NULL; + PRArenaPool *poolp = NULL; SECAlgorithmID *owf; - PK11SlotInfo *slot; - PK11SymKey *symKey = NULL; SECStatus rv = SECFailure; + SECOidTag tag; CMMFRand randStr; SECItem hashItem; - SECOidTag tag; unsigned char hash[HASH_LENGTH_MAX]; - PRArenaPool *poolp = NULL; PORT_Assert(inChalCont != NULL && inPrivKey != NULL); if (inChalCont == NULL || inIndex <0 || inIndex > inChalCont->numChallenges || inPrivKey == NULL){ return SECFailure; } - challenge = inChalCont->challenges[inIndex]; - decryptedRand = PORT_ZNew(SECItem); - if (decryptedRand == NULL) { + + poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE); + if (poolp == NULL) { goto loser; } - decryptedRand->data = - PORT_NewArray(unsigned char, challenge->challenge.len); - if (decryptedRand->data == NULL) { + + challenge = inChalCont->challenges[inIndex]; + decryptedRand = SECITEM_AllocItem(poolp, NULL, challenge->challenge.len); + if (decryptedRand == NULL) { goto loser; } - slot = inPrivKey->pkcs11Slot; - symKey = PK11_PubUnwrapSymKey(inPrivKey, &challenge->challenge, - CKM_RSA_PKCS, CKA_VALUE, 0); - if (symKey == NULL) { - rv = SECFailure; - goto loser; - } - rv = PK11_ExtractKeyValue(symKey); + rv = PK11_PrivDecryptPKCS1(inPrivKey, decryptedRand->data, + &decryptedRand->len, decryptedRand->len, + challenge->challenge.data, challenge->challenge.len); if (rv != SECSuccess) { - goto loser; - } - decryptedRand = PK11_GetKeyData(symKey); - - poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE); - if (poolp == NULL) { goto loser; } + rv = SEC_ASN1DecodeItem(poolp, &randStr, CMMFRandTemplate, decryptedRand); - /* The decryptedRand returned points to a member within the symKey - * structure, so we don't want to free it. Let the symKey destruction - * function deal with freeing that memory. - */ if (rv != SECSuccess) { goto loser; } @@ -196,6 +181,7 @@ CMMF_POPODecKeyChallContDecryptChallenge(CMMFPOPODecKeyChallContent *inChalCont, /* The hash for the data we decrypted doesn't match the hash provided * in the challenge. Bail out. */ + PORT_SetError(SEC_ERROR_BAD_DATA); rv = SECFailure; goto loser; } @@ -208,6 +194,7 @@ CMMF_POPODecKeyChallContDecryptChallenge(CMMFPOPODecKeyChallContent *inChalCont, /* The hash for the data we decrypted doesn't match the hash provided * in the challenge. Bail out. */ + PORT_SetError(SEC_ERROR_BAD_DATA); rv = SECFailure; goto loser; } @@ -215,9 +202,6 @@ CMMF_POPODecKeyChallContDecryptChallenge(CMMFPOPODecKeyChallContent *inChalCont, rv = SECITEM_CopyItem(inChalCont->poolp, &challenge->randomNumber, &randStr.integer); loser: - if (symKey != NULL) { - PK11_FreeSymKey(symKey); - } if (poolp) { PORT_FreeArena(poolp, PR_FALSE); } @@ -275,7 +259,10 @@ CMMF_EncodePOPODecKeyRespContent(long *inDecodedRand, if (currItem == NULL) { goto loser; } - SEC_ASN1EncodeInteger(poolp, currItem,inDecodedRand[i]); + currItem = SEC_ASN1EncodeInteger(poolp, currItem, inDecodedRand[i]); + if (currItem == NULL) { + goto loser; + } } rv = cmmf_user_encode(response, inCallback, inArg, CMMFPOPODecKeyRespContentTemplate); diff --git a/security/nss/lib/crmf/crmfpop.c b/security/nss/lib/crmf/crmfpop.c index e4c885318..f728e9894 100644 --- a/security/nss/lib/crmf/crmfpop.c +++ b/security/nss/lib/crmf/crmfpop.c @@ -185,8 +185,8 @@ crmf_sign_certreq(PRArenaPool *poolp, SECKEYPrivateKey *inKey, SECAlgorithmID *inAlgId) { - SECItem derCertReq; - SECItem certReqSig; + SECItem derCertReq = { siBuffer, NULL, 0 }; + SECItem certReqSig = { siBuffer, NULL, 0 }; SECStatus rv = SECSuccess; rv = crmf_encode_certreq(certReq, &derCertReq); diff --git a/security/nss/lib/freebl/Makefile b/security/nss/lib/freebl/Makefile index 23d3b0277..6c4274447 100644 --- a/security/nss/lib/freebl/Makefile +++ b/security/nss/lib/freebl/Makefile @@ -283,7 +283,7 @@ ifeq ($(CPU_ARCH),sparc) # 32-bit ABI, it uses FPU code, and 32-bit word size. # these flags were determined by running cc -### -fast and copying # the generated flag settings - SOL_CFLAGS += -D__MATHERR_ERRNO_DONTCARE -fns -fsimple=2 -fsingle + SOL_CFLAGS += -D__MATHERR_ERRNO_DONTCARE -fns -fsimple=1 -fsingle SOL_CFLAGS += -xalias_level=basic -xbuiltin=%all SOL_CFLAGS += $(FPU_TARGET_OPTIMIZER) -xdepend SOL_CFLAGS += -xlibmil -xmemalign=8s -xO5 @@ -301,7 +301,7 @@ ifeq ($(CPU_ARCH),sparc) # this builds for Sparc v9a pure 64-bit architecture # It uses floating point, and 32-bit word size. # See comment for USE_ABI32_FPU. - SOL_CFLAGS += -D__MATHERR_ERRNO_DONTCARE -fns -fsimple=2 -fsingle + SOL_CFLAGS += -D__MATHERR_ERRNO_DONTCARE -fns -fsimple=1 -fsingle SOL_CFLAGS += -xalias_level=basic -xbuiltin=%all SOL_CFLAGS += $(FPU_TARGET_OPTIMIZER) -xdepend SOL_CFLAGS += -xlibmil -xmemalign=8s -xO5 diff --git a/security/nss/lib/nss/nss.h b/security/nss/lib/nss/nss.h index 100758dd9..3c8fc9281 100644 --- a/security/nss/lib/nss/nss.h +++ b/security/nss/lib/nss/nss.h @@ -53,13 +53,13 @@ SEC_BEGIN_PROTOS * "<major version>.<minor version>[.<patch level>] [<Beta>]" */ #ifdef NSS_ENABLE_ECC -#define NSS_VERSION "3.11.2 ECC Beta" +#define NSS_VERSION "3.11.3 ECC Beta" #else -#define NSS_VERSION "3.11.2 Beta" +#define NSS_VERSION "3.11.3 Beta" #endif #define NSS_VMAJOR 3 #define NSS_VMINOR 11 -#define NSS_VPATCH 2 +#define NSS_VPATCH 3 #define NSS_BETA PR_TRUE /* diff --git a/security/nss/lib/pk11wrap/pk11cert.c b/security/nss/lib/pk11wrap/pk11cert.c index c0d10f9ac..7e04ac6a9 100644 --- a/security/nss/lib/pk11wrap/pk11cert.c +++ b/security/nss/lib/pk11wrap/pk11cert.c @@ -702,7 +702,30 @@ PK11_FindCertsFromNickname(char *nickname, void *wincx) &status); nssPKIObjectCollection_AddInstances(collection, instances, 0); nss_ZFreeIf(instances); - nssList_Destroy(nameList); + + /* if it wasn't found, repeat the process for email address */ + if (nssPKIObjectCollection_Count(collection) == 0 && + PORT_Strchr(nickname, '@') != NULL) + { + char* lowercaseName = CERT_FixupEmailAddr(nickname); + if (lowercaseName) { + (void)nssTrustDomain_GetCertsForEmailAddressFromCache(defaultTD, + lowercaseName, + nameList); + transfer_token_certs_to_collection(nameList, token, collection); + instances = nssToken_FindCertificatesByEmail(token, + NULL, + lowercaseName, + tokenOnly, + 0, + &status); + nssPKIObjectCollection_AddInstances(collection, instances, 0); + nss_ZFreeIf(instances); + PORT_Free(lowercaseName); + } + } + + nssList_Destroy(nameList); foundCerts = nssPKIObjectCollection_GetCertificates(collection, NULL, 0, NULL); nssPKIObjectCollection_Destroy(collection); diff --git a/security/nss/lib/pk11wrap/pk11mech.c b/security/nss/lib/pk11wrap/pk11mech.c index 1f8f2a372..fe106de50 100644 --- a/security/nss/lib/pk11wrap/pk11mech.c +++ b/security/nss/lib/pk11wrap/pk11mech.c @@ -823,7 +823,7 @@ PK11_ParamFromIV(CK_MECHANISM_TYPE type,SECItem *iv) rc5_cbc_params = (CK_RC5_CBC_PARAMS *) PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + ((iv) ? iv->len : 0)); if (rc5_cbc_params == NULL) break; - if (iv && iv->data) { + if (iv && iv->data && iv->len) { rc5_cbc_params->pIv = ((CK_BYTE_PTR) rc5_cbc_params) + sizeof(CK_RC5_CBC_PARAMS); PORT_Memcpy(rc5_cbc_params->pIv,iv->data,iv->len); @@ -832,7 +832,7 @@ PK11_ParamFromIV(CK_MECHANISM_TYPE type,SECItem *iv) } else { rc5_cbc_params->ulWordsize = 4; rc5_cbc_params->pIv = NULL; - rc5_cbc_params->ulIvLen = iv->len; + rc5_cbc_params->ulIvLen = 0; } rc5_cbc_params->ulRounds = 16; param->data = (unsigned char *) rc5_cbc_params; diff --git a/security/nss/lib/pk11wrap/pk11pbe.c b/security/nss/lib/pk11wrap/pk11pbe.c index 4a55b0ba7..07ac7dff4 100644 --- a/security/nss/lib/pk11wrap/pk11pbe.c +++ b/security/nss/lib/pk11wrap/pk11pbe.c @@ -704,10 +704,10 @@ pk11_destroy_ck_pbe_params(CK_PBE_PARAMS *pbe_params) { if (pbe_params) { if (pbe_params->pPassword) - PORT_ZFree(pbe_params->pPassword, PR_FALSE); + PORT_ZFree(pbe_params->pPassword, pbe_params->ulPasswordLen); if (pbe_params->pSalt) - PORT_ZFree(pbe_params->pSalt, PR_FALSE); - PORT_ZFree(pbe_params, PR_TRUE); + PORT_ZFree(pbe_params->pSalt, pbe_params->ulSaltLen); + PORT_ZFree(pbe_params, sizeof(CK_PBE_PARAMS)); } } @@ -716,30 +716,49 @@ PK11_CreatePBEParams(SECItem *salt, SECItem *pwd, unsigned int iterations) { CK_PBE_PARAMS *pbe_params = NULL; SECItem *paramRV = NULL; - pbe_params = (CK_PBE_PARAMS *)PORT_ZAlloc(sizeof(CK_PBE_PARAMS)); + + paramRV = SECITEM_AllocItem(NULL, NULL, sizeof(CK_PBE_PARAMS)); + if (!paramRV ) { + goto loser; + } + /* init paramRV->data with zeros. SECITEM_AllocItem does not do it */ + PORT_Memset(paramRV->data, 0, sizeof(CK_PBE_PARAMS)); + + pbe_params = (CK_PBE_PARAMS *)paramRV->data; pbe_params->pPassword = (CK_CHAR_PTR)PORT_ZAlloc(pwd->len); - if (pbe_params->pPassword != NULL) { - PORT_Memcpy(pbe_params->pPassword, pwd->data, pwd->len); - pbe_params->ulPasswordLen = pwd->len; - } else goto loser; + if (!pbe_params->pPassword) { + goto loser; + } + PORT_Memcpy(pbe_params->pPassword, pwd->data, pwd->len); + pbe_params->ulPasswordLen = pwd->len; + pbe_params->pSalt = (CK_CHAR_PTR)PORT_ZAlloc(salt->len); - if (pbe_params->pSalt != NULL) { - PORT_Memcpy(pbe_params->pSalt, salt->data, salt->len); - pbe_params->ulSaltLen = salt->len; - } else goto loser; + if (!pbe_params->pSalt) { + goto loser; + } + PORT_Memcpy(pbe_params->pSalt, salt->data, salt->len); + pbe_params->ulSaltLen = salt->len; + pbe_params->ulIteration = (CK_ULONG)iterations; - paramRV = SECITEM_AllocItem(NULL, NULL, sizeof(CK_PBE_PARAMS)); - paramRV->data = (unsigned char *)pbe_params; return paramRV; + loser: - pk11_destroy_ck_pbe_params(pbe_params); + if (pbe_params) + pk11_destroy_ck_pbe_params(pbe_params); + if (paramRV) + PORT_ZFree(paramRV, sizeof(SECItem)); return NULL; } void -PK11_DestroyPBEParams(SECItem *params) +PK11_DestroyPBEParams(SECItem *pItem) { - pk11_destroy_ck_pbe_params((CK_PBE_PARAMS *)params->data); + if (pItem) { + CK_PBE_PARAMS * params = (CK_PBE_PARAMS *)(pItem->data); + if (params) + pk11_destroy_ck_pbe_params(params); + PORT_ZFree(pItem, sizeof(SECItem)); + } } SECAlgorithmID * @@ -766,6 +785,9 @@ PK11_RawPBEKeyGen(PK11SlotInfo *slot, CK_MECHANISM_TYPE type, SECItem *mech, } pbe_params = (CK_PBE_PARAMS *)mech->data; + if (!pbe_params) { + return NULL; + } pbe_params->pPassword = (CK_CHAR_PTR)PORT_ZAlloc(pwitem->len); if(pbe_params->pPassword != NULL) { PORT_Memcpy(pbe_params->pPassword, pwitem->data, pwitem->len); diff --git a/security/nss/lib/pki/pki3hack.c b/security/nss/lib/pki/pki3hack.c index c274d2e75..dd1216210 100644 --- a/security/nss/lib/pki/pki3hack.c +++ b/security/nss/lib/pki/pki3hack.c @@ -146,15 +146,12 @@ STAN_LoadDefaultNSS3TrustDomain ( * we hold the tokensLock. We can use the NSSRWLock Rank feature to * guarrentee this. tokensLock have a higher rank than module lock. */ - SECMOD_GetReadLock(moduleLock); - NSSRWLock_LockWrite(td->tokensLock); td->tokenList = nssList_Create(td->arena, PR_TRUE); if (!td->tokenList) { - NSSRWLock_UnlockWrite(td->tokensLock); - SECMOD_ReleaseReadLock(moduleLock); - NSSTrustDomain_Destroy(td); - return PR_FAILURE; + goto loser; } + SECMOD_GetReadLock(moduleLock); + NSSRWLock_LockWrite(td->tokensLock); for (mlp = SECMOD_GetDefaultModuleList(); mlp != NULL; mlp=mlp->next) { for (i=0; i < mlp->module->slotCount; i++) { STAN_InitTokenForSlotInfo(td, mlp->module->slots[i]); @@ -163,9 +160,19 @@ STAN_LoadDefaultNSS3TrustDomain ( td->tokens = nssList_CreateIterator(td->tokenList); NSSRWLock_UnlockWrite(td->tokensLock); SECMOD_ReleaseReadLock(moduleLock); - g_default_trust_domain = td; + if (!td->tokens) { + goto loser; + } g_default_crypto_context = NSSTrustDomain_CreateCryptoContext(td, NULL); + if (!g_default_crypto_context) { + goto loser; + } + g_default_trust_domain = td; return PR_SUCCESS; + + loser: + NSSTrustDomain_Destroy(td); + return PR_FAILURE; } /* diff --git a/security/nss/lib/pki/trustdomain.c b/security/nss/lib/pki/trustdomain.c index 0ecb8846d..165669395 100644 --- a/security/nss/lib/pki/trustdomain.c +++ b/security/nss/lib/pki/trustdomain.c @@ -134,10 +134,15 @@ NSSTrustDomain_Destroy ( /* 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; diff --git a/security/nss/lib/smime/cmscipher.c b/security/nss/lib/smime/cmscipher.c index 00042937a..071e56538 100644 --- a/security/nss/lib/smime/cmscipher.c +++ b/security/nss/lib/smime/cmscipher.c @@ -224,8 +224,9 @@ NSS_CMSCipherContext_StartEncrypt(PRArenaPool *poolp, PK11SymKey *key, SECAlgori } cc = (NSSCMSCipherContext *)PORT_ZAlloc(sizeof(NSSCMSCipherContext)); - if (cc == NULL) - return NULL; + if (cc == NULL) { + goto loser; + } /* now find pad and block sizes for our mechanism */ cc->pad_size = PK11_GetBlockSize(mechanism,param); diff --git a/security/nss/lib/smime/cmsrecinfo.c b/security/nss/lib/smime/cmsrecinfo.c index e7dadac5b..c77d113ad 100644 --- a/security/nss/lib/smime/cmsrecinfo.c +++ b/security/nss/lib/smime/cmsrecinfo.c @@ -187,24 +187,6 @@ nss_cmsrecipientinfo_create(NSSCMSMessage *cmsg, NSSCMSRecipientIDSelector type, rv = SECFailure; } break; - case SEC_OID_MISSI_KEA_DSS_OLD: - case SEC_OID_MISSI_KEA_DSS: - case SEC_OID_MISSI_KEA: - PORT_Assert(type == NSSCMSRecipientID_IssuerSN); - if (type != NSSCMSRecipientID_IssuerSN) { - rv = SECFailure; - break; - } - /* backward compatibility - this is not really a keytrans operation */ - ri->recipientInfoType = NSSCMSRecipientInfoID_KeyTrans; - /* hardcoded issuerSN choice for now */ - ri->ri.keyTransRecipientInfo.recipientIdentifier.identifierType = NSSCMSRecipientID_IssuerSN; - ri->ri.keyTransRecipientInfo.recipientIdentifier.id.issuerAndSN = CERT_GetCertIssuerAndSN(poolp, cert); - if (ri->ri.keyTransRecipientInfo.recipientIdentifier.id.issuerAndSN == NULL) { - rv = SECFailure; - break; - } - break; case SEC_OID_X942_DIFFIE_HELMAN_KEY: /* dh-public-number */ PORT_Assert(type == NSSCMSRecipientID_IssuerSN); if (type != NSSCMSRecipientID_IssuerSN) { @@ -530,20 +512,6 @@ NSS_CMSRecipientInfo_WrapBulkKey(NSSCMSRecipientInfo *ri, PK11SymKey *bulkkey, rv = SECOID_SetAlgorithmID(poolp, &(ri->ri.keyTransRecipientInfo.keyEncAlg), certalgtag, NULL); break; - case SEC_OID_MISSI_KEA_DSS_OLD: - case SEC_OID_MISSI_KEA_DSS: - case SEC_OID_MISSI_KEA: - rv = NSS_CMSUtil_EncryptSymKey_MISSI(poolp, cert, bulkkey, - bulkalgtag, - &ri->ri.keyTransRecipientInfo.encKey, - ¶ms, ri->cmsg->pwfn_arg); - if (rv != SECSuccess) - break; - - /* here, we DO need to pass the params to the wrap function because, with - * RSA, there is no funny stuff going on with generation of IV vectors or so */ - rv = SECOID_SetAlgorithmID(poolp, &(ri->ri.keyTransRecipientInfo.keyEncAlg), certalgtag, params); - break; case SEC_OID_X942_DIFFIE_HELMAN_KEY: /* dh-public-number */ rek = ri->ri.keyAgreeRecipientInfo.recipientEncryptedKeys[0]; if (rek == NULL) { diff --git a/security/nss/lib/smime/cmsreclist.c b/security/nss/lib/smime/cmsreclist.c index 34e31d582..61eb260be 100644 --- a/security/nss/lib/smime/cmsreclist.c +++ b/security/nss/lib/smime/cmsreclist.c @@ -66,25 +66,33 @@ nss_cms_recipients_traverse(NSSCMSRecipientInfo **recipientinfos, NSSCMSRecipien switch (ri->recipientInfoType) { case NSSCMSRecipientInfoID_KeyTrans: if (recipient_list) { + NSSCMSRecipientIdentifier *recipId = + &ri->ri.keyTransRecipientInfo.recipientIdentifier; + + if (recipId->identifierType != NSSCMSRecipientID_IssuerSN && + recipId->identifierType != NSSCMSRecipientID_SubjectKeyID) { + PORT_SetError(SEC_ERROR_INVALID_ARGS); + return -1; + } /* alloc one & fill it out */ rle = (NSSCMSRecipient *)PORT_ZAlloc(sizeof(NSSCMSRecipient)); - if (rle == NULL) + if (!rle) return -1; rle->riIndex = i; rle->subIndex = -1; - switch (ri->ri.keyTransRecipientInfo.recipientIdentifier.identifierType) { + switch (recipId->identifierType) { case NSSCMSRecipientID_IssuerSN: rle->kind = RLIssuerSN; - rle->id.issuerAndSN = ri->ri.keyTransRecipientInfo.recipientIdentifier.id.issuerAndSN; + rle->id.issuerAndSN = recipId->id.issuerAndSN; break; case NSSCMSRecipientID_SubjectKeyID: rle->kind = RLSubjKeyID; - rle->id.subjectKeyID = ri->ri.keyTransRecipientInfo.recipientIdentifier.id.subjectKeyID; + rle->id.subjectKeyID = recipId->id.subjectKeyID; + break; + default: /* we never get here because of identifierType check + we done before. Leaving it to kill compiler warning */ break; - default: - PORT_SetError(SEC_ERROR_INVALID_ARGS); - return -1; } recipient_list[rlindex++] = rle; } else { @@ -99,7 +107,7 @@ nss_cms_recipients_traverse(NSSCMSRecipientInfo **recipientinfos, NSSCMSRecipien rek = ri->ri.keyAgreeRecipientInfo.recipientEncryptedKeys[j]; /* alloc one & fill it out */ rle = (NSSCMSRecipient *)PORT_ZAlloc(sizeof(NSSCMSRecipient)); - if (rle == NULL) + if (!rle) return -1; rle->riIndex = i; diff --git a/security/nss/lib/softoken/fipstest.c b/security/nss/lib/softoken/fipstest.c index efc2c278b..6018b66a8 100644 --- a/security/nss/lib/softoken/fipstest.c +++ b/security/nss/lib/softoken/fipstest.c @@ -117,6 +117,9 @@ EC_CopyParams(PRArenaPool *arena, ECParams *dstParams, #define FIPS_DSA_PRIME_LENGTH 64 /* 512-bits */ #define FIPS_DSA_BASE_LENGTH 64 /* 512-bits */ +/* FIPS preprocessor directives for RNG. */ +#define FIPS_RNG_XKEY_LENGTH 32 /* 512-bits */ + static CK_RV sftk_fips_RC2_PowerUpSelfTest( void ) { @@ -1767,6 +1770,66 @@ sftk_fips_DSA_PowerUpSelfTest( void ) } +static CK_RV +sftk_fips_RNG_PowerUpSelfTest( void ) +{ + static const PRUint8 XKeyValue[] = { + 0x8d,0xf2,0xa4,0x94,0x49,0x22,0x76,0xaa, + 0x3d,0x25,0x75,0x9b,0xb0,0x68,0x69,0xcb, + 0xea,0xc0,0xd8,0x3a,0xfb,0x8d,0x0c,0xf7, + 0xcb,0xb8,0x32,0x4f,0x0d,0x78,0x82,0xe5}; + static const PRUint8 XSeed[] = { + 0xea,0xc0,0xd8,0x3a,0xfb,0x8d,0x0c,0xf7, + 0xcb,0xb8,0x32,0x4f,0x0d,0x78,0x82,0xe5, + 0xd0,0x76,0x2f,0xc5,0xb7,0x21,0x0e,0xaf, + 0xc2,0xe9,0xad,0xac,0x32,0xab,0x7a,0xac}; + static const PRUint8 Q[] = { + 0x85,0x89,0x9c,0x77,0xa3,0x79,0xff,0x1a, + 0x86,0x6f,0x2f,0x3e,0x2e,0xf9,0x8c,0x9c, + 0x9d,0xef,0xeb,0xed}; + static const PRUint8 rng_known_GENX[] = { + 0x65,0x48,0xe3,0xca,0xac,0x64,0x2d,0xf7, + 0x7b,0xd3,0x4e,0x79,0xc9,0x7d,0xa6,0xa8, + 0xa2,0xc2,0x1f,0x8f,0xe9,0xb9,0xd3,0xa1, + 0x3f,0xf7,0x0c,0xcd,0xa6,0xca,0xbf,0xce, + 0x84,0x0e,0xb6,0xf1,0x0d,0xbe,0xa9,0xa3}; + static const PRUint8 rng_known_DSAX[] = { + 0x7a,0x86,0xf1,0x7f,0xbd,0x4e,0x6e,0xd9, + 0x0a,0x26,0x21,0xd0,0x19,0xcb,0x86,0x73, + 0x10,0x1f,0x60,0xd7}; + + SECStatus rng_status = SECSuccess; + PRUint8 GENX[2*SHA1_LENGTH]; + PRUint8 DSAX[FIPS_DSA_SUBPRIME_LENGTH]; + PRUint8 XKey[FIPS_RNG_XKEY_LENGTH]; + + PORT_Memcpy (XKey, XKeyValue, FIPS_RNG_XKEY_LENGTH); + + /*******************************************/ + /* Generate X with a known seed. */ + /*******************************************/ + rng_status = FIPS186Change_GenerateX(XKey, XSeed, GENX); + + /* Verify GENX to perform the RNG integrity check */ + if( ( rng_status != SECSuccess ) || + ( PORT_Memcmp( GENX, rng_known_GENX, + (2*SHA1_LENGTH) ) != 0 ) ) + return( CKR_DEVICE_ERROR ); + + /*******************************************/ + /* Generate DSAX fow given Q. */ + /*******************************************/ + + rng_status = FIPS186Change_ReduceModQForDSA(GENX, Q, DSAX); + + /* Verify DSAX to perform the RNG integrity check */ + if( ( rng_status != SECSuccess ) || + ( PORT_Memcmp( DSAX, rng_known_DSAX, + (FIPS_DSA_SUBPRIME_LENGTH) ) != 0 ) ) + return( CKR_DEVICE_ERROR ); + + return( CKR_OK ); +} CK_RV sftk_fipsPowerUpSelfTest( void ) @@ -1850,6 +1913,12 @@ sftk_fipsPowerUpSelfTest( void ) if( rv != CKR_OK ) return rv; + + /* RNG Power-Up SelfTest(s). */ + rv = sftk_fips_RNG_PowerUpSelfTest(); + + if( rv != CKR_OK ) + return rv; #ifdef NSS_ENABLE_ECC /* ECDSA Power-Up SelfTest(s). */ diff --git a/security/nss/lib/softoken/fipstokn.c b/security/nss/lib/softoken/fipstokn.c index fc114f792..d2d19fda4 100644 --- a/security/nss/lib/softoken/fipstokn.c +++ b/security/nss/lib/softoken/fipstokn.c @@ -106,7 +106,7 @@ libaudit_init(void) * ******************** Password Utilities ******************************* */ static PRBool isLoggedIn = PR_FALSE; -static PRBool fatalError = PR_FALSE; +PRBool sftk_fatalError = PR_FALSE; /* * This function returns @@ -204,10 +204,10 @@ static CK_RV sftk_newPinCheck(CK_CHAR_PTR pPin, CK_ULONG ulPinLen) { /* FIPS required checks before any useful cryptographic services */ static CK_RV sftk_fipsCheck(void) { - if (isLoggedIn != PR_TRUE) - return CKR_USER_NOT_LOGGED_IN; - if (fatalError) + if (sftk_fatalError) return CKR_DEVICE_ERROR; + if (!isLoggedIn) + return CKR_USER_NOT_LOGGED_IN; return CKR_OK; } @@ -217,7 +217,7 @@ static CK_RV sftk_fipsCheck(void) { if ((rv = sftk_fipsCheck()) != CKR_OK) return rv; #define SFTK_FIPSFATALCHECK() \ - if (fatalError) return CKR_DEVICE_ERROR; + if (sftk_fatalError) return CKR_DEVICE_ERROR; /* grab an attribute out of a raw template */ @@ -424,16 +424,16 @@ CK_RV FC_Initialize(CK_VOID_PTR pReserved) { /* not an 'else' rv can be set by either SFTK_LowInit or SFTK_SlotInit*/ if (crv != CKR_OK) { - fatalError = PR_TRUE; + sftk_fatalError = PR_TRUE; return crv; } - fatalError = PR_FALSE; /* any error has been reset */ + sftk_fatalError = PR_FALSE; /* any error has been reset */ crv = sftk_fipsPowerUpSelfTest(); if (crv != CKR_OK) { nsc_CommonFinalize(NULL, PR_TRUE); - fatalError = PR_TRUE; + sftk_fatalError = PR_TRUE; if (sftk_audit_enabled) { char msg[128]; PR_snprintf(msg,sizeof msg, @@ -536,7 +536,7 @@ CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) { CK_RV FC_InitPIN(CK_SESSION_HANDLE hSession, CK_CHAR_PTR pPin, CK_ULONG ulPinLen) { CK_RV rv; - if (fatalError) return CKR_DEVICE_ERROR; + if (sftk_fatalError) return CKR_DEVICE_ERROR; if ((rv = sftk_newPinCheck(pPin,ulPinLen)) == CKR_OK) { rv = NSC_InitPIN(hSession,pPin,ulPinLen); } @@ -616,7 +616,7 @@ CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) { CK_RV FC_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, CK_CHAR_PTR pPin, CK_ULONG usPinLen) { CK_RV rv; - if (fatalError) return CKR_DEVICE_ERROR; + if (sftk_fatalError) return CKR_DEVICE_ERROR; rv = NSC_Login(hSession,userType,pPin,usPinLen); if (rv == CKR_OK) isLoggedIn = PR_TRUE; @@ -629,12 +629,12 @@ CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) { if (rv == CKR_OK) rv = CKR_USER_ALREADY_LOGGED_IN; else - fatalError = PR_TRUE; + sftk_fatalError = PR_TRUE; } if (sftk_audit_enabled) { char msg[128]; NSSAuditSeverity severity; - if (fatalError) { + if (sftk_fatalError) { severity = NSS_AUDIT_ERROR; PR_snprintf(msg,sizeof msg, "C_Login(hSession=%lu, userType=%lu)=0x%08lX ", @@ -1107,7 +1107,7 @@ CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) { usPrivateKeyAttributeCount,phPublicKey,phPrivateKey); if (crv == CKR_GENERAL_ERROR) { /* pairwise consistency check failed. */ - fatalError = PR_TRUE; + sftk_fatalError = PR_TRUE; } return crv; } @@ -1183,7 +1183,7 @@ CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) { SFTK_FIPSFATALCHECK(); crv = NSC_SeedRandom(hSession,pSeed,usSeedLen); if (crv != CKR_OK) { - fatalError = PR_TRUE; + sftk_fatalError = PR_TRUE; } return crv; } @@ -1197,7 +1197,7 @@ CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) { SFTK_FIPSFATALCHECK(); crv = NSC_GenerateRandom(hSession,pRandomData,ulRandomLen); if (crv != CKR_OK) { - fatalError = PR_TRUE; + sftk_fatalError = PR_TRUE; if (sftk_audit_enabled) { char msg[128]; PR_snprintf(msg,sizeof msg, diff --git a/security/nss/lib/softoken/keydb.c b/security/nss/lib/softoken/keydb.c index 68ba72da0..da79f6b73 100644 --- a/security/nss/lib/softoken/keydb.c +++ b/security/nss/lib/softoken/keydb.c @@ -580,13 +580,18 @@ makeGlobalSalt(NSSLOWKEYDBHandle *handle) DBT saltData; unsigned char saltbuf[16]; int status; + SECStatus rv; saltKey.data = SALT_STRING; saltKey.size = sizeof(SALT_STRING) - 1; saltData.data = (void *)saltbuf; saltData.size = sizeof(saltbuf); - RNG_GenerateGlobalRandomBytes(saltbuf, sizeof(saltbuf)); + rv = RNG_GenerateGlobalRandomBytes(saltbuf, sizeof(saltbuf)); + if ( rv != SECSuccess ) { + sftk_fatalError = PR_TRUE; + return(rv); + } /* put global salt into the database now */ status = keydb_Put(handle, &saltKey, &saltData, 0); @@ -1522,11 +1527,12 @@ seckey_create_rc4_salt(void) if(salt->data != NULL) { salt->len = SALT_LENGTH; - RNG_GenerateGlobalRandomBytes(salt->data, salt->len); - rv = SECSuccess; + rv = RNG_GenerateGlobalRandomBytes(salt->data, salt->len); + if(rv != SECSuccess) + sftk_fatalError = PR_TRUE; } - if(rv == SECFailure) + if(rv != SECSuccess) { SECITEM_FreeItem(salt, PR_TRUE); salt = NULL; diff --git a/security/nss/lib/softoken/pkcs11.c b/security/nss/lib/softoken/pkcs11.c index b06cb77f7..824938583 100644 --- a/security/nss/lib/softoken/pkcs11.c +++ b/security/nss/lib/softoken/pkcs11.c @@ -1537,6 +1537,9 @@ sftk_GenerateSecretCKA_ID(NSSLOWKEYDBHandle *handle, SECItem *id, char *label) (++retries <= SFTK_KEY_MAX_RETRIES)); if ((rv != SECSuccess) || (retries > SFTK_KEY_MAX_RETRIES)) { + if (rv != SECSuccess) { + sftk_fatalError = PR_TRUE; + } crv = CKR_DEVICE_ERROR; /* random number generator is bad */ PORT_Free(id->data); id->data = NULL; diff --git a/security/nss/lib/softoken/pkcs11c.c b/security/nss/lib/softoken/pkcs11c.c index d78dbe2a5..8bae971ec 100644 --- a/security/nss/lib/softoken/pkcs11c.c +++ b/security/nss/lib/softoken/pkcs11c.c @@ -1666,6 +1666,9 @@ nsc_DSA_Sign_Stub(void *ctx, void *sigBuf, digest.data = (unsigned char *)dataBuf; digest.len = dataLen; rv = DSA_SignDigest(&(key->u.dsa), &signature, &digest); + if (rv != SECSuccess && PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } *sigLen = signature.len; return rv; } @@ -1699,6 +1702,9 @@ nsc_ECDSASignStub(void *ctx, void *sigBuf, digest.data = (unsigned char *)dataBuf; digest.len = dataLen; rv = ECDSA_SignDigest(&(key->u.ec), &signature, &digest); + if (rv != SECSuccess && PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } *sigLen = signature.len; return rv; } @@ -2604,6 +2610,9 @@ nsc_parameter_gen(CK_KEY_TYPE key_type, SFTKObject *key) } if (rv != SECSuccess) { + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } return CKR_DEVICE_ERROR; } crv = sftk_AddAttributeType(key,CKA_PRIME, @@ -3432,6 +3441,9 @@ CK_RV NSC_GenerateKeyPair (CK_SESSION_HANDLE hSession, rsaPriv = RSA_NewKey(public_modulus_bits, &pubExp); PORT_Free(pubExp.data); if (rsaPriv == NULL) { + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } crv = CKR_DEVICE_ERROR; break; } @@ -3548,7 +3560,13 @@ kpg_done: PORT_Free(pqgParam.subPrime.data); PORT_Free(pqgParam.base.data); - if (rv != SECSuccess) { crv = CKR_DEVICE_ERROR; break; } + if (rv != SECSuccess) { + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } + crv = CKR_DEVICE_ERROR; + break; + } /* store the generated key into the attributes */ crv = sftk_AddAttributeType(publicKey,CKA_VALUE, @@ -3616,6 +3634,9 @@ dsagn_done: PORT_Free(dhParam.prime.data); PORT_Free(dhParam.base.data); if (rv != SECSuccess) { + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } crv = CKR_DEVICE_ERROR; break; } @@ -3665,8 +3686,11 @@ dhgn_done: rv = EC_NewKey(ecParams, &ecPriv); PORT_FreeArena(ecParams->arena, PR_TRUE); if (rv != SECSuccess) { - crv = CKR_DEVICE_ERROR; - break; + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } + crv = CKR_DEVICE_ERROR; + break; } crv = sftk_AddAttributeType(publicKey, CKA_EC_POINT, @@ -4790,15 +4814,16 @@ CK_RV NSC_DeriveKey( CK_SESSION_HANDLE hSession, if (isTLS) { SECStatus status; - SECItem crsr = { siBuffer, crsrdata, sizeof crsrdata }; - SECItem master = { siBuffer, key_block, SSL3_MASTER_SECRET_LENGTH}; - SECItem pms = { siBuffer }; + SECItem crsr = { siBuffer, NULL, 0 }; + SECItem master = { siBuffer, NULL, 0 }; + SECItem pms = { siBuffer, NULL, 0 }; - /* HPUX won't let a structure member be initialized with the - * value of a variable, but the address of a local variable. :-/ - */ - pms.data = (unsigned char*)att->attrib.pValue; - pms.len = att->attrib.ulValueLen; + crsr.data = crsrdata; + crsr.len = sizeof crsrdata; + master.data = key_block; + master.len = SSL3_MASTER_SECRET_LENGTH; + pms.data = (unsigned char*)att->attrib.pValue; + pms.len = att->attrib.ulValueLen; status = TLS_PRF(&pms, "master secret", &crsr, &master, isFIPS); if (status != SECSuccess) { @@ -4939,10 +4964,13 @@ CK_RV NSC_DeriveKey( CK_SESSION_HANDLE hSession, */ if (isTLS) { SECStatus status; - SECItem srcr = { siBuffer, srcrdata, sizeof srcrdata }; - SECItem keyblk = { siBuffer, key_block }; - SECItem master = { siBuffer }; + SECItem srcr = { siBuffer, NULL, 0 }; + SECItem keyblk = { siBuffer, NULL, 0 }; + SECItem master = { siBuffer, NULL, 0 }; + srcr.data = srcrdata; + srcr.len = sizeof srcrdata; + keyblk.data = key_block; keyblk.len = block_needed; master.data = (unsigned char*)att->attrib.pValue; master.len = att->attrib.ulValueLen; @@ -5109,7 +5137,7 @@ CK_RV NSC_DeriveKey( CK_SESSION_HANDLE hSession, */ SECStatus status; SECItem secret = { siBuffer, NULL, 0 }; - SECItem crsr = { siBuffer, crsrdata, sizeof crsrdata }; + SECItem crsr = { siBuffer, NULL, 0 }; SECItem keyblk = { siBuffer, NULL, 0 }; /* @@ -5121,6 +5149,8 @@ CK_RV NSC_DeriveKey( CK_SESSION_HANDLE hSession, secret.data = &key_block[i]; secret.len = effKeySize; i += effKeySize; + crsr.data = crsrdata; + crsr.len = sizeof crsrdata; keyblk.data = key_block2; keyblk.len = sizeof key_block2; status = TLS_PRF(&secret, "client write key", &crsr, &keyblk, diff --git a/security/nss/lib/softoken/pkcs11i.h b/security/nss/lib/softoken/pkcs11i.h index fd5ff6423..6f77994fd 100644 --- a/security/nss/lib/softoken/pkcs11i.h +++ b/security/nss/lib/softoken/pkcs11i.h @@ -556,7 +556,7 @@ typedef struct sftk_parametersStr { SEC_BEGIN_PROTOS /* shared functions between pkcs11.c and fipstokn.c */ -extern int nsf_init; +extern PRBool nsf_init; extern CK_RV nsc_CommonInitialize(CK_VOID_PTR pReserved, PRBool isFIPS); extern CK_RV nsc_CommonFinalize(CK_VOID_PTR pReserved, PRBool isFIPS); extern CK_RV nsc_CommonGetSlotList(CK_BBOOL tokPresent, diff --git a/security/nss/lib/softoken/rsawrapr.c b/security/nss/lib/softoken/rsawrapr.c index 2ae3039e7..c60c71344 100644 --- a/security/nss/lib/softoken/rsawrapr.c +++ b/security/nss/lib/softoken/rsawrapr.c @@ -193,6 +193,7 @@ rsa_FormatOneBlock(unsigned modulusLen, RSA_BlockType blockType, unsigned char *bp; int padLen; int i; + SECStatus rv; block = (unsigned char *) PORT_Alloc(modulusLen); if (block == NULL) @@ -254,8 +255,13 @@ rsa_FormatOneBlock(unsigned modulusLen, RSA_BlockType blockType, for (i = 0; i < padLen; i++) { /* Pad with non-zero random data. */ do { - RNG_GenerateGlobalRandomBytes(bp + i, 1); - } while (bp[i] == RSA_BLOCK_AFTER_PAD_OCTET); + rv = RNG_GenerateGlobalRandomBytes(bp + i, 1); + } while (rv == SECSuccess && bp[i] == RSA_BLOCK_AFTER_PAD_OCTET); + if (rv != SECSuccess) { + sftk_fatalError = PR_TRUE; + PORT_Free (block); + return NULL; + } } bp += padLen; *bp++ = RSA_BLOCK_AFTER_PAD_OCTET; @@ -292,7 +298,12 @@ rsa_FormatOneBlock(unsigned modulusLen, RSA_BlockType blockType, /* * Salt */ - RNG_GenerateGlobalRandomBytes(bp, OAEP_SALT_LEN); + rv = RNG_GenerateGlobalRandomBytes(bp, OAEP_SALT_LEN); + if (rv != SECSuccess) { + sftk_fatalError = PR_TRUE; + PORT_Free (block); + return NULL; + } bp += OAEP_SALT_LEN; /* @@ -310,8 +321,14 @@ rsa_FormatOneBlock(unsigned modulusLen, RSA_BlockType blockType, /* * Pad2 */ - if (bp < (block + modulusLen)) - RNG_GenerateGlobalRandomBytes(bp, block - bp + modulusLen); + if (bp < (block + modulusLen)) { + rv = RNG_GenerateGlobalRandomBytes(bp, block - bp + modulusLen); + if (rv != SECSuccess) { + sftk_fatalError = PR_TRUE; + PORT_Free (block); + return NULL; + } + } /* * Now we have the following: @@ -463,6 +480,9 @@ RSA_Sign(NSSLOWKEYPrivateKey *key, goto done; rv = RSA_PrivateKeyOpDoubleChecked(&key->u.rsa, output, formatted.data); + if (rv != SECSuccess && PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } *output_len = modulus_len; goto done; @@ -665,8 +685,12 @@ RSA_DecryptBlock(NSSLOWKEYPrivateKey *key, goto failure; rv = RSA_PrivateKeyOp(&key->u.rsa, buffer, input); - if (rv != SECSuccess) + if (rv != SECSuccess) { + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } goto loser; + } if (buffer[0] != 0 || buffer[1] != 2) goto loser; @@ -725,6 +749,9 @@ RSA_SignRaw(NSSLOWKEYPrivateKey *key, goto done; rv = RSA_PrivateKeyOpDoubleChecked(&key->u.rsa, output, formatted.data); + if (rv != SECSuccess && PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } *output_len = modulus_len; done: @@ -874,8 +901,12 @@ RSA_DecryptRaw(NSSLOWKEYPrivateKey *key, goto failure; rv = RSA_PrivateKeyOp(&key->u.rsa, output, input); - if (rv != SECSuccess) + if (rv != SECSuccess) { + if (PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { + sftk_fatalError = PR_TRUE; + } goto failure; + } *output_len = modulus_len; return SECSuccess; diff --git a/security/nss/lib/softoken/softoken.h b/security/nss/lib/softoken/softoken.h index 9a06be831..27b25e892 100644 --- a/security/nss/lib/softoken/softoken.h +++ b/security/nss/lib/softoken/softoken.h @@ -184,6 +184,11 @@ extern PRBool sftk_audit_enabled; extern void sftk_LogAuditMessage(NSSAuditSeverity severity, const char *msg); +/* +** FIPS 140-2 Error state +*/ +extern PRBool sftk_fatalError; + SEC_END_PROTOS #endif /* _SOFTOKEN_H_ */ diff --git a/security/nss/lib/ssl/ssl3con.c b/security/nss/lib/ssl/ssl3con.c index 36eeb3e0b..37ca116c5 100644 --- a/security/nss/lib/ssl/ssl3con.c +++ b/security/nss/lib/ssl/ssl3con.c @@ -3507,6 +3507,11 @@ ssl3_SendClientHello(sslSocket *ss) if (total_exten_len > 0) total_exten_len += 2; } +#if defined(NSS_ENABLE_ECC) && !defined(NSS_ECC_MORE_THAN_SUITE_B) + else { /* SSL3 only */ + ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ + } +#endif /* how many suites are permitted by policy and user preference? */ num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE); @@ -6781,23 +6786,25 @@ ssl3_SendCertificate(sslSocket *ss) if (rv != SECSuccess) { return rv; /* err set by AppendHandshake. */ } - for (i = 0; i < certChain->len; i++) { + if (certChain) { + for (i = 0; i < certChain->len; i++) { #ifdef NISCC_TEST - if (fakeCert.len > 0 && i == ndex) { - rv = ssl3_AppendHandshakeVariable(ss, fakeCert.data, fakeCert.len, - 3); - SECITEM_FreeItem(&fakeCert, PR_FALSE); - } else { - rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, - certChain->certs[i].len, 3); - } + if (fakeCert.len > 0 && i == ndex) { + rv = ssl3_AppendHandshakeVariable(ss, fakeCert.data, + fakeCert.len, 3); + SECITEM_FreeItem(&fakeCert, PR_FALSE); + } else { + rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, + certChain->certs[i].len, 3); + } #else - rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, - certChain->certs[i].len, 3); + rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, + certChain->certs[i].len, 3); #endif - if (rv != SECSuccess) { - return rv; /* err set by AppendHandshake. */ - } + if (rv != SECSuccess) { + return rv; /* err set by AppendHandshake. */ + } + } } return SECSuccess; diff --git a/security/nss/lib/ssl/ssl3ecc.c b/security/nss/lib/ssl/ssl3ecc.c index e74ef41ea..144968c4d 100644 --- a/security/nss/lib/ssl/ssl3ecc.c +++ b/security/nss/lib/ssl/ssl3ecc.c @@ -955,6 +955,8 @@ static const ssl3CipherSuite ecSuites[] = { SECStatus ssl3_DisableECCSuites(sslSocket * ss, const ssl3CipherSuite * suite) { + if (!suite) + suite = ecSuites; for (; *suite; ++suite) { SECStatus rv = ssl3_CipherPrefSet(ss, *suite, PR_FALSE); diff --git a/security/nss/lib/ssl/sslcon.c b/security/nss/lib/ssl/sslcon.c index d97d6ce6c..70b270ae4 100644 --- a/security/nss/lib/ssl/sslcon.c +++ b/security/nss/lib/ssl/sslcon.c @@ -3120,7 +3120,11 @@ ssl2_BeginClientHandshake(sslSocket *ss) return rv; } - +#if defined(NSS_ENABLE_ECC) && !defined(NSS_ECC_MORE_THAN_SUITE_B) + /* ensure we don't neogtiate ECC cipher suites with SSL2 hello */ + ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ +#endif + if (!ss->cipherSpecs) { rv = ssl2_ConstructCipherSpecs(ss); if (rv < 0) { diff --git a/security/nss/lib/ssl/sslimpl.h b/security/nss/lib/ssl/sslimpl.h index 6da5801cb..26c353b29 100644 --- a/security/nss/lib/ssl/sslimpl.h +++ b/security/nss/lib/ssl/sslimpl.h @@ -1274,6 +1274,8 @@ extern SECStatus ssl3_CreateRSAStepDownKeys(sslSocket *ss); #ifdef NSS_ENABLE_ECC extern void ssl3_FilterECCipherSuitesByServerCerts(sslSocket *ss); extern PRBool ssl3_IsECCEnabled(sslSocket *ss); +extern SECStatus ssl3_DisableECCSuites(sslSocket * ss, + const ssl3CipherSuite * suite); #endif /* NSS_ENABLE_ECC */ extern SECStatus ssl3_CipherPrefSetDefault(ssl3CipherSuite which, PRBool on); diff --git a/security/nss/lib/ssl/sslsnce.c b/security/nss/lib/ssl/sslsnce.c index b0e386e2e..89f7d1045 100644 --- a/security/nss/lib/ssl/sslsnce.c +++ b/security/nss/lib/ssl/sslsnce.c @@ -892,7 +892,8 @@ CloseCache(cacheDesc *cache) ** be) in use by multiple processes. We do not wish to destroy ** the mutexes while they are still in use. */ - if (PR_FALSE == cache->sharedCache->everInherited) { + if (cache->sharedCache && + PR_FALSE == cache->sharedCache->everInherited) { sidCacheLock *pLock = cache->sidCacheLocks; for (; locks_initialized > 0; --locks_initialized, ++pLock ) { sslMutex_Destroy(&pLock->mutex); @@ -941,6 +942,12 @@ InitCache(cacheDesc *cache, int maxCacheEntries, PRUint32 ssl2_timeout, cache->cacheMemMap = cacheMemMap = NULL; cache->sharedCache = (cacheDesc *)0; + cache->numSIDCacheLocksInitialized = 0; + cache->nextCertCacheEntry = 0; + cache->stopPolling = PR_FALSE; + cache->everInherited = PR_FALSE; + cache->poller = NULL; + cache->numSIDCacheEntries = maxCacheEntries ? maxCacheEntries : DEF_SID_CACHE_ENTRIES; cache->numSIDCacheSets = |