Bouncy Castle FIPS Issue
Brent Putman
putmanb at georgetown.edu
Thu Jul 15 05:00:40 UTC 2021
Hi,
The secret byte[] over which which the key derivation is performed is
literally a runtime argument. It's in the method signature of the
derive(...) method of the our KeyDerivation interface:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=blob;f=opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/derivation/KeyDerivation.java;hb=refs/heads/main
The ConcatKDF under discussion is just a concrete impl of that.
The XML Encryption model here - and reflected in our design - is that
key derivation is a first class concern. It intrinsically has nothing
to do with key agreement. For example, one can also produce a
symmetric key from a pre-shared secret + a KDF, which the XML spec
calls a DerivedKey.
So any approach that conflates/combines key agreement and key
derivation into a single monolithic operation is a non-starter for
this. That's the main point I was trying to make.
Thanks,
Brent
On 7/14/21 9:28 PM, David Hook wrote:
>
> Hi Brent,
>
> I think I just need some more information.
>
> When you say output byte[] of the KeyAgreement op, where does that
> come from? As in what code is producing that? Would you point me at
> the file that's calling the KDFConcat derive() method - referring to
> the source is generally the least ambiguous way of sorting these
> things out.
>
> Thanks,
>
> David
>
> On 15/7/21 10:55 am, Brent Putman wrote:
>>
>> 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/20210715/71cc76a0/attachment-0001.htm>
More information about the dev
mailing list