On 8/31/2020 2:00 PM, Anthony Scarpino wrote:
On 8/31/20 8:16 AM, Anders Rundgren wrote:
On
https://tools.ietf.org/html/rfc8032#page-24
you can find test vectors that are also used by rfc8037 (JOSE).

However, there seems to be no information on how to create an EdDSA public key from such a vector. Apparently you must be an expert on the inner workings of EdDSA in order to use this API.

I have though managed(...) but 1) it looks strange 2) it may be incorrect.

Steps
1. Convert the hex-code to a byte[] array.
2. Reverse (!) all the bytes in the byte[] array.
3. publicKey = kf.generatePublic(
                     new EdECPublicKeySpec(new NamedParameterSpec(alg),
                                           new EdECPoint(false, new BigInteger(1, theByteArray))));

Ideally, EdECPoint should have an constructor that does whatever it takes based on a byte[] array.

It is equally fuzzy in the other direction.  A "getByteArray()" on EdECPoint had been great.

Thanx,
Anders

Hi,

It does seem like a constructor and/or helper methods would be a good addition.  I filed a bug to track this:

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

thanks

Tony


Generically, maybe this should be added not to the ED based stuff, but to BigInteger:

public static BigInteger fromLittleEndianEncoding(int signum, byte[] magnitude);

public  byte[] getMagnitude(boolean bigEndian, int sizeInBytes); // if size in bytes < actual magnitude size, returns the magnitude bytes, otherwise returns the magnitude bytes left or right padded to sizeInBytes depending on endianness.

Almost all of the crypto stuff related to converting between the various encodings of signatures and keys would benefit from a standard version of the left/right padding stuff.

Mike

ps - there's a long thread maybe a year or two ago about internal vs external representations of the EDDSA and EDDH keys.  I'm actually kind of surprised that the internal representation turned out to be BigInteger.   I'm glad it did, but its now kind of strange that we have 6 extra interface classes when we could probably have gotten away with folding them in under the EC* classes.


pps - the alternate way of doing this (and probably the most correct way) would be to encode the bytes from the test vector into a SubjectPublicKeyInfo public key (see RFC8401)  and run that through the key factory.  That should do all the reversing and generating.  You can confirm that by doing a getEncoded() on your built public key and running it back through the key factory.



Reply via email to