Subject: [Cfrg] Questions regarding BIP32-Ed25519 (was: Interest in an "Ed25519-HD" standard?)

From: Oleg Andreev <[email-masked]>
Date: Fri, 31 Mar 2017 11:06:34 -0700

Dmitry,

Thanks for your with Jason paper on adopting BIP32 to Ed25519 and critique of ChainKD, very appreciated. I have a few questions about it:

1. Why do you impose requirements on the master secret to yield 3rd high bit to be zero, while you can simply set it to zero along with other 5 bits. In two places you mention that you reject non-compliant master secret, but in Security section (F) you say "we set 6 bits", which is what seems to be the intention all along.

2. You choose 2^20 as a max depth level therefore leaving 2^230 bits for the derived key. In your paper you round this down to whole number of bytes (28 bytes -> 2^224) while it's actually possible to slightly increase collision-resistance by taking 29 bytes instead and clearing top 2 bits. Have you considered that, and if yes, is there any issues with that?

3. What was the rationale for 2^20 as a depth limit? I myself don't have a good framework to decide which limit is the best, so I'm wondering if you have? :)

4. You effectively make xprv to be 96-byte string (32 bytes for the scalar, 32 bytes for the "prefix" used in nonce generation and 32 byte chain code), and use two HMAC calls to derive new chain code separately from the privkey. Have you considered expanding the 64-byte privkey (as defined by NaCl library) from the scalar itself? In my recent tweak to ChainKD scheme [1] I'm doing that and to stay fully compatible with EdDSA requirement that prefix originally has 256 bits of entropy, add only one secret byte ("pepper") that eats 8 bits from the chain code (which we call "salt"). This allows us to keep both xprv and xpub 64 bytes long and avoid double-HMAC when deriving public keys - single hash call produces a key component and another salt value.

Thank you!

[1] Updated ChainKD: https://github.com/chain/chain/blob/chainkd-dh/docs/protocol/specifications/chainkd.md

> Being a co-author of [5], I am ready to contribute to such a document. I
> will present our own proposal at
> http://prosecco.gforge.inria.fr/ieee-blockchain2016/ in Paris  just before
> the CFRG meeting at the same place next day. It would be great if we come
> up with some proposal to discuss it already there.
> 
> The most recent version is
> https://drive.google.com/open?id=0ByMtMw2hul0EMFJuNnZORDR2NDA It has some
> critique of [6], hopefully not too offensive:)
> 
> Our motivation in [5] was to generate private keys satisfying the
> Curve25519 requirements too so that the code can be reused, even if in the
> signature setting some attacks would not apply. But it would be great to
> have comments from the community as well.
> 
> Best regards,
> Dmitry
> 
> On Wed, Mar 22, 2017 at 5:00 AM, Phillip Hallam-Baker <[email-masked]
> > wrote:
> 
> > You can do hierarchical key derivation in Montgomery without the need for
> > an add.
> >
> > Say your master key is x. To generate a key for site 'example.com' we
> > take
> >
> > xs = (x + H('example.com')) mod q
> >
> > Where q is the sub group order.
> >
> > In fact that isn't really using any EC relevant operation at all. Perhaps
> > I am not understanding the full requirements for the scheme.
> >
> >
> > I don't follow the argument about small subgroups in the referenced post.
> > With Curve25519 and Ed25519 we have chosen the curve cofactor and the
> > generator point. So there is only one group that our point can possibly be
> > in regardless of whether our private key is (x mod q) or (x mod q + nq). We
> > are going to arrive at the same set of points regardless.
> >
> >
> > I do very much prefer the Edwards curves though because we can combine two
> > keypairs by simply adding the corresponding public and private keys. That
> > allows us to do the co-generation trick I showed a while back.
> >
> > We can also split the key, give one part to a recryption service and
> > encrypt the other half under the public key of the recipient. This allows
> > us to support group messaging through proxy re-encryption.
> >
> > Some applications of that are encumbered (possibly) under a soon to expire
> > patent.
> >
> >
> >
> > On Tue, Mar 21, 2017 at 8:34 PM, Phillip Hallam-Baker <
> > [email-masked]> wrote:
> >
> >> I have just implemented Proxy Re-Encryption under Ed-25519 and Ed448. I
> >> think EdCurve Crypto is a good plan.
> >>
> >> Or we could do it on the Montgomery Curves and give the algorithm for
> >> point addition.
> >>
> >> On Tue, Mar 21, 2017 at 3:42 PM, Tony Arcieri <[email-masked]> wrote:
> >>
> >>> Hierarchical key derivation (also sometimes described as "semiprivate
> >>> keys" or "key blinding") is an increasingly popular technique for
> >>> generating unlinkable child keys from master public and private keys.
> >>>
> >>> The Tor Project has been exploring such an approach as the basis for
> >>> their next-generation hidden services design for several years now[1],
> >>> during which time it has received security proofs[2]. Their latest
> >>> design[3] allegedly includes feedback from Dan Bernstein.
> >>>
> >>> Application of hierarchical key derivation is perhaps most notable in
> >>> the cryptocurrency space, where Bitcoin's BIP32[4] provided a means for
> >>> unlinkable single-use signature keys for the secp256k1 elliptic curve.
> >>> There are several designs for applying the ideas from BIP32 to Ed25519,
> >>> including ones from Evernym[5] and Chain[6] (where I am an employee).
> >>>
> >>> The designs in [3], [5], and [6] are all highly similar and accomplish
> >>> the same goals. Personally I would love to see a single standard design for
> >>> producing Ed25519 signatures from hierarchically derived keys, notably one
> >>> which produces signatures that can be verified by any off-the-shelf RFC
> >>> 8032-compatible Ed25519 implementation.
> >>>
> >>> There's already been some discussion of this on the moderncrypto.org
> >>> curves list:
> >>>
> >>> https://moderncrypto.org/mail-archive/curves/2017/000858.html
> >>>
> >>> I'd be curious to know if anyone else would be interested in
> >>> collaborating on a draft for such a standard, which can be a synthesis of
> >>> the existing work in this space.
> >>>
> >>> [1]: https://lists.torproject.org/pipermail/tor-dev/2012-Sep
> >>> tember/004026.html
> >>> [2]: https://www-users.cs.umn.edu/~hopper/basic-proof.pdf
> >>> [3]: https://gitweb.torproject.org/torspec.git/tree/proposal
> >>> s/224-rend-spec-ng.txt#n1979
> >>> [4]: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
> >>> [5]: https://github.com/WebOfTrustInfo/rebooting-the-web-of-
> >>> trust-fall2016/blob/master/topics-and-advance-readings/HDKey
> >>> s-Ed25519.pdf
> >>> [6]: https://chain.com/docs/protocol/specifications/chainkd
> >>>
> >>> --
> >>> Tony Arcieri
> >>>
> >>> _______________________________________________
> >>> Cfrg mailing list
> >>> [email-masked]
> >>> https://www.irtf.org/mailman/listinfo/cfrg
> >>>
> >>>
> >>
> >
> > _______________________________________________
> > Cfrg mailing list
> > [email-masked]
> > https://www.irtf.org/mailman/listinfo/cfrg
> >
> >
> 
> 
> -- 
> Best regards,
> Dmitry Khovratovich