mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-06-15 07:29:45 +00:00
#369: M1606992 -> NSS 3.48.1
This commit is contained in:
parent
c9168bc53e
commit
1828db0478
|
@ -18,6 +18,7 @@
|
||||||
#include "alghmac.h"
|
#include "alghmac.h"
|
||||||
#include "softoken.h"
|
#include "softoken.h"
|
||||||
#include "secerr.h"
|
#include "secerr.h"
|
||||||
|
#include "pkcs11i.h"
|
||||||
|
|
||||||
SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate)
|
SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate)
|
||||||
|
|
||||||
|
@ -553,6 +554,52 @@ loser:
|
||||||
return A;
|
return A;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Bug 1606992 - Cache the hash result for the common case that we're
|
||||||
|
* asked to repeatedly compute the key for the same password item,
|
||||||
|
* hash, iterations and salt. */
|
||||||
|
static PZLock *PBE_cache_lock = NULL;
|
||||||
|
static SECItem *cached_PBKDF2_item = NULL;
|
||||||
|
static HASH_HashType cached_hashType;
|
||||||
|
static int cached_iterations;
|
||||||
|
static int cached_keyLen;
|
||||||
|
static SECItem *cached_salt = NULL;
|
||||||
|
static SECItem *cached_pwitem = NULL;
|
||||||
|
|
||||||
|
void
|
||||||
|
sftk_PBELockInit(void)
|
||||||
|
{
|
||||||
|
if (!PBE_cache_lock) {
|
||||||
|
PBE_cache_lock = PZ_NewLock(nssIPBECacheLock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sftk_clearPBECacheItems(void)
|
||||||
|
{
|
||||||
|
if (cached_PBKDF2_item) {
|
||||||
|
SECITEM_FreeItem(cached_PBKDF2_item, PR_TRUE);
|
||||||
|
cached_PBKDF2_item = NULL;
|
||||||
|
}
|
||||||
|
if (cached_salt) {
|
||||||
|
SECITEM_FreeItem(cached_salt, PR_TRUE);
|
||||||
|
cached_salt = NULL;
|
||||||
|
}
|
||||||
|
if (cached_pwitem) {
|
||||||
|
SECITEM_FreeItem(cached_pwitem, PR_TRUE);
|
||||||
|
cached_pwitem = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sftk_PBELockShutdown(void)
|
||||||
|
{
|
||||||
|
if (PBE_cache_lock) {
|
||||||
|
PZ_DestroyLock(PBE_cache_lock);
|
||||||
|
PBE_cache_lock = 0;
|
||||||
|
}
|
||||||
|
sftk_clearPBECacheItems();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* generate key as per PKCS 5
|
* generate key as per PKCS 5
|
||||||
*/
|
*/
|
||||||
|
@ -596,7 +643,35 @@ nsspkcs5_ComputeKeyAndIV(NSSPKCS5PBEParameter *pbe_param, SECItem *pwitem,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NSSPKCS5_PBKDF2:
|
case NSSPKCS5_PBKDF2:
|
||||||
hash = nsspkcs5_PBKDF2(hashObj, pbe_param, pwitem);
|
PZ_Lock(PBE_cache_lock);
|
||||||
|
if (cached_PBKDF2_item) {
|
||||||
|
if (pbe_param->hashType == cached_hashType &&
|
||||||
|
pbe_param->iter == cached_iterations &&
|
||||||
|
pbe_param->keyLen == cached_keyLen &&
|
||||||
|
cached_salt &&
|
||||||
|
SECITEM_ItemsAreEqual(&pbe_param->salt, cached_salt) &&
|
||||||
|
cached_pwitem &&
|
||||||
|
SECITEM_ItemsAreEqual(pwitem, cached_pwitem)) {
|
||||||
|
hash = SECITEM_DupItem(cached_PBKDF2_item);
|
||||||
|
} else {
|
||||||
|
sftk_clearPBECacheItems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PZ_Unlock(PBE_cache_lock);
|
||||||
|
if (!hash) {
|
||||||
|
hash = nsspkcs5_PBKDF2(hashObj, pbe_param, pwitem);
|
||||||
|
PZ_Lock(PBE_cache_lock);
|
||||||
|
/* ensure no other thread was quicker than us setting the cache */
|
||||||
|
if (!cached_PBKDF2_item) {
|
||||||
|
cached_PBKDF2_item = SECITEM_DupItem(hash);
|
||||||
|
cached_hashType = pbe_param->hashType;
|
||||||
|
cached_iterations = pbe_param->iter;
|
||||||
|
cached_keyLen = pbe_param->keyLen;
|
||||||
|
cached_salt = SECITEM_DupItem(&pbe_param->salt);
|
||||||
|
cached_pwitem = SECITEM_DupItem(pwitem);
|
||||||
|
}
|
||||||
|
PZ_Unlock(PBE_cache_lock);
|
||||||
|
}
|
||||||
if (getIV) {
|
if (getIV) {
|
||||||
PORT_Memcpy(iv->data, pbe_param->ivData, iv->len);
|
PORT_Memcpy(iv->data, pbe_param->ivData, iv->len);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3097,6 +3097,9 @@ sftk_closePeer(PRBool isFIPS)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void sftk_PBELockInit(void);
|
||||||
|
extern void sftk_PBELockShutdown(void);
|
||||||
|
|
||||||
/* NSC_Initialize initializes the Cryptoki library. */
|
/* NSC_Initialize initializes the Cryptoki library. */
|
||||||
CK_RV
|
CK_RV
|
||||||
nsc_CommonInitialize(CK_VOID_PTR pReserved, PRBool isFIPS)
|
nsc_CommonInitialize(CK_VOID_PTR pReserved, PRBool isFIPS)
|
||||||
|
@ -3113,6 +3116,8 @@ nsc_CommonInitialize(CK_VOID_PTR pReserved, PRBool isFIPS)
|
||||||
|
|
||||||
ENABLE_FORK_CHECK();
|
ENABLE_FORK_CHECK();
|
||||||
|
|
||||||
|
sftk_PBELockInit();
|
||||||
|
|
||||||
rv = SECOID_Init();
|
rv = SECOID_Init();
|
||||||
if (rv != SECSuccess) {
|
if (rv != SECSuccess) {
|
||||||
crv = CKR_DEVICE_ERROR;
|
crv = CKR_DEVICE_ERROR;
|
||||||
|
@ -3293,6 +3298,8 @@ nsc_CommonFinalize(CK_VOID_PTR pReserved, PRBool isFIPS)
|
||||||
/* clean up the default OID table */
|
/* clean up the default OID table */
|
||||||
SECOID_Shutdown();
|
SECOID_Shutdown();
|
||||||
|
|
||||||
|
sftk_PBELockShutdown();
|
||||||
|
|
||||||
/* reset fork status in util */
|
/* reset fork status in util */
|
||||||
UTIL_SetForkState(PR_FALSE);
|
UTIL_SetForkState(PR_FALSE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user