Re: [jose] JOSE and PKCS11

Nathaniel McCallum <> Wed, 27 February 2019 17:21 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 44A99131024 for <>; Wed, 27 Feb 2019 09:21:37 -0800 (PST)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -1.9
X-Spam-Status: No, score=-1.9 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id gB41SxRTrU56 for <>; Wed, 27 Feb 2019 09:21:35 -0800 (PST)
Received: from ( []) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 79D1E13101F for <>; Wed, 27 Feb 2019 09:21:35 -0800 (PST)
Received: by with SMTP id e24so10396422itl.1 for <>; Wed, 27 Feb 2019 09:21:35 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=mcs1OzmazMKCzdmcVbtNMeOk8YZVWW4elgSg+eenqPg=; b=puEbC7dAw2PHqVsve8P5puoC8UT4ybaCq2RwbaMzbP1WRtJBFaubBahgVA2AFoNnOt ACAsdLobx6yzoWRIKyDGyP3pJKV1qbxMTeaIALS58OddcSVewgtAZWZSKSvgqgR9reCe gPUHgciE8gkgInro7JLd/dGNRO2IIQ28BN3Pmekj7M8IYb+nj0yT2Z0wYvvyfwR66IYi zw0eqYoNlZ1+sJHNNVPDki/DL4tIUnqRXx+yJHGkvvPvbLiYE97A+GPfkFkFK9tYTkuo BAXEN43s2zo83UfF2EpU2Qu4HeJ04AdMBxWZMmdse3LIKs8TvueBpJMjfErwqgaRKyjK 3sNA==
X-Gm-Message-State: AHQUAuaaVbOEauRk4cEDKuoef189gstA0g/HVv/s1NFgsvY1GJin8J53 5uDIPzr/5mWabb6lCuSC7AE6UQ+lf19zSz5rUP7jKA==
X-Google-Smtp-Source: AHgI3IbhdEYuWbiCTZtRmgu5S1R16BCOsRKBamSsqfnZl7BSjVKs40FoUqaNB7atEaWjLnnC7oMHJEyHXXMvQnZYzQM=
X-Received: by 2002:a02:8899:: with SMTP id n25mr2026255jaj.7.1551288094343; Wed, 27 Feb 2019 09:21:34 -0800 (PST)
MIME-Version: 1.0
References: <> <> <> <> <> <> <> <> <> <>
In-Reply-To: <>
From: Nathaniel McCallum <>
Date: Wed, 27 Feb 2019 12:21:23 -0500
Message-ID: <>
To: Neil Madden <>
Cc: Stefan Berger <>,, jose <>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Archived-At: <>
Subject: Re: [jose] JOSE and PKCS11
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Javascript Object Signing and Encryption <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Wed, 27 Feb 2019 17:21:37 -0000

The relationship between Java and PKCS#11 is different than literally
every other language. :)

On Wed, Feb 27, 2019 at 12:07 PM Neil Madden <> wrote:
> > On 27 Feb 2019, at 15:50, Nathaniel McCallum <> wrote:
> >
> > On Wed, Feb 27, 2019 at 10:09 AM Neil Madden <> wrote:
> >>
> >> On 27 Feb 2019, at 14:36, Nathaniel McCallum <> wrote:
> >>>
> >>> On Wed, Feb 27, 2019 at 9:26 AM Neil Madden <> wrote:
> >>>>
> >>>> [snip]
> >>
> >>>> That already works just fine. Set the “kid” claim in your public JWK to the pkcs11/kmip URI and then make sure the client sends you the same value in the “kid” header of the encrypted JWE. This is precisely what the “kid” JWK claim and header are for.
> >>>>
> >>>> Depending on the sensitivity of the information in the URI, you may want to either encrypt it or replace it with an opaque identifier that you store in a local lookup table.
> >>>
> >>> The "kid" claim is not a good fit for this.
> >>>
> >>> First, "kid" may need to be used in conjunction with "p11". For
> >>> example, where "p11" replaces key material, the URI only refers to how
> >>> to find the key material. But it does not provide credentials to
> >>> access that key material. The "kid" may be needed to look up those
> >>> credentials.
> >>
> >> If you need the kid to lookup the credentials, can you not also use it to lookup the PKCS#11 URI?
> >
> > You *may* need the kid to look up the credentials. You might also need
> > it for other reasons, like looking up usage policy or other things
> > unrelated to PKCS#11. The important bit here is that this is optional.
> >
> > I chose the "p11" assertion precisely because I don't want to consume
> > "kid" with this information. In practice, libraries will handle "p11"
> > and applications will handle "kid". That, to me, justifies having two.
> I think I see where we are missing each other. I tend to think about JWK mostly in cases where they are communicated over a network, as in the jwks_uri usage in OpenID Connect. As I understand it, with this draft you are thinking about JWK as a standard way for an application to represent key material to a JOSE library that it is interacting with locally? If so, it might be worth spelling that out in the draft to clarify the use case being addressed.
> >
> >>> Second, "p11" needs to have its own well-defined security
> >>> considerations. There are security implications of using a PKCS#11 URI
> >>> in publicly disclosed fields. These need to be carefully outlined.
> >>> This is different than "kid" which is always presumed to be safe to
> >>> disclose.
> >>
> >> Again, this comes back to use cases. If the PKCS#11 URI is not safe to disclose then why do you want to expose it in a JWK? I know that JWK allows private key material to be represented, because this is sometimes useful to allow transmitting that key material. But with a PKCS#11 URI it is not key material, but instead a reference to key material in a locally/network-attached HSM, so presumably you are only sending it to yourself or another party locally connected to the same HSM? I’m struggling to see the interoperability requirement that would need this to be standardised.
> >
> > First, PKCS#11 is a general purpose crypto API. HSMs are the
> > predominant, but not only, use case.
> >
> > Second, PKCS#11 URIs are generally safe to disclose given the right
> > handling. Security is not black and white. This is precisely why the
> > Security Considerations section of IETF standards exist: to discuss
> > the details. These details are enough to justify a standard.
> >
> > Third, there is a clear interoperability issue here: JOSE libraries.
> > Applications aren't going to be doing PKCS#11 directly (it is,
> > frankly, too hard). They're going to use JOSE libraries. So even if
> > the protocol between them is proprietary, they are going to hand a JWK
> > over to the library and expect PKCS#11 to work (within a set of
> > constraints).
> I think this is why I struggled to understand the use-case. As my employer's JOSE library is written in Java, we take as input an opaque Java Key object rather than a JWK. This allows us to transparently use PKCS#11 HSMs via the Java Cryptography APIs that abstract over the details of PKCS#11 and instead deal with Java KeyStore and Key objects. As far as I am aware, most Java JOSE libraries operate the same way (or support both options), and most Java application developers would expect that.
> > Please keep this in mind: the JOSE WG is closed. This standard will
> > probably end up as an individual submission. I'm doing most of the
> > work. Implementers, including me, are finding value in it. I plan to
> > continue this work. However, if you would like to have discussion over
> > the specifics in the existing draft (including "p11" vs "kid"), I'm
> > glad to do so.
> OK, that wasn’t clear to me as there has been discussion about potentially re-opening this WG or a related one some time ago on this list.
> — Neil