Return-Path: <aaron@parecki.com>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1])
 by ietfa.amsl.com (Postfix) with ESMTP id 234D33A0896
 for <oauth@ietfa.amsl.com>; Wed, 20 May 2020 15:48:39 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.898
X-Spam-Level: 
X-Spam-Status: No, score=-1.898 tagged_above=-999 required=5
 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
 HTML_MESSAGE=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001,
 URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key)
 header.d=parecki-com.20150623.gappssmtp.com
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 Nx38byCpGLCJ for <oauth@ietfa.amsl.com>;
 Wed, 20 May 2020 15:48:34 -0700 (PDT)
Received: from mail-io1-xd2b.google.com (mail-io1-xd2b.google.com
 [IPv6:2607:f8b0:4864:20::d2b])
 (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 796653A088C
 for <oauth@ietf.org>; Wed, 20 May 2020 15:48:34 -0700 (PDT)
Received: by mail-io1-xd2b.google.com with SMTP id f3so5248307ioj.1
 for <oauth@ietf.org>; Wed, 20 May 2020 15:48:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=parecki-com.20150623.gappssmtp.com; s=20150623;
 h=mime-version:references:in-reply-to:from:date:message-id:subject:to
 :cc; bh=KKJFxMrFvJaMFRjLn1wxWQLV7Tur58hRPE46tt3iv0A=;
 b=EJNw2Z3nU/D+2Wanw4XB23IMHC0EH/GGm3W6Zj67N370nNF5NB7lpUCg0YnSMvM8jH
 QMR/kF0i1Jo4Sva1tBV5UhNDTrDUoPD16OoZC1UCZ7F5zx7XGigMMgPZXcWddC7xg+Y0
 UzuhrPlPM1V3nsd+UON5wnnnLXJ7qjbh6qsxkAqJG9iq41ZAeP+WGDLRjVIg/+m+9OY8
 tmfRCnqrDooMxXSfS6w9D/9Yk3PtXFPfBHVo9tiy6gGfRBl27isLtfNLnjUURhs+wS/R
 8Pz4GBOIqHDFi1h0Ps4hOPNBlBINQOz7bVIxo2C9/dnZm5QmAWy55GUXhiIO5KfqxTRO
 8PjQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:mime-version:references:in-reply-to:from:date
 :message-id:subject:to:cc;
 bh=KKJFxMrFvJaMFRjLn1wxWQLV7Tur58hRPE46tt3iv0A=;
 b=YRJvv9SdtGuZMB2XanTlOsGUZkEiTohN8DcGuO5qpvt2wDOYhCRBXrtbqQSX/Jz00j
 zXZtOhzIJclb1fR7um/pwI5EEUu2HpIQMMpo57tAYm7P+5zq7to9RG+q6yv95GgUYia5
 tCEQ4/PRSwU1MDzuw7i+3bEe9C2Gcu8erB//RezuYG6PfY6qun8zrCAhOI1ZuR3d5xTu
 1INkz7WDpHUoRtBR44VpiCvYFzvIY33NNSYGBdx6cbA2cBP80qZHDP6YnlTk+tKdkxuk
 2KqQml+/Jzwtq7+cvjBQmpTabIP8pwccejaZMlFHhfwsDboFJeFlnr0g2IjqVDKyI/B/
 Gy1Q==
X-Gm-Message-State: AOAM530vaMTtkzfEKUTaZpNK7UGvbzsXmMmOkJ2QhbvPladh1+HTje7Z
 ZHNxK8rkdaG63l+FG1BQGkJyFq0NJe4=
X-Google-Smtp-Source: ABdhPJxB6s9IFEO+tez7O3WR0EzgzAVNxq6+5uBZipdTBE0L23L6SpTkPnZn2rDiKfnBF5+MGJ2fmQ==
X-Received: by 2002:a6b:14c9:: with SMTP id 192mr2924412iou.174.1590014912795; 
 Wed, 20 May 2020 15:48:32 -0700 (PDT)
Received: from mail-io1-f49.google.com (mail-io1-f49.google.com.
 [209.85.166.49])
 by smtp.gmail.com with ESMTPSA id u2sm1645583ion.50.2020.05.20.15.48.31
 for <oauth@ietf.org>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Wed, 20 May 2020 15:48:31 -0700 (PDT)
Received: by mail-io1-f49.google.com with SMTP id j8so5152662iog.13
 for <oauth@ietf.org>; Wed, 20 May 2020 15:48:31 -0700 (PDT)
X-Received: by 2002:a6b:d219:: with SMTP id q25mr5415759iob.202.1590014911186; 
 Wed, 20 May 2020 15:48:31 -0700 (PDT)
MIME-Version: 1.0
References: <MN2PR00MB0688FA432C1351809AAABF24F5B90@MN2PR00MB0688.namprd00.prod.outlook.com>
 <67F643A9-47E5-4339-B6B0-E39C7B959EF7@gmail.com>
In-Reply-To: <67F643A9-47E5-4339-B6B0-E39C7B959EF7@gmail.com>
From: Aaron Parecki <aaron@parecki.com>
Date: Wed, 20 May 2020 15:48:20 -0700
X-Gmail-Original-Message-ID: <CAGBSGjqmUmw9O1v0sj4A9_nVMGPxMzCd-cAbB-kR+9dpLmg_ww@mail.gmail.com>
Message-ID: <CAGBSGjqmUmw9O1v0sj4A9_nVMGPxMzCd-cAbB-kR+9dpLmg_ww@mail.gmail.com>
To: Nov Matake <matake@gmail.com>
Cc: Mike Jones <Michael.Jones@microsoft.com>, "oauth@ietf.org" <oauth@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000f80ca305a61c3129"
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/xxH2WsUWce7JkSuEoESqQnERY5w>
Subject: Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.29
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: <https://mailarchive.ietf.org/arch/browse/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: Wed, 20 May 2020 22:48:40 -0000

--000000000000f80ca305a61c3129
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

So if I'm understanding this correctly, it sounds like the AS needs to
reject a token request with code_verifier if the authorization code was
issued in response to a request that did not contain a code_challenge. This
to me sounds like it would be simpler to just say the code_challenge and
code_verifier are always required.

That said, I do understand the previously discussed concerns around
existing OpenID Connect clients.

I believe the text that Daniel proposed is the best of both worlds, and I
support making this change in both OAuth 2.1 and the Security BCP.

Aaron Parecki



On Tue, May 19, 2020 at 9:29 AM Nov Matake <matake@gmail.com> wrote:

> Yes.
>
> The root problem isn=E2=80=99t the mix-use of PKCE and nonce, it=E2=80=99=
s PKCE
> implementation bug.
> Yeah, all PKCE implementation MUST reject such requests, regardless it=E2=
=80=99s
> OAuth 2.1 or 2.0.
>
> (and it=E2=80=99s probably because of PKCE spec=E2=80=99s ambiguity..)
>
> 2020/05/20 1:13=E3=80=81Mike Jones <Michael.Jones@microsoft.com>=E3=81=AE=
=E3=83=A1=E3=83=BC=E3=83=AB:
>
> So it sounds me like the fix is to have servers reject PKCE requests with
> incomplete parameter sets: requests that only contains one of
> code_challenge and code_verified.  Will that eliminate the attack, Nov?
>
>                                                        -- Mike
>
> *From:* OAuth <oauth-bounces@ietf.org> *On Behalf Of *Nov Matake
> *Sent:* Monday, May 18, 2020 11:50 PM
> *To:* Daniel Fett <fett@danielfett.de>
> *Cc:* oauth@ietf.org
> *Subject:* Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
>
> Sure, feel free to add the senario to your post.
>
> FYI:
> my OAuth2 server ruby gem rejects such token requests,
>
> https://github.com/nov/rack-oauth2/blob/master/lib/rack/oauth2/server/ext=
ension/pkce.rb#L28
> and Google also does the same.
> https://gist.github.com/nov/9feba86685bd3b18b4bf7bfb88022046
>
> So I'm guessing such behavior is relatively rare-case, hopefully.
>
> iPad=E3=81=8B=E3=82=89=E9=80=81=E4=BF=A1
>
>
> 2020/05/19 15:43=E3=80=81Daniel Fett <fett@danielfett.de>=E3=81=AE=E3=83=
=A1=E3=83=BC=E3=83=AB:
>
> =EF=BB=BF
> Hi,
>
> Am 19.05.20 um 04:55 schrieb Nov Matake:
>
> I thought the server MUST reject such token requests, but I couldn=E2=80=
=99t find
> such definition in RFC7636...
>
> > The client will send the code, along with a (now not matching)
> code_verifier to the server. The server will ignore the code_verifier (as
> it was not expected) and send back an access token and ID token to the
> client.
>
> https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#noncepk=
ce-sidestep-attack
>
> If the behavior is acceptable by RFC7636, "Nonce/PKCE Sidestep Attack=E2=
=80=9D
> would be possible.
>
> I *think* that there is nothing preventing servers from sometimes using
> PKCE and sometimes using Nonce. I assume that this is out of the scope of
> the existing specifications.
>
> I would be interested to hear how actual implementations handle this in
> practice.
>
>
> Plus, with such AS behavior, CSRF protection using PKCE can also be
> bypassed as below.
> 1. The attacker removes code_challenge from his/her own AuthZ
> Req, receives a non-code_challenge-bound code, and sends it to the victim=
.
> 2. The client receives the attacker=E2=80=99s code from the victim, and s=
ends it
> to the AS w/ the valid code_verifier bound to the victim=E2=80=99s browse=
r session.
> 3. The AS ignores the code_verifier and returns tokens.
>
> If that=E2=80=99s the case, current OAuth 2.0 PKCE implementation can be =
weaker
> than expected..
>
> Excellent point!
>
> Would it be okay if I add that attack to the original post (with credits,
> of course)?
>
> -Daniel
>
>
> nov
>
>
> 2020/05/19 1:54=E3=80=81Daniel Fett <fett@danielfett.de>=E3=81=AE=E3=83=
=A1=E3=83=BC=E3=83=AB:
>
> Hi all,
>
> Talking to Torsten, we realized that providing a generic extension point
> here is probably not a good idea. It is really hard to tell what protects
> you from code injection and what does not, and people might come up with
> all sorts of non-standard and potentially insecure solutions.
>
> Even just for PKCE vs. Nonce, it is not obvious if they provide the same
> level of protection. In an attempt to answer this question, I tried to co=
me
> up with a more systematic analysis of "PKCE vs Nonce". I wrote up my
> results here:
> https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/
>
> Although this is not a formal analysis, I hope that I have covered all
> interesting cases. Please review the text and let me know if I have misse=
d
> something or if there are any mistakes.
>
> The main results are:
>
>    1. In terms of protection against CSRF and code misuse, PKCE and Nonce
>    provide similar levels of security, with a slight advantage for PKCE.
>    2. In practice, a circumvention of both mechanisms, however, is
>    possible if an AS allows a client to choose between PKCE and Nonce and=
 the
>    client makes use of this freedom. I propose to call this attack the
>    Nonce/PKCE Sidestep Attack. =E2=86=92 Please review the attack descrip=
tion in the
>    analysis.
>    3. To avoid the Nonce/PKCE Sidestep Attack, clients must not switch
>    between using only PKCE and only Nonce (but may use both in parallel, =
or
>    switch between using only PKCE and PKCE+Nonce). Authorization servers =
must
>    enforce PKCE unless they know that the client uses Nonce for all of it=
s
>    flows (and checks the Nonce value). The presence of a nonce parameter =
in
>    the authorization request is not sufficient to determine if a client
>    actually checks the nonce claim in the ID token.
>
> As you can see, already having two more-or-less well-understood mechanism=
s
> is hard enough to wrap your head around from a security standpoint. We
> should therefore make PKCE the default and Nonce an option for backwards
> compatibility.
> To this end, I would like to propose the follwing strawman, based on
> Torsten's and Aaron's suggestions:
> An AS MUST reject requests without a code_challenge from public
> clients, and MUST reject such requests from other clients unless there
> is reasonable assurance that the client mitigates authorization code
> injection using the OpenID Connect Nonce mechanism and that this
> mitigation is used for all interactions with the client. See section
> 9.7 for details.
>
> Section 9.7:
>
> Clients MUST prevent injection (replay) of authorization codes into
> the authorization response by attackers. The use of the
> `code_challenge` parameter is RECOMMENDED to this end. For
> confidential clients, the OpenID Connect `nonce` parameter and ID
> Token Claim {{OpenID}} MAY be used instead of or in addition to the
> `code_challenge` parameter for this purpose. The `code_challenge` or
> OpenID Connect `nonce` value MUST be transaction-specific and securely
> bound to the client and the user agent in which the transaction was
> started.
>
> If the OpenID Connect `nonce` is used to mitigate authorization code
> injection instead of `code_challenge`, client and authorization server
> MUST ensure that the mitigation is applied to every interaction with
> the client and that the client cannot switch between `code_challenge`
> and `nonce`. For example, the presence of a `nonce` parameter in the
> authorization request is not sufficient to determine that the
> `code_verifier` check can be skipped.
>
> Of course, we need to adapt the wording in the Security BCP accordingly.
> -Daniel
>
>
> Am 15.05.20 um 01:01 schrieb Mike Jones:
>
> I agree with Nov that obscuring the language in 9.7 would be a disservice=
 to developers.
>
>
>
> The Security BCP, which has already going the WGLC, explicitly calls out =
the use of nonce as part of the best practices.  OAuth 2.1 should do no les=
s.
>
>
>
> The 9.7 language that Aaron proposed was the result of many people's cont=
ributions and a vigorous discussion.  Let's publish the next version of 2.1=
 with that language intact, as I believe it represents at least a local poi=
nt of hard-won consensus.  Let's get that language into the record of draft=
s.
>
>
>
> There's always time to debate it and change it later in subsequent drafts=
, but let's not now lose what it took a lot of effort to achieve.
>
>
>
>     Thanks,
>
>     -- Mike
>
>
>
> -----Original Message-----
>
> From: Nov Matake <matake@gmail.com> <matake@gmail.com>
>
> Sent: Thursday, May 14, 2020 3:18 AM
>
> To: Torsten Lodderstedt <torsten@lodderstedt.net> <torsten@lodderstedt.ne=
t>
>
> Cc: OAuth WG <oauth@ietf.org> <oauth@ietf.org>; Mike Jones <Michael.Jones=
@microsoft.com> <Michael.Jones@microsoft.com>
>
> Subject: Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
>
>
>
> There is no specific mechanism right now.
>
> But future developers won=E2=80=99t be able to read the reason why the ex=
tension point is given only for confidential clients.
>
>
>
> On May 14, 2020, at 18:32, Torsten Lodderstedt <torsten@lodderstedt.net> =
<torsten@lodderstedt.net> wrote:
>
>
>
> Are you aware of any suitable mechanism? I=E2=80=99m asking since from my=
 perspective this clause is mainly intended to allow existing OpenID Connec=
t deployments to use nonce instead of PKCE in combination with OAuth 2.1. I=
t=E2=80=99s a compromise. I think we should not encourage others to invent =
their own OAuth security mechanisms.
>
>
>
> On 14. May 2020, at 09:37, Nov Matake <matake@gmail.com> <matake@gmail.co=
m> wrote:
>
>
>
> Hi,
>
>
>
> Why not allowing public clients use "other suitable mechanisms=E2=80=9D t=
hen?
>
> OAuth WG can allow both type of clients do so, then OIDF will define nonc=
e as the alternative only for confidential clients.
>
>
>
> 2020/05/14 15:56=E3=80=81Torsten Lodderstedt <torsten=3D40lodderstedt.net=
@dmarc.ietf.org> <torsten=3D40lodderstedt.net@dmarc.ietf.org>=E3=81=AE=E3=
=83=A1=E3=83=BC=E3=83=AB:
>
>
>
> Hi all,
>
>
>
> I would also like to thank everybody for the substantial discussion.
>
>
>
> The proposed change for Section 4.1.2.1 works for me (as already stated).=
 I=E2=80=99m not fully comfortable with the proposed change for Section 9.7=
 for the following reasons:
>
>
>
> - The text is weaker than Section 4.1.2.1 since it RECOMMENDS use of PKCE=
 instead of requiring it (with a well-defined exception).
>
> - Given the latest findings re nonce I don=E2=80=99t feel comfortable wit=
h recommending any mechanism that this WG is not responsible for and thus d=
id not conduct the security threat analysis for. I think the better way for=
 us as WG is to define the extension point for other mechanisms. The OpenID=
 Foundation (or any other body) can then fill in and issue a statement that=
 nonce (or another suitable mechanism) fulfils the requirements of the exte=
nsion point.
>
>
>
> Based on this considerations, I propose the following text for Section 9.=
7:
>
>
>
> Clients MUST prevent injection (replay) of authorization codes into
>
> the authorization response by attackers. Public clients MUST use the
>
> "code_challenge=E2=80=9D with a transaction-specific value that is secure=
ly
>
> bound to the client and the user agent in which the transaction was
>
> started. Confidential clients MUST use the =E2=80=9Ccode_challenge=E2=80=
=9D in the
>
> same way or other suitable mechanisms to mitigate authorization code
>
> injection.
>
>
>
> This text follows the logic in Section 4.1.2.1 and allows use of the nonc=
e for confidential clients.
>
>
>
> best regards,
>
> Torsten.
>
>
>
> On 12. May 2020, at 02:21, Mike Jones <Michael.Jones=3D40microsoft.com@dm=
arc.ietf.org> <Michael.Jones=3D40microsoft.com@dmarc.ietf.org> wrote:
>
>
>
> That works for me.  Thanks all for the useful back-and-forth that got us =
to this point of clarity.  I suspect many of us learned things along the wa=
y; I know that I did!
>
>
>
>                                                     Cheers,
>
>                                                     -- Mike
>
>
>
> From: Aaron Parecki <aaron@parecki.com> <aaron@parecki.com>
>
> Sent: Monday, May 11, 2020 4:55 PM
>
> To: OAuth WG <oauth@ietf.org> <oauth@ietf.org>
>
> Cc: Neil Madden <neil.madden@forgerock.com> <neil.madden@forgerock.com>; =
Mike Jones
>
> <Michael.Jones@microsoft.com> <Michael.Jones@microsoft.com>
>
> Subject: Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
>
>
>
> Thank you Neil.
>
>
>
> To address Mike's concerns in the previous threads, I would like to also =
update section 9.7 with the following text:
>
>
>
> Clients MUST prevent injection (replay) of authorization codes into
>
> the authorization response by attackers. The use of the
>
> `code_challenge` parameter is RECOMMENDED to this end. For
>
> confidential clients, the OpenID Connect `nonce` parameter and ID
>
> Token Claim {{OpenID}} MAY be used instead of or in addition to the
>
> `code_challenge` parameter for this purpose. The `code_challenge`
>
> or OpenID Connect `nonce` value MUST be transaction-specific and
>
> securely bound to the client and the user agent in which the transaction =
was started.
>
>
>
> This change better clarifies the specific circumstances under which the "=
nonce" parameter is sufficient to protect against authorization code inject=
ion.
>
>
>
> Aaron Parecki
>
>
>
> On Mon, May 11, 2020 at 11:55 AM Neil Madden <neil.madden@forgerock.com> =
<neil.madden@forgerock.com> wrote:
>
> I am happy with this proposed wording. Thanks for updating it.
>
>
>
> =E2=80=94 Neil
>
>
>
>
>
> On 11 May 2020, at 19:52, Aaron Parecki <aaron@parecki.com> <aaron@pareck=
i.com> wrote:
>
>
>
> Thanks for the lively discussion around PKCE in OAuth 2.1 everyone!
>
>
>
> We would like to propose the following text, which is a slight variation =
from the text Neil proposed. This would replace the paragraph in 4.1.2.1 (h=
ttps://tools.ietf.org/html/draft-parecki-oauth-v2-1-02#section-4.1.2.1) tha=
t begins with "If the client does not send the "code_challenge" in the requ=
est..."
>
>
>
> "An AS MUST reject requests without a code_challenge from public clients,=
 and MUST reject such requests from other clients unless there is reasonabl=
e assurance that the client mitigates authorization code injection in other=
 ways.. See section 9.7 for details."
>
>
>
> Section 9.7 is where the nuances of PKCE vs nonce are described.
>
>
>
> As Neil described, we believe this will allow ASs to support both OAuth 2=
.0 and 2.1 clients simultaneously. The change from Neil's text is the clari=
fication of which threats, and changing to MUST instead of SHOULD. The "MUS=
T...unless" is more specific than "SHOULD", and since we are already descri=
bing the explicit exception to the rule, it's more clear as a MUST here.
>
>
>
> Aaron Parecki
>
>
>
>
>
>
>
>
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
>
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth
>
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth
>

--000000000000f80ca305a61c3129
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">So if I&#39;m understanding this correctly, it sounds like=
 the AS needs to reject a token request with code_verifier if the authoriza=
tion code was issued in response to a request that did not contain a code_c=
hallenge. This to me sounds like it would be simpler to just say the code_c=
hallenge and code_verifier are always required.<div><br></div><div>That sai=
d, I do understand the previously discussed concerns around existing OpenID=
 Connect clients.</div><div><br></div><div>I believe the text that Daniel p=
roposed is the best of both worlds, and I support making this change in bot=
h OAuth 2.1 and the Security BCP.</div><div><br></div><div>Aaron Parecki<br=
><div><br><div><br></div></div></div></div><br><div class=3D"gmail_quote"><=
div dir=3D"ltr" class=3D"gmail_attr">On Tue, May 19, 2020 at 9:29 AM Nov Ma=
take &lt;<a href=3D"mailto:matake@gmail.com">matake@gmail.com</a>&gt; wrote=
:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.=
8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style=3D"=
overflow-wrap: break-word;">Yes.<div><br><div>The root problem isn=E2=80=99=
t the mix-use of PKCE and nonce, it=E2=80=99s PKCE implementation bug.</div=
><div><span style=3D"color:rgb(0,0,0)">Yeah, all PKCE implementation MUST r=
eject such requests, regardless it=E2=80=99s OAuth 2.1 or 2.0.</span></div>=
<div><span style=3D"color:rgb(0,0,0)"><br></span></div><div><font color=3D"=
#000000"><span>(and it=E2=80=99s=C2=A0</span></font><span style=3D"color:rg=
b(0,0,0)">probably</span>=C2=A0<span style=3D"color:rgb(0,0,0)">because of =
PKCE spec=E2=80=99s ambiguity..)</span></div><div><div><br><blockquote type=
=3D"cite"><div>2020/05/20 1:13=E3=80=81Mike Jones &lt;<a href=3D"mailto:Mic=
hael.Jones@microsoft.com" target=3D"_blank">Michael.Jones@microsoft.com</a>=
&gt;=E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB:</div><br><div><div style=3D"font-=
family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;=
font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;t=
ext-transform:none;white-space:normal;word-spacing:0px;text-decoration:none=
"><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,=
sans-serif"><span style=3D"color:rgb(0,32,96)">So it sounds me like the fix=
 is to have servers reject PKCE requests with incomplete parameter sets: re=
quests that only contains one of code_challenge and code_verified.=C2=A0 Wi=
ll that eliminate the attack, Nov?<u></u><u></u></span></div><div style=3D"=
margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif"><spa=
n style=3D"color:rgb(0,32,96)"><u></u>=C2=A0<u></u></span></div><div style=
=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">=
<span style=3D"color:rgb(0,32,96)">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 -- Mike<u></u>=
<u></u></span></div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;fo=
nt-family:Calibri,sans-serif"><span style=3D"color:rgb(0,32,96)"><u></u>=C2=
=A0<u></u></span></div><div><div style=3D"border-style:solid none none;bord=
er-top-width:1pt;border-top-color:rgb(225,225,225);padding:3pt 0in 0in"><di=
v style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-=
serif"><b>From:</b><span>=C2=A0</span>OAuth &lt;<a href=3D"mailto:oauth-bou=
nces@ietf.org" style=3D"color:blue;text-decoration:underline" target=3D"_bl=
ank">oauth-bounces@ietf.org</a>&gt;<span>=C2=A0</span><b>On Behalf Of<span>=
=C2=A0</span></b>Nov Matake<br><b>Sent:</b><span>=C2=A0</span>Monday, May 1=
8, 2020 11:50 PM<br><b>To:</b><span>=C2=A0</span>Daniel Fett &lt;<a href=3D=
"mailto:fett@danielfett.de" style=3D"color:blue;text-decoration:underline" =
target=3D"_blank">fett@danielfett.de</a>&gt;<br><b>Cc:</b><span>=C2=A0</spa=
n><a href=3D"mailto:oauth@ietf.org" style=3D"color:blue;text-decoration:und=
erline" target=3D"_blank">oauth@ietf.org</a><br><b>Subject:</b><span>=C2=A0=
</span>Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1<u></u><u></=
u></div></div></div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;fo=
nt-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></div><div><div style=3D"=
margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">Sure=
, feel free to add the senario to your post.<u></u><u></u></div></div><div>=
<div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sa=
ns-serif"><u></u>=C2=A0<u></u></div></div><div style=3D"margin:0in 0in 0.00=
01pt;font-size:11pt;font-family:Calibri,sans-serif">FYI:<u></u><u></u></div=
><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,s=
ans-serif">my OAuth2 server ruby gem rejects such token requests,<u></u><u>=
</u></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-fa=
mily:Calibri,sans-serif"><a href=3D"https://github.com/nov/rack-oauth2/blob=
/master/lib/rack/oauth2/server/extension/pkce.rb#L28" style=3D"color:blue;t=
ext-decoration:underline" target=3D"_blank">https://github.com/nov/rack-oau=
th2/blob/master/lib/rack/oauth2/server/extension/pkce.rb#L28</a><u></u><u><=
/u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;fo=
nt-family:Calibri,sans-serif">and Google also does the same.<u></u><u></u><=
/div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-f=
amily:Calibri,sans-serif"><a href=3D"https://gist.github.com/nov/9feba86685=
bd3b18b4bf7bfb88022046" style=3D"color:blue;text-decoration:underline" targ=
et=3D"_blank">https://gist.github.com/nov/9feba86685bd3b18b4bf7bfb88022046<=
/a><u></u><u></u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;fon=
t-size:11pt;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></div></div=
><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Cali=
bri,sans-serif">So I&#39;m guessing such behavior is relatively rare-case, =
hopefully.<u></u><u></u></div></div><div style=3D"margin:0in 0in 0.0001pt;f=
ont-size:11pt;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></div><di=
v><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,=
sans-serif">iPad<span style=3D"font-family:&quot;MS Gothic&quot;">=E3=81=8B=
=E3=82=89=E9=80=81=E4=BF=A1</span><u></u><u></u></div></div><div><div style=
=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">=
<br><br><u></u><u></u></div><blockquote style=3D"margin-top:5pt;margin-bott=
om:5pt"><p class=3D"MsoNormal" style=3D"margin:0in 0in 12pt;font-size:11pt;=
font-family:Calibri,sans-serif">2020/05/19 15:43<span style=3D"font-family:=
&quot;MS Gothic&quot;">=E3=80=81</span>Daniel Fett &lt;<a href=3D"mailto:fe=
tt@danielfett.de" style=3D"color:blue;text-decoration:underline" target=3D"=
_blank">fett@danielfett.de</a>&gt;<span style=3D"font-family:&quot;MS Gothi=
c&quot;">=E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB</span>:<u></u><u></u></p></bl=
ockquote></div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-fa=
mily:Calibri,sans-serif">=EF=BB=BF<span>=C2=A0</span><u></u><u></u></div><d=
iv><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri=
,sans-serif">Hi,<u></u><u></u></div></div><div><div style=3D"margin:0in 0in=
 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></=
u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;fon=
t-family:Calibri,sans-serif">Am 19.05.20 um 04:55 schrieb Nov Matake:<u></u=
><u></u></div></div><blockquote style=3D"margin-top:5pt;margin-bottom:5pt">=
<div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sa=
ns-serif">I thought the server MUST reject such token requests, but I could=
n=E2=80=99t find such definition in RFC7636...<u></u><u></u></div><div><div=
><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,s=
ans-serif"><u></u>=C2=A0<u></u></div></div><div><div><div style=3D"margin:0=
in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">&gt;=C2=A0Th=
e client will send the code, along with a (now not matching) code_verifier =
to the server. The server will ignore the code_verifier (as it was not expe=
cted) and send back an access token and ID token to the client.<u></u><u></=
u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;fon=
t-family:Calibri,sans-serif"><a href=3D"https://danielfett.de/2020/05/16/pk=
ce-vs-nonce-equivalent-or-not/#noncepkce-sidestep-attack" style=3D"color:bl=
ue;text-decoration:underline" target=3D"_blank">https://danielfett.de/2020/=
05/16/pkce-vs-nonce-equivalent-or-not/#noncepkce-sidestep-attack</a><u></u>=
<u></u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11p=
t;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></div></div><div><div=
><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,s=
ans-serif">If the behavior is acceptable by RFC7636, &quot;Nonce/PKCE Sides=
tep Attack=E2=80=9D would be possible.<u></u><u></u></div></div></div></div=
></div></blockquote><p>I *think* that there is nothing preventing servers f=
rom sometimes using PKCE and sometimes using Nonce. I assume that this is o=
ut of the scope of the existing specifications.<u></u><u></u></p><p>I would=
 be interested to hear how actual implementations handle this in practice.<=
u></u><u></u></p><blockquote style=3D"margin-top:5pt;margin-bottom:5pt"><di=
v><div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-famil=
y:Calibri,sans-serif"><u></u>=C2=A0<u></u></div></div><div><div style=3D"ma=
rgin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">Plus, =
with such AS behavior, CSRF protection using PKCE can also be bypassed as b=
elow.<u></u><u></u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;f=
ont-size:11pt;font-family:Calibri,sans-serif">1. The attacker removes code_=
challenge from his/her own AuthZ Req,=C2=A0receives=C2=A0a non-code_challen=
ge-bound code, and sends it to the victim.<u></u><u></u></div></div><div><d=
iv style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans=
-serif">2. The client receives the attacker=E2=80=99s code from the victim,=
 and sends it to the AS w/ the valid code_verifier bound to the victim=E2=
=80=99s browser session.<u></u><u></u></div></div><div><div style=3D"margin=
:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">3. The AS =
ignores the code_verifier and returns tokens.<u></u><u></u></div></div><div=
><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,s=
ans-serif"><u></u>=C2=A0<u></u></div></div><div><div style=3D"margin:0in 0i=
n 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">If that=E2=80=99s=
 the case, current OAuth 2.0 PKCE implementation can be weaker than expecte=
d..<u></u><u></u></div></div></div></div></blockquote><p>Excellent point!<u=
></u><u></u></p><p>Would it be okay if I add that attack to the original po=
st (with credits, of course)?<u></u><u></u></p><p>-Daniel<u></u><u></u></p>=
<blockquote style=3D"margin-top:5pt;margin-bottom:5pt"><div><div><div><div =
style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-se=
rif"><u></u>=C2=A0<u></u></div></div><div><div style=3D"margin:0in 0in 0.00=
01pt;font-size:11pt;font-family:Calibri,sans-serif">nov<u></u><u></u></div>=
</div><div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-f=
amily:Calibri,sans-serif"><br><br><u></u><u></u></div><blockquote style=3D"=
margin-top:5pt;margin-bottom:5pt"><div><div style=3D"margin:0in 0in 0.0001p=
t;font-size:11pt;font-family:Calibri,sans-serif">2020/05/19 1:54<span style=
=3D"font-family:&quot;MS Gothic&quot;">=E3=80=81</span>Daniel Fett &lt;<a h=
ref=3D"mailto:fett@danielfett.de" style=3D"color:blue;text-decoration:under=
line" target=3D"_blank">fett@danielfett.de</a>&gt;<span style=3D"font-famil=
y:&quot;MS Gothic&quot;">=E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB</span>:<u></u=
><u></u></div></div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;fo=
nt-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></div><div><div><div><div=
 style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-s=
erif">Hi all,<u></u><u></u></div></div><div><div style=3D"margin:0in 0in 0.=
0001pt;font-size:11pt;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></u><=
/div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-f=
amily:Calibri,sans-serif">Talking to Torsten, we realized that providing a =
generic extension point here is probably not a good idea. It is really hard=
 to tell what protects you from code injection and what does not, and peopl=
e might come up with all sorts of non-standard and potentially insecure sol=
utions.<span>=C2=A0</span><u></u><u></u></div></div><div><div style=3D"marg=
in:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif"><u></u>=
=C2=A0<u></u></div></div><div><div style=3D"margin:0in 0in 0.0001pt;font-si=
ze:11pt;font-family:Calibri,sans-serif">Even just for PKCE vs. Nonce, it is=
 not obvious if they provide the same level of protection. In an attempt to=
 answer this question, I tried to come up with a more systematic analysis o=
f &quot;PKCE vs Nonce&quot;. I wrote up my results here:<u></u><u></u></div=
></div><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-famil=
y:Calibri,sans-serif"><a href=3D"https://danielfett.de/2020/05/16/pkce-vs-n=
once-equivalent-or-not/" style=3D"color:blue;text-decoration:underline" tar=
get=3D"_blank">https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or=
-not/</a><u></u><u></u></div></div><div style=3D"margin:0in 0in 0.0001pt;fo=
nt-size:11pt;font-family:Calibri,sans-serif"><br>Although this is not a for=
mal analysis, I hope that I have covered all interesting cases. Please revi=
ew the text and let me know if I have missed something or if there are any =
mistakes.<br><br>The main results are:<u></u><u></u></div><ol start=3D"1" t=
ype=3D"1" style=3D"margin-bottom:0in"><li class=3D"MsoNormal" style=3D"marg=
in:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">In terms=
 of protection against CSRF and code misuse, PKCE and Nonce provide similar=
 levels of security, with a slight advantage for PKCE.<u></u><u></u></li><l=
i class=3D"MsoNormal" style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-=
family:Calibri,sans-serif">In practice, a circumvention of both mechanisms,=
 however, is possible if an AS allows a client to choose between PKCE and N=
once and the client makes use of this freedom. I propose to call this attac=
k the Nonce/PKCE Sidestep Attack. =E2=86=92 Please review the attack descri=
ption in the analysis.<u></u><u></u></li><li class=3D"MsoNormal" style=3D"m=
argin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">To av=
oid the Nonce/PKCE Sidestep Attack, clients must not switch between using o=
nly PKCE and only Nonce (but may use both in parallel, or switch between us=
ing only PKCE and PKCE+Nonce). Authorization servers must enforce PKCE unle=
ss they know that the client uses Nonce for all of its flows (and checks th=
e Nonce value). The presence of a nonce parameter in the authorization requ=
est is not sufficient to determine if a client actually checks the nonce cl=
aim in the ID token.<u></u><u></u></li></ol><div style=3D"margin:0in 0in 0.=
0001pt;font-size:11pt;font-family:Calibri,sans-serif">As you can see, alrea=
dy having two more-or-less well-understood mechanisms is hard enough to wra=
p your head around from a security standpoint. We should therefore make PKC=
E the default and Nonce an option for backwards compatibility.<u></u><u></u=
></div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Cal=
ibri,sans-serif">To this end, I would like to propose the follwing strawman=
, based on Torsten&#39;s and Aaron&#39;s suggestions:<u></u><u></u></div><d=
iv style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans=
-serif"><tt style=3D"font-family:&quot;Courier New&quot;"><span style=3D"fo=
nt-size:10pt">An AS MUST reject requests without a code_challenge from publ=
ic</span></tt><span style=3D"font-size:10pt;font-family:&quot;Courier New&q=
uot;"><br><tt style=3D"font-family:&quot;Courier New&quot;">clients, and MU=
ST reject such requests from other clients unless there</tt><br><tt style=
=3D"font-family:&quot;Courier New&quot;">is reasonable assurance that the c=
lient mitigates authorization code</tt><br><tt style=3D"font-family:&quot;C=
ourier New&quot;">injection using the OpenID Connect Nonce mechanism and th=
at this</tt><br><tt style=3D"font-family:&quot;Courier New&quot;">mitigatio=
n is used for all interactions with the client. See section</tt><br><tt sty=
le=3D"font-family:&quot;Courier New&quot;">9.7 for details.</tt></span><br>=
<br>Section 9.7:<br><br><tt style=3D"font-family:&quot;Courier New&quot;"><=
span style=3D"font-size:10pt">Clients MUST prevent injection (replay) of au=
thorization codes into</span></tt><span style=3D"font-size:10pt;font-family=
:&quot;Courier New&quot;"><br><tt style=3D"font-family:&quot;Courier New&qu=
ot;">the authorization response by attackers. The use of the</tt><br><tt st=
yle=3D"font-family:&quot;Courier New&quot;">`code_challenge` parameter is R=
ECOMMENDED to this end. For</tt><br><tt style=3D"font-family:&quot;Courier =
New&quot;">confidential clients, the OpenID Connect `nonce` parameter and I=
D</tt><br><tt style=3D"font-family:&quot;Courier New&quot;">Token Claim {{O=
penID}} MAY be used instead of or in addition to the</tt><br><tt style=3D"f=
ont-family:&quot;Courier New&quot;">`code_challenge` parameter for this pur=
pose. The `code_challenge` or</tt><br><tt style=3D"font-family:&quot;Courie=
r New&quot;">OpenID Connect `nonce` value MUST be transaction-specific and =
securely</tt><br><tt style=3D"font-family:&quot;Courier New&quot;">bound to=
 the client and the user agent in which the transaction was</tt><br><tt sty=
le=3D"font-family:&quot;Courier New&quot;">started.</tt><br><br><tt style=
=3D"font-family:&quot;Courier New&quot;">If the OpenID Connect `nonce` is u=
sed to mitigate authorization code</tt><br><tt style=3D"font-family:&quot;C=
ourier New&quot;">injection instead of `code_challenge`, client and authori=
zation server</tt><br><tt style=3D"font-family:&quot;Courier New&quot;">MUS=
T ensure that the mitigation is applied to every interaction with</tt><br><=
tt style=3D"font-family:&quot;Courier New&quot;">the client and that the cl=
ient cannot switch between `code_challenge`</tt><br><tt style=3D"font-famil=
y:&quot;Courier New&quot;">and `nonce`. For example, the presence of a `non=
ce` parameter in the</tt><br><tt style=3D"font-family:&quot;Courier New&quo=
t;">authorization request is not sufficient to determine that the</tt><br><=
tt style=3D"font-family:&quot;Courier New&quot;">`code_verifier` check can =
be skipped.</tt></span><u></u><u></u></div><div style=3D"margin:0in 0in 0.0=
001pt;font-size:11pt;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></=
div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibr=
i,sans-serif">Of course, we need to adapt the wording in the Security BCP a=
ccordingly.<u></u><u></u></div><div style=3D"margin:0in 0in 0.0001pt;font-s=
ize:11pt;font-family:Calibri,sans-serif">-Daniel<u></u><u></u></div><div st=
yle=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-seri=
f"><u></u>=C2=A0<u></u></div><div><div style=3D"margin:0in 0in 0.0001pt;fon=
t-size:11pt;font-family:Calibri,sans-serif"><u></u>=C2=A0<u></u></div></div=
><div><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:Cali=
bri,sans-serif">Am 15.05.20 um 01:01 schrieb Mike Jones:<u></u><u></u></div=
></div><blockquote style=3D"margin-top:5pt;margin-bottom:5pt"><pre style=3D=
"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;=
">I agree with Nov that obscuring the language in 9.7 would be a disservice=
 to developers.<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;fo=
nt-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre=
><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Cou=
rier New&quot;">The Security BCP, which has already going the WGLC, explici=
tly calls out the use of nonce as part of the best practices.=C2=A0 OAuth 2=
.1 should do no less.<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.000=
1pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u=
></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&qu=
ot;Courier New&quot;">The 9.7 language that Aaron proposed was the result o=
f many people&#39;s contributions and a vigorous discussion.=C2=A0 Let&#39;=
s publish the next version of 2.1 with that language intact, as I believe i=
t represents at least a local point of hard-won consensus.=C2=A0 Let&#39;s =
get that language into the record of drafts.<u></u><u></u></pre><pre style=
=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&qu=
ot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-s=
ize:10pt;font-family:&quot;Courier New&quot;">There&#39;s always time to de=
bate it and change it later in subsequent drafts, but let&#39;s not now los=
e what it took a lot of effort to achieve.<u></u><u></u></pre><pre style=3D=
"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;=
"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size=
:10pt;font-family:&quot;Courier New&quot;">    Thanks,<u></u><u></u></pre><=
pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Couri=
er New&quot;">    -- Mike<u></u><u></u></pre><pre style=3D"margin:0in 0in 0=
.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u=
></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family=
:&quot;Courier New&quot;">-----Original Message-----<u></u><u></u></pre><pr=
e style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier=
 New&quot;">From: Nov Matake <a href=3D"mailto:matake@gmail.com" style=3D"c=
olor:blue;text-decoration:underline" target=3D"_blank">&lt;matake@gmail.com=
&gt;</a> <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-siz=
e:10pt;font-family:&quot;Courier New&quot;">Sent: Thursday, May 14, 2020 3:=
18 AM<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10=
pt;font-family:&quot;Courier New&quot;">To: Torsten Lodderstedt <a href=3D"=
mailto:torsten@lodderstedt.net" style=3D"color:blue;text-decoration:underli=
ne" target=3D"_blank">&lt;torsten@lodderstedt.net&gt;</a><u></u><u></u></pr=
e><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Co=
urier New&quot;">Cc: OAuth WG <a href=3D"mailto:oauth@ietf.org" style=3D"co=
lor:blue;text-decoration:underline" target=3D"_blank">&lt;oauth@ietf.org&gt=
;</a>; Mike Jones <a href=3D"mailto:Michael.Jones@microsoft.com" style=3D"c=
olor:blue;text-decoration:underline" target=3D"_blank">&lt;Michael.Jones@mi=
crosoft.com&gt;</a><u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001p=
t;font-size:10pt;font-family:&quot;Courier New&quot;">Subject: Re: [OAUTH-W=
G] proposed resolution for PKCE in OAuth 2.1<u></u><u></u></pre><pre style=
=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&qu=
ot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-s=
ize:10pt;font-family:&quot;Courier New&quot;">There is no specific mechanis=
m right now.<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-=
size:10pt;font-family:&quot;Courier New&quot;">But future developers won=E2=
=80=99t be able to read the reason why the extension point is given only fo=
r confidential clients.<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0=
001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u><=
/u></pre><blockquote style=3D"margin-top:5pt;margin-bottom:5pt"><pre style=
=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&qu=
ot;">On May 14, 2020, at 18:32, Torsten Lodderstedt <a href=3D"mailto:torst=
en@lodderstedt.net" style=3D"color:blue;text-decoration:underline" target=
=3D"_blank">&lt;torsten@lodderstedt.net&gt;</a> wrote:<u></u><u></u></pre><=
pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Couri=
er New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001=
pt;font-size:10pt;font-family:&quot;Courier New&quot;">Are you aware of any=
 suitable mechanism? I=E2=80=99m asking since from my perspective this clau=
se is mainly intended to allow existing OpenID Connect deployments to use n=
once instead of PKCE in combination with OAuth 2.1. It=E2=80=99s a compromi=
se. I think we should not encourage others to invent their own OAuth securi=
ty mechanisms. <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;fo=
nt-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre=
><blockquote style=3D"margin-top:5pt;margin-bottom:5pt"><pre style=3D"margi=
n:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">On 1=
4. May 2020, at 09:37, Nov Matake <a href=3D"mailto:matake@gmail.com" style=
=3D"color:blue;text-decoration:underline" target=3D"_blank">&lt;matake@gmai=
l.com&gt;</a> wrote:<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001=
pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u>=
</pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quo=
t;Courier New&quot;">Hi,<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.=
0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u>=
</u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:=
&quot;Courier New&quot;">Why not allowing public clients use &quot;other su=
itable mechanisms=E2=80=9D then?<u></u><u></u></pre><pre style=3D"margin:0i=
n 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">OAuth WG=
 can allow both type of clients do so, then OIDF will define nonce as the a=
lternative only for confidential clients.<u></u><u></u></pre><pre style=3D"=
margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"=
><u></u>=C2=A0<u></u></pre><blockquote style=3D"margin-top:5pt;margin-botto=
m:5pt"><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&qu=
ot;Courier New&quot;">2020/05/14 15:56<span style=3D"font-family:&quot;MS G=
othic&quot;">=E3=80=81</span>Torsten Lodderstedt <a href=3D"mailto:torsten=
=3D40lodderstedt.net@dmarc.ietf.org" style=3D"color:blue;text-decoration:un=
derline" target=3D"_blank">&lt;torsten=3D40lodderstedt.net@dmarc.ietf.org&g=
t;</a><span style=3D"font-family:&quot;MS Gothic&quot;">=E3=81=AE=E3=83=A1=
=E3=83=BC=E3=83=AB</span>:<u></u><u></u></pre><pre style=3D"margin:0in 0in =
0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<=
u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-famil=
y:&quot;Courier New&quot;">Hi all,<u></u><u></u></pre><pre style=3D"margin:=
0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u=
>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;fo=
nt-family:&quot;Courier New&quot;">I would also like to thank everybody for=
 the substantial discussion.=C2=A0 <u></u><u></u></pre><pre style=3D"margin=
:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></=
u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;f=
ont-family:&quot;Courier New&quot;">The proposed change for Section 4.1.2.1=
 works for me (as already stated). I=E2=80=99m not fully comfortable with t=
he proposed change for Section 9.7 for the following reasons:<u></u><u></u>=
</pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quo=
t;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in=
 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">- The text is=
 weaker than Section 4.1.2.1 since it RECOMMENDS use of PKCE instead of req=
uiring it (with a well-defined exception).<u></u><u></u></pre><pre style=3D=
"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;=
">- Given the latest findings re nonce I don=E2=80=99t feel comfortable wit=
h recommending any mechanism that this WG is not responsible for and thus d=
id not conduct the security threat analysis for. I think the better way for=
 us as WG is to define the extension point for other mechanisms. The OpenID=
 Foundation (or any other body) can then fill in and issue a statement that=
 nonce (or another suitable mechanism) fulfils the requirements of the exte=
nsion point. <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font=
-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><=
pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Couri=
er New&quot;">Based on this considerations, I propose the following text fo=
r Section 9.7:<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;fon=
t-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre>=
<pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Cour=
ier New&quot;">Clients MUST prevent injection (replay) of authorization cod=
es into <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size=
:10pt;font-family:&quot;Courier New&quot;">the authorization response by at=
tackers. Public clients MUST use the <u></u><u></u></pre><pre style=3D"marg=
in:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">&qu=
ot;code_challenge=E2=80=9D with a transaction-specific value that is secure=
ly <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt=
;font-family:&quot;Courier New&quot;">bound to the client and the user agen=
t in which the transaction was <u></u><u></u></pre><pre style=3D"margin:0in=
 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">started. =
Confidential clients MUST use the =E2=80=9Ccode_challenge=E2=80=9D in the <=
u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;fon=
t-family:&quot;Courier New&quot;">same way or other suitable mechanisms to =
mitigate authorization code <u></u><u></u></pre><pre style=3D"margin:0in 0i=
n 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">injection.<u=
></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font=
-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"ma=
rgin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">T=
his text follows the logic in Section 4.1.2.1 and allows use of the nonce f=
or confidential clients.<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.=
0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u>=
</u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:=
&quot;Courier New&quot;">best regards,<u></u><u></u></pre><pre style=3D"mar=
gin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">To=
rsten. <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:=
10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><blockq=
uote style=3D"margin-top:5pt;margin-bottom:5pt"><pre style=3D"margin:0in 0i=
n 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">On 12. May 2=
020, at 02:21, Mike Jones <a href=3D"mailto:Michael.Jones=3D40microsoft.com=
@dmarc.ietf.org" style=3D"color:blue;text-decoration:underline" target=3D"_=
blank">&lt;Michael.Jones=3D40microsoft.com@dmarc.ietf.org&gt;</a> wrote:<u>=
</u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-=
family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"mar=
gin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">Th=
at works for me.=C2=A0 Thanks all for the useful back-and-forth that got us=
 to this point of clarity.=C2=A0 I suspect many of us learned things along =
the way; I know that I did!<u></u><u></u></pre><pre style=3D"margin:0in 0in=
 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0=
<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-fami=
ly:&quot;Courier New&quot;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Cheers,<u></u><u></u></pre><pre style=
=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&qu=
ot;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 -- Mike<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001=
pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u>=
</pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quo=
t;Courier New&quot;">From: Aaron Parecki <a href=3D"mailto:aaron@parecki.co=
m" style=3D"color:blue;text-decoration:underline" target=3D"_blank">&lt;aar=
on@parecki.com&gt;</a><u></u><u></u></pre><pre style=3D"margin:0in 0in 0.00=
01pt;font-size:10pt;font-family:&quot;Courier New&quot;">Sent: Monday, May =
11, 2020 4:55 PM<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;f=
ont-size:10pt;font-family:&quot;Courier New&quot;">To: OAuth WG <a href=3D"=
mailto:oauth@ietf.org" style=3D"color:blue;text-decoration:underline" targe=
t=3D"_blank">&lt;oauth@ietf.org&gt;</a><u></u><u></u></pre><pre style=3D"ma=
rgin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">C=
c: Neil Madden <a href=3D"mailto:neil.madden@forgerock.com" style=3D"color:=
blue;text-decoration:underline" target=3D"_blank">&lt;neil.madden@forgerock=
.com&gt;</a>; Mike Jones <u></u><u></u></pre><pre style=3D"margin:0in 0in 0=
.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><a href=3D"mail=
to:Michael.Jones@microsoft.com" style=3D"color:blue;text-decoration:underli=
ne" target=3D"_blank">&lt;Michael.Jones@microsoft.com&gt;</a><u></u><u></u>=
</pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quo=
t;Courier New&quot;">Subject: Re: [OAUTH-WG] proposed resolution for PKCE i=
n OAuth 2.1<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-s=
ize:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pr=
e style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier=
 New&quot;">Thank you Neil.<u></u><u></u></pre><pre style=3D"margin:0in 0in=
 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0=
<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-fami=
ly:&quot;Courier New&quot;">To address Mike&#39;s concerns in the previous =
threads, I would like to also update section 9.7 with the following text:<u=
></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font=
-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"ma=
rgin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">C=
lients MUST prevent injection (replay) of authorization codes into <u></u><=
u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-famil=
y:&quot;Courier New&quot;">the authorization response by attackers. The use=
 of the <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size=
:10pt;font-family:&quot;Courier New&quot;">`code_challenge` parameter is RE=
COMMENDED to this end. For <u></u><u></u></pre><pre style=3D"margin:0in 0in=
 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">confidential =
clients, the OpenID Connect `nonce` parameter and ID <u></u><u></u></pre><p=
re style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courie=
r New&quot;">Token Claim {{OpenID}} MAY be used instead of or in addition t=
o the <u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:1=
0pt;font-family:&quot;Courier New&quot;">`code_challenge` parameter for thi=
s purpose. The `code_challenge` <u></u><u></u></pre><pre style=3D"margin:0i=
n 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">or OpenI=
D Connect `nonce` value MUST be transaction-specific and <u></u><u></u></pr=
e><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Co=
urier New&quot;">securely bound to the client and the user agent in which t=
he transaction was started.<u></u><u></u></pre><pre style=3D"margin:0in 0in=
 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0=
<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-fami=
ly:&quot;Courier New&quot;">This change better clarifies the specific circu=
mstances under which the &quot;nonce&quot; parameter is sufficient to prote=
ct against authorization code injection.<u></u><u></u></pre><pre style=3D"m=
argin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">=
<u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:1=
0pt;font-family:&quot;Courier New&quot;">Aaron Parecki<u></u><u></u></pre><=
pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Couri=
er New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001=
pt;font-size:10pt;font-family:&quot;Courier New&quot;">On Mon, May 11, 2020=
 at 11:55 AM Neil Madden <a href=3D"mailto:neil.madden@forgerock.com" style=
=3D"color:blue;text-decoration:underline" target=3D"_blank">&lt;neil.madden=
@forgerock.com&gt;</a> wrote:<u></u><u></u></pre><pre style=3D"margin:0in 0=
in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">I am happy =
with this proposed wording. Thanks for updating it.<u></u><u></u></pre><pre=
 style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier =
New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;=
font-size:10pt;font-family:&quot;Courier New&quot;">=E2=80=94 Neil<u></u><u=
></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family=
:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0i=
n 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=
=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;fon=
t-family:&quot;Courier New&quot;">On 11 May 2020, at 19:52, Aaron Parecki <=
a href=3D"mailto:aaron@parecki.com" style=3D"color:blue;text-decoration:und=
erline" target=3D"_blank">&lt;aaron@parecki.com&gt;</a> wrote:<u></u><u></u=
></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&qu=
ot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0i=
n 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">Thanks for t=
he lively discussion around PKCE in OAuth 2.1 everyone! <u></u><u></u></pre=
><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Cou=
rier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.00=
01pt;font-size:10pt;font-family:&quot;Courier New&quot;">We would like to p=
ropose the following text, which is a slight variation from the text Neil p=
roposed. This would replace the paragraph in 4.1.2.1 (<a href=3D"https://to=
ols.ietf.org/html/draft-parecki-oauth-v2-1-02#section-4.1.2.1" style=3D"col=
or:blue;text-decoration:underline" target=3D"_blank">https://tools.ietf.org=
/html/draft-parecki-oauth-v2-1-02#section-4.1.2.1</a>) that begins with &qu=
ot;If the client does not send the &quot;code_challenge&quot; in the reques=
t...&quot;<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-si=
ze:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre=
 style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier =
New&quot;">&quot;An AS MUST reject requests without a code_challenge from p=
ublic clients, and MUST reject such requests from other clients unless ther=
e is reasonable assurance that the client mitigates authorization code inje=
ction in other ways.. See section 9.7 for details.&quot;<u></u><u></u></pre=
><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Cou=
rier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.00=
01pt;font-size:10pt;font-family:&quot;Courier New&quot;">Section 9.7 is whe=
re the nuances of PKCE vs nonce are described.<u></u><u></u></pre><pre styl=
e=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&q=
uot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-=
size:10pt;font-family:&quot;Courier New&quot;">As Neil described, we believ=
e this will allow ASs to support both OAuth 2.0 and 2.1 clients simultaneou=
sly. The change from Neil&#39;s text is the clarification of which threats,=
 and changing to MUST instead of SHOULD. The &quot;MUST...unless&quot; is m=
ore specific than &quot;SHOULD&quot;, and since we are already describing t=
he explicit exception to the rule, it&#39;s more clear as a MUST here.<u></=
u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-fa=
mily:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margi=
n:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">Aaro=
n Parecki<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-siz=
e:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre =
style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier N=
ew&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;f=
ont-size:10pt;font-family:&quot;Courier New&quot;"><u></u>=C2=A0<u></u></pr=
e><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Co=
urier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0in 0.0=
001pt;font-size:10pt;font-family:&quot;Courier New&quot;">_________________=
______________________________<u></u><u></u></pre><pre style=3D"margin:0in =
0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">OAuth mail=
ing list<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size=
:10pt;font-family:&quot;Courier New&quot;"><a href=3D"mailto:OAuth@ietf.org=
" style=3D"color:blue;text-decoration:underline" target=3D"_blank">OAuth@ie=
tf.org</a><u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-si=
ze:10pt;font-family:&quot;Courier New&quot;"><a href=3D"https://www.ietf.or=
g/mailman/listinfo/oauth" style=3D"color:blue;text-decoration:underline" ta=
rget=3D"_blank">https://www.ietf.org/mailman/listinfo/oauth</a><u></u><u></=
u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-family:&q=
uot;Courier New&quot;"><u></u>=C2=A0<u></u></pre><pre style=3D"margin:0in 0=
in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">___________=
____________________________________<u></u><u></u></pre><pre style=3D"margi=
n:0in 0in 0.0001pt;font-size:10pt;font-family:&quot;Courier New&quot;">OAut=
h mailing list<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;fon=
t-size:10pt;font-family:&quot;Courier New&quot;"><a href=3D"mailto:OAuth@ie=
tf.org" style=3D"color:blue;text-decoration:underline" target=3D"_blank">OA=
uth@ietf.org</a><u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;f=
ont-size:10pt;font-family:&quot;Courier New&quot;"><a href=3D"https://www.i=
etf.org/mailman/listinfo/oauth" style=3D"color:blue;text-decoration:underli=
ne" target=3D"_blank">https://www.ietf.org/mailman/listinfo/oauth</a><u></u=
><u></u></pre></blockquote><pre style=3D"margin:0in 0in 0.0001pt;font-size:=
10pt;font-family:&quot;Courier New&quot;">_________________________________=
______________<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;fon=
t-size:10pt;font-family:&quot;Courier New&quot;">OAuth mailing list<u></u><=
u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-famil=
y:&quot;Courier New&quot;"><a href=3D"mailto:OAuth@ietf.org" style=3D"color=
:blue;text-decoration:underline" target=3D"_blank">OAuth@ietf.org</a><u></u=
><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-fam=
ily:&quot;Courier New&quot;"><a href=3D"https://www.ietf.org/mailman/listin=
fo/oauth" style=3D"color:blue;text-decoration:underline" target=3D"_blank">=
https://www.ietf.org/mailman/listinfo/oauth</a><u></u><u></u></pre></blockq=
uote></blockquote></blockquote><pre style=3D"margin:0in 0in 0.0001pt;font-s=
ize:10pt;font-family:&quot;Courier New&quot;">_____________________________=
__________________<u></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt=
;font-size:10pt;font-family:&quot;Courier New&quot;">OAuth mailing list<u><=
/u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font-f=
amily:&quot;Courier New&quot;"><a href=3D"mailto:OAuth@ietf.org" style=3D"c=
olor:blue;text-decoration:underline" target=3D"_blank">OAuth@ietf.org</a><u=
></u><u></u></pre><pre style=3D"margin:0in 0in 0.0001pt;font-size:10pt;font=
-family:&quot;Courier New&quot;"><a href=3D"https://www.ietf.org/mailman/li=
stinfo/oauth" style=3D"color:blue;text-decoration:underline" target=3D"_bla=
nk">https://www.ietf.org/mailman/listinfo/oauth</a><u></u><u></u></pre></bl=
ockquote><div style=3D"margin:0in 0in 0.0001pt;font-size:11pt;font-family:C=
alibri,sans-serif"><u></u>=C2=A0<u></u></div></div><div style=3D"margin:0in=
 0in 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif">______________=
_________________________________<br>OAuth mailing list<br><a href=3D"mailt=
o:OAuth@ietf.org" style=3D"color:blue;text-decoration:underline" target=3D"=
_blank">OAuth@ietf.org</a><br><a href=3D"https://www.ietf.org/mailman/listi=
nfo/oauth" style=3D"color:blue;text-decoration:underline" target=3D"_blank"=
>https://www.ietf.org/mailman/listinfo/oauth</a></div></div></blockquote></=
div></div></div></div></blockquote></div></div></blockquote></div><br></div=
></div></div>_______________________________________________<br>
OAuth mailing list<br>
<a href=3D"mailto:OAuth@ietf.org" target=3D"_blank">OAuth@ietf.org</a><br>
<a href=3D"https://www.ietf.org/mailman/listinfo/oauth" rel=3D"noreferrer" =
target=3D"_blank">https://www.ietf.org/mailman/listinfo/oauth</a><br>
</blockquote></div>

--000000000000f80ca305a61c3129--

