imported changes from mozilla NSS:

- Bug 1759794 - protect SFTKSlot needLogin with slotLock. r=rrelyea (1bbd8d8c)
- Bug 1771497 - Uninitialized value in cert_VerifyCertChainOld. r=nss-reviewers,djackson (23be110c)
- Bug 1771495 - unchecked return code in sec_DecodeSigAlg. r=nss-reviewers,djackson (d4fb4b83)
- Bug 1771498 - Uninitialized value in cert_ComputeCertType. r=djackson (b28bc4cd)
- Bug 1764392 - Add DigitCert Roots r=nss-reviewers,jschanck (0863d9ec)
- Bug 1768970 - Add Certainly Roots. r=nss-reviewers,jschanck (6307e75b)
- Bug 1770267 - Add E-Tugra Roots. r=nss-reviewers,jschanck (9555008f)
- Bug 1759815 - Remove Hellenic Academic 2011 Root. r=nss-reviewers,jschanck (9c2cbf14)
- Bug 1764206 - Bump nssckbi version number for June. r=nss-reviewers,jschanck (b3acf3d9)
This commit is contained in:
roytam1 2022-06-17 11:00:44 +08:00
commit 43cfc69b25
10 changed files with 1209 additions and 186 deletions

View file

@ -384,9 +384,9 @@ GetKeyUsage(CERTCertificate *cert)
rv = CERT_FindKeyUsageExtension(cert, &tmpitem);
if (rv == SECSuccess) {
/* remember the actual value of the extension */
cert->rawKeyUsage = tmpitem.data[0];
cert->rawKeyUsage = tmpitem.len ? tmpitem.data[0] : 0;
cert->keyUsagePresent = PR_TRUE;
cert->keyUsage = tmpitem.data[0];
cert->keyUsage = cert->rawKeyUsage;
PORT_Free(tmpitem.data);
tmpitem.data = NULL;
@ -506,7 +506,7 @@ cert_ComputeCertType(CERTCertificate *cert)
isCA = basicConstraint.isCA;
}
if (tmpitem.data != NULL || extKeyUsage != NULL) {
if (tmpitem.data == NULL) {
if (tmpitem.data == NULL || tmpitem.len == 0) {
nsCertType = 0;
} else {
nsCertType = tmpitem.data[0];

View file

@ -213,7 +213,7 @@ CERT_CheckCertUsage(CERTCertificate *cert, unsigned char usage)
if (rv == SECFailure) {
rv = (PORT_GetError() == SEC_ERROR_EXTENSION_NOT_FOUND) ? SECSuccess
: SECFailure;
} else if (!keyUsage.data || !(keyUsage.data[0] & usage)) {
} else if (!keyUsage.data || !keyUsage.len || !(keyUsage.data[0] & usage)) {
PORT_SetError(SEC_ERROR_CERT_USAGES_INVALID);
rv = SECFailure;
}

View file

@ -417,12 +417,15 @@ CERT_FindBitStringExtension(CERTCertExtension **extensions, int tag,
goto loser;
}
retItem->data = (unsigned char *)PORT_Alloc((tmpItem.len + 7) >> 3);
retItem->data = (unsigned char *)PORT_ZAlloc((tmpItem.len + 7) >> 3);
if (retItem->data == NULL) {
goto loser;
}
PORT_Memcpy(retItem->data, tmpItem.data, (tmpItem.len + 7) >> 3);
if (tmpItem.len > 0) {
PORT_Memcpy(retItem->data, tmpItem.data, (tmpItem.len + 7) >> 3);
}
retItem->len = tmpItem.len;
rv = SECSuccess;

View file

@ -120,8 +120,11 @@ CERT_DecodeBasicConstraintValue(CERTBasicConstraints *value,
number
for unlimited certificate path.
*/
if (value->isCA)
if (value->isCA) {
value->pathLenConstraint = CERT_UNLIMITED_PATH_CONSTRAINT;
} else {
value->pathLenConstraint = 0;
}
} else if (value->isCA) {
long len = DER_GetInteger(&decodeContext.pathLenConstraint);
if (len < 0 || len == LONG_MAX) {

File diff suppressed because it is too large Load diff

View file

@ -46,8 +46,8 @@
* It's recommend to switch back to 0 after having reached version 98/99.
*/
#define NSS_BUILTINS_LIBRARY_VERSION_MAJOR 2
#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 54
#define NSS_BUILTINS_LIBRARY_VERSION "2.54"
#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 56
#define NSS_BUILTINS_LIBRARY_VERSION "2.56"
/* These version numbers detail the semantic changes to the ckfw engine. */
#define NSS_BUILTINS_HARDWARE_VERSION_MAJOR 1

View file

@ -291,7 +291,7 @@ CMMF_CertifiedKeyPairUnwrapPrivKey(CMMFCertifiedKeyPair *inKeyPair,
cert = CMMF_CertifiedKeyPairGetCertificate(inKeyPair, inCertdb);
CERT_FindKeyUsageExtension(cert, &keyUsageValue);
if (keyUsageValue.data != NULL) {
keyUsage = keyUsageValue.data[3];
keyUsage = keyUsageValue.len ? keyUsageValue.data[0] : 0;
PORT_Free(keyUsageValue.data);
}
pubKey = CERT_ExtractPublicKey(cert);

View file

@ -296,8 +296,8 @@ sec_DecodeSigAlg(const SECKEYPublicKey *key, SECOidTag sigAlg,
PORT_DestroyCheapArena(&tmpArena);
/* only accept hash algorithms */
if (HASH_GetHashTypeByOidTag(*hashalg) == HASH_AlgNULL) {
/* error set by HASH_GetHashTypeByOidTag */
if (rv != SECSuccess || HASH_GetHashTypeByOidTag(*hashalg) == HASH_AlgNULL) {
/* error set by sec_DecodeRSAPSSParams or HASH_GetHashTypeByOidTag */
return SECFailure;
}
} else {

View file

@ -1583,6 +1583,7 @@ sftk_handleObject(SFTKObject *object, SFTKSession *session)
CK_OBJECT_HANDLE handle;
CK_BBOOL ckfalse = CK_FALSE;
CK_BBOOL cktrue = CK_TRUE;
PRBool isLoggedIn, needLogin;
CK_RV crv;
/* make sure all the base object types are defined. If not set the
@ -1600,9 +1601,13 @@ sftk_handleObject(SFTKObject *object, SFTKSession *session)
if (crv != CKR_OK)
return crv;
PZ_Lock(slot->slotLock);
isLoggedIn = slot->isLoggedIn;
needLogin = slot->needLogin;
PZ_Unlock(slot->slotLock);
/* don't create a private object if we aren't logged in */
if ((!slot->isLoggedIn) && (slot->needLogin) &&
(sftk_isTrue(object, CKA_PRIVATE))) {
if (!isLoggedIn && needLogin && sftk_isTrue(object, CKA_PRIVATE)) {
return CKR_USER_NOT_LOGGED_IN;
}
@ -3472,11 +3477,18 @@ NSC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo)
static PRBool
sftk_checkNeedLogin(SFTKSlot *slot, SFTKDBHandle *keyHandle)
{
PRBool needLogin;
if (sftkdb_PWCached(keyHandle) == SECSuccess) {
return slot->needLogin;
PZ_Lock(slot->slotLock);
needLogin = slot->needLogin;
PZ_Unlock(slot->slotLock);
} else {
needLogin = (PRBool)!sftk_hasNullPassword(slot, keyHandle);
PZ_Lock(slot->slotLock);
slot->needLogin = needLogin;
PZ_Unlock(slot->slotLock);
}
slot->needLogin = (PRBool)!sftk_hasNullPassword(slot, keyHandle);
return (slot->needLogin);
return needLogin;
}
static PRBool
@ -3848,8 +3860,11 @@ NSC_InitPIN(CK_SESSION_HANDLE hSession,
/* Now update our local copy of the pin */
if (rv == SECSuccess) {
if (ulPinLen == 0)
if (ulPinLen == 0) {
PZ_Lock(slot->slotLock);
slot->needLogin = PR_FALSE;
PZ_Unlock(slot->slotLock);
}
/* database has been initialized, now force min password in FIPS
* mode. NOTE: if we are in level1, we may not have a password, but
* forcing it now will prevent an insufficient password from being set.
@ -3884,6 +3899,7 @@ NSC_SetPIN(CK_SESSION_HANDLE hSession, CK_CHAR_PTR pOldPin,
char newPinStr[SFTK_MAX_PIN + 1], oldPinStr[SFTK_MAX_PIN + 1];
SECStatus rv;
CK_RV crv = CKR_SESSION_HANDLE_INVALID;
PRBool needLogin;
PRBool tokenRemoved = PR_FALSE;
CHECK_FORK();
@ -3904,7 +3920,10 @@ NSC_SetPIN(CK_SESSION_HANDLE hSession, CK_CHAR_PTR pOldPin,
return CKR_PIN_LEN_RANGE; /* XXX FIXME wrong return value */
}
if (slot->needLogin && sp->info.state != CKS_RW_USER_FUNCTIONS) {
PZ_Lock(slot->slotLock);
needLogin = slot->needLogin;
PZ_Unlock(slot->slotLock);
if (needLogin && sp->info.state != CKS_RW_USER_FUNCTIONS) {
crv = CKR_USER_NOT_LOGGED_IN;
goto loser;
}
@ -4132,6 +4151,8 @@ NSC_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
CK_RV crv;
char pinStr[SFTK_MAX_PIN + 1];
PRBool tokenRemoved = PR_FALSE;
PRBool isLoggedIn;
PRBool needLogin;
CHECK_FORK();
@ -4155,9 +4176,14 @@ NSC_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
return CKR_USER_TYPE_INVALID;
}
if (slot->isLoggedIn)
PZ_Lock(slot->slotLock);
isLoggedIn = slot->isLoggedIn;
needLogin = slot->needLogin;
PZ_Unlock(slot->slotLock);
if (isLoggedIn)
return CKR_USER_ALREADY_LOGGED_IN;
if (!slot->needLogin) {
if (!needLogin) {
return ulPinLen ? CKR_PIN_INCORRECT : CKR_OK;
}
slot->ssoLoggedIn = PR_FALSE;
@ -4611,7 +4637,7 @@ NSC_GetAttributeValue(CK_SESSION_HANDLE hSession,
SFTKSession *session;
SFTKObject *object;
SFTKAttribute *attribute;
PRBool sensitive;
PRBool sensitive, isLoggedIn, needLogin;
CK_RV crv;
int i;
@ -4642,9 +4668,13 @@ NSC_GetAttributeValue(CK_SESSION_HANDLE hSession,
return CKR_OBJECT_HANDLE_INVALID;
}
PZ_Lock(slot->slotLock);
isLoggedIn = slot->isLoggedIn;
needLogin = slot->needLogin;
PZ_Unlock(slot->slotLock);
/* don't read a private object if we aren't logged in */
if ((!slot->isLoggedIn) && (slot->needLogin) &&
(sftk_isTrue(object, CKA_PRIVATE))) {
if (!isLoggedIn && needLogin && sftk_isTrue(object, CKA_PRIVATE)) {
sftk_FreeObject(object);
return CKR_USER_NOT_LOGGED_IN;
}
@ -4685,7 +4715,7 @@ NSC_SetAttributeValue(CK_SESSION_HANDLE hSession,
SFTKSession *session;
SFTKAttribute *attribute;
SFTKObject *object;
PRBool isToken;
PRBool isToken, isLoggedIn, needLogin;
CK_RV crv = CKR_OK;
CK_BBOOL legal;
int i;
@ -4709,9 +4739,13 @@ NSC_SetAttributeValue(CK_SESSION_HANDLE hSession,
return CKR_OBJECT_HANDLE_INVALID;
}
PZ_Lock(slot->slotLock);
isLoggedIn = slot->isLoggedIn;
needLogin = slot->needLogin;
PZ_Unlock(slot->slotLock);
/* don't modify a private object if we aren't logged in */
if ((!slot->isLoggedIn) && (slot->needLogin) &&
(sftk_isTrue(object, CKA_PRIVATE))) {
if (!isLoggedIn && needLogin && sftk_isTrue(object, CKA_PRIVATE)) {
sftk_FreeSession(session);
sftk_FreeObject(object);
return CKR_USER_NOT_LOGGED_IN;
@ -4989,7 +5023,10 @@ NSC_FindObjectsInit(CK_SESSION_HANDLE hSession,
search->index = 0;
search->size = 0;
search->array_size = NSC_SEARCH_BLOCK_SIZE;
PZ_Lock(slot->slotLock);
isLoggedIn = (PRBool)((!slot->needLogin) || slot->isLoggedIn);
PZ_Unlock(slot->slotLock);
crv = sftk_searchTokenList(slot, search, pTemplate, ulCount, isLoggedIn);
if (crv != CKR_OK) {

View file

@ -310,7 +310,7 @@ struct SFTKSessionStr {
* object hash tables (sessObjHashTable[] and tokObjHashTable), and
* sessionObjectHandleCount.
* slotLock protects the remaining protected elements:
* password, isLoggedIn, ssoLoggedIn, and sessionCount,
* password, needLogin, isLoggedIn, ssoLoggedIn, and sessionCount,
* and pwCheckLock serializes the key database password checks in
* NSC_SetPIN and NSC_Login.
*