I can agree with #2. We won’t be setting a precedent by returning null.  Either 
1 or 2 allow us to better support a future RFC with an encoding.  #3, probably 
creates more potential problems than we need.

I believe a majority of EdDSA usage doesn’t use the parameters. As far as I 
know browsers and ssh don’t support them, so I don’t think we are significantly 
harming anyone by doing this. 

Tony 

> On Apr 1, 2020, at 9:31 PM, Weijun Wang <weijun.w...@oracle.com> wrote:
> 
> I just read https://tools.ietf.org/html/rfc8410 and it intentionally did not 
> encode prehash and context anywhere. If AlgorithmParameters' main purpose is 
> to decode/encode this, then looks like it's useless here.
> 
> The EDDSA case is quite unusual because normally anything set by setParameter 
> on the signing side should be available as byte array thru 
> getParameters().getEncoded() so that it can encoded inside the signature and 
> readable by the verifying side. But here, according to RFC 8410, prehash 
> should be used; according to RFC 8032, context "SHOULD be a constant string 
> specified by the protocol using it" and therefore should be 
> negotiated/determined elsewhere.
> 
> Anyway, so far we have found 3 ways to deal with this:
> 
> 1. EdDSASignature::engineGetParameters throws UOE.
> 2. EdDSASignature::engineGetParameters returns null.
> 3. EdDSASignature::engineGetParameters returns something but it.getEncoded() 
> returns null
> 
> Neither is perfect.
> 
> 1. No one might expect an UOE.
> 2. Conflict with spec, when setParameter() was called.
> 3. No AlgorithmParametersSpi::engineGetEncoded has ever returned a null.
> 
> My current preference is 2), seems like the least chance to break existing 
> programs (at least RSASignature has returned null before). This means a spec 
> change in Signature::getParameters is need to clarify this. We might also 
> need to add a paragraph into the spec of EdDSAParameterSpec saying it does 
> not have a counterpart AlgorithmParameters type because of RFC 8410. We can 
> define an AlgorithmParameters later if a future RFC defined anything.
> 
> Thanks,
> Max
> 
>> On Apr 2, 2020, at 10:45 AM, Anthony Scarpino <anthony.scarp...@oracle.com> 
>> wrote:
>> 
>>> On 4/1/20 6:44 PM, Weijun Wang wrote:
>>> Two comments:
>>> 1. Signature::getParameters explicitly specifies that the return value 
>>> should match that set in setParameter(). Therefore although the types of 
>>> params are different we need to make sure the contents are essentially the 
>>> same. This means the getParameters() result should be designed after 
>>> EdDSAParameterSpec.
>> 
>> If that is the case, then at the least both AlgorithmParameter.getEncoded 
>> methods will not be supported or return an empty array because there is no 
>> official encoding.
>> 
>>> 2. If the Signature is of "EDDSA" type (i.e. not ed25519 or ed448), then 
>>> before calling initSign() one does not know what named curve will be used. 
>>> This means the result will not include curve info.
>> If I remember correctly that's the way all the other EC curves work, so this 
>> is nothing new.
>> In any case for Signature EDDSA is defaulting to 25519. I saw the default 
>> today and I'm not sure I like it, I would rather the user specify ED25519 
>> and ED448.  The generic way EDDSA is used sometimes in this code I feel 
>> makes it more confusing.
>> 
>>> --Max
>>>> On Apr 2, 2020, at 9:21 AM, Anthony Scarpino <anthony.scarp...@oracle.com> 
>>>> wrote:
>>>> 
>>>> 
>>>> I understand what the spec says, but here is why I believe the code 
>>>> returns UOE.
>>>> 
>>>> EdDSASignature.setParameters only takes EdDSAParameterSpec and does not 
>>>> take NamedParameterSpec, which can define the curve.  The curve is defined 
>>>> during getInstance().  While there is an ASN.1 for the curve there is none 
>>>> defined for the values contained in EdDSAParameterSpec, prehash and 
>>>> context.  https://tools.ietf.org/html/rfc8410#page-3
>>>> 
>>>> I think it is confusing for EdDSASignature.getParameters() to give a 
>>>> AlgorithmParameters class that provides NamedParameterSpec which cannot be 
>>>> used with EdDSASignature.setParameters().
>>>> 
>>>> Below is what I could do to satisfy the API. I'm just not sure it has any 
>>>> more value than that:
>>>> https://cr.openjdk.java.net/~ascarpino/8166597/webrev.04/raw_files/new/src/jdk.crypto.ec/share/classes/sun/security/ec/ed/EdDSAAlgorithmParameters.java
>>>> 
>>>> Tony
>>>> 
>>>> On 4/1/20 12:22 AM, Weijun Wang wrote:
>>>>> While SignatureSpi says engineGetParameters() would throw an UOE when 
>>>>> it's not overridden, it is not specified in Signature::getParameters:
>>>>>     * <p> If this signature has been previously initialized with 
>>>>> parameters
>>>>>     * (by calling the {@code setParameter} method), this method returns
>>>>>     * the same parameters. If this signature has not been initialized with
>>>>>     * parameters, this method may return a combination of default and
>>>>>     * randomly generated parameter values if the underlying
>>>>>     * signature implementation supports it and can successfully generate
>>>>>     * them. Otherwise, {@code null} is returned.
>>>>> I'm afraid we'll have to return something here, maybe a mixture of a 
>>>>> curve name and fields inside EdDSAParameterSpec.
>>>>> --Max
>>>>>> On Mar 31, 2020, at 12:25 PM, Anthony Scarpino 
>>>>>> <anthony.scarp...@oracle.com> wrote:
>>>>>> 
>>>>>> On 3/30/20 8:52 PM, Anthony Scarpino wrote:
>>>>>>> On 3/30/20 7:54 PM, Weijun Wang wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On Mar 31, 2020, at 10:50 AM, Anthony Scarpino 
>>>>>>>>> <anthony.scarp...@oracle.com> wrote:
>>>>>>>>> 
>>>>>>>>> On 3/30/20 11:52 AM, Anthony Scarpino wrote:
>>>>>>>>>> On 3/30/20 6:21 AM, Weijun Wang wrote:
>>>>>>>>>>> I was playing with keytool with your patch and noticed
>>>>>>>>>>> sun.security.util.KeyUtil.getKeySize(Key) does not support an
>>>>>>>>>>> EdECKey. While we use curve name instead of key size in EC to
>>>>>>>>>>> describe the parameters, the size is still useful in determining the
>>>>>>>>>>> strength.
>>>>>>>>>> I think I should be able to access the parameter with the key's 
>>>>>>>>>> NamedParameterSpec to return the size.
>>>>>>>>> 
>>>>>>>>> I was wrong about this.  The parameters are part of jdk.crypto.ec 
>>>>>>>>> while KeyUtil is part of java.base, so I cannot access the internal 
>>>>>>>>> EdDSAParameters class.
>>>>>>>>> 
>>>>>>>>> The easiest way would be to look at the NamedParameterSpec and return 
>>>>>>>>> a hardcoded length based on the curve used. It's not ideal, but all 
>>>>>>>>> these curves don't change lengths unlike for RSA, AES, etc.
>>>>>>>> 
>>>>>>>> Yes.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Tony
>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> There is also a KeyUtil.getKeySize(AlgorithmParameters) nearby. I'm
>>>>>>>>>>> not involved with previous discussions on EdDSA design, but why does
>>>>>>>>>>> EdDSASignature.engineGetParameters() throw an UOE?
>>>>>>>>>> Because the public API for engineGetParameter(String param) is 
>>>>>>>>>> deprecated would be my suspicion.
>>>>>>>> 
>>>>>>>> engineGetParameter() is deprecated, engineGetParameters() is not.
>>>>>>> Oh sorry.  I'm not sure why, but I have to ask the question what is the 
>>>>>>> point of this method?  If the user needs to set the parameters to do 
>>>>>>> the a signature of verify, what is the need for a method that gets the 
>>>>>>> parameter from Signature that should have just set?  Are the parameters 
>>>>>>> returned changed from the initial setting?  In the EdDSA case they are 
>>>>>>> not.
>>>>>>> I don't have an immediate problem in having EdDSA return the same 
>>>>>>> parameters back, I'm just not sure why it's necessary and I haven't see 
>>>>>>> anything in the JEP as to why Adam decided against this.
>>>>>>> Tony
>>>>>> 
>>>>>> Ok.. That's frustrating that engineSetParameters takes 
>>>>>> AlgorithmParameterSpec, but engineGetParameters returns 
>>>>>> AlgorithmParameter.  That confused me.
>>>>>> 
>>>>>> So I would say the reason EdDSASignature.engineGetParameters() is UOE is 
>>>>>> because the parameters are not exposed publicly.  The NamedParameterSpec 
>>>>>> tells the internals of EdDSA what parameters to use.  I know this to be 
>>>>>> a choice by Adam as he found it unnecessary to expose APIs that were 
>>>>>> unnecessary at this time with predefined EdDSA curves and with a 
>>>>>> implementation that did not allow arbitrary curves.
>>>>>> 
>>>>>> Tony
>>>>>> 
>>>>>>>> 
>>>>>>>>>>> Another small problem:
>>>>>>>>>>> 
>>>>>>>>>>> You reverted the copyright year from 2020 to an earlier year in
>>>>>>>>>>> module-info.java, keytool/Main.java.
>>>>>>>>>> The copyright has not been reverted, the jdk repo was updated to 
>>>>>>>>>> 2020 from another changeset.
>>>>>>>> 
>>>>>>>> Ah yes, I applied your patch to my old repo.
>>>>>>>> 
>>>>>>>> --Max
>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Thanks, Max
>>>>>>>>>>> 
>>>>>>>>>>>> On Mar 24, 2020, at 2:53 AM, Anthony Scarpino
>>>>>>>>>>>> <anthony.scarp...@oracle.com> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> On 2/25/20 12:49 PM, Anthony Scarpino wrote:
>>>>>>>>>>>>> Hi I need a code review for the EdDSA support in JEP 339.  The
>>>>>>>>>>>>> code builds on the existing java implemented constant time
>>>>>>>>>>>>> classes used for XDH and the NIST curves.  The change also adds
>>>>>>>>>>>>> classes to the public API to support EdDSA operations. All
>>>>>>>>>>>>> information about the JEP is located at: JEP 339:
>>>>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8199231 CSR:
>>>>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8190219 webrev:
>>>>>>>>>>>>> https://cr.openjdk.java.net/~ascarpino/8166597/webrev/ thanks Tony
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> I updated the webrev with some minor updates that were commented
>>>>>>>>>>>> previously.
>>>>>>>>>>>> 
>>>>>>>>>>>> https://cr.openjdk.java.net/~ascarpino/8166597/webrev.01/
>>>>>>>>>>>> 
>>>>>>>>>>>> Tony
>>>> 
>> 
> 

Reply via email to