[OAUTH-WG] Public key authenticated encryption for JWTs [Was Re: JWT ATs and authenticated encryption]

Neil Madden <neil.madden@forgerock.com> Thu, 09 May 2019 16:15 UTC

Return-Path: <neil.madden@forgerock.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 B653612006B for <oauth@ietfa.amsl.com>; Thu, 9 May 2019 09:15:21 -0700 (PDT)
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, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=forgerock.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 wbwrnvME_yr5 for <oauth@ietfa.amsl.com>; Thu, 9 May 2019 09:15:18 -0700 (PDT)
Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) (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 1EEB612000E for <oauth@ietf.org>; Thu, 9 May 2019 09:15:18 -0700 (PDT)
Received: by mail-wr1-x433.google.com with SMTP id w12so3899747wrp.2 for <oauth@ietf.org>; Thu, 09 May 2019 09:15:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=forgerock.com; s=google; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=tfCdKJopZDtQAJmBv8vy4YiPuS9tUSuFapC9Rj5f+0M=; b=BSRdYXhJEetawxrvDHhMi8RoK6LufZtSF9b2asDbAvzuRu4kxUVDfIm+Sxie8GodHr CXpfTt4EOuwVy061Lv1ciOWVmT/HRQjIiHK5lgGqO57DL61fcIfy3jeKfGaZt1v7Z9lC rkSpdvLrygV9q5+66VSUB+adp6+F+MBG7b7/U=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=tfCdKJopZDtQAJmBv8vy4YiPuS9tUSuFapC9Rj5f+0M=; b=W8VyOknVpDPP1tzrkKMZXYaPX+MI2N8jZYN/ozeT1ff6lnyv2FMZzawGG4jR3UPUct nKCUgRQ9xqmfnUT9U5U1EGmaxIicovujybJdGu+KxxplWa62ij3XV8t11PzhArdta546 5h0HTZEVhKQmWdNoGP/gBVboLIpsUxeHHY8rpWOGxxKyiAQHdmSh9jXWax6RVGpAYka9 MOsV32tgT1hwXF3vBh0gEtK5yFScfxQBzA6f6su0T1jLBq+nDp1o/9pBnQRY2V0oGVWO d+z3Q31W1ExSaSOqSs8jnP40aNJGAPKnvLZiXY8DEiX20E5kG217eRrb2REPdrWlskwE FIEA==
X-Gm-Message-State: APjAAAWC8GjQ0gHHqqKMHQWFAm7HGibv4BX2AIiaMQpXDbH0ZUu0lUEy Lj7thCKGLdg5Mj3hlHaOzbdyxw==
X-Google-Smtp-Source: APXvYqz9bH/jaouo2dLUSCW8ZSD3Q3GO9aAgk6hAFODAEi6yMEluSB8XJdwVL3iNgxjVcOSwGxouzw==
X-Received: by 2002:adf:c503:: with SMTP id q3mr3995249wrf.263.1557418516449; Thu, 09 May 2019 09:15:16 -0700 (PDT)
Received: from [192.168.1.64] (29.87.75.194.dyn.plus.net. [194.75.87.29]) by smtp.gmail.com with ESMTPSA id b2sm1648833wma.41.2019.05.09.09.15.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 May 2019 09:15:15 -0700 (PDT)
From: Neil Madden <neil.madden@forgerock.com>
Message-Id: <6F0B4144-C0E9-48E4-8BE0-0B305FC32B32@forgerock.com>
Content-Type: multipart/alternative; boundary="Apple-Mail=_B360F635-F8B3-48D5-AE8B-1459DE246438"
Mime-Version: 1.0 (Mac OS X Mail 12.2 \(3445.102.3\))
Date: Thu, 09 May 2019 17:15:14 +0100
In-Reply-To: <3B27C5F4-3D67-4F37-9522-0883F0D18B85@forgerock.com>
Cc: IETF oauth WG <oauth@ietf.org>
To: Vittorio Bertocci <Vittorio@auth0.com>
References: <FBA6E90C-F63E-4104-8518-0136A7B87DDF@forgerock.com> <CAO_FVe6BnhcmGxnWV6mqvVrY_V+UOuTNM8JEpMkFtA561SW+bA@mail.gmail.com> <3B27C5F4-3D67-4F37-9522-0883F0D18B85@forgerock.com>
X-Mailer: Apple Mail (2.3445.102.3)
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/EOe_yiXD8rQnVoYafDqeJfTEY9I>
Subject: [OAUTH-WG] Public key authenticated encryption for JWTs [Was Re: JWT ATs and authenticated encryption]
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: Thu, 09 May 2019 16:15:22 -0000

OK, I have put together a (very) rough first draft here - https://datatracker.ietf.org/doc/draft-madden-jose-ecdh-1pu/ <https://datatracker.ietf.org/doc/draft-madden-jose-ecdh-1pu/>

I have an implementation so I will try to find some time to generate some test vectors, but essentially you do exactly the same as for ECDH-ES but you derive a second shared secret between the sender’s static private key and the recipient’s static private key, then concatenate them together and run it through Concat-KDF as before.

I also have a GitHub for the draft https://github.com/NeilMadden/jose-ecdh-1pu <https://github.com/NeilMadden/jose-ecdh-1pu> that has a README with some more informal discussion.

I think this is potentially a very useful mode for JWT access tokens in particular where you want to encrypt and authenticate the AT to pass through the client to the RS without the overhead of nested signed+encrypted JWTs or the security risks of shared secrets.

Cheers,

Neil

> On 27 Mar 2019, at 13:51, Neil Madden <neil.madden@forgerock.com> wrote:
> 
> Yes - a separate doc. Given that it is potentially useful in the context of OAuth, it might be something that the OAuth WG could consider, given that the JOSE WG is disbanded. I’ll see if I can find some time to put a draft together. (In markdown now that my mind has been blown that I don’t have to do everything in XML!)
> 
>> On 26 Mar 2019, at 16:50, Vittorio Bertocci <Vittorio@auth0.com> wrote:
>> 
>> Hi Neil,
>> thanks! This does sound very interesting. Just to clarify, you would document this in a separate doc extending JOSE?
>> We could then mention it from the JWT AT profile, whihc would remain lightweight and implementation independent.
>> thanks
>> V.
>> 
>> On Tue, Mar 26, 2019 at 3:11 AM Neil Madden <neil.madden@forgerock.com> wrote:
>> There was a brief discussion at OSW about signing vs encryption for JWT-based access tokens. I think it was Brian Campbell that pointed out that you often want authenticated encryption rather than signing, and I agree with this.
>> 
>> Currently JOSE only supports authenticated encryption for symmetric cryptography, which means that the AS and RS must agree a shared secret key beforehand. (Or else the RS uses the token introspection endpoint and doesn’t decrypt the token itself). Symmetric cryptography is less than ideal when the AS and RS are in separate trust boundaries (e.g., different companies).
>> 
>> There are actually ways to do *public key* authenticated encryption, but JOSE doesn’t support them yet. I wrote a 3-part blog series about this recently [1], but I’ll summarise the tl;dr version here. I think for JWT-based access tokens that contain identity assertions, this is probably what you want in most cases as it provides both confidentiality and authenticity without needing a bulky nested signed-then-encrypted JWT. Is this something people would be interested in, if I propose a draft?
>> 
>> Details:
>> 
>> The basic idea is to introduce one or more variants on ECDH-ES that provide sender authentication. The most straightforward is to use ECDH-SS — i.e., Diffie-Hellman between two static key pairs, one for the sender and one for the recipient, with no ephemeral keys. This provides authenticated encryption so long as the content encryption method is authenticated (which they all are in JOSE). But it has a number of security downsides, which I describe in more detail in the blog. (It might be useful in some IoT scenarios though).
>> 
>> The better variant is to instead do ECDH-ESSS. That is, we generate a random ephemeral key pair and do an agreement with the recipient’s static public key, just like in ECDH-ES, but then we do another key agreement between the sender’s static private key and the recipient’s static private key. We then concatenate the two shared secrets and feed them into ConcatKDF just like you would for ECDH-ES. This is what NIST SP.800-56A [2] calls the “one-pass unified model” (section 6.2.1.2). If you squint a bit then it is also very similar to the “K” one-way pattern in the Noise protocol framework [3].
>> 
>> To spell it out, the process for encrypting a JWE with this new scheme is as follows:
>> 
>> Sender has long-term “static” key pair: ssk,_spk (ssk = sender secret key, etc)
>> Recipient has long-term static key pair: rsk, rpk
>> 
>> 1. Sender generates a random ephemeral key pair: esk, epk
>> 2. Calculate Ze := ecdh(esk, rpk)  — just like in ECDH-ES
>> 3. Calculate Zs := ecdh(ssk, rpk)
>> 4. Let Z = Ze || Zs where || is concatenation
>> 5. Run Z through ConcatKDF with PartyUInfo/PartyVInfo just as in ECDH-ES
>> 6. Encrypt the message using the chosen “enc” encryption method using the key derived in step 5.
>> 
>> On its own ECDH-ESSS has some decent security properties (including authenticated encryption), but it is especially good when you want to exchange lots of messages with the recipient. If the recipient replies to your initial message using ECDH-ESSS but using the ephemeral public key you sent in the first message as if it was your static public key, then what you get is an interactive handshake very similar to the Noise KK pattern [4] (squinting quite hard at this point). Both parties can then use the derived key from step 5 of the second message as a shared session key and send “direct” encrypted JWEs to each other from that point on. This provides very strong security properties listed later in the Noise spec, including forward secrecy and both sender and recipient authentication with resistance to key compromise impersonation. So beyond its usefulness for Access Token JWTs, this scheme is a really versatile building block that you can use for lots of advanced use-cases (e.g., PoP schemes).
>> 
>> There are even nice formal models of the Noise handshake patterns in ProVerif [5], but I think they are only valid for the specific details of how Noise performs key derivation and transcript hashing so they wouldn’t directly apply to a JOSE version.
>> 
>> [1] https://neilmadden.blog/2018/11/14/public-key-authenticated-encryption-and-why-you-want-it-part-i/
>> [2] https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar3.pdf
>> [3] https://noiseprotocol.org/noise.html#one-way-handshake-patterns 
>> [4] https://noiseprotocol.org/noise.html#interactive-handshake-patterns-fundamental 
>> [5] https://noiseexplorer.com
>> 
>> Cheers,
>> 
>> Neil
>> _______________________________________________
>> OAuth mailing list
>> OAuth@ietf.org
>> https://www.ietf.org/mailman/listinfo/oauth
>