public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
To: git-commits@fedoraproject.org
Subject: [rpms/nss] rawhide: Cherry-pick confirmed patches from RHEL nss-3.124
Date: Fri, 21 Aug 2026 11:21:17 GMT	[thread overview]
Message-ID: <178731127704.1.1755766281357220173.rpms-nss-96c6bcd742f6@fedoraproject.org> (raw)

            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,
+                                          &paramSet);
+             if (crv != CKR_OK) {
+                 crv = sftk_GetULongAttribute(object, CKA_NSS_PARAMETER_SET,
+                                              &paramSet);
+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
 

                 reply	other threads:[~2026-08-21 11:21 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178731127704.1.1755766281357220173.rpms-nss-96c6bcd742f6@fedoraproject.org \
    --to=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox