public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/nss] rawhide: Cherry-pick confirmed patches from RHEL nss-3.124
@ 2026-08-21 11:21
0 siblings, 0 replies; only message in thread
From: @ 2026-08-21 11:21 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/nss
Branch : rawhide
Commit : 96c6bcd742f67a12916fc87edb19065dd5b2738e
Author : Krenželok František <fkrenzel@redhat.com>
Date : 2026-08-20T13:43:38+02:00
Stats : +1323/-1 in 11 file(s)
URL : https://src.fedoraproject.org/rpms/nss/c/96c6bcd742f67a12916fc87edb19065dd5b2738e?branch=rawhide
Log:
Cherry-pick confirmed patches from RHEL nss-3.124
Patches confirmed absent from NSS 3.127 upstream source:
- nss-3.112-disable-md5: disallow MD2/MD4/MD5 in FIPS mode for
signing and PKCS#12 write
- nss-3.90-dh-test-update: update FIPS DH test prime to RFC 7919
FFDHE group
- nss-3.124-tools-test-fix: fix expected exit code for corrupted
PKCS#12 bag in tools test
- nss-3.124-ppc_no_init: disable NSS_NO_INIT_SUPPORT on ppc64le
- nss-3.124-annocheck.fix: add GNU stack / noexecstack annotations
to x86 assembly (arcfour, intel-aes, intel-gcm)
- nss-3.124-fix-ed-key-storage: fix Ed25519/Ed448 key storage and
display in secutil and softoken
- nss-3.124-prefer-all-hybrid: prefer hybrid PQC+classical key
exchange groups in TLS 1.3 (was commented-out Patch62)
- nss-3.124-add-ml-kem-key-size-mech-info: populate ML-KEM key size
bounds in PKCS#11 mechanism info (was all zeros)
- nss-3.124-ml-kem-alias-fix: add MLKEM768SECP256R1 and
MLKEM1024SECP384R1 aliases to pk11pars
- nss-3.101-extend-db-dump-time: extend db dump timeout for slow
builders
---
diff --git a/nss-3.101-extend-db-dump-time.patch b/nss-3.101-extend-db-dump-time.patch
new file mode 100644
index 0000000..88a608b
--- /dev/null
+++ b/nss-3.101-extend-db-dump-time.patch
@@ -0,0 +1,12 @@
+diff -up ./tests/dbtests/dbtests.sh.extend ./tests/dbtests/dbtests.sh
+--- ./tests/dbtests/dbtests.sh.extend 2023-11-15 13:17:50.651020458 -0800
++++ ./tests/dbtests/dbtests.sh 2023-11-15 13:18:57.091608850 -0800
+@@ -366,7 +366,7 @@ dbtest_main()
+ RARRAY=($dtime)
+ TIMEARRAY=(${RARRAY[1]//./ })
+ echo "${TIMEARRAY[0]} seconds"
+- test ${TIMEARRAY[0]} -lt 5
++ test ${TIMEARRAY[0]} -lt ${NSS_DB_DUMP_TIME-5}
+ ret=$?
+ html_msg ${ret} 0 "certutil dump keys with explicit default trust flags"
+ fi
diff --git a/nss-3.112-disable-md5.patch b/nss-3.112-disable-md5.patch
new file mode 100644
index 0000000..f52f3f3
--- /dev/null
+++ b/nss-3.112-disable-md5.patch
@@ -0,0 +1,72 @@
+diff -up ./lib/pk11wrap/pk11pars.c.no_md ./lib/pk11wrap/pk11pars.c
+--- ./lib/pk11wrap/pk11pars.c.no_md 2024-06-11 12:41:35.054654990 -0700
++++ ./lib/pk11wrap/pk11pars.c 2024-06-11 12:46:25.347979894 -0700
+@@ -329,14 +329,11 @@ static const oidValDef curveOptList[] =
+ static const oidValDef hashOptList[] = {
+ /* Hashes */
+ { CIPHER_NAME("MD2"), SEC_OID_MD2,
+- NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE | NSS_USE_ALG_IN_SMIME |
+- NSS_USE_ALG_IN_PKCS12 },
++ NSS_USE_ALG_IN_SMIME_LEGACY | NSS_USE_ALG_IN_PKCS12_DECRYPT },
+ { CIPHER_NAME("MD4"), SEC_OID_MD4,
+- NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE | NSS_USE_ALG_IN_SMIME |
+- NSS_USE_ALG_IN_PKCS12 },
++ NSS_USE_ALG_IN_SMIME_LEGACY | NSS_USE_ALG_IN_PKCS12_DECRYPT },
+ { CIPHER_NAME("MD5"), SEC_OID_MD5,
+- NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE | NSS_USE_ALG_IN_SMIME |
+- NSS_USE_ALG_IN_PKCS12 },
++ NSS_USE_ALG_IN_SMIME_LEGACY | NSS_USE_ALG_IN_PKCS12_DECRYPT },
+ { CIPHER_NAME("SHA1"), SEC_OID_SHA1,
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE | NSS_USE_ALG_IN_SMIME |
+ NSS_USE_ALG_IN_PKCS12 },
+diff -up ./lib/util/secoid.c.no_md ./lib/util/secoid.c
+diff -r 699541a7793b lib/util/secoid.c
+--- a/lib/util/secoid.c Tue Jun 16 23:03:22 2020 +0000
++++ b/lib/util/secoid.c Thu Jun 25 14:33:09 2020 +0200
+@@ -2042,6 +2042,19 @@
+ int i;
+
+ for (i = 1; i < SEC_OID_TOTAL; i++) {
++ switch (i) {
++ case SEC_OID_MD2:
++ case SEC_OID_MD4:
++ case SEC_OID_MD5:
++ case SEC_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION:
++ case SEC_OID_PKCS1_MD4_WITH_RSA_ENCRYPTION:
++ case SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION:
++ case SEC_OID_PKCS5_PBE_WITH_MD2_AND_DES_CBC:
++ case SEC_OID_PKCS5_PBE_WITH_MD5_AND_DES_CBC:
++ continue;
++ default:
++ break;
++ }
+ if (oids[i].desc && strstr(arg, oids[i].desc)) {
+ xOids[i].notPolicyFlags = notEnable |
+ (xOids[i].notPolicyFlags & ~(DEF_FLAGS));
+diff -up ./tests/tools/pkcs12policy.txt.disable_md5 ./tests/tools/pkcs12policy.txt
+--- ./tests/tools/pkcs12policy.txt.disable_md5 2025-05-23 06:07:49.000000000 -0700
++++ ./tests/tools/pkcs12policy.txt 2025-06-21 13:46:53.055812187 -0700
+@@ -95,21 +95,12 @@
+ 0 17 allow_all disallow=rc2 PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC4 PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC SHA-1 disallow rc2 (read), RC4 and RC2
+ # integrity policy check the various has based controls.
+ # NOTE: md4, md2, and md5 are turned off by policy by default for encrypting
+-# (decrypting is fine). To be enabled, you must allow=all or allow=mdX on the
++# (decrypting is fine). To be enabled, you must allow=mdX/pkcs12 on the
+ # encryption side. These tests purposefully tests that the default fails to encrypt
+ # but succeeds when decrypting.
+ 27 x allow=tls allow=tls PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Use default policy with multiple hashes
+- 0 0 allow=all allow=tls PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Allow all encrypt, use default decrypt with multiple hashes
+- 0 0 allow=all allow=all PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Allow all with multiple hashes
+- 28 x disallow=sha1_allow=md2 allow=all PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha1 on write
+ 27 x disallow=md2 allow=all PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow md2 on write
+- 29 x disallow=sha256_allow=md2 allow=all PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha256 on write
+- 0 19 allow=all disallow=sha1 PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha1 on read
+- 0 17 allow=all disallow=md2 PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow md2 on read
+- 0 17 allow=all disallow=sha256 PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha256 on read
+- 0 0 allow=all disallow=md2/pkcs12-encrypt PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow md2 on read
+- 0 0 allow=all disallow=sha1/pkcs12-encrypt PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha1 on read
+- 0 0 allow=all disallow=sha256/pkcs12-encrypt PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha256 on read
++ 27 x disallow=sha256_allow=md2 allow=all PKCS_#12_V2_PBE_With_SHA-1_And_128_Bit_RC2_CBC PKCS_#5_Password_Based_Encryption_with_MD2_and_DES-CBC SHA-256 Disallow sha256 on write
+ 0 0 allow=all allow=all AES-128-CBC AES-128-CBC HMAC_SHA-256 Allow all with hmac
+ 29 x disallow=hmac-sha256 allow=all AES-128-CBC AES-128-CBC HMAC_SHA-256 Disallow hmac on write
+ 0 17 allow=all disallow=hmac-sha256 AES-128-CBC AES-128-CBC HMAC_SHA-256 Disallow hmac on read
diff --git a/nss-3.124-add-ml-kem-key-size-mech-info.patch b/nss-3.124-add-ml-kem-key-size-mech-info.patch
new file mode 100644
index 0000000..f80b695
--- /dev/null
+++ b/nss-3.124-add-ml-kem-key-size-mech-info.patch
@@ -0,0 +1,60 @@
+# HG changeset patch
+# User Robert Relyea <rrelyea@redhat.com>
+# Date 1781030209 25200
+# Tue Jun 09 11:36:49 2026 -0700
+# Branch NSS_3_124_BRANCH
+# Node ID 9d51dda84f46517faa8b9cf6abe4311e1ae3e2ac
+# Parent 2a7bb3310ced138c06a588fc47b9f98e3f9faa68
+nss-3.124-add-ml-kem-key-size-mech-info.patch
+
+diff --git a/lib/softoken/pkcs11.c b/lib/softoken/pkcs11.c
+--- a/lib/softoken/pkcs11.c
++++ b/lib/softoken/pkcs11.c
+@@ -35,16 +35,17 @@
+ #include "secoid.h"
+ #include "sftkdb.h"
+ #include "utilpars.h"
+ #include "ec.h"
+ #include "secasn1.h"
+ #include "secerr.h"
+ #include "lgglue.h"
+ #include "kem.h"
++#include "kyber.h"
+
+ PRBool parentForkedAfterC_Initialize;
+
+ #ifndef NO_FORK_CHECK
+
+ PRBool sftkForkCheckDisabled;
+
+ #if defined(CHECK_FORK_PTHREAD) || defined(CHECK_FORK_MIXED)
+@@ -676,23 +677,23 @@ static const struct mechanismList mechan
+ { CKM_IKE1_PRF_DERIVE, { 8, 64, CKF_DERIVE }, PR_TRUE },
+ { CKM_IKE1_EXTENDED_DERIVE, { 8, 255 * 64, CKF_DERIVE }, PR_TRUE },
+ { CKM_NSS_IKE_PRF_PLUS_DERIVE, { 8, 255 * 64, CKF_DERIVE }, PR_TRUE },
+ { CKM_NSS_IKE_PRF_DERIVE, { 8, 64, CKF_DERIVE }, PR_TRUE },
+ { CKM_NSS_IKE1_PRF_DERIVE, { 8, 64, CKF_DERIVE }, PR_TRUE },
+ { CKM_NSS_IKE1_APP_B_PRF_DERIVE, { 8, 255 * 64, CKF_DERIVE }, PR_TRUE },
+ /* -------------------- Kyber Operations ----------------------- */
+ #ifndef NSS_DISABLE_KYBER
+- { CKM_NSS_KYBER_KEY_PAIR_GEN, { 0, 0, CKF_GENERATE_KEY_PAIR }, PR_TRUE },
+- { CKM_NSS_KYBER, { 0, 0, CKF_KEM }, PR_TRUE },
++ { CKM_NSS_KYBER_KEY_PAIR_GEN, { KYBER768_PUBLIC_KEY_BYTES, KYBER768_PUBLIC_KEY_BYTES, CKF_GENERATE_KEY_PAIR }, PR_TRUE },
++ { CKM_NSS_KYBER, { KYBER768_PUBLIC_KEY_BYTES, KYBER768_PUBLIC_KEY_BYTES, CKF_KEM }, PR_TRUE },
+ #endif
+- { CKM_NSS_ML_KEM_KEY_PAIR_GEN, { 0, 0, CKF_GENERATE_KEY_PAIR }, PR_TRUE },
+- { CKM_NSS_ML_KEM, { 0, 0, CKF_KEM }, PR_TRUE },
+- { CKM_ML_KEM_KEY_PAIR_GEN, { 0, 0, CKF_GENERATE_KEY_PAIR }, PR_TRUE },
+- { CKM_ML_KEM, { 0, 0, CKF_KEM }, PR_TRUE },
++ { CKM_NSS_ML_KEM_KEY_PAIR_GEN, { KYBER768_PUBLIC_KEY_BYTES, MLKEM1024_PUBLIC_KEY_BYTES, CKF_GENERATE_KEY_PAIR }, PR_TRUE },
++ { CKM_NSS_ML_KEM, { KYBER768_PUBLIC_KEY_BYTES, MLKEM1024_PUBLIC_KEY_BYTES, CKF_KEM }, PR_TRUE },
++ { CKM_ML_KEM_KEY_PAIR_GEN, { KYBER768_PUBLIC_KEY_BYTES, MLKEM1024_PUBLIC_KEY_BYTES, CKF_GENERATE_KEY_PAIR }, PR_TRUE },
++ { CKM_ML_KEM, { KYBER768_PUBLIC_KEY_BYTES, MLKEM1024_PUBLIC_KEY_BYTES, CKF_KEM }, PR_TRUE },
+ /* don't advertize ML_DSA support until we have it working in freebl */
+ { CKM_ML_DSA_KEY_PAIR_GEN, { ML_DSA_44_PUBLICKEY_LEN, ML_DSA_87_PUBLICKEY_LEN, CKF_GENERATE }, PR_TRUE },
+ { CKM_ML_DSA, { ML_DSA_44_PUBLICKEY_LEN, ML_DSA_87_PUBLICKEY_LEN, CKF_SN_VR }, PR_TRUE },
+ };
+ static const CK_ULONG mechanismCount = sizeof(mechanisms) / sizeof(mechanisms[0]);
+
+ /* sigh global so fipstokn can read it */
+ PRBool nsc_init = PR_FALSE;
diff --git a/nss-3.124-annocheck.fix.patch b/nss-3.124-annocheck.fix.patch
new file mode 100644
index 0000000..64ae590
--- /dev/null
+++ b/nss-3.124-annocheck.fix.patch
@@ -0,0 +1,170 @@
+# HG changeset patch
+# User Robert Relyea <rrelyea@redhat.com>
+# Date 1780440795 25200
+# Tue Jun 02 15:53:15 2026 -0700
+# Branch NSS_3_124_BRANCH
+# Node ID b1208e88ea45bdc57d04ae64e6614eec7072bd7f
+# Parent 7b631ae5c0693bdb28e9ee9a4171eee2d3d62d0a
+nss-3.124-annocheck.fix.patch
+
+diff --git a/lib/freebl/arcfour-amd64-gas.s b/lib/freebl/arcfour-amd64-gas.s
+--- a/lib/freebl/arcfour-amd64-gas.s
++++ b/lib/freebl/arcfour-amd64-gas.s
+@@ -1,11 +1,35 @@
+ # 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/.
++#
++# none of the functions are used as a target of an indirect call, so
++# it's safe to set IBT. If we ever need to put these at the end of a
++# function table pointer, then we should and ENDBR64 instructions as the
++# first instruction of each function. */
++# reference names are in /usr/include/elf.h
++ .section .note.gnu.property,"a"
++ .align 8
++ .long 1f - 0f # note_gnu_name_end - note_gnu_name
++ .long 4f - 1f # note_gnu_descriptor_end -note_gnu_descriptor
++ .long 5 # GNU_PROPERTY_TYPE_0
++0: #note_gnu_name
++ .string "GNU"
++1: #note_gnu_end
++ #note_gnu_descriptor
++ .align 8
++ .long 0xc0000002 # GNU_PROPERTY_X86_FEATURE_1_AND
++ .long 3f - 2f #note_gnu_flags_end - note_gnu_flags
++2: #note_gnu_flags
++ .long 0x3 # GNU_PROPERTY_X86_FEATURE_1_IBT = 1 |
++ # GNU_PROPERTY_X86_FEATURE_1_SHSTK = 2
++3: #note_gnu_flags_end
++ .align 8
++4: #note_gnu_descriptor_end
+
+ # ** ARCFOUR implementation optimized for AMD64.
+ # **
+ # ** The throughput achieved by this code is about 320 MBytes/sec, on
+ # ** a 1.8 GHz AMD Opteron (rev C0) processor.
+
+ .text
+ .align 16
+diff --git a/lib/freebl/intel-aes.S b/lib/freebl/intel-aes.S
+--- a/lib/freebl/intel-aes.S
++++ b/lib/freebl/intel-aes.S
+@@ -1,12 +1,34 @@
+ /* 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/. */
+-
++/* none of the functions are used as a target of an indirect call, so
++ * it's safe to set IBT. If we ever need to put these at the end of a
++ * function table pointer, then we should and ENDBR64 instructions as the
++ * first instruction of each function. */
++# reference names are in /usr/include/elf.h
++ .section .note.gnu.property,"a"
++ .align 8
++ .long 1f - 0f # note_gnu_name_end - note_gnu_name
++ .long 4f - 1f # note_gnu_descriptor_end -note_gnu_descriptor
++ .long 5 # GNU_PROPERTY_TYPE_0
++0: #note_gnu_name
++ .string "GNU"
++1: #note_gnu_end
++ #note_gnu_descriptor
++ .align 8
++ .long 0xc0000002 # GNU_PROPERTY_X86_FEATURE_1_AND
++ .long 3f - 2f #note_gnu_flags_end - note_gnu_flags
++2: #note_gnu_flags
++ .long 0x3 # GNU_PROPERTY_X86_FEATURE_1_IBT = 1 |
++ # GNU_PROPERTY_X86_FEATURE_1_SHSTK = 2
++3: #note_gnu_flags_end
++ .align 8
++4: #note_gnu_descriptor_end
+ .text
+
+ #define IV_OFFSET 256
+
+ /*
+ * Warning: the length values used in this module are "unsigned int"
+ * in C, which is 32-bit. When they're passed in registers, use only
+ * the low 32 bits, because the top half is unspecified.
+diff --git a/lib/freebl/intel-gcm.S b/lib/freebl/intel-gcm.S
+--- a/lib/freebl/intel-gcm.S
++++ b/lib/freebl/intel-gcm.S
+@@ -1,14 +1,38 @@
+ # LICENSE:
+ # This submission to NSS is to be made available under the terms of the
+ # Mozilla Public License, v. 2.0. You can obtain one at http:
+ # //mozilla.org/MPL/2.0/.
+ ################################################################################
+ # Copyright(c) 2012, Intel Corp.
++/* none of the functions are used as a target of an indirect call, so
++ * it's safe to set IBT. If we ever need to put these at the end of a
++ * function table pointer, then we should and ENDBR64 instructions as the
++ * first instruction of each function. */
++# reference names are in /usr/include/elf.h
++ .section .note.gnu.property,"a"
++ .align 8
++ .long 1f - 0f # note_gnu_name_end - note_gnu_name
++ .long 4f - 1f # note_gnu_descriptor_end -note_gnu_descriptor
++ .long 5 # GNU_PROPERTY_TYPE_0
++0: #note_gnu_name
++ .string "GNU"
++1: #note_gnu_end
++ #note_gnu_descriptor
++ .align 8
++ .long 0xc0000002 # GNU_PROPERTY_X86_FEATURE_1_AND
++ .long 3f - 2f #note_gnu_flags_end - note_gnu_flags
++2: #note_gnu_flags
++ .long 0x3 # GNU_PROPERTY_X86_FEATURE_1_IBT = 1 |
++ # GNU_PROPERTY_X86_FEATURE_1_SHSTK = 2
++3: #note_gnu_flags_end
++ .align 8
++4: #note_gnu_descriptor_end
++ .text
+
+ #if defined(DARWIN)
+ # define cdecl(s) _##s
+ #else
+ # define cdecl(s) s
+ #endif
+
+ #ifndef DARWIN
+diff --git a/lib/freebl/mpi/mpi_amd64_common.S b/lib/freebl/mpi/mpi_amd64_common.S
+--- a/lib/freebl/mpi/mpi_amd64_common.S
++++ b/lib/freebl/mpi/mpi_amd64_common.S
+@@ -398,12 +398,37 @@ s_mpv_mul_add_vec64:
+
+ .L27:
+ movq %r9, %rax
+ ret
+
+ #ifndef DARWIN
+ .size s_mpv_mul_add_vec64, .-s_mpv_mul_add_vec64
+
++# Magic indicating IBT is allowed.
++# none of the functions are used as a target of an indirect call, so
++# it's safe to set IBT. If we ever need to put these at the end of a
++# function table pointer, then we should and ENDBR64 instructions as the
++# first instruction of each function.
++# reference names are in /usr/include/elf.h
++ .section .note.gnu.property,"a"
++ .align 8
++ .long 1f - 0f # note_gnu_name_end - note_gnu_name
++ .long 4f - 1f # note_gnu_descriptor_end -note_gnu_descriptor
++ .long 5 # GNU_PROPERTY_TYPE_0
++0: #note_gnu_name
++ .string "GNU"
++1: #note_gnu_end
++ #note_gnu_descriptor
++ .align 8
++ .long 0xc0000002 # GNU_PROPERTY_X86_FEATURE_1_AND
++ .long 3f - 2f #note_gnu_flags_end - note_gnu_flags
++2: #note_gnu_flags
++ .long 0x3 # GNU_PROPERTY_X86_FEATURE_1_IBT = 1 |
++ # GNU_PROPERTY_X86_FEATURE_1_SHSTK = 2
++3: #note_gnu_flags_end
++ .align 8
++4: #note_gnu_descriptor_end
++
+ # Magic indicating no need for an executable stack
+ .section .note.GNU-stack, "", @progbits
+ .previous
+ #endif
diff --git a/nss-3.124-fix-ed-key-storage.patch b/nss-3.124-fix-ed-key-storage.patch
new file mode 100644
index 0000000..f539a92
--- /dev/null
+++ b/nss-3.124-fix-ed-key-storage.patch
@@ -0,0 +1,627 @@
+diff --git a/cmd/lib/secutil.c b/cmd/lib/secutil.c
+--- a/cmd/lib/secutil.c
++++ b/cmd/lib/secutil.c
+@@ -1603,10 +1603,18 @@
+
+ case ecKey:
+ secu_PrintECPublicKey(out, pk, "EC Public Key", level + 1);
+ break;
+
++ case ecMontKey:
++ secu_PrintECPublicKey(out, pk, "EC Montgomery Public Key", level + 1);
++ break;
++
++ case edKey:
++ secu_PrintECPublicKey(out, pk, "EC Edwards Public Key", level + 1);
++ break;
++
+ case mldsaKey:
+ SECU_PrintMLDSAPublicKey(out, pk, "ML-DSA Public Key", level + 1);
+ break;
+
+ case kyberKey:
+diff --git a/cmd/pk11importtest/pk11importtest.c b/cmd/pk11importtest/pk11importtest.c
+--- a/cmd/pk11importtest/pk11importtest.c
++++ b/cmd/pk11importtest/pk11importtest.c
+@@ -191,10 +191,12 @@
+ " -r skip rsa test",
+ " -D skip dsa test",
+ " -h skip dh test",
+ " -e skip ec test",
+ " -K skip mk-kem test",
++ " -w skip ed test",
++ " -g skip ec montgomery test",
+ };
+ static int nUsageInfo = sizeof(usageInfo) / sizeof(char *);
+
+ static void
+ Usage(char *progName, FILE *outFile)
+@@ -216,10 +218,12 @@
+ opt_NoRSA,
+ opt_NoDSA,
+ opt_NoDH,
+ opt_NoEC,
+ opt_NoMLKEM,
++ opt_NoED,
++ opt_NoECMont,
+ };
+
+ static secuCommandFlag options[] = {
+ { /* opt_CertDir */ 'd', PR_TRUE, 0, PR_FALSE },
+ { /* opt_KeySize */ 'k', PR_TRUE, 0, PR_FALSE },
+@@ -230,10 +234,12 @@
+ { /* opt_NoRSA */ 'r', PR_FALSE, 0, PR_FALSE },
+ { /* opt_NoDSA */ 'D', PR_FALSE, 0, PR_FALSE },
+ { /* opt_NoDH */ 'h', PR_FALSE, 0, PR_FALSE },
+ { /* opt_NoEC */ 'e', PR_FALSE, 0, PR_FALSE },
+ { /* opt_NoMLKEM */ 'K', PR_FALSE, 0, PR_FALSE },
++ { /* opt_NoED */ 'w', PR_FALSE, 0, PR_FALSE },
++ { /* opt_NoECMont */ 'g', PR_FALSE, 0, PR_FALSE },
+ };
+
+ int
+ main(int argc, char **argv)
+ {
+@@ -246,10 +252,12 @@
+ PRBool doRSA = PR_TRUE;
+ PRBool doDSA = PR_TRUE;
+ PRBool doDH = PR_FALSE; /* NSS currently can't export wrapped DH keys */
+ PRBool doEC = PR_TRUE;
+ PRBool doMLKEM = PR_TRUE;
++ PRBool doED = PR_TRUE;
++ PRBool doECMont = PR_TRUE;
+ PRBool noPub = PR_FALSE;
+ PQGParams *pqgParams = NULL;
+ int keySize;
+
+ args.numCommands = 0;
+@@ -410,10 +418,55 @@
+ fprintf(stderr, "MLKEM Import Failed!\n");
+ failed = PR_TRUE;
+ }
+ }
+
++ if (doED) {
++ SECKEYECParams ecParams;
++ SECOidData *curve = SECOID_FindOIDByTag(SEC_OID_ED25519);
++ ecParams.data = PORT_Alloc(curve->oid.len + 2);
++ if (ecParams.data == NULL) {
++ rv = SECFailure;
++ goto ed_failed;
++ }
++ ecParams.data[0] = SEC_ASN1_OBJECT_ID;
++ ecParams.data[1] = (unsigned char)curve->oid.len;
++ PORT_Memcpy(&ecParams.data[2], curve->oid.data, curve->oid.len);
++ ecParams.len = curve->oid.len + 2;
++ rv = handleEncryptedPrivateImportTest(progName, slot, "EDDSA",
++ CKM_EC_EDWARDS_KEY_PAIR_GEN,
++ noPub, &ecParams, &pwArgs);
++ PORT_Free(ecParams.data);
++ ed_failed:
++ if (rv != SECSuccess) {
++ fprintf(stderr, "EDDSA Import Failed!\n");
++ failed = PR_TRUE;
++ }
++ }
++ if (doECMont) {
++ SECKEYECParams ecParams;
++ SECOidData *curve = SECOID_FindOIDByTag(SEC_OID_X25519);
++ ecParams.data = PORT_Alloc(curve->oid.len + 2);
++ if (ecParams.data == NULL) {
++ rv = SECFailure;
++ goto ecmont_failed;
++ }
++ ecParams.data[0] = SEC_ASN1_OBJECT_ID;
++ ecParams.data[1] = (unsigned char)curve->oid.len;
++ PORT_Memcpy(&ecParams.data[2], curve->oid.data, curve->oid.len);
++ ecParams.len = curve->oid.len + 2;
++ rv = handleEncryptedPrivateImportTest(progName, slot, "EC Mont",
++ CKM_EC_MONTGOMERY_KEY_PAIR_GEN,
++ noPub, &ecParams, &pwArgs);
++ PORT_Free(ecParams.data);
++ ecmont_failed:
++ if (rv != SECSuccess) {
++ fprintf(stderr, "EC Montgomery Import Failed!\n");
++ failed = PR_TRUE;
++ }
++ }
++
+ if (pqgParams) {
+ PK11_PQG_DestroyParams(pqgParams);
+ }
+
+ if (slot) {
+diff --git a/lib/softoken/lowkey.c b/lib/softoken/lowkey.c
+--- a/lib/softoken/lowkey.c
++++ b/lib/softoken/lowkey.c
+@@ -43,10 +43,15 @@
+ { SEC_ASN1_OCTET_STRING,
+ offsetof(NSSLOWKEYPrivateKeyInfo, privateKey) },
+ { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
+ offsetof(NSSLOWKEYPrivateKeyInfo, attributes),
+ nsslowkey_SetOfAttributeTemplate },
++ { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED |
++ SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC |
++ SEC_ASN1_XTRN | 1,
++ offsetof(NSSLOWKEYPrivateKeyInfo, publicKey),
++ SEC_ASN1_SUB(SEC_BitStringTemplate) },
+ { 0 }
+ };
+
+ const SEC_ASN1Template nsslowkey_SubjectPublicKeyInfoTemplate[] = {
+ { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSSLOWKEYSubjectPublicKeyInfo) },
+@@ -399,10 +404,12 @@
+ if (rv == SECSuccess)
+ return pubk;
+ }
+ break;
+ case NSSLOWKEYECKey:
++ case NSSLOWKEYECEdwardsKey:
++ case NSSLOWKEYECMontgomeryKey:
+ pubk = (NSSLOWKEYPublicKey *)PORT_ArenaZAlloc(arena,
+ sizeof(NSSLOWKEYPublicKey));
+ if (pubk != NULL) {
+ SECStatus rv;
+
+@@ -631,10 +638,12 @@
+ &(privKey->u.dh.base));
+ if (rv != SECSuccess)
+ break;
+ break;
+ case NSSLOWKEYECKey:
++ case NSSLOWKEYECEdwardsKey:
++ case NSSLOWKEYECMontgomeryKey:
+ rv = SECITEM_CopyItem(poolp, &(returnKey->u.ec.version),
+ &(privKey->u.ec.version));
+ if (rv != SECSuccess)
+ break;
+ rv = SECITEM_CopyItem(poolp, &(returnKey->u.ec.publicValue),
+diff --git a/lib/softoken/lowkeyti.h b/lib/softoken/lowkeyti.h
+--- a/lib/softoken/lowkeyti.h
++++ b/lib/softoken/lowkeyti.h
+@@ -48,10 +48,11 @@
+ PLArenaPool *arena;
+ SECItem version;
+ SECAlgorithmID algorithm;
+ SECItem privateKey;
+ NSSLOWKEYAttribute **attributes;
++ SECItem publicKey;
+ };
+ typedef struct NSSLOWKEYPrivateKeyInfoStr NSSLOWKEYPrivateKeyInfo;
+ #define NSSLOWKEY_PRIVATE_KEY_INFO_VERSION 0 /* what we *create* */
+
+ struct NSSLOWKEYSubjectPublicKeyInfoStr {
+@@ -65,12 +66,14 @@
+ NSSLOWKEYNullKey = 0,
+ NSSLOWKEYRSAKey = 1,
+ NSSLOWKEYDSAKey = 2,
+ NSSLOWKEYDHKey = 4,
+ NSSLOWKEYECKey = 5,
+- NSSLOWKEYMLDSAKey = 6,
+- NSSLOWKEYMLKEMKey = 7,
++ NSSLOWKEYECEdwardsKey = 6,
++ NSSLOWKEYECMontgomeryKey = 7,
++ NSSLOWKEYMLDSAKey = 8,
++ NSSLOWKEYMLKEMKey = 9,
+ } NSSLOWKEYType;
+
+ /* ML KEM low structures packages a key with it's parameters.
+ * The ML KEM freebl didn't define these because all the functions
+ * take raw keys and param separately */
+diff --git a/lib/softoken/pkcs11.c b/lib/softoken/pkcs11.c
+--- a/lib/softoken/pkcs11.c
++++ b/lib/softoken/pkcs11.c
+@@ -2223,13 +2223,18 @@
+ break;
+ crv = sftk_Attribute2SSecItem(arena, &pubKey->u.dh.publicValue,
+ object, CKA_VALUE);
+ break;
+ case CKK_EC_EDWARDS:
++ pubKey->keyType = NSSLOWKEYECEdwardsKey;
++ goto ec_continue;
+ case CKK_EC_MONTGOMERY:
++ pubKey->keyType = NSSLOWKEYECMontgomeryKey;
++ goto ec_continue;
+ case CKK_EC:
+ pubKey->keyType = NSSLOWKEYECKey;
++ ec_continue:
+ crv = sftk_Attribute2SSecItem(arena,
+ &pubKey->u.ec.ecParams.DEREncoding,
+ object, CKA_EC_PARAMS);
+ if (crv != CKR_OK)
+ break;
+@@ -2451,13 +2456,18 @@
+ itemTemplateCount++;
+ /* privKey was zero'd so public value is already set to NULL, 0
+ * if we don't set it explicitly */
+ break;
+ case CKK_EC_EDWARDS:
++ privKey->keyType = NSSLOWKEYECEdwardsKey;
++ goto ec_continue;
+ case CKK_EC_MONTGOMERY:
++ privKey->keyType = NSSLOWKEYECMontgomeryKey;
++ goto ec_continue;
+ case CKK_EC:
+ privKey->keyType = NSSLOWKEYECKey;
++ ec_continue:
+ crv = sftk_Attribute2SSecItem(arena,
+ &privKey->u.ec.ecParams.DEREncoding,
+ object, CKA_EC_PARAMS);
+ if (crv != CKR_OK)
+ break;
+@@ -2514,10 +2524,11 @@
+ case CKK_NSS_KYBER:
+ #endif
+ case CKK_NSS_ML_KEM:
+ case CKK_ML_KEM:
+ privKey->keyType = NSSLOWKEYMLKEMKey;
++
+ crv = sftk_GetULongAttribute(object, CKA_PARAMETER_SET,
+ ¶mSet);
+ if (crv != CKR_OK) {
+ crv = sftk_GetULongAttribute(object, CKA_NSS_PARAMETER_SET,
+ ¶mSet);
+diff --git a/lib/softoken/pkcs11c.c b/lib/softoken/pkcs11c.c
+--- a/lib/softoken/pkcs11c.c
++++ b/lib/softoken/pkcs11c.c
+@@ -6465,12 +6465,10 @@
+ * the private key */
+ seed.data = seedData;
+ seed.len = sizeof(seedData);
+ rv = RNG_GenerateGlobalRandomBytes(seed.data, seed.len);
+ if (rv != SECSuccess) {
+- fprintf(stderr, "Generate bytes failed nbytes=%d err=%d\n",
+- seed.len, PORT_GetError());
+ crv = sftk_MapCryptError(PORT_GetError());
+ goto kyber_done;
+ }
+
+ KyberParams kyberParams = sftk_kyber_PK11ParamToInternal(genParamSet);
+@@ -6482,12 +6480,10 @@
+ crv = CKR_HOST_MEMORY;
+ goto kyber_done;
+ }
+ rv = Kyber_NewKey(kyberParams, &seed, &privKey, &pubKey);
+ if (rv != SECSuccess) {
+- fprintf(stderr, "Generate Kyber_NewKey failed nbytes=%d err=%d\n",
+- seed.len, PORT_GetError());
+ crv = sftk_MapCryptError(PORT_GetError());
+ goto kyber_done;
+ }
+
+ crv = sftk_AddAttributeType(publicKey, CKA_VALUE, sftk_item_expand(&pubKey));
+@@ -6902,10 +6898,11 @@
+ param = SEC_ASN1EncodeItem(NULL, NULL, &(lk->u.dsa.params),
+ nsslowkey_PQGParamsTemplate);
+ algorithm = SEC_OID_ANSIX9_DSA_SIGNATURE;
+ break;
+ case NSSLOWKEYECKey:
++ algorithm = SEC_OID_ANSIX962_EC_PUBLIC_KEY;
+ prepare_low_ec_priv_key_for_asn1(lk);
+ /* Public value is encoded as a bit string so adjust length
+ * to be in bits before ASN encoding and readjust
+ * immediately after.
+ *
+@@ -6926,12 +6923,30 @@
+ SEC_PRINT("sftk_PackagePrivateKey()", "PrivateKey", lk->keyType,
+ fordebug);
+ #endif
+
+ param = SECITEM_DupItem(&lk->u.ec.ecParams.DEREncoding);
+-
+- algorithm = SEC_OID_ANSIX962_EC_PUBLIC_KEY;
++ break;
++ /* X25519, ED25519, X448, and ED448 encode the private key
++ * as just and int. The public key and Curve come from the
++ * generaly key structure */
++ case NSSLOWKEYECEdwardsKey:
++ algorithm = SEC_OID_ED25519;
++ goto ec_continue;
++ case NSSLOWKEYECMontgomeryKey:
++ algorithm = SEC_OID_X25519;
++ ec_continue:
++ prepare_low_ec_priv_key_for_asn1(lk);
++ /* if we have a public key, copy it to pki public key */
++ if (lk->u.ec.publicValue.len) {
++ pki->publicKey = lk->u.ec.publicValue;
++ pki->publicKey.len <<= 3;
++ }
++ dummy = SEC_ASN1EncodeItem(arena, &pki->privateKey,
++ &lk->u.ec.privateValue,
++ SEC_ASN1_GET(SEC_OctetStringTemplate));
++ param = NULL;
+ break;
+ case NSSLOWKEYMLKEMKey: {
+ SECItem seed = { siBuffer, NULL, 0 };
+ SECItem rawKey = { siBuffer, NULL, 0 };
+ dummy = NULL;
+@@ -7258,10 +7273,12 @@
+ PLArenaPool *arena;
+ NSSLOWKEYPrivateKey *lpk = NULL;
+ NSSLOWKEYPrivateKeyInfo *pki = NULL;
+ CK_RV crv = CKR_KEY_TYPE_INCONSISTENT;
+ CK_ULONG paramSet = 0;
++ const SECOidData *oidData = NULL;
++ SECOidTag pkiAlg = SEC_OID_UNKNOWN;
+
+ arena = PORT_NewArena(2048);
+ if (!arena) {
+ return SECFailure;
+ }
+@@ -7283,11 +7300,12 @@
+ if (lpk == NULL) {
+ goto loser;
+ }
+ lpk->arena = arena;
+
+- switch (SECOID_GetAlgorithmTag(&pki->algorithm)) {
++ pkiAlg = SECOID_GetAlgorithmTag(&pki->algorithm);
++ switch (pkiAlg) {
+ case SEC_OID_PKCS1_RSA_ENCRYPTION:
+ case SEC_OID_PKCS1_RSA_PSS_SIGNATURE:
+ keyTemplate = nsslowkey_RSAPrivateKeyTemplate;
+ paramTemplate = NULL;
+ paramDest = NULL;
+@@ -7309,10 +7327,46 @@
+ paramDest = &(lpk->u.ec.ecParams.DEREncoding);
+ lpk->keyType = NSSLOWKEYECKey;
+ prepare_low_ec_priv_key_for_asn1(lpk);
+ prepare_low_ecparams_for_asn1(&lpk->u.ec.ecParams);
+ break;
++ case SEC_OID_X25519:
++ lpk->keyType = NSSLOWKEYECMontgomeryKey;
++ goto ecx_continue;
++ case SEC_OID_ED25519:
++ lpk->keyType = NSSLOWKEYECEdwardsKey;
++ ecx_continue:
++ /* we decode the whole key here rather than do the normal
++ * later decode step */
++ keyTemplate = NULL;
++ paramTemplate = NULL;
++ paramDest = NULL;
++ oidData = SECOID_FindOIDByTag(pkiAlg);
++ if (oidData == NULL) {
++ goto loser;
++ }
++ /* CURVE is provided by the tag, not encoded in the parameters
++ * for the x25519, x448, ed25519 and ed448 keys */
++ if (SEC_ASN1EncodeItem(arena, &(lpk->u.ec.ecParams.DEREncoding),
++ &oidData->oid,
++ SEC_ASN1_GET(SEC_ObjectIDTemplate)) == NULL) {
++ goto loser;
++ }
++ prepare_low_ec_priv_key_for_asn1(lpk);
++ /* private key is a simple octet string, just decode it now */
++ rv = SEC_QuickDERDecodeItem(arena, &(lpk->u.ec.privateValue),
++ SEC_ASN1_GET(SEC_OctetStringTemplate),
++ &(pki->privateKey));
++ if (rv != SECSuccess) {
++ goto loser;
++ }
++ if (pki->publicKey.len) {
++ lpk->u.ec.publicValue = pki->publicKey;
++ /* convert length in bits to length in bytes */
++ lpk->u.ec.publicValue.len >>= 3;
++ }
++ break;
+ case SEC_OID_ML_KEM_768:
+ paramSet = CKP_ML_KEM_768;
+ goto mlkem_next;
+ case SEC_OID_ML_KEM_1024:
+ paramSet = CKP_ML_KEM_1024;
+@@ -7344,30 +7398,31 @@
+ case SEC_ASN1_CONSTRUCTED | SEC_ASN1_SEQUENCE:
+ keyTemplate = nsslowkey_PQBothSeedAndPrivateKeyTemplate;
+ break;
+ default:
+ keyTemplate = NULL;
+- break;
++ PORT_SetError(SEC_ERROR_BAD_KEY);
++ goto loser;
+ }
+
+ paramTemplate = NULL;
+ paramDest = NULL;
+ /* genpq encodes ocect, not integer, so no need to prep it */
+ break;
+ default:
+ keyTemplate = NULL;
+ paramTemplate = NULL;
+ paramDest = NULL;
+- break;
+- }
+-
+- if (!keyTemplate) {
+- goto loser;
++ PORT_SetError(SEC_ERROR_BAD_KEY);
++ goto loser;
+ }
+
+ /* decode the private key and any algorithm parameters */
+- rv = SEC_QuickDERDecodeItem(arena, lpk, keyTemplate, &pki->privateKey);
++ rv = SECSuccess;
++ if (keyTemplate) {
++ rv = SEC_QuickDERDecodeItem(arena, lpk, keyTemplate, &pki->privateKey);
++ }
+
+ if (lpk->keyType == NSSLOWKEYECKey) {
+ /* convert length in bits to length in bytes */
+ lpk->u.ec.publicValue.len >>= 3;
+ rv = SECITEM_CopyItem(arena,
+@@ -7560,13 +7615,19 @@
+ template = dhTemplate;
+ templateCount = sizeof(dhTemplate) / sizeof(CK_ATTRIBUTE);
+ keyType = CKK_DH;
+ break;
+ #endif
+- /* what about fortezza??? */
++ case NSSLOWKEYECEdwardsKey:
++ keyType = CKK_EC_EDWARDS;
++ goto ec_import_continue;
++ case NSSLOWKEYECMontgomeryKey:
++ keyType = CKK_EC_MONTGOMERY;
++ goto ec_import_continue;
+ case NSSLOWKEYECKey:
+ keyType = CKK_EC;
++ ec_import_continue:
+ /* if we weren't passed the CKA_NSS_DB, get it
+ * from the public key */
+ if (!sftk_hasAttribute(key, CKA_NSS_DB)) {
+ if (lpk->u.ec.publicValue.len == 0) {
+ crv = CKR_KEY_TYPE_INCONSISTENT;
+diff --git a/lib/softoken/pkcs11u.c b/lib/softoken/pkcs11u.c
+--- a/lib/softoken/pkcs11u.c
++++ b/lib/softoken/pkcs11u.c
+@@ -1642,10 +1642,12 @@
+ case CKK_DH:
+ crv = stfk_CopyTokenAttributes(destObject, src_to, dhPrivKeyAttrs,
+ dhPrivKeyAttrsCount);
+ break;
+ case CKK_EC:
++ case CKK_EC_EDWARDS:
++ case CKK_EC_MONTGOMERY:
+ crv = stfk_CopyTokenAttributes(destObject, src_to, ecPrivKeyAttrs,
+ ecPrivKeyAttrsCount);
+ break;
+ default:
+ crv = CKR_DEVICE_ERROR; /* shouldn't happen unless we store more types
+@@ -1706,10 +1708,12 @@
+ case CKK_DH:
+ crv = stfk_CopyTokenAttributes(destObject, src_to, dhPubKeyAttrs,
+ dhPubKeyAttrsCount);
+ break;
+ case CKK_EC:
++ case CKK_EC_EDWARDS:
++ case CKK_EC_MONTGOMERY:
+ crv = stfk_CopyTokenAttributes(destObject, src_to, ecPubKeyAttrs,
+ ecPubKeyAttrsCount);
+ break;
+ default:
+ crv = CKR_DEVICE_ERROR; /* shouldn't happen unless we store more types
+diff --git a/lib/util/secoid.c b/lib/util/secoid.c
+--- a/lib/util/secoid.c
++++ b/lib/util/secoid.c
+@@ -640,14 +640,14 @@
+ a private key, and a signature (for the two EdDSA related OIDs).
+ Additional encoding information is provided below for each of these
+ locations.
+ */
+
+-CONST_OID ed25519PublicKey[] = { 0x2B, 0x65, 0x70 };
+-CONST_OID ed25519Signature[] = { 0x2B, 0x65, 0x70 };
+-
+ /*https://www.rfc-editor.org/rfc/rfc8410#section-3*/
++/* 1.3.101.112 */
++CONST_OID ed25519[] = { 0x2B, 0x65, 0x70 };
++/* 1.3.101.110 */
+ CONST_OID x25519PublicKey[] = { 0x2b, 0x65, 0x6e };
+
+ /*
+ * ML-DSA OIDs
+ * https://csrc.nist.gov/projects/computer-security-objects-register/algorithm-registration
+@@ -1869,15 +1869,18 @@
+ OD(hmac_sha3_512, SEC_OID_HMAC_SHA3_512, "HMAC SHA3-512", CKM_SHA3_512_HMAC, INVALID_CERT_EXTENSION),
+
+ ODE(SEC_OID_XYBER768D00,
+ "X25519+Kyber768 key exchange", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION),
+
+- OD(ed25519Signature, SEC_OID_ED25519_SIGNATURE, "X9.62 EDDSA signature", CKM_EDDSA,
+- INVALID_CERT_EXTENSION),
++ /* SEC_OID_ED25519_PUBLIC_KEY and SEC_OID_ED25519_SIGNATURE have the same
++ * values, so we should only have one entry in the table, We can't
++ * shift the values of the other entries, so just leav a dead spot here */
++ ODE(SEC_OID_RESERVED_OLD_EDSIG, "Reserved", CKM_INVALID_MECHANISM,
++ INVALID_CERT_EXTENSION),
+
+- OD(ed25519PublicKey, SEC_OID_ED25519_PUBLIC_KEY,
+- "X9.62 elliptic edwards curve public key", CKM_EC_EDWARDS_KEY_PAIR_GEN, INVALID_CERT_EXTENSION),
++ OD(ed25519, SEC_OID_ED25519,
++ "X9.62 Elliptic Edwards Curve 25519", CKM_EDDSA, INVALID_CERT_EXTENSION),
+
+ OD(dhSinglePassstdDHsha1kdfscheme, SEC_OID_DHSINGLEPASS_STDDH_SHA1KDF_SCHEME,
+ "Eliptic Curve Diffie-Hellman Single Pass Standard with SHA1 KDF", CKM_ECDH1_DERIVE,
+ INVALID_CERT_EXTENSION),
+ OD(dhSinglePassstdDHsha224kdfscheme, SEC_OID_DHSINGLEPASS_STDDH_SHA224KDF_SCHEME,
+diff --git a/lib/util/secoidt.h b/lib/util/secoidt.h
+--- a/lib/util/secoidt.h
++++ b/lib/util/secoidt.h
+@@ -512,12 +512,12 @@
+ SEC_OID_HMAC_SHA3_384 = 370,
+ SEC_OID_HMAC_SHA3_512 = 371,
+
+ SEC_OID_XYBER768D00 = 372,
+
+- SEC_OID_ED25519_SIGNATURE = 373,
+- SEC_OID_ED25519_PUBLIC_KEY = 374,
++ SEC_OID_RESERVED_OLD_EDSIG = 373,
++ SEC_OID_ED25519 = 374,
+
+ SEC_OID_DHSINGLEPASS_STDDH_SHA1KDF_SCHEME = 375,
+ SEC_OID_DHSINGLEPASS_STDDH_SHA224KDF_SCHEME = 376,
+ SEC_OID_DHSINGLEPASS_STDDH_SHA256KDF_SCHEME = 377,
+ SEC_OID_DHSINGLEPASS_STDDH_SHA384KDF_SCHEME = 378,
+@@ -561,10 +561,14 @@
+ #define SEC_OID_ML_DSA_65_SIGNATURE SEC_OID_ML_DSA_65
+ #define SEC_OID_ML_DSA_65_PUBLIC_KEY SEC_OID_ML_DSA_65
+ #define SEC_OID_ML_DSA_87_SIGNATURE SEC_OID_ML_DSA_87
+ #define SEC_OID_ML_DSA_87_PUBLIC_KEY SEC_OID_ML_DSA_87
+
++/* EDDSA have the same identifiers for public keys and signatures */
++#define SEC_OID_ED25519_SIGNATURE SEC_OID_ED25519
++#define SEC_OID_ED25519_PUBLIC_KEY SEC_OID_ED25519
++
+ typedef enum {
+ INVALID_CERT_EXTENSION = 0,
+ UNSUPPORTED_CERT_EXTENSION = 1,
+ SUPPORTED_CERT_EXTENSION = 2
+ } SECSupportExtenTag;
+diff --git a/tests/tools/tools.sh b/tests/tools/tools.sh
+--- a/tests/tools/tools.sh
++++ b/tests/tools/tools.sh
+@@ -126,10 +126,11 @@
+ cp ${QADIR}/tools/pbmac1-valid-sha512.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/pbmac1-invalid-bad-iter.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/pbmac1-invalid-bad-salt.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/pbmac1-invalid-no-length.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/corrupted_cert_bag.p12 ${TOOLSDIR}/data
++ cp ${QADIR}/tools/openssl-ed25519.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/openssl-ml-kem-768-seed.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/openssl-ml-kem-768-priv.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/openssl-ml-kem-768-both.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/openssl-ml-kem-1024-seed.p12 ${TOOLSDIR}/data
+ cp ${QADIR}/tools/openssl-ml-kem-1024-priv.p12 ${TOOLSDIR}/data
+@@ -534,10 +535,21 @@
+ check_tmpfile
+
+ return $ret
+ }
+
++tools_p12_import_ed25519_private_key()
++{
++ echo "$SCRIPTNAME: Importing ED25519 private key from PKCS#12 file --------------"
++ ${BINDIR}/pk12util -i ${TOOLSDIR}/data/openssl-ed25519.p12 -d ${P_R_COPYDIR} -k ${R_PWFILE} -W 'test' 2>&1
++ ret=$?
++ html_msg $ret 0 "Importing ED25519 private key from PKCS#12 file"
++ check_tmpfile
++
++ return $ret
++}
++
+ tools_p12_ml_kem_import()
+ {
+ echo "$SCRIPTNAME: Testing ml-kem compatibility with pkcs12 --------------"
+ for i in 768 1024
+ do
+@@ -614,10 +626,11 @@
+ fi
+ tools_p12_export_with_none_ciphers
+ tools_p12_export_with_invalid_ciphers
+ tools_p12_import_old_files
+ tools_p12_import_pbmac1_samples
++ tools_p12_import_ed25519_private_key
+ tools_p12_ml_kem_import
+ if using_sql; then
+ tools_p12_import_rsa_pss_private_key
+ tools_p12_policy
+ fi
+
diff --git a/nss-3.124-ml-kem-alias-fix.patch b/nss-3.124-ml-kem-alias-fix.patch
new file mode 100644
index 0000000..3b1e1ca
--- /dev/null
+++ b/nss-3.124-ml-kem-alias-fix.patch
@@ -0,0 +1,80 @@
+# HG changeset patch
+# User Robert Relyea <rrelyea@redhat.com>
+# Date 1780962091 25200
+# Mon Jun 08 16:41:31 2026 -0700
+# Branch NSS_3_124_BRANCH
+# Node ID 7748a8ddfa510458e76ff41e840f78f5af55795a
+# Parent 5f6c91f6171020eea4ce9eb5bc353370d30c8df0
+nss-3.124-ml-kem-alias-fix.patch
+
+diff --git a/cmd/lib/secutil.c b/cmd/lib/secutil.c
+--- a/cmd/lib/secutil.c
++++ b/cmd/lib/secutil.c
+@@ -4303,16 +4303,18 @@ static const struct SSLNamedGroupString
+ #ifndef NSS_DISABLE_KYBER
+ { NAME_AND_LEN("xyber76800"), ssl_grp_kem_xyber768d00 },
+ #endif
+ { NAME_AND_LEN("x25519mlkem768"), ssl_grp_kem_mlkem768x25519 },
+ { NAME_AND_LEN("secp256r1mlkem768"), ssl_grp_kem_secp256r1mlkem768 },
+ { NAME_AND_LEN("secp384r1mlkem1024"), ssl_grp_kem_secp384r1mlkem1024 },
+ // keep for compatibility
+ { NAME_AND_LEN("mlkem768x25519"), ssl_grp_kem_mlkem768x25519 },
++ { NAME_AND_LEN("mlkem768secp256r1"), ssl_grp_kem_secp256r1mlkem768 },
++ { NAME_AND_LEN("mlkem1024secp384r1"), ssl_grp_kem_secp384r1mlkem1024 },
+ };
+
+ static const size_t sslNamedGroupStringLen = PR_ARRAY_SIZE(sslNamedGroupStringArray);
+
+ static SSLNamedGroup
+ groupNameToNamedGroup(char *name)
+ {
+ int len = PL_strlen(name);
+diff --git a/lib/pk11wrap/pk11pars.c b/lib/pk11wrap/pk11pars.c
+--- a/lib/pk11wrap/pk11pars.c
++++ b/lib/pk11wrap/pk11pars.c
+@@ -255,16 +255,20 @@ static const oidValDef curveOptList[] =
+ { CIPHER_NAME("X25519MLKEM768"), SEC_OID_MLKEM768X25519,
+ NSS_USE_ALG_IN_SSL_KX },
+ { CIPHER_NAME("SECP256R1MLKEM768"), SEC_OID_SECP256R1MLKEM768,
+ NSS_USE_ALG_IN_SSL_KX },
+ { CIPHER_NAME("SECP384R1MLKEM1024"), SEC_OID_SECP384R1MLKEM1024,
+ NSS_USE_ALG_IN_SSL_KX },
+ { CIPHER_NAME("MLKEM768X25519"), SEC_OID_MLKEM768X25519,
+ NSS_USE_ALG_IN_SSL_KX },
++ { CIPHER_NAME("MLKEM768SECP256R1"), SEC_OID_SECP256R1MLKEM768,
++ NSS_USE_ALG_IN_SSL_KX },
++ { CIPHER_NAME("MLKEM1024SECP384R1"), SEC_OID_SECP384R1MLKEM1024,
++ NSS_USE_ALG_IN_SSL_KX },
+ /* ANSI X9.62 named elliptic curves (characteristic two field) */
+ { CIPHER_NAME("C2PNB163V1"), SEC_OID_ANSIX962_EC_C2PNB163V1,
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
+ { CIPHER_NAME("C2PNB163V2"), SEC_OID_ANSIX962_EC_C2PNB163V2,
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
+ { CIPHER_NAME("C2PNB163V3"), SEC_OID_ANSIX962_EC_C2PNB163V3,
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
+ { CIPHER_NAME("C2PNB176V1"), SEC_OID_ANSIX962_EC_C2PNB176V1,
+@@ -467,21 +471,21 @@ static const oidValDef signOptList[] = {
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE },
+ { CIPHER_NAME("RSA-PSS"), SEC_OID_PKCS1_RSA_PSS_SIGNATURE,
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE },
+ { CIPHER_NAME("ECDSA"), SEC_OID_ANSIX962_EC_PUBLIC_KEY,
+ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE },
+ { CIPHER_NAME("ED25519"), SEC_OID_ED25519_PUBLIC_KEY,
+ NSS_USE_ALG_IN_SIGNATURE },
+ { CIPHER_NAME("ML-DSA-44"), SEC_OID_ML_DSA_44,
+- NSS_USE_ALG_IN_SIGNATURE },
++ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE },
+ { CIPHER_NAME("ML-DSA-65"), SEC_OID_ML_DSA_65,
+- NSS_USE_ALG_IN_SIGNATURE },
++ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE },
+ { CIPHER_NAME("ML-DSA-87"), SEC_OID_ML_DSA_87,
+- NSS_USE_ALG_IN_SIGNATURE },
++ NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_SIGNATURE },
+ };
+
+ typedef struct {
+ const oidValDef *list;
+ PRUint32 entries;
+ const char *description;
+ PRBool allowEmpty;
+ } algListsDef;
diff --git a/nss-3.124-ppc_no_init.patch b/nss-3.124-ppc_no_init.patch
new file mode 100644
index 0000000..036ad62
--- /dev/null
+++ b/nss-3.124-ppc_no_init.patch
@@ -0,0 +1,65 @@
+# HG changeset patch
+# User Robert Relyea <rrelyea@redhat.com>
+# Date 1780431689 25200
+# Tue Jun 02 13:21:29 2026 -0700
+# Branch NSS_3_124_BRANCH
+# Node ID c3324d6ea02d9496ced68a4c59f81af9525d89ea
+# Parent ba35abba131fe9379c69e63c9206d6a2143a3762
+nss-3.90-ppc_no_init.patch
+
+diff --git a/lib/freebl/Makefile b/lib/freebl/Makefile
+--- a/lib/freebl/Makefile
++++ b/lib/freebl/Makefile
+@@ -288,17 +288,17 @@ ifeq ($(CPU_ARCH),arm)
+ DEFINES += -DMP_USE_UINT_DIGIT
+ DEFINES += -DSHA_NO_LONG_LONG # avoid 64-bit arithmetic in SHA512
+ MPI_SRCS += mpi_arm.c
+ endif
+ ifeq ($(CPU_ARCH),ppc)
+ DEFINES += -DHAVE_PLATFORM_GHASH
+ EXTRA_SRCS += ghash-ppc.c
+ ifdef USE_64
+- DEFINES += -DNSS_NO_INIT_SUPPORT
++# DEFINES += -DNSS_NO_INIT_SUPPORT
+ PPC_ABI := $(shell $(CC) -dM -E - < /dev/null | awk '$$2 == "_CALL_ELF" {print $$3}')
+ ifeq ($(PPC_ABI),2)
+ ASFILES += sha512-p8.s
+ ifeq ($(OS_TEST),ppc64le)
+ EXTRA_SRCS += chacha20poly1305-ppc.c ppc-gcm-wrap.c
+ ASFILES += chacha20-ppc64le.s ppc-gcm.s
+ DEFINES += -DHAVE_PLATFORM_GCM
+ endif # ppc64le
+diff --git a/lib/softoken/Makefile b/lib/softoken/Makefile
+--- a/lib/softoken/Makefile
++++ b/lib/softoken/Makefile
+@@ -18,23 +18,23 @@ include $(CORE_DEPTH)/coreconf/config.mk
+
+ #######################################################################
+ # (3) Include "component" configuration information. (OPTIONAL) #
+ #######################################################################
+
+ ifdef NSS_NO_INIT_SUPPORT
+ DEFINES += -DNSS_NO_INIT_SUPPORT
+ endif
+-ifeq ($(OS_TARGET),Linux)
+-ifeq ($(CPU_ARCH),ppc)
+-ifdef USE_64
+- DEFINES += -DNSS_NO_INIT_SUPPORT
+-endif # USE_64
+-endif # ppc
+-endif # Linux
++#ifeq ($(OS_TARGET),Linux)
++#ifeq ($(CPU_ARCH),ppc)
++#ifdef USE_64
++# DEFINES += -DNSS_NO_INIT_SUPPORT
++#endif # USE_64
++#endif # ppc
++#endif # Linux
+
+
+ #######################################################################
+ # (4) Include "local" platform-dependent assignments (OPTIONAL). #
+ #######################################################################
+
+ include config.mk
+
diff --git a/nss-3.124-prefer-all-hybrid.patch b/nss-3.124-prefer-all-hybrid.patch
new file mode 100644
index 0000000..9a2a987
--- /dev/null
+++ b/nss-3.124-prefer-all-hybrid.patch
@@ -0,0 +1,93 @@
+# HG changeset patch
+# User Robert Relyea <rrelyea@redhat.com>
+# Date 1780514963 25200
+# Wed Jun 03 12:29:23 2026 -0700
+# Branch NSS_3_124_BRANCH
+# Node ID 6e7722343bbb64c097f476afff27db4bc0b103c2
+# Parent c821cfd68f40883d94215accb63869deeeb1d4e6
+nss-3.124-prefer-all-hybrid.patch
+
+diff --git a/gtests/ssl_gtest/ssl_dhe_unittest.cc b/gtests/ssl_gtest/ssl_dhe_unittest.cc
+--- a/gtests/ssl_gtest/ssl_dhe_unittest.cc
++++ b/gtests/ssl_gtest/ssl_dhe_unittest.cc
+@@ -36,17 +36,17 @@ TEST_P(TlsConnectTls13, SharesForBothEcd
+ auto shares_capture =
+ std::make_shared<TlsExtensionCapture>(client_, ssl_tls13_key_share_xtn);
+ std::vector<std::shared_ptr<PacketFilter>> captures = {groups_capture,
+ shares_capture};
+ client_->SetFilter(std::make_shared<ChainedPacketFilter>(captures));
+
+ Connect();
+
+- CheckKeys(ssl_kea_ecdh, ssl_auth_rsa_sign);
++ CheckKeys(GetDefaultKEA(), ssl_auth_rsa_sign);
+
+ bool ec, dh;
+ auto track_group_type = [&ec, &dh](SSLNamedGroup group) {
+ if ((group & 0xff00U) == 0x100U) {
+ dh = true;
+ } else {
+ ec = true;
+ }
+diff --git a/lib/ssl/sslsock.c b/lib/ssl/sslsock.c
+--- a/lib/ssl/sslsock.c
++++ b/lib/ssl/sslsock.c
+@@ -163,23 +163,23 @@ static const PRUint16 srtpCiphers[] = {
+ ssl_grp_kem_##first##second, size, ssl_kea_ecdh_hybrid, \
+ SEC_OID_##first_oid##second_oid, assumeSupported \
+ }
+
+ const sslNamedGroupDef ssl_named_groups[] = {
+ /* Note that 256 for 25519 and x25519mlkem786 is a lie, but we only use it
+ * for checking bit security and expect 256 bits there (not 255). */
+ HYGROUP(mlkem768, x25519, 256, MLKEM768, X25519, PR_TRUE),
++ HYGROUP(secp256r1, mlkem768, 256, SECP256R1, MLKEM768, PR_TRUE),
++ HYGROUP(secp384r1, mlkem1024, 256, SECP384R1, MLKEM1024, PR_TRUE),
+ { ssl_grp_ec_curve25519, 256, ssl_kea_ecdh, SEC_OID_CURVE25519, PR_TRUE },
+ ECGROUP(secp256r1, 256, SECP256R1, PR_TRUE),
+ ECGROUP(secp384r1, 384, SECP384R1, PR_TRUE),
+ ECGROUP(secp521r1, 521, SECP521R1, PR_TRUE),
+- HYGROUP(secp256r1, mlkem768, 256, SECP256R1, MLKEM768, PR_TRUE),
+- HYGROUP(secp384r1, mlkem1024, 256, SECP384R1, MLKEM1024, PR_TRUE),
+ { ssl_grp_kem_mlkem1024, 256, ssl_kea_kem, SEC_OID_ML_KEM_1024, PR_TRUE },
+ { ssl_grp_kem_xyber768d00, 256, ssl_kea_ecdh_hybrid, SEC_OID_XYBER768D00, PR_FALSE },
+ FFGROUP(2048),
+ FFGROUP(3072),
+ FFGROUP(4096),
+ FFGROUP(6144),
+ FFGROUP(8192),
+ ECGROUP(secp192r1, 192, SECP192R1, PR_FALSE),
+ ECGROUP(secp160r2, 160, SECP160R2, PR_FALSE),
+diff --git a/lib/ssl/tls13con.c b/lib/ssl/tls13con.c
+--- a/lib/ssl/tls13con.c
++++ b/lib/ssl/tls13con.c
+@@ -666,20 +666,29 @@ tls13_SetupClientHello(sslSocket *ss, ss
+ if (rv != SECSuccess) {
+ return SECFailure;
+ }
+
+ /* Select the first enabled group.
+ * TODO(ekr@rtfm.com): be smarter about offering the group
+ * that the other side negotiated if we are resuming. */
+ PORT_Assert(PR_CLIST_IS_EMPTY(&ss->ephemeralKeyPairs));
++ PRBool has_hybrid = PR_FALSE;
+ for (i = 0; i < SSL_NAMED_GROUP_COUNT; ++i) {
+ if (!ss->namedGroupPreferences[i]) {
+ continue;
+ }
++ /* only send one hybrid key share no matter how many key
++ * shares we send */
++ if (ss->namedGroupPreferences[i]->keaType == ssl_kea_ecdh_hybrid) {
++ if (has_hybrid) {
++ continue; /* already have one skip*/
++ }
++ has_hybrid = PR_TRUE;
++ }
+ rv = tls13_AddKeyShare(ss, ss->namedGroupPreferences[i]);
+ if (rv != SECSuccess) {
+ return SECFailure;
+ }
+ if (++numShares > ss->additionalShares) {
+ break;
+ }
+ }
diff --git a/nss-3.124-tools-test-fix.patch b/nss-3.124-tools-test-fix.patch
new file mode 100644
index 0000000..046b660
--- /dev/null
+++ b/nss-3.124-tools-test-fix.patch
@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Robert Relyea <rrelyea@redhat.com>
+# Date 1780589779 25200
+# Thu Jun 04 09:16:19 2026 -0700
+# Branch NSS_3_124_BRANCH
+# Node ID 5f6c91f6171020eea4ce9eb5bc353370d30c8df0
+# Parent 709702f4bfbee0bed65f6abcd85bc8fc2d14ff55
+nss-3.124-tools-test-fix.patch
+
+diff --git a/tests/tools/tools.sh b/tests/tools/tools.sh
+--- a/tests/tools/tools.sh
++++ b/tests/tools/tools.sh
+@@ -518,17 +518,17 @@ tools_p12_import_old_files()
+ ${BINDIR}/pk12util -i ${TOOLSDIR}/data/PKCS5WithImplicitKDF.p12 -d ${P_R_COPYDIR} -k ${R_PWFILE} -W password 2>&1
+ ret=$?
+ html_msg $ret 0 "Importing PKCS#12 file with and implicit KDF value"
+ check_tmpfile
+
+ echo "pk12util -I -l corrupted_cert_bag.p12 -W start"
+ ${BINDIR}/pk12util -I -l ${TOOLSDIR}/data/corrupted_cert_bag.p12 -W start 2>&1
+ ret=$?
+- html_msg $ret 17 "Listing a PKCS#12 file with corrupted certificate bag"
++ html_msg $ret 19 "Listing a PKCS#12 file with corrupted certificate bag"
+ check_tmpfile
+
+ }
+
+ tools_p12_import_rsa_pss_private_key()
+ {
+ echo "$SCRIPTNAME: Importing RSA-PSS private key from PKCS#12 file --------------"
+ ${BINDIR}/pk12util -i ${TOOLSDIR}/data/TestRSAPSS.p12 -d ${P_R_COPYDIR} -k ${R_PWFILE} -W '' 2>&1
diff --git a/nss-3.90-dh-test-update.patch b/nss-3.90-dh-test-update.patch
new file mode 100644
index 0000000..fcbeae5
--- /dev/null
+++ b/nss-3.90-dh-test-update.patch
@@ -0,0 +1,90 @@
+diff -up ./lib/freebl/fipsfreebl.c.dh_test ./lib/freebl/fipsfreebl.c
+--- ./lib/freebl/fipsfreebl.c.dh_test 2024-01-18 08:34:45.936944401 -0800
++++ ./lib/freebl/fipsfreebl.c 2024-01-18 09:20:57.555980326 -0800
+@@ -1816,38 +1816,39 @@ freebl_fips_DH_PowerUpSelfTest(void)
+ {
+ /* DH Known P (2048-bits) */
+ static const PRUint8 dh_known_P[] = {
+- 0xc2, 0x79, 0xbb, 0x76, 0x32, 0x0d, 0x43, 0xfd,
+- 0x1b, 0x8c, 0xa2, 0x3c, 0x00, 0xdd, 0x6d, 0xef,
+- 0xf8, 0x1a, 0xd9, 0xc1, 0xa2, 0xf5, 0x73, 0x2b,
+- 0xdb, 0x1a, 0x3e, 0x84, 0x90, 0xeb, 0xe7, 0x8e,
+- 0x5f, 0x5c, 0x6b, 0xb6, 0x61, 0x89, 0xd1, 0x03,
+- 0xb0, 0x5f, 0x91, 0xe4, 0xd2, 0x82, 0x90, 0xfc,
+- 0x3c, 0x49, 0x69, 0x59, 0xc1, 0x51, 0x6a, 0x85,
+- 0x71, 0xe7, 0x5d, 0x72, 0x5a, 0x45, 0xad, 0x01,
+- 0x6f, 0x82, 0xae, 0xec, 0x91, 0x08, 0x2e, 0x7c,
+- 0x64, 0x93, 0x46, 0x1c, 0x68, 0xef, 0xc2, 0x03,
+- 0x28, 0x1d, 0x75, 0x3a, 0xeb, 0x9c, 0x46, 0xf0,
+- 0xc9, 0xdb, 0x99, 0x95, 0x13, 0x66, 0x4d, 0xd5,
+- 0x1a, 0x78, 0x92, 0x51, 0x89, 0x72, 0x28, 0x7f,
+- 0x20, 0x70, 0x41, 0x49, 0xa2, 0x86, 0xe9, 0xf9,
+- 0x78, 0x5f, 0x8d, 0x2e, 0x5d, 0xfa, 0xdb, 0x57,
+- 0xd4, 0x71, 0xdf, 0x66, 0xe3, 0x9e, 0x88, 0x70,
+- 0xa4, 0x21, 0x44, 0x6a, 0xc7, 0xae, 0x30, 0x2c,
+- 0x9c, 0x1f, 0x91, 0x57, 0xc8, 0x24, 0x34, 0x2d,
+- 0x7a, 0x4a, 0x43, 0xc2, 0x5f, 0xab, 0x64, 0x2e,
+- 0xaa, 0x28, 0x32, 0x95, 0x42, 0x7b, 0xa0, 0xcc,
+- 0xdf, 0xfd, 0x22, 0xc8, 0x56, 0x84, 0xc1, 0x62,
+- 0x15, 0xb2, 0x77, 0x86, 0x81, 0xfc, 0xa5, 0x12,
+- 0x3c, 0xca, 0x28, 0x17, 0x8f, 0x03, 0x16, 0x6e,
+- 0xb8, 0x24, 0xfa, 0x1b, 0x15, 0x02, 0xfd, 0x8b,
+- 0xb6, 0x0a, 0x1a, 0xf7, 0x47, 0x41, 0xc5, 0x2b,
+- 0x37, 0x3e, 0xa1, 0xbf, 0x68, 0xda, 0x1c, 0x55,
+- 0x44, 0xc3, 0xee, 0xa1, 0x63, 0x07, 0x11, 0x3b,
+- 0x5f, 0x00, 0x84, 0xb4, 0xc4, 0xe4, 0xa7, 0x97,
+- 0x29, 0xf8, 0xce, 0xab, 0xfc, 0x27, 0x3e, 0x34,
+- 0xe4, 0xc7, 0x81, 0x52, 0x32, 0x0e, 0x27, 0x3c,
+- 0xa6, 0x70, 0x3f, 0x4a, 0x54, 0xda, 0xdd, 0x60,
+- 0x26, 0xb3, 0x6e, 0x45, 0x26, 0x19, 0x41, 0x6f
++ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
++ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
++ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
++ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
++ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
++ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
++ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
++ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
++ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
++ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
++ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
++ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
++ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
++ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
++ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
++ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
++ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
++ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
++ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
++ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
++ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
++ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
++ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
++ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
++ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
++ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
++ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
++ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
++ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
++ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
++ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97,
++ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
++
+ };
+
+ static const PRUint8 dh_known_Y_1[] = {
+@@ -1893,10 +1894,10 @@ freebl_fips_DH_PowerUpSelfTest(void)
+ };
+
+ static const PRUint8 dh_known_hash_result[] = {
+- 0x93, 0xa2, 0x89, 0x1c, 0x8a, 0xc3, 0x70, 0xbf,
+- 0xa7, 0xdf, 0xb6, 0xd7, 0x82, 0xfb, 0x87, 0x81,
+- 0x09, 0x47, 0xf3, 0x9f, 0x5a, 0xbf, 0x4f, 0x3f,
+- 0x8e, 0x5e, 0x06, 0xca, 0x30, 0xa7, 0xaf, 0x10
++ 0x40, 0xe3, 0x7a, 0x34, 0x83, 0x2d, 0x94, 0x57,
++ 0x99, 0x3d, 0x66, 0xec, 0x54, 0xdf, 0x82, 0x4a,
++ 0x37, 0x0d, 0xf9, 0x01, 0xb3, 0xbc, 0x54, 0xe5,
++ 0x5e, 0x63, 0xd3, 0x46, 0x4e, 0xa3, 0xe2, 0x8a
+ };
+
+ /* DH variables. */
diff --git a/nss.spec b/nss.spec
index fda2421..12073bf 100644
--- a/nss.spec
+++ b/nss.spec
@@ -130,16 +130,34 @@ Source101: nspr-config.xml
Patch4: iquote.patch
Patch12: nss-signtool-format.patch
Patch13: nss-dso-ldflags.patch
+
+# Extend db dump timeout to avoid flaky failures on slow builders
+Patch20: nss-3.101-extend-db-dump-time.patch
+# Update FIPS DH test prime to RFC 7919 FFDHE group
+Patch21: nss-3.90-dh-test-update.patch
+# Fix tools test expected exit code for corrupted PKCS#12 bag
+Patch22: nss-3.124-tools-test-fix.patch
+
+# Disallow MD2/MD4/MD5 in FIPS mode for signing and PKCS#12 write
+Patch30: nss-3.112-disable-md5.patch
+
# fedora disabled dbm by default
Patch40: nss-no-dbm-man-page.patch
+# Disable NSS_NO_INIT_SUPPORT on ppc64le (causes init failures)
+Patch41: nss-3.124-ppc_no_init.patch
+# Add missing GNU stack / noexecstack annotations to x86 assembly
+Patch42: nss-3.124-annocheck.fix.patch
# https://issues.redhat.com/browse/FC-1613
Patch50: nss-3.110-dissable_test-ssl_policy_pkix_oscp.patch
+# Fix Ed25519/Ed448 key storage and display in secutil/softoken
+Patch51: nss-3.124-fix-ed-key-storage.patch
# ML-DSA support patches that haven't made it to the 3.118.1 release
Patch60: nss-3.118-ml-dsa-leancrypto.patch
Patch61: nss-3.118-ml-dsa-tls.patch
-#Patch62: nss-3.118-prefer-all-hybrid.patch
+# Prefer hybrid (classical + PQC) key exchange groups in TLS 1.3
+Patch62: nss-3.124-prefer-all-hybrid.patch
Patch65: nss-3.118-ml-dsa-test-for-sign-verify-pkcs12.patch
Patch66: nss-3.118-ml-dsa-tls-test.patch
@@ -150,6 +168,10 @@ Patch68: nss-3.123-fix-mldsa-import-regeneration.patch
# replay the parent's random stream (mozbz#2056509)
Patch70: nss-3.125-drbg-reseed-after-fork.patch
+# ML-KEM: populate key size bounds and add MLKEM alias names
+Patch71: nss-3.124-add-ml-kem-key-size-mech-info.patch
+Patch72: nss-3.124-ml-kem-alias-fix.patch
+
Patch100: nspr-config-pc.patch
Patch101: nspr-gcc-atomics.patch
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-08-21 11:21 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-21 11:21 [rpms/nss] rawhide: Cherry-pick confirmed patches from RHEL nss-3.124
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox