[EXTERNAL]Re: SecureRandom regression with certain security providers
Valerie Peng
valerie.peng at oracle.com
Tue Jul 7 00:01:35 UTC 2020
BTW, I have tentatively filed
https://bugs.openjdk.java.net/browse/JDK-8248885 for Entrust NSAE
problem. Just FYI.
Valerie
On 7/6/2020 12:07 PM, Valerie Peng wrote:
>
> Hi John,
>
> Thanks for looking into this on your end. It's interesting how Entrust
> has to do this deletion/re-insertion of providers and it's interesting
> that adding a new instance of Entrust provider inside the
> Security.insertProviderAt() call makes this problem go away.
>
> Please find my questions and comments in line below.
>
> On 7/3/2020 1:13 PM, John Gray wrote:
>>
>> Thanks for your comments! They sparked off a lot more investigation
>> on my end. I created a test provider and could not reproduce the
>> issue. That led me to investigate how our provider was being
>> installed. We use our own internal Initializer() class to install
>> providers in various orders (we have had to work around bugs in
>> different JVM's in the past). That work-around required we remove
>> the provider from the Security provider list (basically to clean it
>> out), then we run a simple crypto test with a new instantiation, and
>> then install that provider in 1st position.
>>
> Does this Initializer() class does all this before the new
> SecureRandom() call? Does the Entrust provider remove or changes its
> registrations ever, i.e. is the provider mutable? One possible
> scenario for legacy provider which add/remove registrations is that
> every update to the legacy map will leads to new re-parsing and new
> service being created as a result which may leads to failing the check
> inside Service.newInstance() call and thus the NSAE.
>
>> If I change the highlighted line above (the last line) to the
>> following, it works.
>>
>> Security.insertProviderAt(new Entrust(), 1);
>>
>> Having to make such a change seems strange. It seems that creating
>> a new provider, using it to get an instance of an algorithm, and then
>> adding that same provider into first position doesn’t work. I'm
>> guessing because of the recent changes you made the provider can’t be
>> used before it is inserted into the provider order because it may
>> hold onto some data from the previous usage? So this led me to
>> investigate some more…..
>>
> Yes, it's indeed strange. Is the "entrustCsp" instance being modified
> in anyway after its creation?
>
>> When it fails, the type and algorithm are “SecureRandom” and
>> “DRBGUsingSHA512”
>>
> Is “DRBGUsingSHA512" the expected default algorithm for Entrust
> provider? Is it being picked up as expected if basing on registration
> ordering?
>
>> The Provider.getService() code fails to match the “previousKey”
>> ServiceKey type and algorithms. In my test code I was testing an AES
>> algorithm, so the previous key type and Algorithm is “Cipher” and
>> “AES/CBC/PKCS5PADDING” in the getService() call which doesn’t match
>> the type “SecureRandom” and “DRBGUsingSHA512”. So it looks like
>> there is a bug caused by holding on to existing data.
>>
> The previousKey is just an optimization to avoid repetitive allocation
> on the same type and algorithm. If either of these two does not match,
> it will be discarded and new key object created for subsequent calls.
> So, this should not be the root cause.
>>
>> So I think when I create a brand new Entrust() instance it works
>> because the previous ServiceKey() contains the correct data and it
>> matches. Debugging showed it to work that way. So I think using a
>> provider before installing it in the provider order is what is
>> causing the issue because of internal data in the Provider class.
>>
> There is something deeper for the Entrust NSAE problem instead of the
> previousKey usage per my comment above. Could you please double check
> the Initializer class and whether the Entrust provider entries are
> modified after it's constructed and when new SecureRandom() is called?
>
> Thanks for looking into this~
>
> Valerie
>
>> It looks like I **could** put in this weird work-around (just create
>> a fresh instance of Entrust()) when installing the provider to work
>> around the issue, but I wonder if there will be other consequences
>> because of the way this previousKey is used? I can make the simple
>> change to our toolkit without breaking FIPS (the initialization class
>> is not in the FIPS boundary). In fact, I assume I don’t need to
>> keep that old work-around for the old IBM JVM anymore either..
>>
>> Thanks for your help!
>>
>> Happy July 4^th (I live in Ottawa Canada, so we had our muted
>> Canada day celebrations a couple days ago on July 1^st ).
>>
>> John Gray
>>
>> -----Original Message-----
>> From: Valerie Peng [mailto:valerie.peng at oracle.com]
>> Sent: Thursday, July 2, 2020 8:34 PM
>> To: John Gray <John.Gray at entrustdatacard.com>;
>> security-dev at openjdk.java.net
>> Cc: John Mahoney <John.Mahoney at entrustdatacard.com>; Muthu Kannappan
>> <muthu at entrustdatacard.com>
>> Subject: Re: [EXTERNAL]Re: SecureRandom regression with certain
>> security providers
>>
>> Hi John,
>>
>> Unfortunately this cannot wait til July 13th if this issue needs to
>> be fixed for jdk 15.
>>
>> Maybe you can try the webrev out or share more details on how Entrust
>> provider does its registration and what Provider APIs it overrides. I
>> need more info to help identifying the trigger for the NSAE in
>> Entrust's case. I have verified that the current webrev works with
>> BCFIPS provider.
>>
>> Regards and an early happy July 4th,
>>
>> Valerie
>>
>> On 7/2/2020 3:17 PM, Valerie Peng wrote:
>>
>> > I can certainly help you verify the fix. Let me know how I can help
>>
>> > verify it for you. 😊
>>
>> >
>>
>> > Note: I will be on vacation next week, so I'll be back July 13th...
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/security-dev/attachments/20200706/ee8953db/attachment.htm>
More information about the security-dev
mailing list