Bouncy Castle FIPS Issue
Brent Putman
putmanb at georgetown.edu
Thu Jul 15 00:55:21 UTC 2021
Hi,
Either I don't think I understand, or maybe you misread our code.
AFAIK the KeyAgreement service interface requires the 2 Keys over which
the key agreement is being performed. For example:
keyAgreement = KeyAgreement.getInstance(agreementAlgo);
keyAgreement.init(privateKey);
keyAgreement.doPhase(publicKey, true);
Our KeyDerivation impls like ConcatKDF do not have access to any of the
key agreement key material. They are about key derivation from an
input byte[] only (i.e. the output byte[] of the KeyAgreement op). The
do not and can not have access to any key agreement key material,
because it's out-of-scope for what they do. So I don't see how we can
re-implement our ConcatKDF "SecretKey derive(...)" method using the
KeyAgreement service interface as you suggest.
Please clarify if I am missing something here.
Thanks,
Brent
On 7/14/21 8:21 PM, David Hook wrote:
>
> Hi Brent,
>
> It will work. The naming convention is also to allow mixing and
> matching, you just need to add:
>
> org.bouncycastle.jcajce.spec.UserKeyingMaterialSpec
>
> as a parameter to the KeyAgreement. It's unfortunate that the JCE
> doesn't define this parameter, so I am not surprised you are not
> aware of it, but it's impossible to use key agreement properly
> without it, and it exists in both BC and BCFIPS specifically for
> situations like this.
>
> You use the UserKeyingMaterialSpec to pass in otherInfo, which I can
> see is being constructed in accordance with SP 800-56A which is the
> FIPS standard. There is some BC support for otherInfo but we are
> using the ASN.1 construction, SP 800-56A allows for several others,
> and I'm not sure what the XML standard settled on. You are probably
> better off sticking to what you are doing now.
>
> For our part I think we'd just need to add some additional KDF
> support for the non-NIST digests. In the case of the SAML code it
> would just be a matter of replacing SecretKey derive() I think and
> allowing for the UserKeyingMaterialSpec construction.
>
> Concerning your comments about BC and BCFIPS. Yes the low level
> libraries are different, they have to be, but we've been able to keep
> the JCE layer in sync since 1.58. The upside of this is it means if
> people swap in BCFIPS rather than BC they can be confident the code
> is then FIPS compliant. If you interested in finding out why the
> difference exists, there is actually a document
>
> https://www.bouncycastle.org/fips/BCFipsDescription.pdf
>
> which provides a summary. I would recommend that over reading the
> FIPS IG and the 30 or so associated documents that go with it unless
> you have a specific interest. The same applies for Common Criteria.
>
> I don't think there will be any end-user problems as the end result
> will be a massive broadening of what the OpenSAML project can be used
> for.
>
> Any further questions or issues, please let me know.
>
> Thanks,
>
> David
>
> On 15/7/21 8:59 am, Brent Putman wrote:
>>
>> Hi David,
>>
>> I took a look and unfortunately what you propose won't work, for at
>> least 2 reasons.
>>
>> First (the main and show-stopping technical issue), those
>> provider-based algorithms you mention are apparently for the
>> KeyAgreement service of the Java security framework. It seems those
>> combine the key agreement op with the KDF op all in one go?
>>
>> That won't work for our design because we're modeling the
>> requirements of XML Encryption 1.1 where the KA and KDF ops are
>> conceptually completely separate. They are defined separately, have
>> distinct XML representations, etc, so one can mix-and-match KA algo
>> and KDF algo.
>>
>> So in OpenSAML we have distinct KA and KDF interfaces and then
>> various impls for each. For example we have interface
>> org.opensaml.xmlsec.derivation.KeyDerivation. The ConcatKDF impl of
>> that in question that threw a NoClassDefFoundError with FIPS was our
>> org.opensaml.xmlsec.derivation.impl.ConcatKDF, which imports these
>> KDF-related classes (along with some needed BC digest classes):
>>
>> import org.bouncycastle.crypto.agreement.kdf.ConcatenationKDFGenerator;
>> import org.bouncycastle.crypto.params.KDFParameters;
>>
>> It was specifically throwing on not finding
>> org.bouncycastle.crypto.DerivationParameters, which is the interface
>> implemented by the above BC KDFParameters. For reference that
>> source is here:
>>
>> http://git.shibboleth.net/view/?p=java-opensaml.git;a=blob;f=opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/derivation/impl/ConcatKDF.java;hb=refs/heads/main
>>
>> By contrast, for PBKDF2 we are using the SecretKeyFactory service
>> with the JDK-provided algorithm support for "PBKDF2With*" (completed
>> with the appropriate PRF algo ID). So if the BC provider had a
>> SecretKeyFactory impl for ConcatKDF by itself, that would be closer
>> to our needs. But....
>>
>> Second, it's unlikely we could introduce a deployment requirement
>> for people to add the BC provider declaratively in java.security and
>> also questionable for us to add the BC provider programmatically by
>> default. As a library OpenSAML probably shouldn't muck with
>> people's environments like that.
>>
>> And in XML Encryption 1.1, ConcatKDF is the mandatory-to-implement
>> KDF (PBKDF2 is optional). For that reason it is our default KDF for
>> ECDH, and it needs to work out-of-the-box. So hopefully you can see
>> that adding a requirement on configuring a third-party provider
>> would be an issue for us. Our team can discuss further the idea of
>> automagically/programmatically adding in BC. I personally am not a
>> fan of the idea. But unless/until BC has a provider-based impl of
>> the ConcatKDF by itself, it's essentially a moot question.
>>
>> I guess what I would ask about the FIPS version is: If the provider
>> there fundamentally supports ConcatKDF via the KeyAgreement
>> algorithms you mention, then why aren't the KDF interfaces/impls
>> there as well? Probably they are there but just with different
>> package and/or class names, etc? If they are, then you know, that
>> means the FIPS version really isn't a drop-in replacement for the
>> regular library, so it's going to be challenging for us as a
>> downstream consumer to overcome that.
>>
>> Thanks,
>> Brent
>>
>>
>>
>> On 7/13/21 10:30 PM, David Hook wrote:
>>> Hi Brent,
>>>
>>> I'd like to suggest that it gets changed to use the BC provider
>>> rather than the BC low-level API.
>>>
>>> For some reason I can't connect to any of the nabble references, so
>>> I can't easily find the source file concerned, but from what I
>>> understand V4.1 added support for the ConcatKDF key derivation
>>> function with ECDH. When I checked the code this looked like
>>> something the BCFIPS provider supports already (and the BC
>>> provider) for the JCE. The agreement algorithms ending in CKDF use
>>> the concat KDF function.
>>>
>>> The following ones are currently available in both providers:
>>>
>>> ECCDHWITHSHA1CKDF
>>> ECCDHWITHSHA256CKDF
>>> ECCDHWITHSHA384CKDF
>>> ECCDHWITHSHA512CKDF
>>>
>>> I have subscribed to the dev list if you would prefer to continue
>>> the discussion there. If you would include the link to the source
>>> file either way we should be able to work something out that will
>>> work for both providers (as I have commit access to both, you'd
>>> hope so!).
>>>
>>> Let me know,
>>>
>>> Thanks,
>>>
>>> David
>>>
>>> On 14/7/21 7:17 am, Brent Putman wrote:
>>>>
>>>> Hello,
>>>>
>>>> Sorry David (Hook) that I didn't get back to you when I returned
>>>> from vacation a couple of weeks ago, I unfortunately overlooked
>>>> that email todo.
>>>>
>>>> I'm interested to hear what you had in mind. If possible it would
>>>> be great to have this discussion over on the Shibboleth/OpenSAML
>>>> developers list, so that other members of the team and community
>>>> can be aware and participate:
>>>>
>>>> https://shibboleth.net/mailman/listinfo/dev
>>>>
>>>> Thanks,
>>>> Brent
>>>>
>>>>
>>>> On 7/9/21 11:54 AM, David Castro wrote:
>>>>> Brent,
>>>>>
>>>>> Just wanted to follow up Re: the following thread on the FIPS
>>>>> issue we were having.
>>>>>
>>>>> https://shibboleth.1660669.n2.nabble.com/Bouncy-Castle-FIPS-Issue-td7649455.html#a7649653
>>>>> <https://shibboleth.1660669.n2.nabble.com/Bouncy-Castle-FIPS-Issue-td7649455.html#a7649653>
>>>>>
>>>>> We spoke with David Hook from Bouncy Castle (included in this
>>>>> thread) and he had some ideas on resolving the issue. Scott
>>>>> Cantor recommended you as the point of contact, but let us know
>>>>> if there is someone else we should reach out to.
>>>>>
>>>>> We are also available to assist as needed.
>>>>>
>>>>> Cheers,
>>>>> David
>>>>>
>>>>> --
>>>>> CONFIDENTIALITY NOTICE: This transmission, and any attachments,
>>>>> may contain CONFIDENTIAL, PRIVILEGED or PROPRIETARY information
>>>>> of HRworx, LLC (dba Intelliworx) that is protected from
>>>>> disclosure under applicable laws. If you are not the intended
>>>>> recipient, any disclosure, copying, distribution, or use of any
>>>>> of the information contained in or attached to this transmission
>>>>> is STRICTLY PROHIBITED. If you have received this communication
>>>>> in error, please notify the sender, by reply e-mail, and delete
>>>>> the original message with any attachments. Thank you for your
>>>>> cooperation.
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://shibboleth.net/pipermail/dev/attachments/20210714/67b7d4de/attachment.htm>
More information about the dev
mailing list