--- a/src/java.base/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Thu Jun 29 11:53:19 2017 -0700
+++ b/src/java.base/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Tue Jul 04 01:52:53 2017 +0000
@@ -48,6 +48,7 @@
public final class RSAPublicKeyImpl extends X509Key implements RSAPublicKey {
private static final long serialVersionUID = 2644735423591199609L;
+ private static final BigInteger THREE = BigInteger.valueOf(3);
private BigInteger n; // modulus
private BigInteger e; // public exponent
@@ -61,6 +62,7 @@
this.n = n;
this.e = e;
RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e);
+ checkExponentRange();
// generate the encoding
algid = RSAPrivateCrtKeyImpl.rsaId;
try {
@@ -83,6 +85,19 @@
public RSAPublicKeyImpl(byte[] encoded) throws InvalidKeyException {
decode(encoded);
RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e);
+ checkExponentRange();
+ }
+
+ private void checkExponentRange() throws InvalidKeyException {
+ // the exponent should be smaller than the modulus
+ if (e.compareTo(n) >= 0) {
+ throw new InvalidKeyException("exponent is larger than modulus");
+ }
+
+ // the exponent should be at least 3
+ if (e.compareTo(THREE) < 0) {
+ throw new InvalidKeyException("exponent is smaller than 3");
+ }
}
// see JCA doc