- update to NSS 3.80
* bmo#1774720 - Fix SEC_ERROR_ALGORITHM_MISMATCH entry in SECerrs.h. * bmo#1617956 - Add support for asynchronous client auth hooks. * bmo#1497537 - nss-policy-check: make unknown keyword check optional. * bmo#1765383 - GatherBuffer: Reduced plaintext buffer allocations by allocating it on initialization. Replaced redundant code with assert. Debug builds: Added buffer freeing/allocation for each record. * bmo#1773022 - Mark 3.79 as an ESR release. * bmo#1764206 - Bump nssckbi version number for June. * bmo#1759815 - Remove Hellenic Academic 2011 Root. * bmo#1770267 - Add E-Tugra Roots. * bmo#1768970 - Add Certainly Roots. * bmo#1764392 - Add DigitCert Roots. * bmo#1759794 - Protect SFTKSlot needLogin with slotLock. * bmo#1366464 - Compare signature and signatureAlgorithm fields in legacy certificate verifier. * bmo#1771497 - Uninitialized value in cert_VerifyCertChainOld. * bmo#1771495 - Unchecked return code in sec_DecodeSigAlg. * bmo#1771498 - Uninitialized value in cert_ComputeCertType. * bmo#1760998 - Avoid data race on primary password change. * bmo#1769063 - Replace ppc64 dcbzl intrinisic. * bmo#1771036 - Allow LDFLAGS override in makefile builds. - FIPS patch updates - removed obsolete patches * nss-fips-tests-skip.patch * nss-fips-tls-allow-md5-prf.patch OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/mozilla-nss?expand=0&rev=388
This commit is contained in:
parent
8442248c89
commit
521f0d9c83
@ -1,3 +1,34 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Jul 26 19:20:48 UTC 2022 - Wolfgang Rosenauer <wr@rosenauer.org>
|
||||
|
||||
- update to NSS 3.80
|
||||
* bmo#1774720 - Fix SEC_ERROR_ALGORITHM_MISMATCH entry in SECerrs.h.
|
||||
* bmo#1617956 - Add support for asynchronous client auth hooks.
|
||||
* bmo#1497537 - nss-policy-check: make unknown keyword check optional.
|
||||
* bmo#1765383 - GatherBuffer: Reduced plaintext buffer allocations
|
||||
by allocating it on initialization. Replaced
|
||||
redundant code with assert. Debug builds: Added
|
||||
buffer freeing/allocation for each record.
|
||||
* bmo#1773022 - Mark 3.79 as an ESR release.
|
||||
* bmo#1764206 - Bump nssckbi version number for June.
|
||||
* bmo#1759815 - Remove Hellenic Academic 2011 Root.
|
||||
* bmo#1770267 - Add E-Tugra Roots.
|
||||
* bmo#1768970 - Add Certainly Roots.
|
||||
* bmo#1764392 - Add DigitCert Roots.
|
||||
* bmo#1759794 - Protect SFTKSlot needLogin with slotLock.
|
||||
* bmo#1366464 - Compare signature and signatureAlgorithm fields in
|
||||
legacy certificate verifier.
|
||||
* bmo#1771497 - Uninitialized value in cert_VerifyCertChainOld.
|
||||
* bmo#1771495 - Unchecked return code in sec_DecodeSigAlg.
|
||||
* bmo#1771498 - Uninitialized value in cert_ComputeCertType.
|
||||
* bmo#1760998 - Avoid data race on primary password change.
|
||||
* bmo#1769063 - Replace ppc64 dcbzl intrinisic.
|
||||
* bmo#1771036 - Allow LDFLAGS override in makefile builds.
|
||||
- FIPS patch updates
|
||||
- removed obsolete patches
|
||||
* nss-fips-tests-skip.patch
|
||||
* nss-fips-tls-allow-md5-prf.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Jun 25 12:30:25 UTC 2022 - Wolfgang Rosenauer <wr@rosenauer.org>
|
||||
|
||||
|
@ -17,14 +17,14 @@
|
||||
#
|
||||
|
||||
|
||||
%global nss_softokn_fips_version 3.79
|
||||
%global nss_softokn_fips_version 3.80
|
||||
%define NSPR_min_version 4.34
|
||||
%define nspr_ver %(rpm -q --queryformat '%%{VERSION}' mozilla-nspr)
|
||||
%define nssdbdir %{_sysconfdir}/pki/nssdb
|
||||
Name: mozilla-nss
|
||||
Version: 3.79
|
||||
Version: 3.80
|
||||
Release: 0
|
||||
%define underscore_version 3_79
|
||||
%define underscore_version 3_80
|
||||
Summary: Network Security Services
|
||||
License: MPL-2.0
|
||||
Group: System/Libraries
|
||||
@ -65,7 +65,6 @@ Patch19: nss-fips-cavs-dsa-fixes.patch
|
||||
Patch20: nss-fips-cavs-rsa-fixes.patch
|
||||
Patch21: nss-fips-approved-crypto-non-ec.patch
|
||||
Patch22: nss-fips-zeroization.patch
|
||||
Patch23: nss-fips-tls-allow-md5-prf.patch
|
||||
Patch24: nss-fips-use-strong-random-pool.patch
|
||||
Patch25: nss-fips-detect-fips-mode-fixes.patch
|
||||
Patch26: nss-fips-combined-hash-sign-dsa-ecdsa.patch
|
||||
@ -74,7 +73,6 @@ Patch37: nss-fips-fix-missing-nspr.patch
|
||||
Patch38: nss-fips-stricter-dh.patch
|
||||
Patch40: nss-fips-180-3-csp-clearing.patch
|
||||
Patch41: nss-fips-pbkdf-kat-compliance.patch
|
||||
Patch42: nss-fips-tests-skip.patch
|
||||
Patch44: nss-fips-tests-enable-fips.patch
|
||||
%if 0%{?sle_version} >= 120000 && 0%{?sle_version} < 150000
|
||||
# aarch64 + gcc4.8 fails to build on SLE-12 due to undefined references
|
||||
@ -225,7 +223,6 @@ cd nss
|
||||
%patch20 -p1
|
||||
%patch21 -p1
|
||||
%patch22 -p1
|
||||
%patch23 -p1
|
||||
%patch24 -p1
|
||||
%patch25 -p1
|
||||
%patch26 -p1
|
||||
@ -234,7 +231,6 @@ cd nss
|
||||
%patch38 -p1
|
||||
%patch40 -p1
|
||||
%patch41 -p1
|
||||
%patch42 -p1
|
||||
%patch44 -p1
|
||||
|
||||
# additional CA certificates
|
||||
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ebdf2d6a96613b6fe70ad579e9f983e0e94e0110171cfb2999db633d3394a514
|
||||
size 84830113
|
3
nss-3.80.tar.gz
Normal file
3
nss-3.80.tar.gz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c0bf1fd2c7e29a6b02b309622baafc443eec90c8934bb155da4bb98988784b6a
|
||||
size 84841312
|
@ -87,62 +87,17 @@ Index: nss/lib/freebl/arcfour.c
|
||||
|
||||
/* Architecture-dependent defines */
|
||||
|
||||
@@ -108,6 +109,7 @@ static const Stype Kinit[256] = {
|
||||
RC4Context *
|
||||
RC4_AllocateContext(void)
|
||||
{
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
return PORT_ZNew(RC4Context);
|
||||
}
|
||||
|
||||
@@ -121,6 +123,8 @@ RC4_InitContext(RC4Context *cx, const un
|
||||
PRUint8 K[256];
|
||||
PRUint8 *L;
|
||||
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
+
|
||||
/* verify the key length. */
|
||||
PORT_Assert(len > 0 && len < ARCFOUR_STATE_SIZE);
|
||||
if (len == 0 || len >= ARCFOUR_STATE_SIZE) {
|
||||
@@ -162,7 +166,11 @@ RC4_InitContext(RC4Context *cx, const un
|
||||
@@ -162,7 +163,9 @@ RC4_InitContext(RC4Context *cx, const un
|
||||
RC4Context *
|
||||
RC4_CreateContext(const unsigned char *key, int len)
|
||||
{
|
||||
- RC4Context *cx = RC4_AllocateContext();
|
||||
+ RC4Context *cx;
|
||||
+
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
+
|
||||
+ cx = RC4_AllocateContext();
|
||||
if (cx) {
|
||||
SECStatus rv = RC4_InitContext(cx, key, len, NULL, 0, 0, 0);
|
||||
if (rv != SECSuccess) {
|
||||
@@ -176,6 +184,7 @@ RC4_CreateContext(const unsigned char *k
|
||||
void
|
||||
RC4_DestroyContext(RC4Context *cx, PRBool freeit)
|
||||
{
|
||||
+ IN_FIPS_RETURN();
|
||||
if (freeit)
|
||||
PORT_ZFree(cx, sizeof(*cx));
|
||||
}
|
||||
@@ -548,6 +557,8 @@ RC4_Encrypt(RC4Context *cx, unsigned cha
|
||||
unsigned int *outputLen, unsigned int maxOutputLen,
|
||||
const unsigned char *input, unsigned int inputLen)
|
||||
{
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
+
|
||||
PORT_Assert(maxOutputLen >= inputLen);
|
||||
if (maxOutputLen < inputLen) {
|
||||
PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
||||
@@ -571,6 +582,8 @@ RC4_Decrypt(RC4Context *cx, unsigned cha
|
||||
unsigned int *outputLen, unsigned int maxOutputLen,
|
||||
const unsigned char *input, unsigned int inputLen)
|
||||
{
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
+
|
||||
PORT_Assert(maxOutputLen >= inputLen);
|
||||
if (maxOutputLen < inputLen) {
|
||||
PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
||||
Index: nss/lib/freebl/deprecated/seed.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/deprecated/seed.c
|
||||
@ -293,56 +248,32 @@ Index: nss/lib/freebl/md2.c
|
||||
#define MD2_DIGEST_LEN 16
|
||||
#define MD2_BUFSIZE 16
|
||||
#define MD2_X_SIZE 48 /* The X array, [CV | INPUT | TMP VARS] */
|
||||
@@ -66,7 +68,11 @@ SECStatus
|
||||
@@ -66,7 +68,9 @@ SECStatus
|
||||
MD2_Hash(unsigned char *dest, const char *src)
|
||||
{
|
||||
unsigned int len;
|
||||
- MD2Context *cx = MD2_NewContext();
|
||||
+ MD2Context *cx;
|
||||
+
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
+
|
||||
+ cx = MD2_NewContext();
|
||||
if (!cx) {
|
||||
PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
|
||||
return SECFailure;
|
||||
@@ -81,7 +87,11 @@ MD2_Hash(unsigned char *dest, const char
|
||||
@@ -81,7 +85,9 @@ MD2_Hash(unsigned char *dest, const char
|
||||
MD2Context *
|
||||
MD2_NewContext(void)
|
||||
{
|
||||
- MD2Context *cx = (MD2Context *)PORT_ZAlloc(sizeof(MD2Context));
|
||||
+ MD2Context *cx;
|
||||
+
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
+
|
||||
+ cx = (MD2Context *)PORT_ZAlloc(sizeof(MD2Context));
|
||||
if (cx == NULL) {
|
||||
PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
|
||||
return NULL;
|
||||
@@ -99,6 +109,8 @@ MD2_DestroyContext(MD2Context *cx, PRBoo
|
||||
void
|
||||
MD2_Begin(MD2Context *cx)
|
||||
{
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
memset(cx, 0, sizeof(*cx));
|
||||
cx->unusedBuffer = MD2_BUFSIZE;
|
||||
}
|
||||
@@ -196,6 +208,8 @@ MD2_Update(MD2Context *cx, const unsigne
|
||||
{
|
||||
PRUint32 bytesToConsume;
|
||||
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
/* Fill the remaining input buffer. */
|
||||
if (cx->unusedBuffer != MD2_BUFSIZE) {
|
||||
bytesToConsume = PR_MIN(inputLen, cx->unusedBuffer);
|
||||
@@ -226,6 +240,9 @@ MD2_End(MD2Context *cx, unsigned char *d
|
||||
@@ -226,6 +232,7 @@ MD2_End(MD2Context *cx, unsigned char *d
|
||||
unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
{
|
||||
PRUint8 padStart;
|
||||
+
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
if (maxDigestLen < MD2_BUFSIZE) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
@ -360,37 +291,18 @@ Index: nss/lib/freebl/md5.c
|
||||
#define MD5_HASH_LEN 16
|
||||
#define MD5_BUFFER_SIZE 64
|
||||
#define MD5_END_BUFFER (MD5_BUFFER_SIZE - 8)
|
||||
@@ -195,6 +197,7 @@ struct MD5ContextStr {
|
||||
SECStatus
|
||||
MD5_Hash(unsigned char *dest, const char *src)
|
||||
{
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
return MD5_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
|
||||
}
|
||||
|
||||
@@ -204,6 +207,8 @@ MD5_HashBuf(unsigned char *dest, const u
|
||||
unsigned int len;
|
||||
MD5Context cx;
|
||||
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
+
|
||||
MD5_Begin(&cx);
|
||||
MD5_Update(&cx, src, src_length);
|
||||
MD5_End(&cx, dest, &len, MD5_HASH_LEN);
|
||||
@@ -215,7 +220,11 @@ MD5Context *
|
||||
@@ -215,7 +217,9 @@ MD5Context *
|
||||
MD5_NewContext(void)
|
||||
{
|
||||
/* no need to ZAlloc, MD5_Begin will init the context */
|
||||
- MD5Context *cx = (MD5Context *)PORT_Alloc(sizeof(MD5Context));
|
||||
+ MD5Context *cx;
|
||||
+
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
+
|
||||
+ cx = (MD5Context *)PORT_Alloc(sizeof(MD5Context));
|
||||
if (cx == NULL) {
|
||||
PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
|
||||
return NULL;
|
||||
@@ -226,7 +235,8 @@ MD5_NewContext(void)
|
||||
@@ -226,7 +230,8 @@ MD5_NewContext(void)
|
||||
void
|
||||
MD5_DestroyContext(MD5Context *cx, PRBool freeit)
|
||||
{
|
||||
@ -400,42 +312,6 @@ Index: nss/lib/freebl/md5.c
|
||||
if (freeit) {
|
||||
PORT_Free(cx);
|
||||
}
|
||||
@@ -235,6 +245,8 @@ MD5_DestroyContext(MD5Context *cx, PRBoo
|
||||
void
|
||||
MD5_Begin(MD5Context *cx)
|
||||
{
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
cx->lsbInput = 0;
|
||||
cx->msbInput = 0;
|
||||
/* memset(cx->inBuf, 0, sizeof(cx->inBuf)); */
|
||||
@@ -425,6 +437,8 @@ MD5_Update(MD5Context *cx, const unsigne
|
||||
PRUint32 inBufIndex = cx->lsbInput & 63;
|
||||
const PRUint32 *wBuf;
|
||||
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
/* Add the number of input bytes to the 64-bit input counter. */
|
||||
addto64(cx->msbInput, cx->lsbInput, inputLen);
|
||||
if (inBufIndex) {
|
||||
@@ -498,6 +512,8 @@ MD5_End(MD5Context *cx, unsigned char *d
|
||||
PRUint32 lowInput, highInput;
|
||||
PRUint32 inBufIndex = cx->lsbInput & 63;
|
||||
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
if (maxDigestLen < MD5_HASH_LEN) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return;
|
||||
@@ -546,6 +562,8 @@ MD5_EndRaw(MD5Context *cx, unsigned char
|
||||
#endif
|
||||
PRUint32 cv[4];
|
||||
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
if (maxDigestLen < MD5_HASH_LEN) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return;
|
||||
Index: nss/lib/freebl/nsslowhash.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/nsslowhash.c
|
||||
@ -448,15 +324,18 @@ Index: nss/lib/freebl/nsslowhash.c
|
||||
|
||||
struct NSSLOWInitContextStr {
|
||||
int count;
|
||||
@@ -92,6 +93,12 @@ NSSLOWHASH_NewContext(NSSLOWInitContext
|
||||
@@ -92,6 +93,15 @@ NSSLOWHASH_NewContext(NSSLOWInitContext
|
||||
{
|
||||
NSSLOWHASHContext *context;
|
||||
|
||||
+#if 0
|
||||
+ /* return with an error if unapproved hash is requested in FIPS mode */
|
||||
+ /* This is now handled by the service level indicator */
|
||||
+ if (!FIPS_hashAlgApproved(hashType)) {
|
||||
+ PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
if (post_failed) {
|
||||
PORT_SetError(SEC_ERROR_PKCS11_DEVICE_ERROR);
|
||||
@ -473,13 +352,16 @@ Index: nss/lib/freebl/rawhash.c
|
||||
|
||||
static void *
|
||||
null_hash_new_context(void)
|
||||
@@ -146,7 +147,8 @@ const SECHashObject SECRawHashObjects[]
|
||||
@@ -146,7 +147,11 @@ const SECHashObject SECRawHashObjects[]
|
||||
const SECHashObject *
|
||||
HASH_GetRawHashObject(HASH_HashType hashType)
|
||||
{
|
||||
- if (hashType <= HASH_AlgNULL || hashType >= HASH_AlgTOTAL) {
|
||||
+ /* We rely on the service level indicator for algorithm approval now, so
|
||||
+ * the FIPS check here has been commented out */
|
||||
+
|
||||
+ if (hashType <= HASH_AlgNULL || hashType >= HASH_AlgTOTAL
|
||||
+ || (!FIPS_hashAlgApproved(hashType))) {
|
||||
+ /* || (!FIPS_hashAlgApproved(hashType)) */) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return NULL;
|
||||
}
|
||||
@ -487,7 +369,24 @@ Index: nss/lib/softoken/pkcs11c.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/softoken/pkcs11c.c
|
||||
+++ nss/lib/softoken/pkcs11c.c
|
||||
@@ -7491,7 +7491,7 @@ NSC_DeriveKey(CK_SESSION_HANDLE hSession
|
||||
@@ -4806,6 +4806,8 @@ NSC_GenerateKey(CK_SESSION_HANDLE hSessi
|
||||
goto loser;
|
||||
}
|
||||
|
||||
+ key->isFIPS = sftk_operationIsFIPS(slot, pMechanism, CKA_KEY_GEN_MECHANISM, key);
|
||||
+
|
||||
/*
|
||||
* handle the base object stuff
|
||||
*/
|
||||
@@ -4820,6 +4822,7 @@ NSC_GenerateKey(CK_SESSION_HANDLE hSessi
|
||||
if (crv == CKR_OK) {
|
||||
*phKey = key->handle;
|
||||
}
|
||||
+
|
||||
loser:
|
||||
PORT_Memset(buf, 0, sizeof buf);
|
||||
sftk_FreeObject(key);
|
||||
@@ -7495,7 +7498,7 @@ NSC_DeriveKey(CK_SESSION_HANDLE hSession
|
||||
} else {
|
||||
/* now allocate the hash contexts */
|
||||
md5 = MD5_NewContext();
|
||||
@ -509,21 +408,10 @@ Index: nss/lib/freebl/desblapi.c
|
||||
#if defined(NSS_X86_OR_X64)
|
||||
/* Intel X86 CPUs do unaligned loads and stores without complaint. */
|
||||
#define COPY8B(to, from, ptr) \
|
||||
@@ -136,6 +138,8 @@ DES_EDE3CBCDe(DESContext *cx, BYTE *out,
|
||||
DESContext *
|
||||
DES_AllocateContext(void)
|
||||
{
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
+
|
||||
return PORT_ZNew(DESContext);
|
||||
}
|
||||
|
||||
@@ -145,12 +149,16 @@ DES_InitContext(DESContext *cx, const un
|
||||
@@ -145,12 +147,14 @@ DES_InitContext(DESContext *cx, const un
|
||||
unsigned int unused)
|
||||
{
|
||||
DESDirection opposite;
|
||||
+
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
+
|
||||
if (!cx) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
@ -535,7 +423,7 @@ Index: nss/lib/freebl/desblapi.c
|
||||
switch (mode) {
|
||||
case NSS_DES: /* DES ECB */
|
||||
DES_MakeSchedule(cx->ks0, key, cx->direction);
|
||||
@@ -201,8 +209,13 @@ DES_InitContext(DESContext *cx, const un
|
||||
@@ -201,8 +205,11 @@ DES_InitContext(DESContext *cx, const un
|
||||
DESContext *
|
||||
DES_CreateContext(const BYTE *key, const BYTE *iv, int mode, PRBool encrypt)
|
||||
{
|
||||
@ -544,43 +432,95 @@ Index: nss/lib/freebl/desblapi.c
|
||||
+ DESContext *cx;
|
||||
+ SECStatus rv;
|
||||
+
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
+
|
||||
+ cx = PORT_ZNew(DESContext);
|
||||
+ rv = DES_InitContext(cx, key, 0, iv, mode, encrypt, 0);
|
||||
|
||||
if (rv != SECSuccess) {
|
||||
PORT_ZFree(cx, sizeof *cx);
|
||||
@@ -214,6 +227,8 @@ DES_CreateContext(const BYTE *key, const
|
||||
void
|
||||
DES_DestroyContext(DESContext *cx, PRBool freeit)
|
||||
{
|
||||
+ IN_FIPS_RETURN();
|
||||
+
|
||||
if (cx) {
|
||||
memset(cx, 0, sizeof *cx);
|
||||
if (freeit)
|
||||
@@ -225,6 +240,7 @@ SECStatus
|
||||
@@ -225,7 +232,6 @@ SECStatus
|
||||
DES_Encrypt(DESContext *cx, BYTE *out, unsigned int *outLen,
|
||||
unsigned int maxOutLen, const BYTE *in, unsigned int inLen)
|
||||
{
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
|
||||
-
|
||||
if ((inLen % 8) != 0 || maxOutLen < inLen || !cx ||
|
||||
cx->direction != DES_ENCRYPT) {
|
||||
@@ -242,6 +258,7 @@ SECStatus
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
@@ -242,7 +248,6 @@ SECStatus
|
||||
DES_Decrypt(DESContext *cx, BYTE *out, unsigned int *outLen,
|
||||
unsigned int maxOutLen, const BYTE *in, unsigned int inLen)
|
||||
{
|
||||
+ IN_FIPS_RETURN(SECFailure);
|
||||
|
||||
-
|
||||
if ((inLen % 8) != 0 || maxOutLen < inLen || !cx ||
|
||||
cx->direction != DES_DECRYPT) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
Index: nss/lib/softoken/fips_algorithms.h
|
||||
===================================================================
|
||||
--- nss.orig/lib/softoken/fips_algorithms.h
|
||||
+++ nss/lib/softoken/fips_algorithms.h
|
||||
@@ -111,8 +111,11 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
@@ -57,7 +57,7 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
#define RSA_FB_STEP 1024
|
||||
#define DSA_FB_KEY 2048, 4096 /* min, max */
|
||||
#define DSA_FB_STEP 1024
|
||||
-#define DH_FB_KEY 2048, 4096 /* min, max */
|
||||
+#define DH_FB_KEY 2048, 8192 /* min, max */
|
||||
#define DH_FB_STEP 1024
|
||||
#define EC_FB_KEY 256, 521 /* min, max */
|
||||
#define EC_FB_STEP 1 /* key limits handled by special operation */
|
||||
@@ -65,7 +65,10 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
#define AES_FB_STEP 64
|
||||
{ CKM_RSA_PKCS_KEY_PAIR_GEN, { RSA_FB_KEY, CKF_KPG }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
+#if 0
|
||||
+ /* Non-approved */
|
||||
{ CKM_RSA_PKCS_OAEP, { RSA_FB_KEY, CKF_ENC }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
+#endif
|
||||
/* -------------- RSA Multipart Signing Operations -------------------- */
|
||||
{ CKM_SHA224_RSA_PKCS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_SHA256_RSA_PKCS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
@@ -76,9 +79,18 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
{ CKM_SHA384_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_SHA512_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
|
||||
/* ------------------------- DSA Operations --------------------------- */
|
||||
+#if 0
|
||||
{ CKM_DSA_KEY_PAIR_GEN, { DSA_FB_KEY, CKF_KPG }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
- { CKM_DSA, { DSA_FB_KEY, CKF_SGN }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
+#endif
|
||||
+
|
||||
+ /* Doesn't consider hash algo. Non-approved, but verification must be allowed
|
||||
+ * since we use it for signature verification */
|
||||
+ { CKM_DSA, { DSA_FB_KEY, CKF_VERIFY }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
+
|
||||
+#if 0
|
||||
{ CKM_DSA_PARAMETER_GEN, { DSA_FB_KEY, CKF_KPG }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
+#endif
|
||||
+
|
||||
{ CKM_DSA_SHA224, { DSA_FB_KEY, CKF_SGN }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_DSA_SHA256, { DSA_FB_KEY, CKF_SGN }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_DSA_SHA384, { DSA_FB_KEY, CKF_SGN }, DSA_FB_STEP, SFTKFIPSNone },
|
||||
@@ -90,7 +102,10 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
/* -------------------- Elliptic Curve Operations --------------------- */
|
||||
{ CKM_EC_KEY_PAIR_GEN, { EC_FB_KEY, CKF_KPG }, EC_FB_STEP, SFTKFIPSECC },
|
||||
{ CKM_ECDH1_DERIVE, { EC_FB_KEY, CKF_KEA }, EC_FB_STEP, SFTKFIPSECC },
|
||||
+#if 0
|
||||
+ /* Doesn't consider hash algo. Non-approved */
|
||||
{ CKM_ECDSA, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
|
||||
+#endif
|
||||
{ CKM_ECDSA_SHA224, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
|
||||
{ CKM_ECDSA_SHA256, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
|
||||
{ CKM_ECDSA_SHA384, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
|
||||
@@ -100,8 +115,11 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
{ CKM_AES_KEY_GEN, { AES_FB_KEY, CKF_GEN }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_ECB, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_CBC, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
|
||||
+#if 0
|
||||
+ /* Non-approved */
|
||||
{ CKM_AES_MAC, { AES_FB_KEY, CKF_SGN }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_MAC_GENERAL, { AES_FB_KEY, CKF_SGN }, AES_FB_STEP, SFTKFIPSNone },
|
||||
+#endif
|
||||
{ CKM_AES_CMAC, { AES_FB_KEY, CKF_SGN }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_CMAC_GENERAL, { AES_FB_KEY, CKF_SGN }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_CBC_PAD, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
|
||||
@@ -111,8 +129,11 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
{ CKM_AES_KEY_WRAP, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_KEY_WRAP_PAD, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
|
||||
{ CKM_AES_KEY_WRAP_KWP, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
|
||||
@ -592,3 +532,62 @@ Index: nss/lib/softoken/fips_algorithms.h
|
||||
/* ------------------------- Hashing Operations ----------------------- */
|
||||
{ CKM_SHA224, { 0, 0, CKF_HSH }, 1, SFTKFIPSNone },
|
||||
{ CKM_SHA224_HMAC, { 112, 224, CKF_SGN }, 1, SFTKFIPSNone },
|
||||
@@ -127,41 +148,44 @@ SFTKFIPSAlgorithmList sftk_fips_mechs[]
|
||||
{ CKM_SHA512_HMAC, { 256, 512, CKF_SGN }, 1, SFTKFIPSNone },
|
||||
{ CKM_SHA512_HMAC_GENERAL, { 256, 512, CKF_SGN }, 1, SFTKFIPSNone },
|
||||
/* --------------------- Secret Key Operations ------------------------ */
|
||||
- { CKM_GENERIC_SECRET_KEY_GEN, { 8, 256, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
+ { CKM_GENERIC_SECRET_KEY_GEN, { 112, 256, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
/* ---------------------- SSL/TLS operations ------------------------- */
|
||||
{ CKM_SHA224_KEY_DERIVATION, { 112, 224, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_SHA256_KEY_DERIVATION, { 128, 256, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_SHA384_KEY_DERIVATION, { 192, 284, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_SHA384_KEY_DERIVATION, { 192, 384, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_SHA512_KEY_DERIVATION, { 256, 512, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_TLS12_MASTER_KEY_DERIVE, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_TLS12_MASTER_KEY_DERIVE_DH, { DH_FB_KEY, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_TLS12_KEY_AND_MAC_DERIVE, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_TLS_PRF_GENERAL, { 8, 512, CKF_SGN }, 1, SFTKFIPSNone },
|
||||
- { CKM_TLS_MAC, { 8, 512, CKF_SGN }, 1, SFTKFIPSNone },
|
||||
+ { CKM_TLS_MAC, { 112, 512, CKF_SGN }, 1, SFTKFIPSNone },
|
||||
/* sigh, is this algorithm really tested. ssl doesn't seem to have a
|
||||
* way of turning the extension off */
|
||||
{ CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE, { 192, 1024, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH, { 192, 1024, CKF_DERIVE }, 1, SFTKFIPSNone },
|
||||
|
||||
/* ------------------------- HKDF Operations -------------------------- */
|
||||
+#if 0
|
||||
+ /* Only approved in the context of TLS 1.3 */
|
||||
{ CKM_HKDF_DERIVE, { 8, 255 * 64 * 8, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_HKDF_DATA, { 8, 255 * 64 * 8, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
{ CKM_HKDF_KEY_GEN, { 160, 224, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
{ CKM_HKDF_KEY_GEN, { 256, 512, CKF_GEN }, 128, SFTKFIPSNone },
|
||||
+#endif
|
||||
/* ------------------ NIST 800-108 Key Derivations ------------------- */
|
||||
- { CKM_SP800_108_COUNTER_KDF, { 0, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_SP800_108_FEEDBACK_KDF, { 0, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_SP800_108_DOUBLE_PIPELINE_KDF, { 0, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_NSS_SP800_108_COUNTER_KDF_DERIVE_DATA, { 0, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_NSS_SP800_108_FEEDBACK_KDF_DERIVE_DATA, { 0, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_NSS_SP800_108_DOUBLE_PIPELINE_KDF_DERIVE_DATA, { 0, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_SP800_108_COUNTER_KDF, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_SP800_108_FEEDBACK_KDF, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_SP800_108_DOUBLE_PIPELINE_KDF, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_SP800_108_COUNTER_KDF_DERIVE_DATA, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_SP800_108_FEEDBACK_KDF_DERIVE_DATA, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_SP800_108_DOUBLE_PIPELINE_KDF_DERIVE_DATA, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
/* --------------------IPSEC ----------------------- */
|
||||
- { CKM_NSS_IKE_PRF_PLUS_DERIVE, { 8, 255 * 64, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_NSS_IKE_PRF_DERIVE, { 8, 64, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_NSS_IKE1_PRF_DERIVE, { 8, 64, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
- { CKM_NSS_IKE1_APP_B_PRF_DERIVE, { 8, 255 * 64, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_IKE_PRF_PLUS_DERIVE, { 112, 255 * 64, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_IKE_PRF_DERIVE, { 112, 112, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_IKE1_PRF_DERIVE, { 112, 112, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
+ { CKM_NSS_IKE1_APP_B_PRF_DERIVE, { 112, 255 * 64, CKF_KDF }, 1, SFTKFIPSNone },
|
||||
/* ------------------ PBE Key Derivations ------------------- */
|
||||
- { CKM_PKCS5_PBKD2, { 1, 256, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
+ { CKM_PKCS5_PBKD2, { 112, 256, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
{ CKM_NSS_PKCS12_PBE_SHA224_HMAC_KEY_GEN, { 224, 224, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
{ CKM_NSS_PKCS12_PBE_SHA256_HMAC_KEY_GEN, { 256, 256, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
{ CKM_NSS_PKCS12_PBE_SHA384_HMAC_KEY_GEN, { 384, 384, CKF_GEN }, 1, SFTKFIPSNone },
|
||||
|
@ -63,6 +63,16 @@ Index: nss/lib/freebl/blapi.h
|
||||
|
||||
/*********************************************************************/
|
||||
extern const SECHashObject *HASH_GetRawHashObject(HASH_HashType hashType);
|
||||
@@ -1791,6 +1791,9 @@ extern SECStatus EC_CopyParams(PLArenaPo
|
||||
*/
|
||||
extern int EC_GetPointSize(const ECParams *params);
|
||||
|
||||
+/* Unconditionally run the integrity check. */
|
||||
+extern void BL_FIPSRepeatIntegrityCheck(void);
|
||||
+
|
||||
SEC_END_PROTOS
|
||||
|
||||
#endif /* _BLAPI_H_ */
|
||||
Index: nss/lib/freebl/fips-selftest.inc
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
@ -641,7 +651,7 @@ Index: nss/lib/freebl/fipsfreebl.c
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2251,28 +2279,104 @@ bl_startup_tests(void)
|
||||
@@ -2251,28 +2279,110 @@ bl_startup_tests(void)
|
||||
* power on selftest failed.
|
||||
*/
|
||||
SECStatus
|
||||
@ -674,6 +684,12 @@ Index: nss/lib/freebl/fipsfreebl.c
|
||||
return SECFailure;
|
||||
}
|
||||
+
|
||||
+void
|
||||
+BL_FIPSRepeatIntegrityCheck(void)
|
||||
+{
|
||||
+ fips_state = fips_initTest("freebl", NULL, NULL);
|
||||
+}
|
||||
+
|
||||
+/* returns the FIPS mode we are running in or the one that we aspire to if the
|
||||
+ * tests have not completed yet - which might happen during the crypto selftest
|
||||
+ */
|
||||
@ -760,7 +776,22 @@ Index: nss/lib/freebl/loader.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/loader.c
|
||||
+++ nss/lib/freebl/loader.c
|
||||
@@ -1213,11 +1213,11 @@ AESKeyWrap_DecryptKWP(AESKeyWrapContext
|
||||
@@ -95,6 +95,14 @@ BL_Init(void)
|
||||
return (vector->p_BL_Init)();
|
||||
}
|
||||
|
||||
+void
|
||||
+BL_FIPSRepeatIntegrityCheck(void)
|
||||
+{
|
||||
+ if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
|
||||
+ return SECFailure;
|
||||
+ (vector->p_BL_FIPSRepeatIntegrityCheck)();
|
||||
+}
|
||||
+
|
||||
RSAPrivateKey *
|
||||
RSA_NewKey(int keySizeInBits, SECItem *publicExponent)
|
||||
{
|
||||
@@ -1213,11 +1221,11 @@ AESKeyWrap_DecryptKWP(AESKeyWrapContext
|
||||
}
|
||||
|
||||
PRBool
|
||||
@ -774,7 +805,7 @@ Index: nss/lib/freebl/loader.c
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1227,12 +1227,12 @@ BLAPI_SHVerify(const char *name, PRFuncP
|
||||
@@ -1227,12 +1235,12 @@ BLAPI_SHVerify(const char *name, PRFuncP
|
||||
* in freebl_LoadDSO) to p_BLAPI_VerifySelf.
|
||||
*/
|
||||
PRBool
|
||||
@ -789,7 +820,7 @@ Index: nss/lib/freebl/loader.c
|
||||
}
|
||||
|
||||
/* ============== New for 3.006 =============================== */
|
||||
@@ -1836,11 +1836,11 @@ SHA224_Clone(SHA224Context *dest, SHA224
|
||||
@@ -1836,11 +1844,11 @@ SHA224_Clone(SHA224Context *dest, SHA224
|
||||
}
|
||||
|
||||
PRBool
|
||||
@ -827,6 +858,16 @@ Index: nss/lib/freebl/loader.h
|
||||
|
||||
/* Version 3.013 came to here */
|
||||
|
||||
@@ -834,6 +834,9 @@ struct FREEBLVectorStr {
|
||||
|
||||
/* Add new function pointers at the end of this struct and bump
|
||||
* FREEBL_VERSION at the beginning of this file. */
|
||||
+
|
||||
+ /* SUSE patch: Goes last */
|
||||
+ void (*p_BL_FIPSRepeatIntegrityCheck)(void);
|
||||
};
|
||||
|
||||
typedef struct FREEBLVectorStr FREEBLVector;
|
||||
Index: nss/lib/freebl/manifest.mn
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/manifest.mn
|
||||
@ -839,7 +880,7 @@ Index: nss/lib/freebl/manifest.mn
|
||||
$(NULL)
|
||||
|
||||
MPI_HDRS = mpi-config.h mpi.h mpi-priv.h mplogic.h mpprime.h logtab.h mp_gf2m.h
|
||||
@@ -186,6 +187,7 @@ ALL_HDRS = \
|
||||
@@ -187,6 +188,7 @@ ALL_HDRS = \
|
||||
shsign.h \
|
||||
vis_proto.h \
|
||||
seed.h \
|
||||
@ -918,7 +959,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
{
|
||||
char *checkName = NULL;
|
||||
PRFileDesc *checkFD = NULL;
|
||||
@@ -340,7 +340,7 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
@@ -341,7 +341,7 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
#endif
|
||||
|
||||
PRBool result = PR_FALSE; /* if anything goes wrong,
|
||||
@ -927,7 +968,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
unsigned char buf[4096];
|
||||
unsigned char hashBuf[HASH_LENGTH_MAX];
|
||||
|
||||
@@ -367,14 +367,17 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
@@ -368,14 +368,17 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
/* open the check File */
|
||||
checkFD = PR_Open(checkName, PR_RDONLY, 0);
|
||||
if (checkFD == NULL) {
|
||||
@ -948,7 +989,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
bytesRead = PR_Read(checkFD, buf, 12);
|
||||
if (bytesRead != 12) {
|
||||
goto loser;
|
||||
@@ -415,7 +418,8 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
@@ -416,7 +419,8 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
if (rv != SECSuccess) {
|
||||
goto loser;
|
||||
}
|
||||
@ -958,7 +999,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
rv = readItem(checkFD, &signature);
|
||||
if (rv != SECSuccess) {
|
||||
goto loser;
|
||||
@@ -430,7 +434,7 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
@@ -431,7 +435,7 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
goto loser;
|
||||
}
|
||||
|
||||
@ -967,7 +1008,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
#ifdef FREEBL_USE_PRELINK
|
||||
shFD = bl_OpenUnPrelink(shName, &pid);
|
||||
#else
|
||||
@@ -438,13 +442,13 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
@@ -439,13 +443,13 @@ blapi_SHVerifyFile(const char *shName, P
|
||||
#endif
|
||||
if (shFD == NULL) {
|
||||
#ifdef DEBUG_SHVERIFY
|
||||
@ -984,7 +1025,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
hashcx = hashObj->create();
|
||||
if (hashcx == NULL) {
|
||||
goto loser;
|
||||
@@ -531,7 +535,7 @@ loser:
|
||||
@@ -532,7 +536,7 @@ loser:
|
||||
}
|
||||
|
||||
PRBool
|
||||
@ -993,7 +1034,7 @@ Index: nss/lib/freebl/shvfy.c
|
||||
{
|
||||
if (name == NULL) {
|
||||
/*
|
||||
@@ -540,7 +544,7 @@ BLAPI_VerifySelf(const char *name)
|
||||
@@ -541,7 +545,7 @@ BLAPI_VerifySelf(const char *name)
|
||||
*/
|
||||
return PR_TRUE;
|
||||
}
|
||||
@ -1006,7 +1047,7 @@ Index: nss/lib/softoken/fips.c
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ nss/lib/softoken/fips.c
|
||||
@@ -0,0 +1,40 @@
|
||||
@@ -0,0 +1,46 @@
|
||||
+#include "../freebl/fips-selftest.inc"
|
||||
+
|
||||
+#include "fips.h"
|
||||
@ -1047,6 +1088,12 @@ Index: nss/lib/softoken/fips.c
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+fips_repeatTestSoftoken(void)
|
||||
+{
|
||||
+ fips_initTestSoftoken();
|
||||
+}
|
||||
Index: nss/lib/softoken/fips.h
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
@ -1422,21 +1469,21 @@ Index: nss/lib/softoken/fipstest.c
|
||||
+ /* check the DSA combined functions in softoken */
|
||||
+ rv = sftk_fips_DSA_PowerUpSelfTest();
|
||||
+ if (rv != SECSuccess) {
|
||||
return;
|
||||
}
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* check the ECDSA combined functions in softoken */
|
||||
+ rv = sftk_fips_ECDSA_PowerUpSelfTest();
|
||||
+ if (rv != SECSuccess) {
|
||||
+ return;
|
||||
+ }
|
||||
return;
|
||||
}
|
||||
+
|
||||
+ /* Checksum is done by fips_initTestSoftoken() in fips.c */
|
||||
+
|
||||
rv = sftk_fips_IKE_PowerUpSelfTests();
|
||||
if (rv != SECSuccess) {
|
||||
return;
|
||||
@@ -759,17 +1089,11 @@ sftk_startup_tests(void)
|
||||
@@ -759,22 +1089,27 @@ sftk_startup_tests(void)
|
||||
CK_RV
|
||||
sftk_FIPSEntryOK()
|
||||
{
|
||||
@ -1456,6 +1503,22 @@ Index: nss/lib/softoken/fipstest.c
|
||||
if (!sftk_self_tests_success) {
|
||||
return CKR_DEVICE_ERROR;
|
||||
}
|
||||
return CKR_OK;
|
||||
}
|
||||
+
|
||||
+void fips_repeatTestSoftoken(void);
|
||||
+
|
||||
+void
|
||||
+sftk_FIPSRepeatIntegrityCheck()
|
||||
+{
|
||||
+ /* These will abort if the checksum fails in FIPS mode */
|
||||
+ BL_FIPSRepeatIntegrityCheck();
|
||||
+ fips_repeatTestSoftoken();
|
||||
+}
|
||||
+
|
||||
#else
|
||||
#include "pkcs11t.h"
|
||||
CK_RV
|
||||
Index: nss/lib/softoken/legacydb/fips.c
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
@ -1549,3 +1612,35 @@ Index: nss/lib/softoken/manifest.mn
|
||||
$(NULL)
|
||||
|
||||
ifndef NSS_DISABLE_DBM
|
||||
Index: nss/lib/softoken/softoken.h
|
||||
===================================================================
|
||||
--- nss.orig/lib/softoken/softoken.h
|
||||
+++ nss/lib/softoken/softoken.h
|
||||
@@ -59,6 +59,9 @@ extern unsigned char *CBC_PadBuffer(PLAr
|
||||
/* make sure Power-up selftests have been run. */
|
||||
extern CK_RV sftk_FIPSEntryOK(void);
|
||||
|
||||
+/* Unconditionally run the crypto self-tests. */
|
||||
+extern PRBool sftk_FIPSRunTests();
|
||||
+
|
||||
/*
|
||||
** make known fixed PKCS #11 key types to their sizes in bytes
|
||||
*/
|
||||
Index: nss/lib/freebl/ldvector.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/ldvector.c
|
||||
+++ nss/lib/freebl/ldvector.c
|
||||
@@ -376,9 +376,12 @@ static const struct FREEBLVectorStr vect
|
||||
/* End of version 3.024 */
|
||||
ChaCha20_InitContext,
|
||||
ChaCha20_CreateContext,
|
||||
- ChaCha20_DestroyContext
|
||||
+ ChaCha20_DestroyContext,
|
||||
|
||||
/* End of version 3.025 */
|
||||
+
|
||||
+ /* SUSE patch: Goes last */
|
||||
+ BL_FIPSRepeatIntegrityCheck
|
||||
};
|
||||
|
||||
const FREEBLVector*
|
||||
|
@ -1,19 +0,0 @@
|
||||
Index: nss/tests/lowhash/lowhash.sh
|
||||
===================================================================
|
||||
--- nss.orig/tests/lowhash/lowhash.sh
|
||||
+++ nss/tests/lowhash/lowhash.sh
|
||||
@@ -61,11 +61,13 @@ lowhash_test()
|
||||
! -f ${BINDIR}/lowhashtest${PROG_SUFFIX} ]; then
|
||||
echo "freebl lowhash not supported in this plaform."
|
||||
else
|
||||
- TESTS="MD5 SHA1 SHA224 SHA256 SHA384 SHA512"
|
||||
+ TESTS_FIPS_0="MD5 SHA1 SHA224 SHA256 SHA384 SHA512"
|
||||
+ TESTS_FIPS_1="SHA224 SHA256 SHA384 SHA512"
|
||||
OLD_MODE=`echo ${NSS_FIPS}`
|
||||
for fips_mode in 0 1; do
|
||||
echo "lowhashtest with fips mode=${fips_mode}"
|
||||
export NSS_FIPS=${fips_mode}
|
||||
+ eval TESTS=\${TESTS_FIPS_${fips_mode}}
|
||||
for TEST in ${TESTS}
|
||||
do
|
||||
echo "lowhashtest ${TEST}"
|
@ -1,270 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User Hans Petter Jansson <hpj@cl.no>
|
||||
# Date 1574240734 -3600
|
||||
# Wed Nov 20 10:05:34 2019 +0100
|
||||
# Node ID 0efca22bbafd7575b20461f255c46157c9321822
|
||||
# Parent 3a2cb65dc157344cdad19e8e16e9c33e36f82d96
|
||||
[PATCH] 30
|
||||
From ca3b695ac461eccf4ed97e1b3fe0a311c80a792f Mon Sep 17 00:00:00 2001
|
||||
---
|
||||
nss/lib/freebl/md5.c | 67 ++++++++++++++++++++++++++------------
|
||||
nss/lib/freebl/rawhash.c | 37 +++++++++++++++++++++
|
||||
nss/lib/freebl/tlsprfalg.c | 5 ++-
|
||||
nss/lib/softoken/pkcs11c.c | 4 +--
|
||||
4 files changed, 90 insertions(+), 23 deletions(-)
|
||||
|
||||
Index: nss/lib/freebl/md5.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/md5.c
|
||||
+++ nss/lib/freebl/md5.c
|
||||
@@ -217,13 +217,11 @@ MD5_HashBuf(unsigned char *dest, const u
|
||||
}
|
||||
|
||||
MD5Context *
|
||||
-MD5_NewContext(void)
|
||||
+MD5_NewContext_NonFIPS(void)
|
||||
{
|
||||
/* no need to ZAlloc, MD5_Begin will init the context */
|
||||
MD5Context *cx;
|
||||
|
||||
- IN_FIPS_RETURN(NULL);
|
||||
-
|
||||
cx = (MD5Context *)PORT_Alloc(sizeof(MD5Context));
|
||||
if (cx == NULL) {
|
||||
PORT_SetError(PR_OUT_OF_MEMORY_ERROR);
|
||||
@@ -232,6 +230,13 @@ MD5_NewContext(void)
|
||||
return cx;
|
||||
}
|
||||
|
||||
+MD5Context *
|
||||
+MD5_NewContext(void)
|
||||
+{
|
||||
+ IN_FIPS_RETURN(NULL);
|
||||
+ return MD5_NewContext_NonFIPS();
|
||||
+}
|
||||
+
|
||||
void
|
||||
MD5_DestroyContext(MD5Context *cx, PRBool freeit)
|
||||
{
|
||||
@@ -243,10 +248,8 @@ MD5_DestroyContext(MD5Context *cx, PRBoo
|
||||
}
|
||||
|
||||
void
|
||||
-MD5_Begin(MD5Context *cx)
|
||||
+MD5_Begin_NonFIPS(MD5Context *cx)
|
||||
{
|
||||
- IN_FIPS_RETURN();
|
||||
-
|
||||
cx->lsbInput = 0;
|
||||
cx->msbInput = 0;
|
||||
/* memset(cx->inBuf, 0, sizeof(cx->inBuf)); */
|
||||
@@ -256,6 +259,13 @@ MD5_Begin(MD5Context *cx)
|
||||
cx->cv[3] = CV0_4;
|
||||
}
|
||||
|
||||
+void
|
||||
+MD5_Begin(MD5Context *cx)
|
||||
+{
|
||||
+ IN_FIPS_RETURN();
|
||||
+ MD5_Begin_NonFIPS(cx);
|
||||
+}
|
||||
+
|
||||
#define cls(i32, s) (tmp = i32, tmp << s | tmp >> (32 - s))
|
||||
|
||||
#if defined(SOLARIS) || defined(HPUX)
|
||||
@@ -431,14 +441,12 @@ md5_compress(MD5Context *cx, const PRUin
|
||||
}
|
||||
|
||||
void
|
||||
-MD5_Update(MD5Context *cx, const unsigned char *input, unsigned int inputLen)
|
||||
+MD5_Update_NonFIPS(MD5Context *cx, const unsigned char *input, unsigned int inputLen)
|
||||
{
|
||||
PRUint32 bytesToConsume;
|
||||
PRUint32 inBufIndex = cx->lsbInput & 63;
|
||||
const PRUint32 *wBuf;
|
||||
|
||||
- IN_FIPS_RETURN();
|
||||
-
|
||||
/* Add the number of input bytes to the 64-bit input counter. */
|
||||
addto64(cx->msbInput, cx->lsbInput, inputLen);
|
||||
if (inBufIndex) {
|
||||
@@ -487,6 +495,13 @@ MD5_Update(MD5Context *cx, const unsigne
|
||||
memcpy(cx->inBuf, input, inputLen);
|
||||
}
|
||||
|
||||
+void
|
||||
+MD5_Update(MD5Context *cx, const unsigned char *input, unsigned int inputLen)
|
||||
+{
|
||||
+ IN_FIPS_RETURN();
|
||||
+ MD5_Update_NonFIPS(cx, input, inputLen);
|
||||
+}
|
||||
+
|
||||
static const unsigned char padbytes[] = {
|
||||
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -503,8 +518,8 @@ static const unsigned char padbytes[] =
|
||||
};
|
||||
|
||||
void
|
||||
-MD5_End(MD5Context *cx, unsigned char *digest,
|
||||
- unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
+MD5_End_NonFIPS(MD5Context *cx, unsigned char *digest,
|
||||
+ unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
{
|
||||
#ifndef IS_LITTLE_ENDIAN
|
||||
PRUint32 tmp;
|
||||
@@ -512,8 +527,6 @@ MD5_End(MD5Context *cx, unsigned char *d
|
||||
PRUint32 lowInput, highInput;
|
||||
PRUint32 inBufIndex = cx->lsbInput & 63;
|
||||
|
||||
- IN_FIPS_RETURN();
|
||||
-
|
||||
if (maxDigestLen < MD5_HASH_LEN) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return;
|
||||
@@ -525,10 +538,10 @@ MD5_End(MD5Context *cx, unsigned char *d
|
||||
lowInput <<= 3;
|
||||
|
||||
if (inBufIndex < MD5_END_BUFFER) {
|
||||
- MD5_Update(cx, padbytes, MD5_END_BUFFER - inBufIndex);
|
||||
+ MD5_Update_NonFIPS(cx, padbytes, MD5_END_BUFFER - inBufIndex);
|
||||
} else {
|
||||
- MD5_Update(cx, padbytes,
|
||||
- MD5_END_BUFFER + MD5_BUFFER_SIZE - inBufIndex);
|
||||
+ MD5_Update_NonFIPS(cx, padbytes,
|
||||
+ MD5_END_BUFFER + MD5_BUFFER_SIZE - inBufIndex);
|
||||
}
|
||||
|
||||
/* Store the number of bytes input (before padding) in final 64 bits. */
|
||||
@@ -554,16 +567,22 @@ MD5_End(MD5Context *cx, unsigned char *d
|
||||
}
|
||||
|
||||
void
|
||||
-MD5_EndRaw(MD5Context *cx, unsigned char *digest,
|
||||
- unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
+MD5_End(MD5Context *cx, unsigned char *digest,
|
||||
+ unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
+{
|
||||
+ IN_FIPS_RETURN();
|
||||
+ MD5_End_NonFIPS(cx, digest, digestLen, maxDigestLen);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+MD5_EndRaw_NonFIPS(MD5Context *cx, unsigned char *digest,
|
||||
+ unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
{
|
||||
#ifndef IS_LITTLE_ENDIAN
|
||||
PRUint32 tmp;
|
||||
#endif
|
||||
PRUint32 cv[4];
|
||||
|
||||
- IN_FIPS_RETURN();
|
||||
-
|
||||
if (maxDigestLen < MD5_HASH_LEN) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return;
|
||||
@@ -581,6 +600,14 @@ MD5_EndRaw(MD5Context *cx, unsigned char
|
||||
*digestLen = MD5_HASH_LEN;
|
||||
}
|
||||
|
||||
+void
|
||||
+MD5_EndRaw(MD5Context *cx, unsigned char *digest,
|
||||
+ unsigned int *digestLen, unsigned int maxDigestLen)
|
||||
+{
|
||||
+ IN_FIPS_RETURN();
|
||||
+ MD5_EndRaw_NonFIPS(cx, digest, digestLen, maxDigestLen);
|
||||
+}
|
||||
+
|
||||
unsigned int
|
||||
MD5_FlattenSize(MD5Context *cx)
|
||||
{
|
||||
Index: nss/lib/freebl/rawhash.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/rawhash.c
|
||||
+++ nss/lib/freebl/rawhash.c
|
||||
@@ -154,3 +154,40 @@ HASH_GetRawHashObject(HASH_HashType hash
|
||||
}
|
||||
return &SECRawHashObjects[hashType];
|
||||
}
|
||||
+
|
||||
+/* Defined in md5.c */
|
||||
+
|
||||
+MD5Context *MD5_NewContext_NonFIPS(void);
|
||||
+void MD5_Begin_NonFIPS(MD5Context *cx);
|
||||
+void MD5_Update_NonFIPS(MD5Context *cx, const unsigned char *input, unsigned int inputLen);
|
||||
+void MD5_End_NonFIPS(MD5Context *cx, unsigned char *digest,
|
||||
+ unsigned int *digestLen, unsigned int maxDigestLen);
|
||||
+void MD5_EndRaw_NonFIPS(MD5Context *cx, unsigned char *digest,
|
||||
+ unsigned int *digestLen, unsigned int maxDigestLen);
|
||||
+
|
||||
+static const SECHashObject SECRawHashObjectMD5NonFIPS = {
|
||||
+ MD5_LENGTH,
|
||||
+ (void *(*)(void))MD5_NewContext_NonFIPS,
|
||||
+ (void *(*)(void *))null_hash_clone_context,
|
||||
+ (void (*)(void *, PRBool))MD5_DestroyContext,
|
||||
+ (void (*)(void *))MD5_Begin_NonFIPS,
|
||||
+ (void (*)(void *, const unsigned char *, unsigned int))MD5_Update_NonFIPS,
|
||||
+ (void (*)(void *, unsigned char *, unsigned int *, unsigned int))MD5_End_NonFIPS,
|
||||
+ MD5_BLOCK_LENGTH,
|
||||
+ HASH_AlgMD5,
|
||||
+ (void (*)(void *, unsigned char *, unsigned int *, unsigned int))MD5_EndRaw_NonFIPS
|
||||
+};
|
||||
+
|
||||
+const SECHashObject *
|
||||
+HASH_GetRawHashObjectNonFIPS(HASH_HashType hashType)
|
||||
+{
|
||||
+ if (hashType <= HASH_AlgNULL || hashType >= HASH_AlgTOTAL) {
|
||||
+ PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (hashType == HASH_AlgMD5)
|
||||
+ return &SECRawHashObjectMD5NonFIPS;
|
||||
+
|
||||
+ return &SECRawHashObjects[hashType];
|
||||
+}
|
||||
Index: nss/lib/freebl/tlsprfalg.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/freebl/tlsprfalg.c
|
||||
+++ nss/lib/freebl/tlsprfalg.c
|
||||
@@ -12,6 +12,9 @@
|
||||
#include "hasht.h"
|
||||
#include "alghmac.h"
|
||||
|
||||
+/* To get valid MD5 object in FIPS mode */
|
||||
+const SECHashObject *HASH_GetRawHashObjectNonFIPS(HASH_HashType hashType);
|
||||
+
|
||||
#define PHASH_STATE_MAX_LEN HASH_LENGTH_MAX
|
||||
|
||||
/* TLS P_hash function */
|
||||
@@ -27,7 +30,7 @@ TLS_P_hash(HASH_HashType hashType, const
|
||||
SECStatus status;
|
||||
HMACContext *cx;
|
||||
SECStatus rv = SECFailure;
|
||||
- const SECHashObject *hashObj = HASH_GetRawHashObject(hashType);
|
||||
+ const SECHashObject *hashObj = HASH_GetRawHashObjectNonFIPS(hashType);
|
||||
|
||||
PORT_Assert((secret != NULL) && (secret->data != NULL || !secret->len));
|
||||
PORT_Assert((seed != NULL) && (seed->data != NULL));
|
||||
Index: nss/lib/softoken/pkcs11c.c
|
||||
===================================================================
|
||||
--- nss.orig/lib/softoken/pkcs11c.c
|
||||
+++ nss/lib/softoken/pkcs11c.c
|
||||
@@ -7158,7 +7158,7 @@ NSC_DeriveKey(CK_SESSION_HANDLE hSession
|
||||
SFTKAttribute *att2 = NULL;
|
||||
unsigned char *buf;
|
||||
SHA1Context *sha;
|
||||
- MD5Context *md5;
|
||||
+ MD5Context *md5 = NULL;
|
||||
MD2Context *md2;
|
||||
CK_ULONG macSize;
|
||||
CK_ULONG tmpKeySize;
|
||||
@@ -7698,7 +7698,7 @@ NSC_DeriveKey(CK_SESSION_HANDLE hSession
|
||||
}
|
||||
sftk_FreeAttribute(att2);
|
||||
md5 = MD5_NewContext();
|
||||
- if (md5 == NULL) {
|
||||
+ if (md5 == NULL && !isTLS) {
|
||||
crv = CKR_HOST_MEMORY;
|
||||
break;
|
||||
}
|
Loading…
Reference in New Issue
Block a user