Re: [OAUTH-WG] PKCE: SHA256(WAT?)

John Bradley <ve7jtb@ve7jtb.com> Fri, 30 January 2015 23:07 UTC

Return-Path: <ve7jtb@ve7jtb.com>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id AA1181A876B for <oauth@ietfa.amsl.com>; Fri, 30 Jan 2015 15:07:39 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.599
X-Spam-Level:
X-Spam-Status: No, score=-2.599 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HTML_MESSAGE=0.001, MIME_QP_LONG_LINE=0.001, RCVD_IN_DNSWL_LOW=-0.7, 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 3_fCPzGgie2k for <oauth@ietfa.amsl.com>; Fri, 30 Jan 2015 15:07:36 -0800 (PST)
Received: from mail-qa0-f52.google.com (mail-qa0-f52.google.com [209.85.216.52]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id DAC741A8727 for <oauth@ietf.org>; Fri, 30 Jan 2015 15:07:35 -0800 (PST)
Received: by mail-qa0-f52.google.com with SMTP id x12so22136869qac.11 for <oauth@ietf.org>; Fri, 30 Jan 2015 15:07:35 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:content-type:mime-version:subject:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to; bh=QIG+mUkwSR9vlAL+XBe7J+3AcveOl7NPlD79viyAxz0=; b=Yzvl9cTDitgGc1I/TtSZdefiVzRllA+nbC9Z21mT8NIU6m3LinEacpLOPOETfjlekO XtJQIZZlTRvZiqOqiLFGWPTj0qSCrcTSxccNmYZmzQKUwrCR8hMJ30rz7vhTNQqeijda fYrklLc4+JrmAhf+01y53tmPsPBieYJTZPQHXDzsz/5UdhaFLObd5yI8ocnB/GO/avW1 vMow9WsOwvrP86bvOJkX2HOt8gJmkT36ho/AYjTBSKyOIWjBhjkexeawfLnhr1tB/rAq t/kIwbjL/Cq+T4FUEqWtnuBE9RB5vuygj87aIPjBOIatFVyqBD44FRGKrg47Qyzfknen +wkA==
X-Gm-Message-State: ALoCoQm2c3dcAmYfVKFRZUkr+qJbXJRwa/C8vqtWfGNgEriDDsaurbQi2OvWVswqlSCnyoXo6dEr
X-Received: by 10.140.97.7 with SMTP id l7mr13204871qge.66.1422659255030; Fri, 30 Jan 2015 15:07:35 -0800 (PST)
Received: from [192.168.8.100] ([181.202.0.93]) by mx.google.com with ESMTPSA id 77sm11399978qgx.43.2015.01.30.15.07.33 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 30 Jan 2015 15:07:34 -0800 (PST)
Content-Type: multipart/alternative; boundary="Apple-Mail-F173D9F4-EB48-4E71-8A68-1CDAE79F139E"
Mime-Version: 1.0 (1.0)
From: John Bradley <ve7jtb@ve7jtb.com>
X-Mailer: iPhone Mail (12B466)
In-Reply-To: <CA+k3eCSgy+q20eUuaAW1i23_k85RWLVDN9fGeBJYMRNP5RRrWA@mail.gmail.com>
Date: Fri, 30 Jan 2015 20:07:31 -0300
Content-Transfer-Encoding: 7bit
Message-Id: <228CF945-D861-49E5-AFE2-6CB48CC847A0@ve7jtb.com>
References: <CA+k3eCQHZJYJ3mMfdGTdO=S3VVQdU+qhjVz+QsEeobJokNSHEA@mail.gmail.com> <FD9F9F2A-8B32-4A26-95CC-59C8C465A202@sakimura.org> <CA+k3eCRn0xT+_fA0G3Q3OjjH9Lq-2AfC+Mv7Gq8bYnHqH5TFDw@mail.gmail.com> <CABzCy2CWnjmeBGT8hgQY-R9Z6u=UFM8AAvHDr1MV81kJXST9WQ@mail.gmail.com> <CA+k3eCTp3xyRuLdCtd3CK_uaACEOYvwYFb4DBs6Cy7UvVMX_ZA@mail.gmail.com> <EE51DE36-7566-4713-8AE3-9F815FA1EE77@ve7jtb.com> <4E1F6AAD24975D4BA5B1680429673943A2201928@TK5EX14MBXC291.redmond.corp.microsoft.com> <CA+k3eCQe9ZweUeoVD+U0H+fsLkbm73bD5ZT6r-wOxusgrq_1wg@mail.gmail.com> <513A0CDA-514E-4ACD-AE78-574149288F01@ve7jtb.com> <CA+k3eCSgy+q20eUuaAW1i23_k85RWLVDN9fGeBJYMRNP5RRrWA@mail.gmail.com>
To: Brian Campbell <bcampbell@pingidentity.com>
Archived-At: <http://mailarchive.ietf.org/arch/msg/oauth/0m8IzFaNi6NFzvxZHPbl7a4iOjA>
Cc: oauth <oauth@ietf.org>, Naveen Agarwal <naa@google.com>
Subject: Re: [OAUTH-WG] PKCE: SHA256(WAT?)
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: OAUTH WG <oauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/oauth>, <mailto:oauth-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/oauth/>
List-Post: <mailto:oauth@ietf.org>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/oauth>, <mailto:oauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 30 Jan 2015 23:07:40 -0000

Ok I will push out draft 7 to the doc tracker later today. 

Sent from my iPhone

> On Jan 30, 2015, at 6:06 PM, Brian Campbell <bcampbell@pingidentity.com> wrote:
> 
> https://bitbucket.org/Nat/oauth-spop/commits/af9ce76988cd32b334e21c71289721a3bf1c4ff1 looks good to me. Thanks John. 
> 
>> On Fri, Jan 30, 2015 at 1:47 PM, John Bradley <ve7jtb@ve7jtb.com> wrote:
>> OK try that one.
>> 
>>> On Jan 30, 2015, at 5:15 PM, Brian Campbell <bcampbell@pingidentity.com> wrote:
>>> 
>>> I agree with Mike here. Though PKCE only needs the ASCII(STRING) one.
>>> 
>>>> On Fri, Jan 30, 2015 at 12:38 PM, Mike Jones <Michael.Jones@microsoft.com> wrote:
>>>> http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-1.1 uses this notation:
>>>> 
>>>>  
>>>> 
>>>>    UTF8(STRING) denotes the octets of the UTF-8 [RFC3629] representation
>>>> 
>>>>    of STRING, where STRING is a sequence of zero or more Unicode
>>>> 
>>>>    [UNICODE] characters.
>>>> 
>>>>  
>>>> 
>>>>    ASCII(STRING) denotes the octets of the ASCII [RFC20] representation
>>>> 
>>>>    of STRING, where STRING is a sequence of zero or more ASCII
>>>> 
>>>>    characters.
>>>> 
>>>>  
>>>> 
>>>> This is unambiguous and has already been vetted by the IESG and SecDir, so I would use exactly this wording.
>>>> 
>>>>  
>>>> 
>>>> OCTETS(STRING) is ambiguous, since for the same string there are many possible representations as octets, including ASCII, UTF-8, UTF-16, UTF-32, and EBCDIC.
>>>> 
>>>>  
>>>> 
>>>>                                                                 -- Mike
>>>> 
>>>>  
>>>> 
>>>> From: OAuth [mailto:oauth-bounces@ietf.org] On Behalf Of John Bradley
>>>> Sent: Friday, January 30, 2015 11:33 AM
>>>> To: Brian Campbell
>>>> Cc: oauth; Naveen Agarwal
>>>> Subject: Re: [OAUTH-WG] PKCE: SHA256(WAT?)
>>>> 
>>>>  
>>>> 
>>>> Have a look at the latest version I added OCTETS(STRING) to show the conversion.   ASCII(STRING) seemed more confusing by drawing character encoding back in.
>>>> 
>>>>  
>>>> 
>>>> I was tempted to call it a octet array without the terminating NULL of STRING but didn’t want to introduce array.
>>>> 
>>>>  
>>>> 
>>>> Let me know what you think.
>>>> 
>>>>  
>>>> 
>>>> On Jan 30, 2015, at 1:56 PM, Brian Campbell <bcampbell@pingidentity.com> wrote:
>>>> 
>>>>  
>>>> 
>>>> But, while it may be clear to you, what I'm saying here is that it's not clear to a reader/implementer.
>>>> 
>>>> Somehow the conversion from a character string to an octet string needs to be clearly and unambiguously stated. It doesn't have to be the text I suggested but it's not sufficient as it is now.
>>>> 
>>>> Something like this might work, if you don't want to touch the parts in 4.2 and 4.6: "SHA256(STRING) denotes a SHA2 256bit hash [RFC6234] of the octets of the ASCII [RFC0020] representation of STRING."
>>>> 
>>>> An "octet sequence using the url and filename safe Alphabet [...], with length less than 128 characters." is ambiguous. Octets and characters are intermixed with no mention of encoding. But they're not interchangeable.
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>> On Fri, Jan 30, 2015 at 7:15 AM, Nat Sakimura <sakimura@gmail.com> wrote:
>>>> 
>>>> I do not think we need ASCII(). It is quite clear without it, I suppose. 
>>>> 
>>>>  
>>>> 
>>>> In 4.1, I would rather do like: 
>>>> 
>>>>  
>>>> 
>>>>  code_verifier = high entropy cryptographic random 
>>>>    octet sequence using the url and filename safe Alphabet [A-Z] / [a-z]
>>>>    / [0-9] / "-" / "_" from Sec 5 of RFC 4648 [RFC4648], with length
>>>>    less than 128 characters.
>>>> 
>>>>  
>>>> 
>>>> Nat
>>>> 
>>>>  
>>>> 
>>>> 2015-01-30 22:51 GMT+09:00 Brian Campbell <bcampbell@pingidentity.com>:
>>>> 
>>>> That's definitely an improvement (to me anyway).
>>>> 
>>>> Checking that the rest of the document uses those notations appropriately, I think, yields a few other changes. And probably begs for the "ASCII(STRING) denotes the octets of the ASCII representation of STRING" notation/function, or something like it, to be put back in. Those changes might look like the following:
>>>> 
>>>> 
>>>> In 4.1.: 
>>>> 
>>>> OLD:
>>>>    code_verifier = high entropy cryptographic random ASCII [RFC0020]
>>>>    octet sequence using the url and filename safe Alphabet [A-Z] / [a-z]
>>>>    / [0-9] / "-" / "_" from Sec 5 of RFC 4648 [RFC4648], with length
>>>>    less than 128 characters.
>>>> 
>>>> NEW (maybe):
>>>>   code_verifier = high entropy cryptographically strong random STRING
>>>>   using the url and filename safe Alphabet [A-Z] / [a-z]
>>>>    / [0-9] / "-" / "_" from Sec 5 of RFC 4648 [RFC4648], with length
>>>>    less than 128 characters.
>>>> 
>>>> 
>>>> In 4.2.: 
>>>> 
>>>> OLD:
>>>>    S256  "code_challenge" = BASE64URL(SHA256("code_verifier"))
>>>> 
>>>> NEW (maybe):
>>>>    S256  "code_challenge" = BASE64URL(SHA256(ASCII("code_verifier")))
>>>> 
>>>> 
>>>> In 4.6.: 
>>>> 
>>>> OLD:
>>>>    SHA256("code_verifier" ) == BASE64URL-DECODE("code_challenge").
>>>> 
>>>> NEW (maybe):
>>>>    SHA256(ASCII("code_verifier")) == BASE64URL-DECODE("code_challenge").
>>>> 
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>> On Thu, Jan 29, 2015 at 8:37 PM, Nat Sakimura (=nat) <nat@sakimura.org> wrote:
>>>> 
>>>> I take your point, Brian. 
>>>> 
>>>>  
>>>> 
>>>> In our most recent manuscript, STRING is defined inside ASCII(STRING) as 
>>>> 
>>>>  
>>>> 
>>>> STRING is a sequence of zero or more ASCII characters
>>>> 
>>>>  
>>>> 
>>>> but it is kind of circular, and we do not seem to use ASCII(). 
>>>> 
>>>>  
>>>> 
>>>> What about re-writing the section like below? 
>>>> 
>>>>  
>>>> 
>>>> STRING denotes a sequence of zero or more ASCII  [RFC0020] characters. 
>>>> 
>>>> OCTETS denotes a sequence of zero or more octets. 
>>>> 
>>>> BASE64URL(OCTETS) denotes the base64url encoding of OCTETS, per Section 3 producing a ASCII[RFC0020] STRING.
>>>> 
>>>> BASE64URL-DECODE(STRING) denotes the base64url decoding of STRING, per Section 3, producing a sequence of octets.
>>>> 
>>>> SHA256(OCTETS) denotes a SHA2 256bit hash [RFC6234] of OCTETS.
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>> On Jan 30, 2015, at 08:15, Brian Campbell <bcampbell@pingidentity.com> wrote:
>>>> 
>>>>  
>>>> 
>>>> In §2 [1] we've got "SHA256(STRING) denotes a SHA2 256bit hash [RFC6234] of STRING."
>>>> 
>>>> But, in the little cow town where I come from anyway, you hash bits/octets not character strings (BTW, "STRING" isn't defined anywhere but it's kind of implied that it's a string of characters). 
>>>> 
>>>> Should it say something more like "SHA256(STRING) denotes a SHA2 256bit hash [RFC6234] of the octets of the ASCII [RFC0020] representation of STRING."?
>>>> 
>>>> I know it's kind of pedantic but I find it kind of confusing because the code_verifier uses the url and filename safe alphabet, which has me second guessing if SHA256(STRING) actually means a hash of the octet produced by base64url decoding the string.
>>>> 
>>>> Maybe it's just me but, when reading the text, I find the transform process to be much more confusing than I think it needs to be. Removing and clarifying some things will help. I hate to suggest this but maybe an example showing the computation steps on both ends would be helpful?
>>>> 
>>>>  
>>>> 
>>>> Also "UTF8(STRING)" and "ASCII(STRING)" notations are defined in §2 but not used anywhere.
>>>> 
>>>> And §2 also says, "BASE64URL-DECODE(STRING) denotes the base64url decoding of STRING, per Section 3, producing a UTF-8 sequence of octets." But what is a UTF-8 sequence of octets? Isn't it just a sequence octets? The [RFC3629] reference, I think, could be removed.
>>>> 
>>>>  
>>>> 
>>>> [1] https://tools.ietf.org/html/draft-ietf-oauth-spop-06#section-2
>>>> 
>>>>  
>>>> 
>>>> Nat Sakimura
>>>> 
>>>> nat@sakimura.org
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>>  
>>>> 
>>>> 
>>>> 
>>>> 
>>>>  
>>>> 
>>>> --
>>>> 
>>>> Nat Sakimura (=nat)
>>>> 
>>>> Chairman, OpenID Foundation
>>>> http://nat.sakimura.org/
>>>> @_nat_en
>>>> 
>