Subject: [TLS] Updated EdDSA/Ed25519 PKIX document

From: Simon Josefsson <[email-masked]>
Date: Wed, 23 Sep 2015 10:33:29 +0200

Hi all,

I have pushed out a new version of the document describing EdDSA public
keys, signatures and certificates for PKIX.  The change in -03 include
the addition of the prehash mode, test vectors generated by GnuTLS, and
a section recommending certain human readable names.

https://tools.ietf.org/html/draft-josefsson-pkix-eddsa-03

I've started a thread to discuss whether it is wortwhile to be able to
use the same Ed25519 key for both PureEdDSA mode and HashEdDSA signing,
and I'd appreciate feedback on whether people are interested in this and
generally if it is a good idea or not.  The complexity involved make me
shy away a bit from it, but it is fun to consider.  The thread is here:
https://moderncrypto.org/mail-archive/curves/2015/000630.html

/Simon

---

From: "Manger, James" <[email-masked]>
Date: Thu, 24 Sep 2015 13:23:45 +1000

Hi Simon, two technical typos:

The example cert in 8.2 has the wrong OID for the signature.
Cert has { 1 3 101 100 1 } [encoding 06 04 2B656401]
Text has { 1 3 101 101 }   [encoding 06 03 2B6565]   for id-EdDSASignature

OIDs use space-separated (not dot-separated) numbers in ASN.1.
Section 4:
Wrong { 1.3.101.100 }
Right { 1 3 101 100 }
Section 7
Wrong { 1.3.101.101 }
Right { 1 3 101 101 }

The cert's notBefore field is a UTCTime value (2-digit year), while the notAfter field is a GeneralizedTime value (4-digit year). I don't think I has seen that before, but it is valid.

--
James Manger

-----Original Message-----
From: pkix [mailto:[email-masked]] On Behalf Of Simon Josefsson
Sent: Wednesday, 23 September 2015 6:33 PM
To: [email-masked]; [email-masked]
Subject: [pkix] Updated EdDSA/Ed25519 PKIX document

Hi all,

I have pushed out a new version of the document describing EdDSA public keys, signatures and certificates for PKIX.  The change in -03 include the addition of the prehash mode, test vectors generated by GnuTLS, and a section recommending certain human readable names.

I've started a thread to discuss whether it is wortwhile to be able to use the same Ed25519 key for both PureEdDSA mode and HashEdDSA signing, and I'd appreciate feedback on whether people are interested in this and generally if it is a good idea or not.  The complexity involved make me shy away a bit from it, but it is fun to consider.  The thread is here:
https://moderncrypto.org/mail-archive/curves/2015/000630.html

/Simon

---

From: Simon Josefsson <[email-masked]>
Date: Thu, 24 Sep 2015 13:04:28 +0200

> Text has { 1 3 101 101 }   [encoding 06 03 2B6565]   for id-EdDSASignature

Hi James.  Good catch -- I believe that is a typo in the implementation.
I'll let Nikos fix that, but we'll update the examples in the document.

> OIDs use space-separated (not dot-separated) numbers in ASN.1.

Fixed, thank you.

> The cert's notBefore field is a UTCTime value (2-digit year), while
> the notAfter field is a GeneralizedTime value (4-digit year). I don't
> think I has seen that before, but it is valid.

I suspect the logic in GnuTLS to pick one encoding over the other looks
at the date to see if it fits in a UTCTime value or not.  It shouldn't
be related to EdDSA.

/Simon

> _______________________________________________
> pkix mailing list
> [email-masked]
> https://www.ietf.org/mailman/listinfo/pkix
>

---

From: Nikos Mavrogiannopoulos <[email-masked]>
Date: Thu, 24 Sep 2015 14:01:14 +0200

> think I has seen that before, but it is valid.

Hi,
 Thanks for the comments, they should be addressed in the next update.
About the times, that's an RFC5280 requirement. 
"CAs conforming to this profile MUST always encode certificate
validity dates through the year 2049 as UTCTime; certificate
validity dates in 2050 or later MUST be encoded as GeneralizedTime."

The notAfter is a date over 2050 (in fact its the 'no well defined
expiration date').

regards,
Nikos

---

From: Ilari Liusvaara <[email-masked]>
Date: Thu, 24 Sep 2015 15:27:47 +0300

> https://moderncrypto.org/mail-archive/curves/2015/000630.html

Some comments:

1) Taking private key example and decoding the ASN.1 yields:

  0  37: SEQUENCE {
  2   1:   ENUMERATED 1
  5  32:   OCTET STRING
       :     D4 EE 72 DB F9 13 58 4A D5 B6 D8 F1 F7 69 F8 AD
       :     3A FE 7C 28 CB F1 D4 FB E0 97 A8 8F 44 75 58 42
       :   }

What is that ENUMERATED 1 for? The text description has algorithm of 
SHA512-Ed25519, which would AFAICT be ENUMERATED 2 if private keys use
the same kind enumeration as public keys.

2) AFAICT, EdDSA-20150704 calls the signature without prehash, with
25519 curve and SHA-512 hash "Ed25519-SHA-512" (and the corresponding
version with SHA-512 prehash "SHA-512-Ed25519-SHA-512").

The first of those is AFAIK the same as the old "Ed25519" signature
primitive.

One problem with those names is that those things might get rather
nasty to read when '-' both appears inside hash names and component
separator.

3) Using the same key for both PureEdDSA and HashEdDSA sounds like a
bad idea. However, it would be technically possible to alter the
internal subkey derivation so that different prehashes give logically
separate keys.

Such change would only affect signing, not verification (since verifier
sees the change as different public key).

4) For TLS PoP signatures, does it make sense to use HashEdDSA at all?
Another way would to always use PureEdDSA and perform hash separtion
from TLS side (e.g. sign(privkey, hash_func_id|H(tbs_data))).

The certificate signatures are different matter tho, since CAs use
HSMs for signing (those HSMs tend to be rather beefy, but still).

Then there are CRLs. I would imagine those are so large that one rather
uses prehashing.

-Ilari

---

From: Nikos Mavrogiannopoulos <[email-masked]>
Date: Thu, 24 Sep 2015 16:03:28 +0200

> HSMs for signing (those HSMs tend to be rather beefy, but still).

The problem with the PureEdDSA is that if you use a smart card or an
HSM (both common for TLS), you have to transfer lots of data to them,
something that may render it not really useful. Also the PureEdDSA in
most implementations it requires a new API for signing.

regards,
Nikos

---

From: Ilari Liusvaara <[email-masked]>
Date: Thu, 24 Sep 2015 18:26:28 +0300

On Thu, Sep 24, 2015 at 04:03:28PM +0200, Nikos Mavrogiannopoulos wrote:
> something that may render it not really useful.

Well, hash_func_id|H(tbs_data) is 33-65 bytes for most nontrivial
hashes.

In TLS 1.3 Editor's copy, tbs_data itself is <150 bytes (but there
will be changes to merge certificate and its verify, which will
presumably enlarge that a bit, but still maybe <200 bytes).

I presume if TLS PoP can use HashEdDSA keys, then the TLS
HashAlgorithm MUST equal HashEdDSA prehash (and with current proposed
kinds, that would always be 6 => SHA-512).

> Also the PureEdDSA in most implementations it requires a new API for
> signing.

Oh yes, the old bad PKCS#11 signature API that takes online signing
model... Nevermind most of the time verification is offline (TLS is
actually one of the few exceptions).

-Ilari

---

From: Nikos Mavrogiannopoulos <[email-masked]>
Date: Thu, 24 Sep 2015 19:05:42 +0200

> presumably enlarge that a bit, but still maybe <200 bytes).

Correct and that's not an issue for most hw out there, but I was
thinking it in the sense that if we standardize a signing algorithm, it
should be the same whether we sign large files or a TLS handshake.

Said that, I pretty much like the properties of PureEd25519, I just
think the practicalities around it are not insignificant.

regards,
Nikos