[15] RFR JDK-8246077: Cloneable test in HmacCore seems questionable

Valerie Peng valerie.peng at oracle.com
Mon Jun 15 23:29:02 UTC 2020


Hmm, on a second thought, I reverted back on this last suggestion. 
Signature class has this delayed provider selection mechanism, so the 
clone() method should always rely on the chosen signatureSpi obj.

Thanks,
Valerie
On 6/15/2020 12:59 PM, Valerie Peng wrote:
> Sure, sounds good. Webrev is updated in place at webrev.01 since the 
> change is just one-line.
>
> Will proceed with integration once the mach5 tests finish.
>
> Thanks!
> Valerie
> On 6/14/2020 2:21 AM, Weijun Wang wrote:
>> Looks fine to me. Maybe you can also use "if (this instanceof 
>> Cloneable)" in Signature$Delegate::clone.
>>
>> Thanks,
>> Max
>>
>>> On Jun 11, 2020, at 3:45 AM, Valerie Peng <valerie.peng at oracle.com> 
>>> wrote:
>>>
>>> Webrev updated at: 
>>> http://cr.openjdk.java.net/~valeriep/8246077/webrev.01/
>>>
>>> Key changes in this revision are in the Delegate.of() method in 
>>> java.security.MessageDigest class.
>>>
>>> Comments?
>>>
>>> Thanks,
>>> Valerie
>>> On 6/8/2020 1:42 PM, Valerie Peng wrote:
>>>> "md instanceof Cloneable && md is not from PKCS11" is not entirely 
>>>> precise. What I mean is that for MessageDigestSpi impls from PKCS11 
>>>> provider, we will need to call the clone() to know for sure whether 
>>>> cloning is supported. If we decide to employ these extra logic for 
>>>> saving clone() call, it's better to do it inside the 
>>>> MessageDigest.of(...) so the callers don't have to repeat the same 
>>>> logic. Comments?
>>>>
>>>> Valerie
>>>>
>>>> On 6/8/2020 1:34 PM, Valerie Peng wrote:
>>>>> Hmm, I checked all MessageDigestSpi impls of JDK providers... The 
>>>>> story is more complicated than we expect.
>>>>>
>>>>> For SUN provider which implement the digest spi, implementing 
>>>>> Cloneable means it supports clone functionality.
>>>>>
>>>>> However, for SunPKCS11 provider which wraps native PKCS11 library, 
>>>>> it always implements Cloneable interface, but when clone() is 
>>>>> called, it will then perform the equivalent PKCS11 calls and throw 
>>>>> CNSE if any PKCS11 error is observed.
>>>>>
>>>>> So, there is a possibility that the instanceof check and the 
>>>>> clone() check leads to different result in this particular scenario.
>>>>>
>>>>> The chance of 3rd non-PKCS11 party provider whose 
>>>>> MessageDigest/MessageDigestSpi impl implements Cloneable but 
>>>>> throws CNSE when clone() is called should be very low? So, I think 
>>>>> it should be sufficient to use "md instanceof Cloneable && md is 
>>>>> not from PKCS11"?
>>>>>
>>>>> Valerie
>>>>>
>>>>> On 6/6/2020 9:10 AM, Xuelei Fan wrote:
>>>>>> As the the Delegate class takes care of the Cloneable SPI 
>>>>>> implementation, it should be sufficient to use "md instanceof 
>>>>>> Cloneable" only.  It is not a expected behavior that a provider 
>>>>>> implements Cloneable but does not really support it.
>>>>>>
>>>>>> Xuelei
>>>>>>
>>>>>> On 6/5/2020 10:54 PM, Weijun Wang wrote:
>>>>>>> Is it possible to try "md instanceof Cloneable || md.clone() 
>>>>>>> returns"? Hopefully this is fast enough in most cases and also 
>>>>>>> has the chance to recognize more actually-cloneable ones.
>>>>>>>
>>>>>>> I'm also OK with simply using "md instanceof Cloneable".
>>>>>>>
>>>>>>> --Max
>>>>>>>
>>>>>>>> On Jun 6, 2020, at 12:02 PM, Valerie Peng 
>>>>>>>> <valerie.peng at oracle.com> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> I am merely following the spec's recommendation of trying the 
>>>>>>>> clone() for cloneability check.
>>>>>>>>
>>>>>>>> If you both are ok with it and prefer the instanceof check, I 
>>>>>>>> can sure reverting back the changes in HmacCore and 
>>>>>>>> HandshakeHash classes.
>>>>>>>>
>>>>>>>> Valerie
>>>>>>>>
>>>>>>>> On 6/5/2020 2:04 AM, Seán Coffey wrote:
>>>>>>>>> I share the same concern. clone() is a heavy weight operation 
>>>>>>>>> in constructors that can be called alot during intensive 
>>>>>>>>> crypto operations.
>>>>>>>>>
>>>>>>>>> Now that you've done work on Delegate class - why not also 
>>>>>>>>> keep the (instanceof Cloneable) test ? That can serve as your 
>>>>>>>>> fastpath for the default JDK configuration AFAIK.
>>>>>>>>>
>>>>>>>>> regards,
>>>>>>>>> Sean.
>>>>>>>>>
>>>>>>>>> On 05/06/2020 00:16, Weijun Wang wrote:
>>>>>>>>>>> 在 2020年6月5日,03:19,Valerie Peng <valerie.peng at oracle.com> 
>>>>>>>>>>> 写道:
>>>>>>>>>>>
>>>>>>>>>>>> Can you give an example when these 2 rules have different 
>>>>>>>>>>>> results? Is this only true for those implementation that 
>>>>>>>>>>>> directly subclass MessageDigest?
>>>>>>>>>>> Before this fix, even the Spi impl implements Cloneable the 
>>>>>>>>>>> instanceof check will always fail because the wrapper class, 
>>>>>>>>>>> i.e. MessageDigest.Delegate does not. However, if you call 
>>>>>>>>>>> the clone() (made public by the MessageDigest class), it 
>>>>>>>>>>> will succeed because Delegate.clone() checks to see if the 
>>>>>>>>>>> spi object implements the Cloneable interface, if yes, it 
>>>>>>>>>>> will proceed to call the spi clone(). So, for this scenario, 
>>>>>>>>>>> the results are different, e.g. instanceof returns false, 
>>>>>>>>>>> but clone() succeeds. This is just one example. Is this what 
>>>>>>>>>>> you are asking?
>>>>>>>>>> No.
>>>>>>>>>>
>>>>>>>>>> I understand this case, but this has already been fixed. Is 
>>>>>>>>>> there any other example? Or are you only follow the words in 
>>>>>>>>>> the spec? i.e. try clone() to see if it’s cloneable.
>>>>>>>>>>
>>>>>>>>>> I am worried that try clone() is much heavier than just check 
>>>>>>>>>> instanof Cloneable.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Max



More information about the security-dev mailing list