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

Watson Ladd <watsonbladd@gmail.com> Thu, 12 February 2015 15:44 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 38AEF1A9027 for <cfrg@ietfa.amsl.com>; Thu, 12 Feb 2015 07:44:18 -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 sVt9X-DKCH4o for <cfrg@ietfa.amsl.com>; Thu, 12 Feb 2015 07:44:15 -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 167131A8AAB for <cfrg@irtf.org>; Thu, 12 Feb 2015 07:44:15 -0800 (PST)
Received: by mail-yk0-f170.google.com with SMTP id 10so973415ykt.1 for <cfrg@irtf.org>; Thu, 12 Feb 2015 07:44:14 -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:content-transfer-encoding; bh=zClw1rQXhrO+0DLrsjaHGnIIq7wRMnOSM7QVwAnW3DI=; b=HgJXXsNmNguQlZHwyAKXhI9XKEqxhN1bKY3CMHFYkJvOc7b3OuazGuXzjKBtr7KpS/ 3ueJW6E27UYDIzDWMzO+GRiIkMSExhievt/vAVVrlJfs5cCQ91TiCSzKwo2GMZR+giRY 01QCzk3Q5HpG9JMluo15yIu94MbII0yhVjSBZhpxis/zQQFZQ0S4iHR9qwnAHVeoWV+g ffq7Z05+gDMFIM0neZDejPSaAi0xziZ2XpFY74W3S61M8IfedVwTHEMy4tr6hg3lUNxe /pRNaXpua+rmKOGoth3zrD5b8AU5eUoE6FcVFS0Yko25fMikKN6W341qEyUB7RxEjJFT BaZA==
MIME-Version: 1.0
X-Received: by 10.170.187.8 with SMTP id d8mr4998415yke.20.1423755854307; Thu, 12 Feb 2015 07:44:14 -0800 (PST)
Received: by 10.170.126.10 with HTTP; Thu, 12 Feb 2015 07:44:14 -0800 (PST)
In-Reply-To: <1302158230.13244609.1423747504306.JavaMail.zimbra@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>
Date: Thu, 12 Feb 2015 07:44:14 -0800
Message-ID: <CACsn0ckioB-h9hiEMj2Vw7dMa6fU8dUVU6p9b+wmOt2sGmJeSw@mail.gmail.com>
From: Watson Ladd <watsonbladd@gmail.com>
To: Nathaniel McCallum <npmccallum@redhat.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Archived-At: <http://mailarchive.ietf.org/arch/msg/cfrg/19JrYP5rheSK8b-LwdhXEaw7SAc>
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: Thu, 12 Feb 2015 15:44:18 -0000

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.

>
>> 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.

>
>> 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?

>
>> 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.

>
> 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.

>
>> 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.

>
> Nathaniel



-- 
"Those who would give up Essential Liberty to purchase a little
Temporary Safety deserve neither  Liberty nor Safety."
-- Benjamin Franklin