diff -r 229aa067e4cc -r e7df7c86eda1 src/java.base/share/classes/sun/security/ssl/SignatureScheme.java --- a/src/java.base/share/classes/sun/security/ssl/SignatureScheme.java Fri Nov 22 09:33:03 2019 +0800 +++ b/src/java.base/share/classes/sun/security/ssl/SignatureScheme.java Thu Nov 21 18:42:33 2019 -0800 @@ -274,17 +274,28 @@ Arrays.asList(handshakeSupportedProtocols); boolean mediator = true; - if (signAlgParams != null) { - mediator = signAlgParams.isAvailable; - } else { - try { - Signature.getInstance(algorithm); - } catch (Exception e) { - mediator = false; - if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.warning( - "Signature algorithm, " + algorithm + - ", is not supported by the underlying providers"); + // HACK CODE + // + // An EC provider, for example the SunEC provider, may support + // AlgorithmParameters but not KeyPairGenerator or Signature. + if ("EC".equals(keyAlgorithm)) { + mediator = JsseJce.isEcAvailable(); + } + + // Check the specific algorithm and parameters. + if (mediator) { + if (signAlgParams != null) { + mediator = signAlgParams.isAvailable; + } else { + try { + Signature.getInstance(algorithm); + } catch (Exception e) { + mediator = false; + if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { + SSLLogger.warning( + "Signature algorithm, " + algorithm + + ", is not supported by the underlying providers"); + } } } }