Code review request, 7106773: 512 bits RSA key cannot work with SHA384 and SHA512
Weijun Wang
weijun.wang at oracle.com
Fri Nov 18 14:16:58 UTC 2011
On 11/18/2011 08:39 PM, Xuelei Fan wrote:
> The VPN is awesomely bad today.
>
> The webrev in cr.openjdk is
> http://cr.openjdk.java.net/~xuelei/7106773/webrev.01/
>
> On 11/18/2011 7:39 PM, Weijun Wang wrote:
>> Oh, there seems to be much more non-trivial code changes then the
>> previous version of webrev.
>>
>> I now focus on the utility class KeyLength.java:
>>
>> In ReflectiveProvider, how about adding a "." at the end of package name?
>>
> It's safer.
>
>> Also, is the while loop really necessary in getKeyLengthMethod? Why not
>> directly call getDeclaredMethod on the the baseClassName? If you want to
>> make sure the current class is a subclass of the baseClassName, try
>> isAssignableFrom.
>>
> It's a little strange of the implement of getKeyLengthMethod() because
> of the following causes:
> 1. Class.getDeclaredMethod() cannot return inherited methods.
>
> 2. Class.forName("sun.security.pkcs11.P11Key") is not reliable.
> The current class loader is not always able to find the P11Key class.
Oh, In which case?
> As you saw in the previous webrev, I specified the class loader while
> searching for the class:
> Class.forName("sun.security.pkcs11.P11Key", true,
> key.getClass().getClassLoader());
>
> There is one assumption that every key will come from the same class
> loader during the JVM life. So we can cache the loaded P11Key class.
> It's a little risky.
>
> And more, it's OK when there is only one PKCS11 provider. However,
> while we adding MSCAPI in, we will have to look through both PKCS11
> provider and MSCAPI provider in order to select the proper cached key
> class. If we get a key from none of PKCS11 and MSCAPI, we will continue
> calling the Class.forName() repeatedly until we are able to encounter
> the PKCS11 key or MSCAPI key. It's very bad in performance.
>
> The calling in the getKeyLengthMethod() is lightweight, and we don't
> have to worry about the class loader any more.
Calling getDeclaredMethod each time is a waste. How about just
while (clazz != null) {
if (clazz.getName().equals(baseClassName)) {
// do sth
break;
}
clazz = clazz.getSuperclass();
}
Also, you're using methods in reflection. Is it faster to use fields?
Thanks
Max
>
>> As for the test, I was thinking that you can add a unit test on the
>> KeyLength class itself.
>>
> I may add some new and simple tests on KeyLength only.
>
> Thanks,
> Xuelei
>
>> Thanks
>> Max
>>
>>
>> On 11/17/2011 11:14 PM, Xuelei Fan wrote:
>>> Sean, could you also review the fix? I plan to backport the fix to JDK
>>> 7, so that the key size constraints for both JSSE and CertPath can work
>>> with PKCS11 and MSCPI.
>>>
>>> updated webrev:
>>> http://javaweb.us.oracle.com/~xf138604/bugbios/7106773/webrev.01/
>>>
>>> In the new webrev, I add a new KeyLength class under sun.security.util.
>>> I think it may be useful for other models.
>>>
>>> On 11/11/2011 2:33 PM, Weijun Wang wrote:
>>>> SSLContextVersion.java:
>>>>
>>>> typo: suported -> supported
>>>>
>>> Updated.
>>>
>>>> DisabledAlgorithmConstraints.java:
>>>>
>>>> When can size == 0? Why it's not allowed?
>>>>
>>> It's a line of dummy code in case the get key size method return 0.
>>>
>>>> Yes, I think the reflection calls should be wrapped in doPriv
>>>>
>>>> Please also consider keys from MSCAPI
>>>>
>>> Support MSCAPI now.
>>>
>>>> Try looking at sun.misc.SharedSecrets and see if it's better
>>>> for you. Probably not. That class is used to share non-public
>>>> methods in public classes. Not the same case here.
>>>>
>>>> SignatureAndHashAlgorithm.java:
>>>>
>>>> Is it possible to combine expected and signingKey into a single
>>>> signingKey? Of course that means it might need to be never null
>>>> and all key alg call it in a consistent way. I wonder if this
>>>> is OK for you.
>>>>
>>> It not always work. For example, the key algorithm may be "EC", but the
>>> expected algorithm may be "ECDSA".
>>>
>>>> The RSAKey interface seems not used anywhere.
>>>>
>>> Yes, removed.
>>>
>>>> How about changing
>>>>
>>>> 288 } // Otherwise, cannot determine the key size, prefer the
>>>> most
>>>> 289 // perferable hash algorithm.
>>>>
>>>> to
>>>>
>>>> maxDigestLength = Integer.MAX_VALUE;
>>>>
>>>> then you don't need to assign -1 and check for< 0 later.
>>>>
>>> Good point.
>>>
>>>> I would be glad if lines 302-306 can be further indented 4 spaces
>>>>
>>>> The comment on lines 268-273 is confusing, because you did calculate
>>>> maxDigestAlgorithm for 512 bits key later.
>>>>
>>>> Personally, I prefer comments on 274-281 and codes on 284-288
>>>> to be from a smaller keySize to bigger ones, but everything is OK.
>>>>
>>> Updated.
>>>
>>>> Test:
>>>>
>>>> I would like a unit test on
>>>> DisabledAlgorithmConstraints::getKeySize.
>>>> Hopefully the test can cover all SecretKey and PrivateKey from all
>>>> providers with all keysizes.
>>>>
>>> Added some new tests for PKCS11 and MSCAPI.
>>>
>>> Thanks,
>>> Xuelei
>>>
>>>> Thanks
>>>> Max
>>>>
>>>> On 11/11/2011 01:09 PM, Xuelei Fan wrote:
>>>>> Hi Weijun,
>>>>>
>>>>> Are you available to review my fix for CR 7106773? The fix in JSSE part
>>>>> is straightforward in that the call to
>>>>> SignatureAndHashAlgorithm.getPreferableAlgorithm() needs an additional
>>>>> Key parameter for RSA key exchanges. The significant change is at
>>>>> sun/security/util/DisabledAlgorithmConstraints.java. I modified the
>>>>> code
>>>>> in order to get the key size of the unextractable key in PKCS#11
>>>>> device.
>>>>>
>>>>> webrev: http://cr.openjdk.java.net/~xuelei/7106773/webrev.00/
>>>>>
>>>>> Thanks,
>>>>> Xuelei
>>>
>
More information about the security-dev
mailing list