JCA design for RFC 7748
Michael StJohns
mstjohns at comcast.net
Thu Aug 17 18:35:34 UTC 2017
On 8/17/2017 1:28 PM, Xuelei Fan wrote:
>> This is the same for ANY current publicly known curve - different
>> providers may implement all some or none of them. So extending this
>> model for the curve25519 stuff isn't going to be any different old
>> provider and new provider wise than is currently the case. If you
>> want the new curves, you have to specify the new providers. If the
>> new and old providers don't implement the same curves, you may need
>> to deal with two different providers simultaneously - and that's not
>> something that just happens.
>>
> I see your points. Not-binding to a provider cause problems; binding
> to a provider cause other problems. There are a few complains on the
> problems, and impact the real world applications in practice.
Basically, this is a failing of imagination when the various
getInstance() methods were defined. Now its possible to use
Security.getProvider(Map<String,String>) to good effect (but more work)
to find appropriate providers for appropriate signature/key agreement
algorithms and curves.
>
>
>> I don't think your concerns are valid. I may still be missing
>> something here - but would ask for a real-world example that actually
>> shows breakage.
>>
> I happened to have a real-world example. See
> https://bugs.openjdk.java.net/browse/JDK-8064330
I'm not sure how this applies to the current question of whether or not
its possible to integrate new EC curves?
>
>
> This is an interesting bug. At first it is requested to support
> SHA224 in JSSE implementation. And, SHA224 is added as the supported
> hash algorithm for TLS. However, because SunMSCAPI does not support
> SHA224 signature, compatibility issues comes. So we removed SHA224 if
> the SunMSCAPI is presented. Later, one found the code is unusual as
> SHA224 and the related signature algorithms are supported by the
> underlying providers, look like no reason to limit the use of SHA224.
> So, SHA224 is added back and then the compatibility issues come back
> again. Then we removed SHA224 again if the SunMSCAPI is presented.
> However, at the same time, another request is asking to support SHA224
> on Windows. The API design itself put me in a either-or situation. I
> would try to avoid it if possible for new design.
This appears to be an MSCAPI issue vice a JSSE issue. And the JCA
specifically disclaims the guaranteed ability to use cryptographic
objects from one provider in another provider. Secondary users like
the JSSE probably need to stick to a single provider for a given connection.
>
>
>> Treat these simply as new curves and let's move forward with very
>> minimal changes to the public API.
>>
> I would like to treat it as two things. One is to support new curves
> for new forms. The other one is to support named curves [1]. For the
> support of new forms, there are still significant problems to solve.
> For the support of named curves (including the current EC form), looks
> like we are in a not-that-bad situation right now. Will the named
> curves solution impacts the support of new curves APIs in the future?
> I don't see the impact yet. I may missing something, but I see no
> reason to option out the named curves support.
>
I'm not sure why you think this (the example in [1]) can't be done?
I gave the example elsewhere, but let me expand it with my comment above
(possibly faking the hash key names - sorry):
> HashMap<String,String> neededAlgs = new HashMap<>();
> neededAlgs.put("Signature.EdDSA", "");
> neededAlgs.put("AlgorithmParameters.EC SupportedCurves", "ed25519")
> Provider[] p = Security.getProviders(neededAlgs);
> if (p == null) throw new Exception ("Oops");
> AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC", p[0]);
> parameters.init(new ECGenParameterSpec("ed25519"));
> ECParameterSpec ecParameters = parameters.getParameterSpec(ECParameterSpec.class);
>
> return KeyFactory.getInstance("EC", p[0]).generatePublic(new ECPublicKeySpec(new ECPoint(x, y), ecParameters));
If you're talking more generally, NamedCurves should be a form of
ECParameterSpec so you can read the name from the key, but there's no
support for adding names to that spec. Maybe extend it? E.g.:
package java.security.spec;
public class NamedECParameterSpec extends ECParameterSpec {
private Collection<String> names;
private Collection<Oid> oids;
public NamedECParameterSpec (EllipticCurve curve, ECPoint g,
BigInteger n, int h, Collection<String> names, Collection<Oid> oids) {
super (curve, g, n, h);
if (names != null) {
this.names = new ArrayList<String>(names);
}
if (oids != null) {
this.oids = new ArrayList<Oid>(oids);
}
}
public Collection<String> getNames() {
if (names == null)
return (Collection<String>)Collections.EMPTY_LIST;
else
return Collections.unmodifiableList(names);
}
etc....
This makes it easier to get exactly what you want from a key.
Assuming the provider implements it.
Mike
> Xuelei
>
> [1]:
> http://mail.openjdk.java.net/pipermail/security-dev/2013-October/009105.html
>
>
>>
>> Mike
>>
>>
>>
>>
>>
>>>
>>> There is an example in my August 10 reply:
>>>
>>> http://mail.openjdk.java.net/pipermail/security-dev/2017-August/016199.html
>>>
>>>
>>> Xuelei
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/security-dev/attachments/20170817/e95cd88f/attachment.htm>
More information about the security-dev
mailing list