From c9c633332d7d2c2c76ec87f19c6747dfa1486d6a Mon Sep 17 00:00:00 2001 From: Bob Relyea Date: Wed, 6 Oct 2021 12:09:11 -0700 Subject: [PATCH] Resolves: rhbz#2008320 Rebase to NSS 3.71: (changes since NSS 3.67) Network Security Services (NSS) 3.71 was released on 30 September 2021. The HG tag is NSS_3_71_RTM. This version of NSS requires NSPR 4.32 or newer. NSS 3.71 source distributions are available on ftp.mozilla.org for secure HTTPS download: Changes: - Bug 1717716 - Set nssckbi version number to 2.52. - Bug 1667000 - Respect server requirements of tlsfuzzer/test-tls13-signature-algorithms.py - Bug 1373716 - Import of PKCS#12 files with Camellia encryption is not supported - Bug 1717707 - Add HARICA Client ECC Root CA 2021. - Bug 1717707 - Add HARICA Client RSA Root CA 2021. - Bug 1717707 - Add HARICA TLS ECC Root CA 2021. - Bug 1717707 - Add HARICA TLS RSA Root CA 2021. - Bug 1728394 - Add TunTrust Root CA certificate to NSS. ------------------------------------- Network Security Services (NSS) 3.70 was released on 4 September 2021. The HG tag is NSS_3_70_RTM. This version of NSS requires NSPR 4.32 or newer. NSS 3.70 source distributions are available on ftp.mozilla.org for secure HTTPS download: Changes: - Documentation: release notes for NSS 3.70. - Documentation: release notes for NSS 3.69.1. - Bug 1726022 - Update test case to verify fix. - Bug 1714579 - Explicitly disable downgrade check in TlsConnectStreamTls13.EchOuterWith12Max - Bug 1714579 - Explicitly disable downgrade check in TlsConnectTest.DisableFalseStartOnFallback - Formatting for lib/util - Bug 1681975 - Avoid using a lookup table in nssb64d. - Bug 1724629 - Use HW accelerated SHA2 on AArch64 Big Endian. - Bug 1714579 - Change default value of enableHelloDowngradeCheck to true. - Formatting for gtests/pk11_gtest/pk11_hpke_unittest.cc - Bug 1726022 - Cache additional PBE entries. - Bug 1709750 - Read HPKE vectors from official JSON. - Documentation: update for NSS 3.69 release. Network Security Services (NSS) 3.69 was released on 5 August 2021. The HG tag is NSS_3_69_RTM. NSS 3.69 requires NSPR 4.32 or newer. NSS 3.69 source distributions are available on ftp.mozilla.org for secure HTTPS download: Bugs fixed: - Bug 1722613 - Disable DTLS 1.0 and 1.1 by default - Bug 1720226 - integrity checks in key4.db not happening on private components with AES_CBC - Bug 1720235 - SSL handling of signature algorithms ignores environmental invalid algorithms. - Bug 1721476 - sqlite 3.34 changed it's open semantics, causing nss failures. - Bug 1720230 - Gtest update changed the gtest reports, losing gtest details in all.sh reports. - Bug 1720228 - NSS incorrectly accepting 1536 bit DH primes in FIPS mode - Bug 1720232 - SQLite calls could timeout in starvation situations. - Bug 1720225 - Coverity/cpp scanner errors found in nss 3.67 - Bug 1709817 - Import the NSS documentation from MDN in nss/doc. - Bug 1720227 - NSS using a tempdir to measure sql performance not active Network Security Services (NSS) 3.68 ESR was released on 8 July 2021. The HG tag is NSS_3_68_RTM. NSS 3.68 requires NSPR 4.32 or newer. NSS 3.68 source distributions are available on ftp.mozilla.org for secure HTTPS download: Bugs fixed: - Bug 1713562 - Fix test leak. - Bug 1717452 - NSS 3.68 should depend on NSPR 4.32. - Bug 1693206 - Implement PKCS8 export of ECDSA keys. - Bug 1712883 - DTLS 1.3 draft-43. - Bug 1655493 - Support SHA2 HW acceleration using Intel SHA Extension. - Bug 1713562 - Validate ECH public names. - Bug 1717610 - Add function to get seconds from epoch from pkix::Time. --- .gitignore | 1 + nss-3.71-fips-module-name.patch | 825 ++++++++++++++++++++++++++++++++ nss-3.71-ipv6-fix.patch | 36 ++ nss-539183.patch | 62 --- nss.spec | 50 +- sources | 2 +- 6 files changed, 891 insertions(+), 85 deletions(-) create mode 100644 nss-3.71-fips-module-name.patch create mode 100644 nss-3.71-ipv6-fix.patch delete mode 100644 nss-539183.patch diff --git a/.gitignore b/.gitignore index dcfdc3f..d31b100 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,4 @@ TestUser51.cert /nss-3.67.tar.gz /nspr-4.31.tar.gz /nspr-4.32.tar.gz +/nss-3.71.tar.gz diff --git a/nss-3.71-fips-module-name.patch b/nss-3.71-fips-module-name.patch new file mode 100644 index 0000000..8e4ea8d --- /dev/null +++ b/nss-3.71-fips-module-name.patch @@ -0,0 +1,825 @@ +diff --git a/cmd/manifest.mn b/cmd/manifest.mn +--- a/cmd/manifest.mn ++++ b/cmd/manifest.mn +@@ -76,6 +76,7 @@ + symkeyutil \ + tests \ + tstclnt \ ++ validation \ + vfychain \ + vfyserv \ + modutil \ +diff --git a/cmd/validation/Makefile b/cmd/validation/Makefile +new file mode 100644 +--- /dev/null ++++ b/cmd/validation/Makefile +@@ -0,0 +1,48 @@ ++#! gmake ++# ++# 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/. ++ ++####################################################################### ++# (1) Include initial platform-independent assignments (MANDATORY). # ++####################################################################### ++ ++include manifest.mn ++ ++####################################################################### ++# (2) Include "global" configuration information. (OPTIONAL) # ++####################################################################### ++ ++include $(CORE_DEPTH)/coreconf/config.mk ++ ++####################################################################### ++# (3) Include "component" configuration information. (OPTIONAL) # ++####################################################################### ++ ++####################################################################### ++# (4) Include "local" platform-dependent assignments (OPTIONAL). # ++####################################################################### ++ ++include ../platlibs.mk ++ ++ ++####################################################################### ++# (5) Execute "global" rules. (OPTIONAL) # ++####################################################################### ++ ++include $(CORE_DEPTH)/coreconf/rules.mk ++ ++####################################################################### ++# (6) Execute "component" rules. (OPTIONAL) # ++####################################################################### ++ ++ ++ ++####################################################################### ++# (7) Execute "local" rules. (OPTIONAL). # ++####################################################################### ++ ++ ++include ../platrules.mk ++ +diff --git a/cmd/validation/manifest.mn b/cmd/validation/manifest.mn +new file mode 100644 +--- /dev/null ++++ b/cmd/validation/manifest.mn +@@ -0,0 +1,23 @@ ++# ++# 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/. ++ ++CORE_DEPTH = ../.. ++ ++DEFINES += -DNSPR20 ++ ++# MODULE public and private header directories are implicitly REQUIRED. ++MODULE = nss ++ ++CSRCS = \ ++ validation.c \ ++ $(NULL) ++ ++# The MODULE is always implicitly required. ++# Listing it here in REQUIRES makes it appear twice in the cc command line. ++REQUIRES = dbm seccmd ++ ++ROGRAM = validation ++ ++# USE_STATIC_LIBS = 1 +diff --git a/cmd/validation/validation.c b/cmd/validation/validation.c +new file mode 100644 +--- /dev/null ++++ b/cmd/validation/validation.c +@@ -0,0 +1,249 @@ ++/* 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 _CRTDBG_MAP_ALLOC ++#include ++#include ++#endif ++ ++#include "nspr.h" ++#include "secutil.h" ++#include "pk11func.h" ++#include "nss.h" ++#include "secport.h" ++#include "secpkcs5.h" ++#include "sechash.h" ++#include "certdb.h" ++#include "secmod.h" ++ ++#define PKCS12_IN_BUFFER_SIZE 200 ++ ++static char *progName; ++PRBool debug = PR_FALSE; ++ ++#define ERR_USAGE 2 ++#define ERR_PK11GETSLOT 13 ++ ++static void ++Usage() ++{ ++#define FPS PR_fprintf(PR_STDERR, ++ FPS "Usage: %s [-d certdir] [-P dbprefix] [-h tokenname]\n", ++ progName); ++ FPS "\t\t [-k slotpwfile | -K slotpw] [-v]\n"); ++ ++ exit(ERR_USAGE); ++} ++ ++typedef enum { ++ tagULong, ++ tagVersion, ++ tagUtf8 ++} tagType; ++ ++typedef struct { ++ const char *attributeName; ++ tagType attributeStorageType; ++} attributeTag; ++ ++enum { ++ opt_CertDir = 0, ++ opt_TokenName, ++ opt_SlotPWFile, ++ opt_SlotPW, ++ opt_DBPrefix, ++ opt_Debug ++}; ++ ++static secuCommandFlag validation_options[] = ++ { ++ { /* opt_CertDir */ 'd', PR_TRUE, 0, PR_FALSE }, ++ { /* opt_TokenName */ 'h', PR_TRUE, 0, PR_FALSE }, ++ { /* opt_SlotPWFile */ 'k', PR_TRUE, 0, PR_FALSE }, ++ { /* opt_SlotPW */ 'K', PR_TRUE, 0, PR_FALSE }, ++ { /* opt_DBPrefix */ 'P', PR_TRUE, 0, PR_FALSE }, ++ { /* opt_Debug */ 'v', PR_FALSE, 0, PR_FALSE } ++ }; ++ ++void ++dump_Raw(char *label, CK_ATTRIBUTE *attr) ++{ ++ int i; ++ unsigned char *value = (unsigned char *)attr->pValue; ++ printf("0x"); ++ for (i = 0; i < attr->ulValueLen; i++) { ++ printf("%02x", value[i]); ++ } ++ printf("<%s>\n", label); ++} ++ ++SECStatus ++dump_validations(CK_OBJECT_CLASS objc, CK_ATTRIBUTE *template, int count, ++ attributeTag *tags, PK11SlotInfo *slot) ++{ ++ PK11GenericObject *objs, *obj; ++ ++ objs = PK11_FindGenericObjects(slot, objc); ++ ++ for (obj = objs; obj != NULL; obj = PK11_GetNextGenericObject(obj)) { ++ int i; ++ printf("Validation Object:\n"); ++ PK11_ReadRawAttributes(NULL, PK11_TypeGeneric, obj, template, count); ++ for (i = 0; i < count; i++) { ++ CK_ULONG ulong; ++ CK_VERSION version; ++ int len = template[i].ulValueLen; ++ printf(" %s: ", tags[i].attributeName); ++ if (len < 0) { ++ printf("\n"); ++ } else if (len == 0) { ++ printf("\n"); ++ } else ++ switch (tags[i].attributeStorageType) { ++ case tagULong: ++ if (len != sizeof(CK_ULONG)) { ++ dump_Raw("bad ulong", &template[i]); ++ break; ++ } ++ ulong = *(CK_ULONG *)template[i].pValue; ++ printf("%ld\n", ulong); ++ break; ++ case tagVersion: ++ if (len != sizeof(CK_VERSION)) { ++ dump_Raw("bad version", &template[i]); ++ break; ++ } ++ version = *(CK_VERSION *)template[i].pValue; ++ printf("%d.%d\n", version.major, version.minor); ++ break; ++ case tagUtf8: ++ printf("%.*s\n", len, (char *)template[i].pValue); ++ break; ++ default: ++ dump_Raw("unknown tag", &template[i]); ++ break; ++ } ++ PORT_Free(template[i].pValue); ++ template[i].pValue = NULL; ++ template[i].ulValueLen = 0; ++ } ++ } ++ PK11_DestroyGenericObjects(objs); ++ return SECSuccess; ++} ++ ++int ++main(int argc, char **argv) ++{ ++ secuPWData slotPw = { PW_NONE, NULL }; ++ secuPWData p12FilePw = { PW_NONE, NULL }; ++ PK11SlotInfo *slot; ++ char *slotname = NULL; ++ char *dbprefix = ""; ++ char *nssdir = NULL; ++ SECStatus rv; ++ secuCommand validation; ++ int local_errno = 0; ++ ++ CK_ATTRIBUTE validation_template[] = { ++ { CKA_NSS_VALIDATION_TYPE, NULL, 0 }, ++ { CKA_NSS_VALIDATION_VERSION, NULL, 0 }, ++ { CKA_NSS_VALIDATION_LEVEL, NULL, 0 }, ++ { CKA_NSS_VALIDATION_MODULE_ID, NULL, 0 } ++ }; ++ attributeTag validation_tags[] = { ++ { "Validation Type", tagULong }, ++ { "Validation Version", tagVersion }, ++ { "Validation Level", tagULong }, ++ { "Validation Module ID", tagUtf8 }, ++ }; ++ ++#ifdef _CRTDBG_MAP_ALLOC ++ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); ++#endif ++ ++ validation.numCommands = 0; ++ validation.commands = 0; ++ validation.numOptions = PR_ARRAY_SIZE(validation_options); ++ validation.options = validation_options; ++ ++ progName = strrchr(argv[0], '/'); ++ progName = progName ? progName + 1 : argv[0]; ++ ++ rv = SECU_ParseCommandLine(argc, argv, progName, &validation); ++ ++ if (rv != SECSuccess) ++ Usage(); ++ ++ debug = validation.options[opt_Debug].activated; ++ ++ slotname = SECU_GetOptionArg(&validation, opt_TokenName); ++ ++ if (validation.options[opt_SlotPWFile].activated) { ++ slotPw.source = PW_FROMFILE; ++ slotPw.data = PORT_Strdup(validation.options[opt_SlotPWFile].arg); ++ } ++ ++ if (validation.options[opt_SlotPW].activated) { ++ slotPw.source = PW_PLAINTEXT; ++ slotPw.data = PORT_Strdup(validation.options[opt_SlotPW].arg); ++ } ++ ++ if (validation.options[opt_CertDir].activated) { ++ nssdir = validation.options[opt_CertDir].arg; ++ } ++ if (validation.options[opt_DBPrefix].activated) { ++ dbprefix = validation.options[opt_DBPrefix].arg; ++ } ++ ++ PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1); ++ if (nssdir == NULL && NSS_NoDB_Init("") == SECSuccess) { ++ rv = SECSuccess; ++ /* if the system isn't already in FIPS mode, we need ++ * to switch to FIPS mode */ ++ if (!PK11_IsFIPS()) { ++ /* flip to FIPS mode */ ++ SECMODModule *module = SECMOD_GetInternalModule(); ++ rv = SECMOD_DeleteInternalModule(module->commonName); ++ } ++ } else { ++ rv = NSS_Initialize(nssdir, dbprefix, dbprefix, ++ "secmod.db", 0); ++ } ++ if (rv != SECSuccess) { ++ SECU_PrintPRandOSError(progName); ++ exit(-1); ++ } ++ ++ if (!slotname || PL_strcmp(slotname, "internal") == 0) ++ slot = PK11_GetInternalKeySlot(); ++ else ++ slot = PK11_FindSlotByName(slotname); ++ ++ if (!slot) { ++ SECU_PrintError(progName, "Invalid slot \"%s\"", slotname); ++ local_errno = ERR_PK11GETSLOT; ++ goto done; ++ } ++ ++ rv = dump_validations(CKO_NSS_VALIDATION, ++ validation_template, ++ PR_ARRAY_SIZE(validation_template), ++ validation_tags, ++ slot); ++ ++done: ++ if (slotPw.data != NULL) ++ PORT_ZFree(slotPw.data, PL_strlen(slotPw.data)); ++ if (p12FilePw.data != NULL) ++ PORT_ZFree(p12FilePw.data, PL_strlen(p12FilePw.data)); ++ if (slot) ++ PK11_FreeSlot(slot); ++ if (NSS_Shutdown() != SECSuccess) { ++ local_errno = 1; ++ } ++ PL_ArenaFinish(); ++ PR_Cleanup(); ++ return local_errno; ++} +diff --git a/cmd/validation/validation.gyp b/cmd/validation/validation.gyp +new file mode 100644 +--- /dev/null ++++ b/cmd/validation/validation.gyp +@@ -0,0 +1,30 @@ ++# 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/. ++{ ++ 'includes': [ ++ '../../coreconf/config.gypi', ++ '../../cmd/platlibs.gypi' ++ ], ++ 'targets': [ ++ { ++ 'target_name': 'validation', ++ 'type': 'executable', ++ 'sources': [ ++ 'validation.c' ++ ], ++ 'dependencies': [ ++ '<(DEPTH)/exports.gyp:dbm_exports', ++ '<(DEPTH)/exports.gyp:nss_exports' ++ ] ++ } ++ ], ++ 'target_defaults': { ++ 'defines': [ ++ 'NSPR20' ++ ] ++ }, ++ 'variables': { ++ 'module': 'nss' ++ } ++} +diff --git a/lib/softoken/config.mk b/lib/softoken/config.mk +--- a/lib/softoken/config.mk ++++ b/lib/softoken/config.mk +@@ -59,3 +59,7 @@ + DEFINES += -DNSS_ENABLE_FIPS_INDICATORS + endif + ++ifdef NSS_FIPS_MODULE_ID ++DEFINES += -DNSS_FIPS_MODULE_ID=\"${NSS_FIPS_MODULE_ID}\" ++endif ++ +diff --git a/lib/softoken/pkcs11.c b/lib/softoken/pkcs11.c +--- a/lib/softoken/pkcs11.c ++++ b/lib/softoken/pkcs11.c +@@ -75,7 +75,6 @@ + * failure so that there are at most 60 login attempts per minute. + */ + static PRIntervalTime loginWaitTime; +-static PRUint32 minSessionObjectHandle = 1U; + + #define __PASTE(x, y) x##y + +@@ -1672,8 +1671,6 @@ + { + SFTKSlot *slot = session->slot; + SFTKAttribute *attribute; +- SFTKObject *duplicateObject = NULL; +- CK_OBJECT_HANDLE handle; + CK_BBOOL ckfalse = CK_FALSE; + CK_BBOOL cktrue = CK_TRUE; + CK_RV crv; +@@ -1711,30 +1708,13 @@ + * token objects and will have a token object handle assigned to + * them by a call to sftk_mkHandle in the handler for each object + * class, invoked below. +- * ++ * + * It may be helpful to note/remember that + * sftk_narrowToXxxObject uses sftk_isToken, + * sftk_isToken examines the sign bit of the object's handle, but + * sftk_isTrue(...,CKA_TOKEN) examines the CKA_TOKEN attribute. + */ +- do { +- PRUint32 wrappedAround; +- +- duplicateObject = NULL; +- PZ_Lock(slot->objectLock); +- wrappedAround = slot->sessionObjectHandleCount & SFTK_TOKEN_MASK; +- handle = slot->sessionObjectHandleCount & ~SFTK_TOKEN_MASK; +- if (!handle) /* don't allow zero handle */ +- handle = minSessionObjectHandle; +- slot->sessionObjectHandleCount = (handle + 1U) | wrappedAround; +- /* Is there already a session object with this handle? */ +- if (wrappedAround) { +- sftkqueue_find(duplicateObject, handle, slot->sessObjHashTable, +- slot->sessObjHashSize); +- } +- PZ_Unlock(slot->objectLock); +- } while (duplicateObject != NULL); +- object->handle = handle; ++ object->handle = sftk_getNextHandle(slot); + + /* get the object class */ + attribute = sftk_FindAttribute(object, CKA_CLASS); +@@ -2875,10 +2855,15 @@ + goto mem_loser; + + slot->sessionIDCount = 0; +- slot->sessionObjectHandleCount = minSessionObjectHandle; ++ slot->sessionObjectHandleCount = NSC_MIN_SESSION_OBJECT_HANDLE; + slot->slotID = slotID; + sftk_setStringName(params->slotdes ? params->slotdes : sftk_getDefSlotName(slotID), slot->slotDescription, + sizeof(slot->slotDescription), PR_TRUE); ++ crv = sftk_InitSession(&slot->moduleObjects, slot, slotID, NULL, NULL, ++ CKF_SERIAL_SESSION); ++ if (crv != CKR_OK) { ++ goto loser; ++ } + + /* call the reinit code to set everything that changes between token + * init calls */ +@@ -2887,6 +2872,12 @@ + if (crv != CKR_OK) { + goto loser; + } ++ if (sftk_isFIPS(slotID)) { ++ crv = sftk_CreateValidationObjects(slot); ++ if (crv != CKR_OK) { ++ goto loser; ++ } ++ } + crv = sftk_RegisterSlot(slot, moduleIndex); + if (crv != CKR_OK) { + goto loser; +@@ -3032,6 +3023,8 @@ + + SFTK_ShutdownSlot(slot); + ++ sftk_ClearSession(&slot->moduleObjects); ++ + if (slot->tokObjHashTable) { + PL_HashTableDestroy(slot->tokObjHashTable); + slot->tokObjHashTable = NULL; +@@ -3262,6 +3255,7 @@ + CK_RV crv = CKR_OK; + SECStatus rv; + CK_C_INITIALIZE_ARGS *init_args = (CK_C_INITIALIZE_ARGS *)pReserved; ++ PRBool destroy_freelist_on_error = PR_TRUE; + int i; + unsigned int moduleIndex = isFIPS ? NSC_FIPS_MODULE : NSC_NON_FIPS_MODULE; + +@@ -3341,7 +3335,14 @@ + "disabled FIPS mode"); + } + } ++ /* if we have a peer open, we don't want to destroy the freelist ++ * from under the peer if we fail, the free list will be ++ * destroyed in that case when the C_Finalize is called for ++ * the peer */ ++ destroy_freelist_on_error = PR_FALSE; + } ++ /* allow us to create objects in SFTK_SlotInit */ ++ sftk_InitFreeLists(); + + for (i = 0; i < paramStrings.token_count; i++) { + crv = SFTK_SlotInit(paramStrings.configdir, +@@ -3355,8 +3356,9 @@ + loser: + sftk_freeParams(¶mStrings); + } +- if (CKR_OK == crv) { +- sftk_InitFreeLists(); ++ if (destroy_freelist_on_error && (CKR_OK != crv)) { ++ /* idempotent. If the list are already freed, this is a noop */ ++ sftk_CleanupFreeLists(); + } + + #ifndef NO_FORK_CHECK +diff --git a/lib/softoken/pkcs11i.h b/lib/softoken/pkcs11i.h +--- a/lib/softoken/pkcs11i.h ++++ b/lib/softoken/pkcs11i.h +@@ -49,6 +49,8 @@ + #define NSC_SEARCH_BLOCK_SIZE 5 + #define NSC_SLOT_LIST_BLOCK_SIZE 10 + ++#define NSC_MIN_SESSION_OBJECT_HANDLE 1U ++ + #define NSC_FIPS_MODULE 1 + #define NSC_NON_FIPS_MODULE 0 + +@@ -375,6 +377,9 @@ + char tokDescription[33]; /* per load */ + char updateTokDescription[33]; /* per load */ + char slotDescription[65]; /* invariant */ ++ SFTKSession moduleObjects; /* global session to hang module specific ++ * objects like profile objects or ++ * validation objects */ + }; + + /* +@@ -766,6 +771,7 @@ + extern void sftk_ReferenceObject(SFTKObject *object); + extern SFTKObject *sftk_ObjectFromHandle(CK_OBJECT_HANDLE handle, + SFTKSession *session); ++extern CK_OBJECT_HANDLE sftk_getNextHandle(SFTKSlot *slot); + extern void sftk_AddSlotObject(SFTKSlot *slot, SFTKObject *object); + extern void sftk_AddObject(SFTKSession *session, SFTKObject *object); + /* clear out all the existing object ID to database key mappings. +@@ -787,7 +793,11 @@ + extern CK_SLOT_ID sftk_SlotIDFromSessionHandle(CK_SESSION_HANDLE handle); + extern SFTKSession *sftk_SessionFromHandle(CK_SESSION_HANDLE handle); + extern void sftk_FreeSession(SFTKSession *session); ++extern void sftk_ClearSession(SFTKSession *session); + extern void sftk_DestroySession(SFTKSession *session); ++extern CK_RV sftk_InitSession(SFTKSession *session, SFTKSlot *slot, ++ CK_SLOT_ID slotID, CK_NOTIFY notify, ++ CK_VOID_PTR pApplication, CK_FLAGS flags); + extern SFTKSession *sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify, + CK_VOID_PTR pApplication, CK_FLAGS flags); + extern void sftk_update_state(SFTKSlot *slot, SFTKSession *session); +@@ -955,6 +965,9 @@ + * FIPS security policy */ + PRBool sftk_operationIsFIPS(SFTKSlot *slot, CK_MECHANISM *mech, + CK_ATTRIBUTE_TYPE op, SFTKObject *source); ++/* add validation objects to the slot */ ++CK_RV sftk_CreateValidationObjects(SFTKSlot *slot); ++ + SEC_END_PROTOS + + #endif /* _PKCS11I_H_ */ +diff --git a/lib/softoken/pkcs11u.c b/lib/softoken/pkcs11u.c +--- a/lib/softoken/pkcs11u.c ++++ b/lib/softoken/pkcs11u.c +@@ -14,6 +14,7 @@ + #include "sftkdb.h" + #include "softoken.h" + #include "secoid.h" ++#include "softkver.h" + + #if !defined(NSS_FIPS_DISABLED) && defined(NSS_ENABLE_FIPS_INDICATORS) + /* this file should be supplied by the vendor and include all the +@@ -1243,6 +1244,32 @@ + return SFTK_Busy; + } + ++/* find the next available object handle that isn't currently in use */ ++CK_OBJECT_HANDLE ++sftk_getNextHandle(SFTKSlot *slot) ++{ ++ CK_OBJECT_HANDLE handle; ++ SFTKObject *duplicateObject = NULL; ++ do { ++ PRUint32 wrappedAround; ++ ++ duplicateObject = NULL; ++ PZ_Lock(slot->objectLock); ++ wrappedAround = slot->sessionObjectHandleCount & SFTK_TOKEN_MASK; ++ handle = slot->sessionObjectHandleCount & ~SFTK_TOKEN_MASK; ++ if (!handle) /* don't allow zero handle */ ++ handle = NSC_MIN_SESSION_OBJECT_HANDLE; ++ slot->sessionObjectHandleCount = (handle + 1U) | wrappedAround; ++ /* Is there already a session object with this handle? */ ++ if (wrappedAround) { ++ sftkqueue_find(duplicateObject, handle, slot->sessObjHashTable, ++ slot->sessObjHashSize); ++ } ++ PZ_Unlock(slot->objectLock); ++ } while (duplicateObject != NULL); ++ return handle; ++} ++ + /* + * add an object to a slot and session queue. These two functions + * adopt the object. +@@ -1848,23 +1875,13 @@ + } + + /* +- * create a new nession. NOTE: The session handle is not set, and the ++ * Init a new session. NOTE: The session handle is not set, and the + * session is not added to the slot's session queue. + */ +-SFTKSession * +-sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify, CK_VOID_PTR pApplication, +- CK_FLAGS flags) ++CK_RV ++sftk_InitSession(SFTKSession *session, SFTKSlot *slot, CK_SLOT_ID slotID, ++ CK_NOTIFY notify, CK_VOID_PTR pApplication, CK_FLAGS flags) + { +- SFTKSession *session; +- SFTKSlot *slot = sftk_SlotFromID(slotID, PR_FALSE); +- +- if (slot == NULL) +- return NULL; +- +- session = (SFTKSession *)PORT_Alloc(sizeof(SFTKSession)); +- if (session == NULL) +- return NULL; +- + session->next = session->prev = NULL; + session->enc_context = NULL; + session->hash_context = NULL; +@@ -1873,8 +1890,7 @@ + session->objectIDCount = 1; + session->objectLock = PZ_NewLock(nssILockObject); + if (session->objectLock == NULL) { +- PORT_Free(session); +- return NULL; ++ return CKR_HOST_MEMORY; + } + session->objects[0] = NULL; + +@@ -1887,12 +1903,38 @@ + sftk_update_state(slot, session); + /* no ops completed yet, so the last one couldn't be a FIPS op */ + session->lastOpWasFIPS = PR_FALSE; ++ return CKR_OK; ++} ++ ++/* ++ * Create a new session and init it. ++ */ ++SFTKSession * ++sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify, CK_VOID_PTR pApplication, ++ CK_FLAGS flags) ++{ ++ SFTKSession *session; ++ SFTKSlot *slot = sftk_SlotFromID(slotID, PR_FALSE); ++ CK_RV crv; ++ ++ if (slot == NULL) ++ return NULL; ++ ++ session = (SFTKSession *)PORT_Alloc(sizeof(SFTKSession)); ++ if (session == NULL) ++ return NULL; ++ ++ crv = sftk_InitSession(session, slot, slotID, notify, pApplication, flags); ++ if (crv != CKR_OK) { ++ PORT_Free(session); ++ return NULL; ++ } + return session; + } + + /* free all the data associated with a session. */ + void +-sftk_DestroySession(SFTKSession *session) ++sftk_ClearSession(SFTKSession *session) + { + SFTKObjectList *op, *next; + +@@ -1918,6 +1960,13 @@ + if (session->search) { + sftk_FreeSearch(session->search); + } ++} ++ ++/* free the data associated with the session, and the session */ ++void ++sftk_DestroySession(SFTKSession *session) ++{ ++ sftk_ClearSession(session); + PORT_Free(session); + } + +@@ -2386,3 +2435,70 @@ + return PR_FALSE; + #endif + } ++ ++/* ++ * create the FIPS Validation objects. If the vendor ++ * doesn't supply an NSS_FIPS_MODULE_ID, at compile time, ++ * then we assumethis is an unvalidated module. ++ */ ++CK_RV ++sftk_CreateValidationObjects(SFTKSlot *slot) ++{ ++ const char *module_id; ++ int module_id_len; ++ CK_RV crv = CKR_OK; ++ /* we currently use vendor specific values until the validation ++ * objects are approved for PKCS #11 v3.2. */ ++ CK_OBJECT_CLASS cko_validation = CKO_NSS_VALIDATION; ++ CK_NSS_VALIDATION_TYPE ckv_fips = CKV_NSS_FIPS_140; ++ CK_VERSION fips_version = { 3, 0 }; /* FIPS-140-3 */ ++ CK_ULONG fips_level = 1; /* or 2 if you validated at level 2 */ ++ ++#ifndef NSS_FIPS_MODULE_ID ++#define NSS_FIPS_MODULE_ID "Generic NSS " SOFTOKEN_VERSION " Unvalidated" ++#endif ++ module_id = NSS_FIPS_MODULE_ID; ++ module_id_len = sizeof(NSS_FIPS_MODULE_ID) - 1; ++ SFTKObject *object; ++ ++ object = sftk_NewObject(slot); /* fill in the handle later */ ++ if (object == NULL) { ++ return CKR_HOST_MEMORY; ++ } ++ object->isFIPS = PR_FALSE; ++ ++ crv = sftk_AddAttributeType(object, CKA_CLASS, ++ &cko_validation, sizeof(cko_validation)); ++ if (crv != CKR_OK) { ++ goto loser; ++ } ++ crv = sftk_AddAttributeType(object, CKA_NSS_VALIDATION_TYPE, ++ &ckv_fips, sizeof(ckv_fips)); ++ if (crv != CKR_OK) { ++ goto loser; ++ } ++ crv = sftk_AddAttributeType(object, CKA_NSS_VALIDATION_VERSION, ++ &fips_version, sizeof(fips_version)); ++ if (crv != CKR_OK) { ++ goto loser; ++ } ++ crv = sftk_AddAttributeType(object, CKA_NSS_VALIDATION_LEVEL, ++ &fips_level, sizeof(fips_level)); ++ if (crv != CKR_OK) { ++ goto loser; ++ } ++ crv = sftk_AddAttributeType(object, CKA_NSS_VALIDATION_MODULE_ID, ++ module_id, module_id_len); ++ if (crv != CKR_OK) { ++ goto loser; ++ } ++ ++ /* future, fill in validation certificate information from a supplied ++ * pointer to a config file */ ++ object->handle = sftk_getNextHandle(slot); ++ object->slot = slot; ++ sftk_AddObject(&slot->moduleObjects, object); ++loser: ++ sftk_FreeObject(object); ++ return crv; ++} +diff --git a/lib/util/pkcs11n.h b/lib/util/pkcs11n.h +--- a/lib/util/pkcs11n.h ++++ b/lib/util/pkcs11n.h +@@ -38,6 +38,9 @@ + #define CKO_NSS_BUILTIN_ROOT_LIST (CKO_NSS + 4) + #define CKO_NSS_NEWSLOT (CKO_NSS + 5) + #define CKO_NSS_DELSLOT (CKO_NSS + 6) ++#define CKO_NSS_VALIDATION (CKO_NSS + 7) ++ ++#define CKV_NSS_FIPS_140 (CKO_NSS + 1) + + /* + * NSS-defined key types +@@ -99,6 +102,11 @@ + #define CKA_NSS_SERVER_DISTRUST_AFTER (CKA_NSS + 35) + #define CKA_NSS_EMAIL_DISTRUST_AFTER (CKA_NSS + 36) + ++#define CKA_NSS_VALIDATION_TYPE (CKA_NSS + 36) ++#define CKA_NSS_VALIDATION_VERSION (CKA_NSS + 37) ++#define CKA_NSS_VALIDATION_LEVEL (CKA_NSS + 38) ++#define CKA_NSS_VALIDATION_MODULE_ID (CKA_NSS + 39) ++ + /* + * Trust attributes: + * +@@ -344,6 +352,9 @@ + #define CKR_NSS_CERTDB_FAILED (CKR_NSS + 1) + #define CKR_NSS_KEYDB_FAILED (CKR_NSS + 2) + ++/* NSS specific types */ ++typedef CK_ULONG CK_NSS_VALIDATION_TYPE; ++ + /* Mandatory parameter for the CKM_NSS_HKDF_* key deriviation mechanisms. + See RFC 5869. + +diff --git a/nss.gyp b/nss.gyp +--- a/nss.gyp ++++ b/nss.gyp +@@ -131,6 +131,7 @@ + 'cmd/smimetools/smimetools.gyp:cmsutil', + 'cmd/ssltap/ssltap.gyp:ssltap', + 'cmd/symkeyutil/symkeyutil.gyp:symkeyutil', ++ 'cmd/validation/validation.gyp:validation', + 'nss-tool/nss_tool.gyp:nss', + 'nss-tool/nss_tool.gyp:hw-support', + ], + diff --git a/nss-3.71-ipv6-fix.patch b/nss-3.71-ipv6-fix.patch new file mode 100644 index 0000000..b72c80f --- /dev/null +++ b/nss-3.71-ipv6-fix.patch @@ -0,0 +1,36 @@ +diff -up ./cmd/selfserv/selfserv.c.ipv6_fix ./cmd/selfserv/selfserv.c +--- ./cmd/selfserv/selfserv.c.ipv6_fix 2021-09-14 11:40:06.176408531 -0700 ++++ ./cmd/selfserv/selfserv.c 2021-09-14 11:49:46.361907308 -0700 +@@ -1717,14 +1717,28 @@ getBoundListenSocket(unsigned short port + PRNetAddr addr; + PRSocketOptionData opt; + +- addr.inet.family = PR_AF_INET; +- addr.inet.ip = PR_INADDR_ANY; +- addr.inet.port = PR_htons(port); ++ if (PR_SetNetAddr(PR_IpAddrAny, PR_AF_INET6, port, &addr) != PR_SUCCESS) { ++ errExit("PR_SetNetAddr"); ++ } + +- listen_sock = PR_NewTCPSocket(); ++ listen_sock = PR_OpenTCPSocket(PR_AF_INET6); + if (listen_sock == NULL) { + errExit("PR_NewTCPSocket"); + } ++ /* NSPR has a bug where set inheritable doesn't work unless it's a pure ++ * NSPR socket. If we have an IPV6 emulator on an IPV4 socket, it will fail. ++ * In that case just open an IPV4 socket instead */ ++ if (PR_NSPR_IO_LAYER != PR_GetLayersIdentity(listen_sock)) { ++ PR_Close(listen_sock); ++ addr.inet.family = PR_AF_INET; ++ addr.inet.ip = PR_INADDR_ANY; ++ addr.inet.port = PR_htons(port); ++ ++ listen_sock = PR_NewTCPSocket(); ++ if (listen_sock == NULL) { ++ errExit("PR_NewTCPSocket"); ++ } ++ } + + opt.option = PR_SockOpt_Nonblocking; + opt.value.non_blocking = PR_FALSE; diff --git a/nss-539183.patch b/nss-539183.patch deleted file mode 100644 index 267e71e..0000000 --- a/nss-539183.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- nss/cmd/httpserv/httpserv.c.539183 2016-05-21 18:31:39.879585420 -0700 -+++ nss/cmd/httpserv/httpserv.c 2016-05-21 18:37:22.374464057 -0700 -@@ -953,23 +953,23 @@ - getBoundListenSocket(unsigned short port) - { - PRFileDesc *listen_sock; - int listenQueueDepth = 5 + (2 * maxThreads); - PRStatus prStatus; - PRNetAddr addr; - PRSocketOptionData opt; - -- addr.inet.family = PR_AF_INET; -- addr.inet.ip = PR_INADDR_ANY; -- addr.inet.port = PR_htons(port); -+ if (PR_SetNetAddr(PR_IpAddrAny, PR_AF_INET6, port, &addr) != PR_SUCCESS) { -+ errExit("PR_SetNetAddr"); -+ } - -- listen_sock = PR_NewTCPSocket(); -+ listen_sock = PR_OpenTCPSocket(PR_AF_INET6); - if (listen_sock == NULL) { -- errExit("PR_NewTCPSocket"); -+ errExit("PR_OpenTCPSockett"); - } - - opt.option = PR_SockOpt_Nonblocking; - opt.value.non_blocking = PR_FALSE; - prStatus = PR_SetSocketOption(listen_sock, &opt); - if (prStatus < 0) { - PR_Close(listen_sock); - errExit("PR_SetSocketOption(PR_SockOpt_Nonblocking)"); ---- nss/cmd/selfserv/selfserv.c.539183 2016-05-21 18:31:39.882585367 -0700 -+++ nss/cmd/selfserv/selfserv.c 2016-05-21 18:41:43.092801174 -0700 -@@ -1711,23 +1711,23 @@ - getBoundListenSocket(unsigned short port) - { - PRFileDesc *listen_sock; - int listenQueueDepth = 5 + (2 * maxThreads); - PRStatus prStatus; - PRNetAddr addr; - PRSocketOptionData opt; - -- addr.inet.family = PR_AF_INET; -- addr.inet.ip = PR_INADDR_ANY; -- addr.inet.port = PR_htons(port); -+ if (PR_SetNetAddr(PR_IpAddrAny, PR_AF_INET6, port, &addr) != PR_SUCCESS) { -+ errExit("PR_SetNetAddr"); -+ } - -- listen_sock = PR_NewTCPSocket(); -+ listen_sock = PR_OpenTCPSocket(PR_AF_INET6); - if (listen_sock == NULL) { -- errExit("PR_NewTCPSocket"); -+ errExit("PR_OpenTCPSocket error"); - } - - opt.option = PR_SockOpt_Nonblocking; - opt.value.non_blocking = PR_FALSE; - prStatus = PR_SetSocketOption(listen_sock, &opt); - if (prStatus < 0) { - PR_Close(listen_sock); - errExit("PR_SetSocketOption(PR_SockOpt_Nonblocking)"); diff --git a/nss.spec b/nss.spec index 04a14b6..848604f 100644 --- a/nss.spec +++ b/nss.spec @@ -4,9 +4,9 @@ # - increment %%{nspr_version}, when updating the NSS part only # - put the nss_release number here next to nspr, as they both # need to be updated on a given release -%global nspr_release 2 -%global nss_release 13 -%global nss_version 3.67.0 +%global nss_release 1 +%global nspr_release %[%nss_release+2] +%global nss_version 3.71.0 # only need to update this as we added new # algorithms under nss policy control %global crypto_policies_version 20210118 @@ -111,7 +111,7 @@ Source100: nspr-%{nspr_archive_version}.tar.gz Source101: nspr-config.xml # Upstream: https://bugzilla.mozilla.org/show_bug.cgi?id=617723 -Patch2: nss-539183.patch +Patch2: nss-3.71-ipv6-fix.patch # This patch uses the GCC -iquote option documented at # http://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options # to give the in-tree headers a higher priority over the system headers, @@ -125,8 +125,6 @@ Patch2: nss-539183.patch # but it doesn't hurt to keep it. Patch4: iquote.patch Patch12: nss-signtool-format.patch -# can drop this patch when the underlying btrfs/sqlite issue is solved -Patch30: nss-fedora-btrf-sql-hack.patch # connect our shared library to the build root loader flags (needed for -relro) Patch31: nss-dso-ldflags.patch # keep RHEL 8 semantics of disabling md4 and md5 even if the env variable is set @@ -137,22 +135,8 @@ Patch32: nss-disable-md5.patch Patch33: nss-no-dbm-man-page.patch %endif -# Patches that should be upstreamed, and (hopefully) will disappear next -# rebase -# Need upstream bug -Patch50: nss-3.44-kbkdf-coverity.patch -# no upsteam bug yet -Patch51: nss-3.67-fix-private-key-mac.patch -# no upstream bug yet -Patch52: nss-3.53.1-measure-fix.patch -# no upstream bug yet -Patch53: nss-3.66-no-small-primes.patch -# no upstream bug yet -Patch54: nss-3.66-fix-gtest-parsing.patch -# no upstream bug yet -Patch55: nss-3.67-fix-coverity-issues.patch -# no upstream bug yet -Patch60: nss-3.67-fix-ssl-alerts.patch +# upstream bug https://bugzilla.mozilla.org/show_bug.cgi?id=1729550 +Patch50: nss-3.71-fips-module-name.patch Patch100: nspr-config-pc.patch Patch101: nspr-gcc-atomics.patch @@ -387,7 +371,26 @@ popd # uncomment if the iquote patch is activated export IN_TREE_FREEBL_HEADERS_FIRST=1 +# FIPS related defines export NSS_FORCE_FIPS=1 +export NSS_FIPS_VERSION="%{name}\ %{version}-$(date +%Y%m%d)" +%if %{defined rhel} +%if %{defined centos} + export NSS_FIPS_MODULE_ID="Centos\ %rhel\ ${NSS_FIPS_VERSION}\ unvalidated" +%else +if [ grep "Red Hat" /etc/system-release ]; then + export NSS_FIPS_MODULE_ID="Red\ Hat\ Enterprise\ Linux\ %rhel\ ${NSS_FIPS_VERSION}" +else + export NSS_FIPS_MODULE_ID="Generic\ Enterprise\ Linux\ %rhel\ ${NSS_FIPS_VERSION}\ unvalidated" +fi +%endif +%else +%if %{defined fedora} + export NSS_FIPS_MODULE_ID="Fedora\ %fedora\ ${NSS_FIPS_VERSION}\ unvalidated" +%else + export NSS_FIPS_MODULE_ID="Generic\ Linux\ ${NSS_FIPS_VERSION}\ unvalidated" +%endif +%endif # Enable compiler optimizations and disable debugging code export BUILD_OPT=1 @@ -1076,6 +1079,9 @@ update-crypto-policies &> /dev/null || : %changelog +* Tue Oct 5 2021 Bob Relyea - 3.71.0-1 +- rebase to NSS-3.71 + * Wed Aug 25 2021 Bob Relyea - 3.67.0-13 - rebuild to clear gating.yaml test diff --git a/sources b/sources index 4484d49..ee7146c 100644 --- a/sources +++ b/sources @@ -3,5 +3,5 @@ SHA512 (blank-cert9.db) = 2f8eab4c0612210ee47db8a3a80c1b58a0b43849551af78c7da403 SHA512 (blank-key3.db) = 01f7314e9fc8a7c9aa997652624cfcde213d18a6b3bb31840c1a60bbd662e56b5bc3221d13874abb42ce78163b225a6dfce2e1326cf6dd29366ad9c28ba5a71c SHA512 (blank-key4.db) = 8fedae93af7163da23fe9492ea8e785a44c291604fa98e58438448efb69c85d3253fc22b926d5c3209c62e58a86038fd4d78a1c4c068bc00600a7f3e5382ebe7 SHA512 (blank-secmod.db) = 06a2dbd861839ef6315093459328b500d3832333a34b30e6fac4a2503af337f014a4d319f0f93322409e719142904ce8bc08252ae9a4f37f30d4c3312e900310 -SHA512 (nss-3.67.tar.gz) = 1d3fa3fafbf3e54c9c3b54b0b3c291aebb48542380a1b704fa07359d3cefab93f166b31928c9db190ed58118e289e67ce8aa1619e4219d69b2c098484a22bc9d SHA512 (nspr-4.32.tar.gz) = da9b65b374783d20a2e589211b411816d899e296e91175d376e59df1919144c1808c155a234d6ceefdf7b8ae8f47cec98d92a5aa3150a579513251860e50dcb7 +SHA512 (nss-3.71.tar.gz) = a4a724dc4e8677965b6245ea2309790d31ec7719658e2b349eb67c9008082132c76277340d15e4fdd8d2fe1f560ae6803fb038d023c3dfd2e3772fa3b77720e2