Re: [Cfrg] Using draft-irtf-cfrg-spake2-00 in Kerberos Preauth

Nathaniel McCallum <npmccallum@redhat.com> Thu, 12 February 2015 13:25 UTC

Return-Path: <nmccallu@redhat.com>
X-Original-To: cfrg@ietfa.amsl.com
Delivered-To: cfrg@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 05A2C1A87D7 for <cfrg@ietfa.amsl.com>; Thu, 12 Feb 2015 05:25:09 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -5.912
X-Spam-Level:
X-Spam-Status: No, score=-5.912 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HK_RANDOM_FROM=0.999, RCVD_IN_DNSWL_HI=-5, SPF_HELO_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gKRTS-UqXsjO for <cfrg@ietfa.amsl.com>; Thu, 12 Feb 2015 05:25:06 -0800 (PST)
Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 535AE1A87D0 for <cfrg@irtf.org>; Thu, 12 Feb 2015 05:25:06 -0800 (PST)
Received: from zmail13.collab.prod.int.phx2.redhat.com (zmail13.collab.prod.int.phx2.redhat.com [10.5.83.15]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t1CDP4Hn030133; Thu, 12 Feb 2015 08:25:04 -0500
Date: Thu, 12 Feb 2015 08:25:04 -0500
From: Nathaniel McCallum <npmccallum@redhat.com>
To: Watson Ladd <watsonbladd@gmail.com>
Message-ID: <1302158230.13244609.1423747504306.JavaMail.zimbra@redhat.com>
In-Reply-To: <CACsn0cmg8z-3AvW57RiQGs4v0bWsUvWBqD9zMWKB+-hX_Tm0Zw@mail.gmail.com>
References: <1422460388.26683.62.camel@redhat.com> <CACsn0ckv09951WZ3d46ScoKVdSEs-GekQG55cSOmH+BSGx5Diw@mail.gmail.com> <1422468737.26683.110.camel@redhat.com> <1423573062.7427.11.camel@redhat.com> <CACsn0cmg8z-3AvW57RiQGs4v0bWsUvWBqD9zMWKB+-hX_Tm0Zw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
X-Originating-IP: [10.5.82.12]
X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC40 (Mac)/8.0.6_GA_5922)
Thread-Topic: Using draft-irtf-cfrg-spake2-00 in Kerberos Preauth
Thread-Index: 2moNBHS5rhDx1jCZZhgkINUA0YOE6w==
Archived-At: <http://mailarchive.ietf.org/arch/msg/cfrg/Ig1VAvVWjAU58NJW4bzCd8Dt5oI>
Cc: cfrg@irtf.org
Subject: Re: [Cfrg] Using draft-irtf-cfrg-spake2-00 in Kerberos Preauth
X-BeenThere: cfrg@irtf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: Crypto Forum Research Group <cfrg.irtf.org>
List-Unsubscribe: <http://www.irtf.org/mailman/options/cfrg>, <mailto:cfrg-request@irtf.org?subject=unsubscribe>
List-Archive: <http://www.irtf.org/mail-archive/web/cfrg/>
List-Post: <mailto:cfrg@irtf.org>
List-Help: <mailto:cfrg-request@irtf.org?subject=help>
List-Subscribe: <http://www.irtf.org/mailman/listinfo/cfrg>, <mailto:cfrg-request@irtf.org?subject=subscribe>
X-List-Received-Date: Fri, 13 Feb 2015 15:24:11 -0000


----- Original Message -----
> On Tue, Feb 10, 2015 at 4:57 AM, Nathaniel McCallum
> <npmccallum@redhat.com> wrote:
> > On Wed, 2015-01-28 at 13:12 -0500, Nathaniel McCallum wrote:
> >> On Wed, 2015-01-28 at 08:06 -0800, Watson Ladd wrote:
> >> > On Wed, Jan 28, 2015 at 7:53 AM, Nathaniel McCallum <
> >> > npmccallum@redhat.com> wrote:
> >> > > I've only just now joined the mailing list, so I'm a bit late to
> >> > > the party (though I see my name has been brought up in the
> >> > > previous discussions).
> >> > >
> >> > > I am currently implementing a PAKE preauthentication mechanism
> >> > > for Kerberos. https://github.com/npmccallum/krb5-pake
> >> > >
> >> > > One of the PAKEs we have chosen to use is SPAKE2. The
> >> > > aforementioned program that I am using to generate M and N
> >> > > constants is here:
> >> > > https://github.com/npmccallum/krb5-pake/blob/master/src/pake/spake_constants.c
> >> > >
> >> > > This program uses two seed strings:
> >> > >  "OID point generation seed (M)"
> >> > >  "OID point generation seed (N)"
> >> > >
> >> > > OID is replaced by the OID of the curve. Since some curves have
> >> > > multiple aliases, the use of OIDs removes any ambiguity to the
> >> > > seed.
> >> > >
> >> > > The method use to generate the constants is fairly similar to
> >> > > that used by Chromium, but differs in several ways:
> >> > > http://src.chromium.org/viewvc/chrome/trunk/src/crypto/p224_spake.cc
> >> > >
> >> > > First, we calculate the length of the encoded value of a single
> >> > > point on the curve. I'll call this $CURVE_SIZE.
> >> > >
> >> > > Second, we determine which is the smallest hash function (of SHA-
> >> > > 1, SHA-2-*) which outputs at least $CURVE_SIZE bytes. So, for
> >> > > instance, given P256, SHA-2-256 will be used. If no hash
> >> > > function is larger than $CURVE_SIZE, we use the largest hash.
> >> > > For example, P521 uses SHA-2-512.
> >> > >
> >> > > Third, we generate the seeds by filling in the OID value.
> >> > >
> >> > > Fourth, we begin a recursive process whereby we hash the seed
> >> > > (or the previous hash of the seed) until the output of the hash
> >> > > yields an X coordinate on the curve. The Y coordinate (+/-) is
> >> > > chosen using the right-most bit of the hash.
> >> >
> >> > I don't think this is what your C code is doing, or if it is, I
> >> > can't figure it out because of the way it uses OpenSSL internals.
> >> > I may try coding that up in SAGE and seeing if it agrees in the
> >> > output. (In particular I think the first byte of the digest might
> >> > get mangled to have the decode function work).
> >>
> >> What internals?
> >>
> >> EC_GROUP *g = EC_GROUP_new_by_curve_name(NID_secp521r1);
> >> EC_POINT *p = EC_POINT_new();
> >> BIGNUM *x = BN_new(hash(seed));
> >> int y = seed[-1] & 0x1; // Last bit
> >> EC_POINT_set_compressed_coordinates_GFp(g, p, x, y);
> >>
> >> That seems straightforward to me.
> >
> > Attached is a (slightly different) method implemented in Java using
> > Bouncy Castle. It depends on no system internals and only one hash. It
> > should be sufficiently simple to grok. A description is given in a
> > comment in the top of the file. This method is easily repeatable on
> > every crypto-system I have tried (including both OpenSSL and libnss).
> 
> I read that file and description of the method. It depends on details
> of SEC1 encoding, as it mungs the hash function value in strange ways.
> Stretching the hash function is ad hoc.

I'm not thrilled about the stretching of the hash function. However, without it we have a significant distribution problem. SHA512 into a curve >511bits has insufficient range.

An arbitrary sized Keccak may be a good fit here. It is implemented in Bouncy Castle, but only for the SHA3 sizes. Neither OpenSSL nor libnss support it yet.

> It's not as easy to describe as "generate a random x coordinate taking
> bytes from HKDF seeded with this particular string, then see if it is
> on the curve, and if so take the smaller y value". I'll implement that
> this weekend.

Except that this is (almost) precisely what the SEC1 encoding hack does. It takes the x coordinate from bytes from the hash. Your proposal (to take the smaller hash value) reduces distribution by one bit. My methodology has an advantage of range here.

The other problem is that standard libraries don't appear to expose similar methods for the type of mechanism you are proposing. This is precisely why I implemented the SEC1 hack: it can be easily implemented by all libraries.

The SEC1 hack isn't dirty because both the point encoding and the hash are octet strings. The only difference is that the SEC1 encoding has some magic bits. We just toggle those. This proposal isn't crazy.

> I've decided to modify the key generation procedure to make it
> integrate better into higher-level protocols,

What in the world does this mean? I'm an experienced protocol implementer and I seriously have no idea what you're talking about here. If you have a proposal, please state it explicitly so it can be properly reviewed.

> but will preserve the current method as an option,

There is no need to do this. Let's agree on a method and all use it. No backwards compatibility is a requirement at this point. I'm happy to update krb5-pake to whatever method we decide on. I just want it to happen soon so that we can start the Kerberos PAKE Preauth Mechanism draft.

> and try to come up with security
> considerations information that drives home how critical it is to pick
> the right one.

The most important consideration is range. All possible x/y values need to be possible outputs of the hash value.

Another idea I had was to have a "version" qualifier. Basically, it is just a counter value used in generating the seed. The purpose is that if a constant is successfully attacked, we can just increment the counter to the next number and get two new seeds.

> Does this seem good to everyone?

It does sound (mostly) good. I'd also like to see the draft include Boneh's (S)PAKE2+ augmented variant.

Nathaniel