On 4/28/20 5:58 PM, Bradford Wetmore wrote:
Hi Tony,

Apologies for the delay.

 > I updated the webrev with some minor updates that were commented
 > previously.
 >
 > https://cr.openjdk.java.net/~ascarpino/8166597/webrev.01/

I've finished the APIs and a fair chunk of the implementation, but had some initial comments.

Overall, the APIs look reasonable and I (or whoever) should have no problems adding TLS support for EdDSA once this is in place.

     https://bugs.openjdk.java.net/browse/JDK-8166596

BTW, I reviewed based off the webrev.01 version (above), but I found in a later email exchange there was mention of a .04:

 > https://cr.openjdk.java.net/~ascarpino/8166597/webrev.04/

dated April 1.  I'm hoping that was just a proposed change idea, and not a new version to review.  Please advise if so.

In my comments below, if I say "you" below, it's the colloquial "you."
Could be you or the previous engineer.

If some of these questions have already been answered, I'll apologize in advance. I'm getting up to speed in RFC 8032 specifics so forgive any "duh" questions.

----

Common:  Throughout the API's, I noticed multiple minor javadoc
style issues, such as:

     . periods inconsistencies (missing or extras) (e.g.  EdECPoint)
     . omissions of @code (e.g. EdDSAParameterSpec/EdECPoint/etc.)

Suggest a javadoc sweep before final CSR.  I started calling them out, but stopped.

For keysize in things like KeyPairGenerator, why are we using 255/448 (externally and internally) instead of 256/456?  From RFC 8032:

     section 3.2:  "An EdDSA private key is a b-bit string k"
+
     section 5.1.5/Ed25519:  "The private key is 32 octets (256 bits,
     corresponding to b) of cryptographically secure random data..."
     section 5.2.5/Ed448:  "The private key is 57 octets (456 bits,
     corresponding to b) of cryptographically secure random data..."

and

     section 3, parameter 2: "EdDSA public keys have exactly b bits"
and
     section 5.1:  "(parameter) b: 256"
     section 5.2:  "(parameter) b: 456"

The Wikipedia entry also lists as 256.  https://en.wikipedia.org/wiki/EdDSA

I notice BC does actually use both.

https://github.com/bcgit/bc-java/blob/master/prov/src/test/jdk1.4/org/bouncycastle/jce/provider/test/EdECTest.java#L365 https://github.com/bcgit/bc-java/blob/master/prov/src/test/jdk1.4/org/bouncycastle/jce/provider/test/EdECTest.java#L371

I have no answer why 255 and 448 are stored, but changing them breaks the underlying implementation. If a problem occurs where we need 256 & 456, it can be addressed in a different way.



Why did you decide to not use the full algorithm names for the variants e.g. Ed25519ctx/Ed25519ph/Ed448ph instead of just Ed25519/Ed448 and let the selection be done using the Parameters.  More for my understanding than an issue.

The variants are not the normal case it would seem. Even the spec hints at this. I suspect Adam didn't want to create all these algorithm names just for a few variations. I can understand the logic. If a parameter spec can address them, why not. The base is Ed25519/Ed448.


Also, I thing you and Max might have discussed EdDSA vs EDDSA (case), but in a different context.  RFC 8410/Section 8, the full names are "EdDSA"/"Ed25519"/"Ed448",
but you're using "EDDSA"/"ED25519"/"ED448".
There is precedence for upper/lower case in our Java Standard Names.
https://docs.oracle.com/en/java/javase/14/docs/specs/security/standard-names.html , so just wondering why you're standardizing on the upper case variant?

That is the plan. The reviews you were looking at hadn't fixed that entirely.


Is Ed448ph working?  I've been playing with your test vectors from RFC 8032 in test/jdk/sun/security/ec/ed/TestEdDSA.java, where you included Ed25519/Ed25519ctx/Ed25519ph, but omitted several (6 of 9) of the Ed448 tests and all of the Ed448ph tests. I tried very quickly to add the two Ed448ph tests in in section 7.5, but no luck.  Could be pilot error, but I tried a lot of different combos (with/without ph boolean, null array vs. empty array, etc), but seems like it should have been straightforward given the test framework.

See comments below



Specific file comments:

make/jdk/src/classes/build/tools/intpoly/FieldGen.java
--------------------------------------------
Lines 643-650 are creating a bunch of comment like this which are
the BigInteger values used later:


//(0%nat,16110573)::(26%nat,10012311)::(52%nat,30238081)::(78%nat,-8746018)::(104%nat,1367802)::nil.

but what is the format of comment expressing?  What ae %nat/nil/::/etc.

I do not know. That file is used to create the Interpolynomial files. It's probably a comment that explains what is created using the constant time code. I have not had to run this file.


src/java.base/share/classes/java/security/spec/NamedParameterSpec.java
--------------------------------------------
94: This never seems to be called in our main test suite, so not sure why this is here.  Please add a comment as to why you added this new no-args constructor.  (was it some Class.newInstance() somewhere/prevent unexpected object creation/some kind of reflection?)

Minor nit, you could put this constructor above the other constructor,
it gets kind of lost here visually.

It may have been created when I was trying different ideas for the CSR for potentially subclassing the EdDSA algorithm parameter spec. I deleted it


src/java.base/share/classes/sun/security/pkcs/PKCS7.java
--------------------------------------------
832:  Seems like the right thing to do for making things bulletproof.
You're convinced this shouldn't happen in our code somewhere?  (i.e. unexpected new failure?)


The method in question reads the algorithm string searching for "with". There is no "with" here in the algorithm string. The digest is internal part of the algorithm and not interchangeable like the other Signatures. Finally ED448's digest algorithm is SHAKE256, which we do not have a standard name for nor support in a provider. Max was ok with this decision.


src/java.base/share/classes/sun/security/provider/SHA3.java
--------------------------------------------
I see what you did here and made 0x06 a parameter in each of the implementation classes, but wondering why?  Is there another change I haven't gotten to yet?

SHAKE256.java


src/java.base/share/classes/sun/security/util/SecurityProviderConstants.java
--------------------------------------------
74:  Why 255 and not 256?  (See comment above)

src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java
--------------------------------------------
OK - I didn't check the math closely in this package, but the refactoring looks reasonable.

src/java.base/share/classes/java/security/interfaces/EdECPrivateKey.java
--------------------------------------------
47:  Do you want to mention a new copy of the array is returned here? You do say this in the spec version, and we do in the XECPrivateKey interface.

I'm changing this for consistency with XECPrivateKey. Personally I'm not in favor of interfaces with this sort of requirement and think it's up to the underlying implementation. If there is a situation where you don't want the copy, now the spec is in conflict. I don't have an example where this would happen, I just feel it's over-specifying the interface.

When you get to Signature.getParameters(), and the follow-on bug & CSR to fix that, you may understand why I say this.


48:  @code the Optional.

53:  Might suggest reworking this to mention the Optional, since it is
actually the return type.  See XECPrivatekey for an example.

Ok for both


src/java.base/share/classes/java/security/interfaces/EdECPublicKey.java
------------------------------------------ > 47:  @code the EdECPoint.

Ok


src/java.base/share/classes/java/security/spec/EdDSAParameterSpec.java
--------------------------------------------
Do you want to include checks/restrictions for contexts > 255 chars?

Sure


52/65:  @code the EdDSAParameterSpec

ok

92:  "...bound to the signature" sounds premature.  This is the context
bound to the EdDSAParameteerSpec, which hasn't been yet bound to the signature.

ok

94:  The word "empty" here seems overloaded between empty arrays which
are array objects with no elements, and empty Optionals which are Optionals with no values which would later throw a NoSuchElementException on a get().  Wondering if there is a better way to say this to not cause confusion? Maybe saying this is an "empty Optional?"

I just put Optional in front of it, I think that makes is clear. I know it can get confusing with null and empty.


src/java.base/share/classes/java/security/spec/EdECPrivateKeySpec.java
--------------------------------------------
33:  Same comment about representation as above.

Sorry, I don't understand.  What above comment about representation?


test/jdk/sun/security/ec/ed/TestEdDSA.java
--------------------------------------------
40:  Should not need this kind of SecureRandom initialization anymore. Remove the seed byte array.

ok


51:  Please add some comments in here to indicate that these are the
test vectors from RFC 8032, so that folks can mentally map if they so choose.

I put it in the @summary


194:  Comment is above, but more details here.  All of the test vectors were included to this point, then it just stopped after 3 Ed448 tests, leaving out 6 of 9 tests, including all of the Ed448ph tests.  RFC pages 32-39.  Intentional? I did try to stick in the two Ed448ph tests from 7.5, and it failed, so maybe I'm missing something?

That's a really good catch.. I do not know why he did that, Adam said all the tests passed, so I didn't have reason to go back and make sure all the tests from the RFC were include. I do not know why he implemented about half of them.

After I added the tests I saw the Ed448ph fail too. Took me a while to finally fine out that the code was using on the message SHAKE256 with a length of 114 instead of a length of 64. Everything is working in my workspace now.


Thanks, I'll continue on tomorrow.

Ok.. that should have happen on wednesday :)
Due to the schedule I can't keep dragging this out longer. If you have them please send them to me today.

Tony


Brad


On 3/23/2020 11:53 AM, Anthony Scarpino 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


Reply via email to