From fb77228ba9f1fb050c1a7f713d15f84bcedd18ad Mon Sep 17 00:00:00 2001 From: Satyen Subramaniam Date: Wed, 30 Apr 2025 22:18:50 +0000 Subject: [PATCH] Backport 5145e5a40a8e9a87b3bc9f236dbf9e4b89094e46 --- .../com/sun/crypto/provider/DHKEM.java | 4 +- .../sun/security/ec/XDHPrivateKeyImpl.java | 2 +- .../provider/DHKEM/NameSensitiveness.java | 63 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 test/jdk/com/sun/crypto/provider/DHKEM/NameSensitiveness.java diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java index 01a6e38d2aa..bd1c3f7c380 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java @@ -353,9 +353,9 @@ private Params paramsFromKey(Key k) throws InvalidKeyException { } } else if (k instanceof XECKey xkey && xkey.getParams() instanceof NamedParameterSpec ns) { - if (ns.getName().equals("X25519")) { + if (ns.getName().equalsIgnoreCase("X25519")) { return Params.X25519; - } else if (ns.getName().equals("X448")) { + } else if (ns.getName().equalsIgnoreCase("X448")) { return Params.X448; } } diff --git a/src/jdk.crypto.ec/share/classes/sun/security/ec/XDHPrivateKeyImpl.java b/src/jdk.crypto.ec/share/classes/sun/security/ec/XDHPrivateKeyImpl.java index 7263d1361a6..dfc0d0f6cd3 100644 --- a/src/jdk.crypto.ec/share/classes/sun/security/ec/XDHPrivateKeyImpl.java +++ b/src/jdk.crypto.ec/share/classes/sun/security/ec/XDHPrivateKeyImpl.java @@ -104,7 +104,7 @@ public Optional getScalar() { @Override public PublicKey calculatePublicKey() { - XECParameters params = paramSpec.getName().equals("X25519") + XECParameters params = paramSpec.getName().equalsIgnoreCase("X25519") ? XECParameters.X25519 : XECParameters.X448; try { diff --git a/test/jdk/com/sun/crypto/provider/DHKEM/NameSensitiveness.java b/test/jdk/com/sun/crypto/provider/DHKEM/NameSensitiveness.java new file mode 100644 index 00000000000..21097652b95 --- /dev/null +++ b/test/jdk/com/sun/crypto/provider/DHKEM/NameSensitiveness.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8318328 + * @summary DHKEM should check XDH name in case-insensitive mode + * @library /test/lib + * @modules java.base/com.sun.crypto.provider + */ +import javax.crypto.KEM; +import java.math.BigInteger; +import java.security.KeyPairGenerator; +import java.security.interfaces.XECPublicKey; +import java.security.spec.AlgorithmParameterSpec; +import java.security.spec.NamedParameterSpec; + +public class NameSensitiveness { + public static void main(String[] args) throws Exception { + var g = KeyPairGenerator.getInstance("XDH"); + g.initialize(NamedParameterSpec.X25519); + var pk1 = (XECPublicKey) g.generateKeyPair().getPublic(); + var pk2 = new XECPublicKey() { + public BigInteger getU() { + return pk1.getU(); + } + public AlgorithmParameterSpec getParams() { + return new NamedParameterSpec("x25519"); // lowercase!!! + } + public String getAlgorithm() { + return pk1.getAlgorithm(); + } + public String getFormat() { + return pk1.getFormat(); + } + public byte[] getEncoded() { + return pk1.getEncoded(); + } + }; + var kem = KEM.getInstance("DHKEM"); + kem.newEncapsulator(pk2); + } +}