I don't know what the final solution for getParameters now but we can be sure 
it won't return something that has a non-null getEncoded(), this means the 
following change is necessary:

diff --git a/src/java.base/share/classes/sun/security/x509/X509CertImpl.java 
b/src/java.base/share/classes/sun/security/x509/X509CertImpl.java
--- a/src/java.base/share/classes/sun/security/x509/X509CertImpl.java
+++ b/src/java.base/share/classes/sun/security/x509/X509CertImpl.java
@@ -602,8 +602,12 @@
                     null);
 
             // in case the name is reset
+            AlgorithmParameters p = null;
             if (signingParams != null) {
-                algId = AlgorithmId.get(sigEngine.getParameters());
+                p = sigEngine.getParameters();
+            }
+            if (p != null) {
+                algId = AlgorithmId.get(p);
             } else {
                 algId = AlgorithmId.get(algorithm);
             }

If we decide getParameters() should throw an exception, the check will be 
different.

PKCS10::encodeAndSign got it correctly.

X509CRLimpl::sign has not considered possible parameters at all. I've just 
asked for a code view at http://cr.openjdk.java.net/~weijun/8242184/webrev.00/ 
to add it but it will need to same adjustment once EdDSA is added.

Thanks,
Max


> On Apr 6, 2020, at 4:34 PM, Weijun Wang <weijun.w...@oracle.com> wrote:
> 
> Some other issues:
> 
> 1. AlgorithmId::derEncode. Otherwise openssl does not like the extra NULL.
> 
> @@ -196,7 +205,8 @@
>             } else {
>                 bytes.putNull();
>             }*/
> -            if (algid.equals(RSASSA_PSS_oid)) {
> +            if (algid.equals(RSASSA_PSS_oid) || algid.equals(ed448_oid)
> +                    || algid.equals(ed25519_oid)) {
>                 // RFC 4055 3.3: when an RSASSA-PSS key does not require
>                 // parameter validation, field is absent.
>             } else {
> 
> 2. AlgorithmId::getWithParameterSpec. Please return 
> "AlgorithmId.get(algName)" when "spec instanceof EdDSAParameterSpec". 
> 
> Thanks,
> Max
> 
>> On Apr 5, 2020, at 5:11 PM, Weijun Wang <weijun.w...@oracle.com> wrote:
>> 
>> OK, I undertand now:
>> 
>> 1. Crypto primitives (Signature/KeyFactory/KeyPairGenerator) would support 
>> all "EdDSA" and "Ed25519"/"Ed448", and their getAlgorithm() returns what was 
>> used back in getInstance().
>> 
>> 2. Key's getAlgorithm() always returns "EdDSA".
>> 
>> Thanks,
>> Max
>> 
>>> On Apr 4, 2020, at 6:02 AM, Anthony Scarpino <anthony.scarp...@oracle.com> 
>>> wrote:
>>> 
>>> On 4/2/20 8:34 PM, Weijun Wang wrote:
>>>> Another question:
>>>> Why does getAlgorithm() of PublicKey and PrivateKey return "EdDSA"
>>>> instead of "Ed25519" and "Ed448"?
>>>> Do we suggest people using "EdDSA" or "Ed25519"/"Ed448" when calling
>>>> KeyFactory.getInstance() andKeyPairGenerator.getInstance()?
>>> 
>>> I don't think the code is suggesting anything. I believe the implementation 
>>> is trying to be consistent with the API and other asymmetric keys factories 
>>> and generators.  Just using EC as an example one uses "EC" for the 
>>> getInstance() and provides the AlgorithmParameterSpec to generate the 
>>> publicKey
>>> 
>>> kf = KeyFactory.getInstance("EC");
>>> ECParameterSpec.ep = ..
>>> kf.generatePublicKey(ep)
>>> 
>>> Being consistent for EDDSA, replace "EC" with "EDDSA" and specify a 
>>> NamedParameterSpec to generate the public key; however, it is allowed to 
>>> replace "EC" with ED25519. Similar to how XDH does it. Unfortunately 
>>> generatePublicKey requires an AlgorithmParameterSpec, which is redundant in 
>>> this case:
>>> ---
>>> kf = KeyFactory.getInstance("ED25519")
>>> ...
>>> kf.generatePublicKey(NamedParameterSpec.ED5519);
>>> ---
>>> 
>>> Since existing code follows the first example we should be consistent for 
>>> apps adding EDDSA.
>>> 
>>> For KeyPairGenerator, initialize() isn't required to be called with 
>>> getInstance("ED25519") to generate the key, but it will accept an 
>>> initialize() call.  What's different is "EDDSA" will default to ED25519 and 
>>> does not require initialize(), but it will accept initialize() to change it 
>>> to ED448.  I believe this is to be consistent with EC and RSA that need 
>>> initialize().
>>> 
>>> To complete all the EDDSA entries, Signature is different because, the key 
>>> provides the details about the curve.  It's similar to KeyPairGenerator, 
>>> "EDDSA" doesn't lock you into a particular curve, allowing the key to 
>>> specify the curve, which follows the EC/RSA logic. Specifying the curve at 
>>> getInstance() locks you into that curve so at least NoSuchAlgorithm will be 
>>> thrown at getInstance() unlike other asymmetric algorithms.
>>> 
>>> So to wrap all this up, it makes sense for consistency with prior behavior 
>>> that all 3 classes have an EDDSA entry.  And the specific curve usage is 
>>> also consistent with what has already been integrated with XDH.
>>> 
>>> Tony
>>> 
>>> 
>>>> 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