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

Watson Ladd <watsonbladd@gmail.com> Fri, 13 February 2015 16:04 UTC

Return-Path: <watsonbladd@gmail.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 3A0E81A8744 for <cfrg@ietfa.amsl.com>; Fri, 13 Feb 2015 08:04:46 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2
X-Spam-Level:
X-Spam-Status: No, score=-2 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_FROM=0.001, SPF_PASS=-0.001] 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 sxSfE0N1ZdRK for <cfrg@ietfa.amsl.com>; Fri, 13 Feb 2015 08:04:43 -0800 (PST)
Received: from mail-yk0-x22a.google.com (mail-yk0-x22a.google.com [IPv6:2607:f8b0:4002:c07::22a]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id DE1A41A0358 for <cfrg@irtf.org>; Fri, 13 Feb 2015 08:04:42 -0800 (PST)
Received: by mail-yk0-f170.google.com with SMTP id 10so4160442ykt.1 for <cfrg@irtf.org>; Fri, 13 Feb 2015 08:04:42 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=e4Aur//ic0lRavk1xFOTIe5CJnSRGwf1PWN4pnUfxg8=; b=B2o/SBEuKcWaIqW+3ZmcaojwjUCuqfEOrcV8vdhjWy/xPp9WA9c6+4DgIZV7zUGY9z xwSIVyYapmvimpyc6N8JaZvx1mECGkagaLPzeAAiLISvWul2YyW1amYJyniwlS7P3gFA oc3dl60xiZmxybGGjHb6/RBsRqPsx+i/d33ZcCcZvYZ9E+O9OqAS5T3YxpcfArymURrX m5od1n6NuyuTtLLmPQ8ldhG4yJ5dfrJ1lRNLX0D69hSvo52y45/DVsYqn6TzvqrPLCUG BmwK2iaGcWPm7LkTgsMlAsOj6B2R+iYAUijhHOtgCcrSK6Lo6aE76OOetoC83f7R8/14 kx3g==
MIME-Version: 1.0
X-Received: by 10.170.127.142 with SMTP id t136mr10587038ykb.28.1423843482148; Fri, 13 Feb 2015 08:04:42 -0800 (PST)
Received: by 10.170.126.10 with HTTP; Fri, 13 Feb 2015 08:04:42 -0800 (PST)
In-Reply-To: <1423841441.2447.30.camel@redhat.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> <1302158230.13244609.1423747504306.JavaMail.zimbra@redhat.com> <CACsn0ckioB-h9hiEMj2Vw7dMa6fU8dUVU6p9b+wmOt2sGmJeSw@mail.gmail.com> <1423841441.2447.30.camel@redhat.com>
Date: Fri, 13 Feb 2015 08:04:42 -0800
Message-ID: <CACsn0c=TfX4FxvX62y=CyS3YY+JArqLgfbXp4zQFB+fcKiZqxA@mail.gmail.com>
From: Watson Ladd <watsonbladd@gmail.com>
To: Nathaniel McCallum <npmccallum@redhat.com>
Content-Type: text/plain; charset="UTF-8"
Archived-At: <http://mailarchive.ietf.org/arch/msg/cfrg/n87ttiLwR8fomVi6NWLZLhYKc3o>
Cc: "cfrg@irtf.org" <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 16:04:46 -0000

On Feb 13, 2015 7:30 AM, "Nathaniel McCallum" <npmccallum@redhat.com> wrote:
>
> On Thu, 2015-02-12 at 07:44 -0800, Watson Ladd wrote:
> > On Thu, Feb 12, 2015 at 5:25 AM, Nathaniel McCallum <
> > npmccallum@redhat.com> wrote:
> > >
> > >
> > > ----- 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 think how we generate the points doesn't matter, so I'll follow
> > your suggestion. Is this the list of generated points you sent me
> > earlier?
> >
> > Note that complaints about range etc. don't really matter. For
> > instance, over primes, we just take 2 and 3.
>
> No, it is not the same list. I don't really care about the method that
> is used (mine or another). I just want it to be:
> 1. secure
> 2. easy to implement on all major crypto libraries
> 3. establishing an unambiguous method for future curves

At this point you've sent me four files, one called
SPAKEConstants.java in an email saying it was slightly different from
the previous one, and one also called SPAKEConstants.java accompanied
with two CSV files, showing that both OpenSSL and Bouncycastle
produced the same results. Which one implements the method you
actually want?

What do you mean by secure?

As for point 3, it's worth noting that you haven't dealt with points
not of prime order or the possibility that the curve isn't specified
in Weierstrass form, or doesn't use SEC1 format.

>

> > > > 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.
> >
> > This is about a different issue, which you pointed out. In the
> > current version, K is a shared group element, and the generated K is
> > a hash of K and the values used to generate it. But in some cases we
> > can trust the higher level protocol to do that hashing, such as TLS
> > 1.3. In those cases having to retain the values sent adds complexity.
> >
> > I think it will be clearer when I upload the new version what I mean.
>
> Sure. But I don't see that having anything to do with how we generate
> the constants.

Notice how you started this thread with two comments on the draft? I'm
addressing both of them.

>
> > > > 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.
> >
> > So you would be happy if I mandated hashing the values used to
> > generate K into K?
>
> I'm not talking about hashing K. I'm talking about generating
> constants.
>
> > > > 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.
> >
> > Are you talking about the point generation? Because that isn't
> > actually a requirement.
>
> I'm talking about the M/N constants.

And it's not actually a requirement that we get all possible points.
We just need two points, and a method that isn't "here, take these".

>
> > > 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.
> >
> > If someone can compute a discrete logarithm, you probably shouldn't
> > use that group.
>
> Fair enough.
>
> > > > 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.
> >
> > Despite much work, I have not been able to find a reference. It does
> > appear in a draft book.
>
> I sent him an email asking for a reference. He has not (yet) responded.

Thanks for doing that. Maybe there is a paper that calls it something
different out there?

Bottom line: I'll upload a new version this weekend, and see if that
clears some of this up.

Sincerely,
Watson Ladd

>
> Nathaniel
>