Hi Siba,
Nice to hear from you.
Yes, we are aware of this issue. That is, a strict FIPS module cannot
provide X25519 as a standalone algorithm as it is not allowed by FIPS
140-3. But it can employ X25519 in the context of X25519MLKEM768 which
is still FIPS 140-3 compliant, as specified in NIST SP 800-227 [1].
Our preferred way to fix this is to implement support for Hybrid Key
Exchange Providers [2]. JCE providers will implement the hybrid
algorithms directly. This should satisfy the FIPS compliance requirement.
HTH,
Sean
[1] https://csrc.nist.gov/pubs/sp/800/227/ipd
[2] https://bugs.openjdk.org/browse/JDK-8385968
On 8/12/26 1:52 PM, Sibabrata Sahoo wrote:
*Hi Sean,*
Hope you are doing well.
I wanted to get your thoughts on a small enhancement to the default
TLS 1.3 named-group configuration introduced by JEP 527.
JEP 527 added three hybrid key-exchange groups:
* X25519MLKEM768
* SecP256r1MLKEM768
* SecP384r1MLKEM1024
The current default list enables only X25519MLKEM768, while the other
two groups can be explicitly enabled through |jdk.tls.namedGroups| or
|SSLParameters.setNamedGroups()|.
I understand and agree with the original rationale for choosing
X25519MLKEM768 as the default: it is the fastest hybrid group and has
the broadest adoption among existing TLS implementations.
However, there is a deployment issue with this configuration in
FIPS-constrained environments.
When X25519MLKEM768 is unavailable because the underlying X25519
algorithm is not permitted by the active FIPS/provider policy, it is
removed from the effective supported named-group list. Since the
remaining default groups are classical groups, there is then no PQC
hybrid key-exchange group available by default.
The current workaround is to explicitly configure
|jdk.tls.namedGroups| to include |SecP256r1MLKEM768|. This works, but
it requires an administrator to know and configure the named-group
property consistently across the relevant TLS endpoints.
I believe the JDK can avoid this deployment dependency by including
|SecP256r1MLKEM768| as a second default hybrid group, for example:
|X25519MLKEM768, SecP256r1MLKEM768, X25519, secp256r1, secp384r1, ...|
This would preserve the current behavior for the vast majority of
deployments: X25519MLKEM768 remains the first and preferred hybrid group.
At the same time, when X25519MLKEM768 is unavailable, the
already-supported SecP256r1MLKEM768 group would naturally become the
next available hybrid option.
This seems preferable to requiring administrators to override
|jdk.tls.namedGroups| simply to retain PQC hybrid key exchange in a
FIPS-constrained environment.
There are a few reasons why SecP256r1MLKEM768 seems particularly
suitable for this role:
1. It is already implemented as part of JEP 527; this proposal does
not introduce a new hybrid scheme.
2. ML-KEM-768 is the FIPS 203 parameter set already used by
X25519MLKEM768.
3. secp256r1 is already an established JDK TLS named group and is
part of the current default configuration.
4. X25519MLKEM768 would remain the preferred/default choice whenever
it is available, so this does not change the behavior of existing
non-FIPS deployments.
5. It provides an automatic alternative when the preferred hybrid
group is unavailable, rather than requiring deployment-specific
configuration.
The intent is therefore not to change the preferred hybrid group, but
to make the default configuration resilient to environments where the
preferred group cannot be used.
Would this be reasonable as a small enhancement to the default
named-group list?
If there is agreement with this approach, I would be happy to submit a
small PR with the corresponding test coverage.
--
/Thanks,/
/Sibabrata Sahoo/