Blocks :
|
|
Duplicate :
|
|
Relates :
|
|
Relates :
|
The following piece of code fails with an InvalidKeySpecException: ------------- KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSASSA-PSS"); KeyFactory kf = KeyFactory.getInstance("RSASSA-PSS"); kpg.initialize(new RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4, new PSSParameterSpec( "SHA-384", "MGF1", new MGF1ParameterSpec("SHA-384"), 48, PSSParameterSpec.TRAILER_FIELD_BC))); kf.generatePublic(new X509EncodedKeySpec( kpg.generateKeyPair().getPublic().getEncoded())); --------------- Caused by: java.security.ProviderException: Unsupported algorithm 1.2.840.113549.1.1.10 at java.base/sun.security.rsa.RSAUtil$KeyType.lookup(RSAUtil.java:66) at java.base/sun.security.rsa.RSAUtil.getParamSpec(RSAUtil.java:142) at java.base/sun.security.rsa.RSAUtil.getParamSpec(RSAUtil.java:133) at java.base/sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:130) Cause ===== This is because when the key is read, the parameters of the AlgorithmId is instantiated with the OID (in AlgorithmId::decodeParams, algParams = AlgorithmParameters.getInstance(algidString)), so its getAlgorithm() always returns the OID string, and cannot be recognized by RSAUtil::lookup. Suggested fix: =========== diff --git a/src/java.base/share/classes/sun/security/rsa/RSAUtil.java b/src/java.base/share/classes/sun/security/rsa/RSAUtil.java --- a/src/java.base/share/classes/sun/security/rsa/RSAUtil.java +++ b/src/java.base/share/classes/sun/security/rsa/RSAUtil.java @@ -63,6 +63,9 @@ } } // no match + if (name.equals(AlgorithmId.RSASSA_PSS_oid.toString())) { + return PSS; + } throw new ProviderException("Unsupported algorithm " + name); } }
|