Re: [jose] Call for Adoption: draft-jones-jose-fully-specified-algorithms

Orie Steele <orie@transmute.industries> Sat, 06 January 2024 15:22 UTC

Return-Path: <orie@transmute.industries>
X-Original-To: jose@ietfa.amsl.com
Delivered-To: jose@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id BB163C14F603 for <jose@ietfa.amsl.com>; Sat, 6 Jan 2024 07:22:29 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.094
X-Spam-Level:
X-Spam-Status: No, score=-2.094 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_BLOCKED=0.001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_KAM_HTML_FONT_INVALID=0.01, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001, URIBL_DBL_BLOCKED_OPENDNS=0.001, URIBL_ZEN_BLOCKED_OPENDNS=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=transmute.industries
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id e6Wrd9IbpjGM for <jose@ietfa.amsl.com>; Sat, 6 Jan 2024 07:22:25 -0800 (PST)
Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 487C3C14F5FC for <jose@ietf.org>; Sat, 6 Jan 2024 07:22:25 -0800 (PST)
Received: by mail-pj1-x1035.google.com with SMTP id 98e67ed59e1d1-28bcc273833so473296a91.1 for <jose@ietf.org>; Sat, 06 Jan 2024 07:22:25 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=transmute.industries; s=google; t=1704554545; x=1705159345; darn=ietf.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=iq6vqO169A/vYsSUwfAWLHos6sc7pxhb9kVAkiFX8+w=; b=cIjyyn6BsRBIam8c5L7BdR8iwxjLOg6pPS+jgUMtEEPGGXgzY58eLD/P4t0Ck1YLDT Zih5Rryt+3f9v8xHLmZyEtkDaedE6xrhm3SwUlfeL7Ko0H1fl77glY+YhF1KwElkmSV2 kQEgod962m6u80bjpS24Q3B4DaY6G9CAtGFWxew2oEPrVISAEYbUO1HF7ci/yjSlz3R7 p0bYxbDhFMV5RnO2SD576+QIPeEig+/m7O9ByPsROXfRDMS4tDiPswKYT/eadN+Ezt8j Ctbi8tO90lpN+epDhx9Kt2IlMb0uMr7mgD+o7nwO3P5POPI0vxy4G7iGiy/8wB5HL/Uk Bhtw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704554545; x=1705159345; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=iq6vqO169A/vYsSUwfAWLHos6sc7pxhb9kVAkiFX8+w=; b=O4HhN54r6iSFLasGfj6a6KY2lE5h0Kj93GOhg6IcXH8Nb4ORVPqdPsbzXaEm4G+WSF AoSjsxwlDG83CBzubLe+nVfFOpyekCygHYHO6L06LpYYStvjbon3u3GxuHP5vfqOrjVy CR70VjgzKf2nT5P+QBNCS6L478qVFpqXczS+lyEHE4R/oPjR1WBctFoNpt9gbFmyBoX1 +TBjzyAg60/hRUEjt759w2uvpWmWhWokJLeVSERTDWbHjxwnCQ8i9ZM5kGkPeFEKZ5XS p1jYalbA5JdHpFUq2mkDByVQA0ewFmoaG+WJING+jVRD+mmuotct9y6m8OG5H+fFhCKa C5/Q==
X-Gm-Message-State: AOJu0YyER8r4XfIqCm4Os+kh1HD8/CdOFV1PTkeXxb7Bc0ZSXGa87vMr KnwvnFxZ+82hz7g6/jHBz3etN24kZVhwssE0hX/x3jSBFpJ6SaBlfawevCY5Vh8=
X-Google-Smtp-Source: AGHT+IE/9P29hdfXKz35ZyjA2BEa2FvI+MLsVyuYryyKLfe0/exywuSZZny1EvB7UcgItWVIYQFo/QeK+I6wW8IvRoY=
X-Received: by 2002:a17:90b:344a:b0:285:b7b9:dcd5 with SMTP id lj10-20020a17090b344a00b00285b7b9dcd5mr678769pjb.36.1704554544328; Sat, 06 Jan 2024 07:22:24 -0800 (PST)
MIME-Version: 1.0
References: <CAN8C-_Js=7touqKt0b=xeC4H8Yr2F9N_Qfu-=vi72VjFesmQ=g@mail.gmail.com> <F1607F5D-95D9-4F85-A2EE-21802EE23E7F@gmail.com>
In-Reply-To: <F1607F5D-95D9-4F85-A2EE-21802EE23E7F@gmail.com>
From: Orie Steele <orie@transmute.industries>
Date: Sat, 06 Jan 2024 09:22:13 -0600
Message-ID: <CAN8C-_Jrka6zh-smadQc9_3omhaeaSTcsiF-X5r=c1MzEXaxVA@mail.gmail.com>
To: Neil Madden <neil.e.madden@gmail.com>
Cc: Karen ODonoghue <kodonog@pobox.com>, jose@ietf.org
Content-Type: multipart/related; boundary="0000000000001da374060e4888e9"
Archived-At: <https://mailarchive.ietf.org/arch/msg/jose/RFRMthoafwmZyLpvvMjvhW3pHuI>
Subject: Re: [jose] Call for Adoption: draft-jones-jose-fully-specified-algorithms
X-BeenThere: jose@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: Javascript Object Signing and Encryption <jose.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/jose>, <mailto:jose-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/jose/>
List-Post: <mailto:jose@ietf.org>
List-Help: <mailto:jose-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/jose>, <mailto:jose-request@ietf.org?subject=subscribe>
X-List-Received-Date: Sat, 06 Jan 2024 15:22:29 -0000

Inline:

On Sat, Jan 6, 2024 at 3:10 AM Neil Madden <neil.e.madden@gmail.com> wrote:

> On 5 Jan 2024, at 22:52, Orie Steele <orie@transmute.industries> wrote:
>
>
> 
> Inline with snips (which I don't often use, so apologies if I get one
> wrong), and thank you again for these excellent comments:
>
> [snip]
>
> Right, and the point of associating the "alg" with the key is to ensure
>> that it is only used for one thing.
>>
>
> That's right, but if you need to know the key type and the alg to verify,
> you have a "not fully specified alg".
>
> https://datatracker.ietf.org/doc/html/rfc9053#section-2.1
> https://datatracker.ietf.org/doc/html/rfc7518#section-3.1
>
> ES256 is P-256 ECDSA with SHA-256 in JOSE.
> ES256 is any curve ECDSA with SHA-256 in COSE.
>
> ES256 in COSE can easily lead to cross curve scenarios, where the hash
> function is correct (the same), but the curve is different...
>
> You need to negotiate the triple: [kty, crv, alg] in COSE and the
> singleton "alg" in JOSE.
>
>
> To which my answer is, so what? You have to negotiate alg + enc for JWE,
> or alg + enc + crv for ECDH-ES. Applications have to be aware of these
> issues and deal with them.
>
> Trying to smoosh all possible degrees of freedom into a single algorithm
> identifier is neither possible nor desirable. (Maybe I care about
> deterministic nonce generation in ECDSA, or maybe I want hedged nonces to
> mitigate fault attacks - should those be in the algorithm identifier? As
> you say, perhaps I want canonical signatures, maybe that should be in the
> identifier?)
>
>
This is an excellent point.

If there is a legitimate need to distinguish deterministic k, or
canonical upper or lower s, then you need a way to signal that, and a
registry entry should be created to enable that precision.... But if nobody
needs it, or asks for it, it need not be included in the identifier (even
for fully specified).

We seem to be refining away some of the vagueness that I admit, remains in
the draft.


>
> [snip]
>
> I'm not familiar with this issue or what "lower S" refers to here. Do you
>> mean some implementations spell the algorithm "Es256K" with a lowercase s?
>>
>
> https://github.com/Legrandin/pycryptodome/issues/759
>
>
> https://bitcoin.stackexchange.com/questions/85946/low-s-value-in-bitcoin-signature
>
> (you replied before I hit send, but for others who might be curious, I'll
> leave the reference)...
>
> I agree it's a "bug" except those are called expected behavior when they
> happen frequently enough... it was an analogy at any rate.
>
>
>> I agree with your comment, but I don't see anything better to do than
>> enable more precision, so that implementations that are aware of it, or
>> that come after it's available, can take advantage of it.
>>
>>
>> Given that an EC/OKP JWK already specifies the curve, this is a case
>> where this draft doesn't make things more precise and just causes
>> compatibility issues for no gain.
>>
>>
> Your argument is that fully specified algorithms in JOSE & COSE are
> redundant to the key type requirements (kty, crv, alg = fully specified)?
>
> This is true, that's the nature of fully specifying things, you can rely
> on 1 value to uniquely identify a security relevant capability.
>
>
> Or you can just publish a set of keys to be used for a given purpose and
> put appropriate constraints on those keys. This is, IMO, the safest way to
> negotiate parameters:
> https://neilmadden.blog/2018/09/30/key-driven-cryptographic-agility/
>
>
I can't argue with this.

The one point I would make is that because "alg" is always optional in key
representations, and it can be fully or partially specified... publishing
valid key representations is not sufficient to achieve interop and
precision... You need to make optional fields mandatory before publishing.
At a minimum whatever alg related params are not already in the key, need
to go in alg, and it MUST be present, and I would also tend to recommend a
content identifier / thumbprint be used for the `kid`.

The recommendations go beyond the requirements for publishing a valid COSE
Key or JWK, but they are an alternative approach to addressing the same
security concerns in my opinion, and perhaps they are a better way.


>
> [snip]
>
> What I mean is that this draft is motivated by saying that algorithms like
>> "EdDSA" don't give enough information to be useful in negotiating an
>> algorithm because one party might only support the curve Ed25519 while
>> another supports only Ed448. Well, exactly the same thing happens with
>> content encryption algorithms. Both parties might support "RSA-OAEP" key
>> algorithm, but one supports only "A128GCM" and the other only supports
>> "A128CBC-HS256". Following the logic of this draft, the issue is that
>> "RSA-OAEP" is not fully specified,
>>
>
> Indeed, I agree.
>
>
>> so we should really add the following additional algorithm identifiers:
>>
>> RSA-OAEP-A128GCM
>> RSA-OAEP-A192GCM
>> RSA-OAEP-A256GCM
>> RSA-OAEP-A128CBC-HS256
>> RSA-OAEP-A192CBC-HS384
>> RSA-OAEP-A256CBC-HS512
>>
>> Not to mention doing the same for RSA-OAEP-256 and RSA1_5 and ECDH-ES and
>> ECDH-ES+A128KW and ...
>>
>> This is what I mean when I say that "fully specifying" the algorithm
>> results in a combinatorial explosion of cipher-suite like identifiers.
>>
>
> Except it's 2024, and as you said, systems already understand these
> algorithms : )
>
> We don't have to backport full specification for things that we think
> people should not use, won't use in the future or that are not being used.
>
>
> ? All of these algorithms are being used.
>
>
Sorry, my point was, we don't need to add any new fully specified entries,
we could just make the draft to prevent ambiguity in future
registrations... or we could pick some high value targets that we think
should have full specification... the working group could decide how much
is worth doing.

>
> Creating a limited number of new code points does not break old code
> points.
>
>
> But it does create new opportunities for incompatibilities for little
> benefit.
>

If you don't understand a new thing, you don't support it.

If you understand an old thing, you are not inconvenienced.

It addressed incompatibilities that exist today, and which other SDOs
already work around, that the work arounds exist is not a reason to bless
them as conventions.

If we instead took the advice in
https://neilmadden.blog/2018/09/30/key-driven-cryptographic-agility/ and
made it an RFC, would there be benefit?

If not, I don't think we agree on the mission objective, regardless of
tactical approach.


>
>
>
>> It doesn't seem like a sensible way to do things, which is why TLS 1.3
>> doesn't do that any more. And this is also why OIDC, which is cited in the
>> draft as a motivating example, has both metadata fields:
>> id_token_encryption_alg_values_supported
>> id_token_encryption_enc_values_supported
>>
> Indeed.
>
>
>> Probably OIDC should add similar id_token_signing_crv_values_supported
>> and so on metadata fields to address this properly, rather than trying to
>> cram everything into a single algorithm identifier.
>>
>
> The intention is to give a "name" to a "reasonably safe thing that is
> supported".
>
>
> Well, I wouldn’t describe ECDSA as a reasonably safe thing under any
> circumstances…
>

lol : )

Perhaps it's time to admit that ECDSA with SHA-256 when you don't know if
the curve is P-521 or P-256 is worse?


>
>
> If changing the curve does not affect the security properties, then it
> seems reasonable to omit it... is that true?
>
>
> I’m not sure what you’re asking here. Obviously the curve choice affects
> the security properties considerably. But we already have a field for
> specifying the curve.
>
>
That field only exists in keys.

Your blog post points out that in messages, the attacker controls the "alg"
value:

> In particular, the standard “alg” header tells the recipient what
cryptographic algorithm was used to sign or encrypt the contents. Letting
the attacker choose the algorithm can lead to disastrous security
vulnerabilities.

> For instance, the related JWK spec already allows specifying the
algorithm that the key is to be used for. The recipient looks up the key
and processes the message according to the metadata.

- https://neilmadden.blog/2018/09/30/key-driven-cryptographic-agility/

You solved the same problem, by making `kid` mandatory and a deterministic
function of the fully specified key.

I even agree your recommendation is better, as you say, some horses have
already left the stable.


> https://datatracker.ietf.org/doc/html/rfc8446#section-9.1
>
> >  A TLS-compliant application MUST support digital signatures with
>    rsa_pkcs1_sha256 (for certificates), rsa_pss_rsae_sha256 (for
>    CertificateVerify and certificates), and ecdsa_secp256r1_sha256.
>
> ecdsa_secp256r1_sha256 = ES256 in JOSE but != ES256 in COSE. (addressed in
> this draft)
>
>
> ... later:
>
> > The following values are marked as "Recommended":
>       ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384,
>       rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512,
>       rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, and
>       *ed25519*.
>
> Here "ed25519" is defined as...
> https://datatracker.ietf.org/doc/html/rfc8446#appendix-B.3.1.3
>
> /* EdDSA algorithms */
> ed25519(0x0807),
>
> If TLS mirrored COSE and JOSE, the algorithm would be called "EdDSA" and
> the curve would be unknown. (addressed in this draft)
>
>
> TLS does mirror JOSE for key exchange:
> https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.7
>
> The fact that TLS 1.3 decided to name Ed25519 rather than EdDSA is not the
> point. The point is that the draft under discussion was that “alg” should
> be “fully specified”, which if actually consistently applied would result
> in alg being more like a TLS 1.2 ciphersuite. What actually now happens in
> TLS 1.3 is that all the things that used to be “fully specified” in a
> single ciphersuite identifier are now negotiated separately:
>
> [image: ietf-logo-card.png]
>
> RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
> <https://datatracker.ietf.org/doc/html/rfc8446#section-4.1.1>
> datatracker.ietf.org
> <https://datatracker.ietf.org/doc/html/rfc8446#section-4.1.1>
> <https://datatracker.ietf.org/doc/html/rfc8446#section-4.1.1>
>
> If the actual point of this draft is the much more narrowly defined: that
> *signature algorithm identifiers* should include group parameters, then
> sure. I can live with that, even if I don’t think it’s necessary.
>
But it’s not what the draft says at the moment.
>
> I’d also say that any such draft should just give advice for the future.
> Changing EdDSA to Ed25519/Ed448 retrospectively just causes pain for very
> little gain.
>

I agree that future advice is more valuable than retrospective precision.


> TLS 1.3 algorithm name is better... "0x0807" refers to EdDSA with Ed25519.
>
> Recent algorithms registered for use in COSE follow the same approach:
>
> kty: HSS-LMS, alg: HSS-LMS
> kty: WalnutDSA, alg: WalnutDSA
>
> Naming the algorithm after the key (and all parameters necessary to use
> it) is fine.
>
> Naming the algorithm after the process that you used the key with is not.
>
> Because that process breaks when:
> a) multiple keys support the same process, and
> b) we don't know which key is supposed to be used.
>
>
> You argued that b is a negotiation problem, and I agree... but that
> problem is compounded by a few poor names, adding a few more precise ones
> eliminates it, and establishes a safer convention moving forward.
>
>
> Negotiate keys, not algorithms. Keys should fully specify their parameters
> (including algorithm).
>

They are not required to, as I said in the above thread, sure a profile can
fix this, but profiles build on requirements, and repeating the same
guidance in every profile might hint at a problem... As you pointed out in
your comment about "alg" in messages.

In COSE, "alg" is not required in message headers btw... so it's easier to
follow your advice for messages, but still you are not assured of a fully
specified algorithm being present in the dereferenced key (which might be a
JWK, COSE Key, or some other key).



>
> [snip]
>
> My point is that "fully specified" is a vague term that depends on what
>> you consider important and is likely to evolve over time.
>>
>>
> Fully specified is not a vague term, it means that when I tell you
> EdDSAEd25519 or "0x0807", you know its EdDSA (which uses SHA-512
> internally) with Ed25519 and that it won't work with an Ed448 key...
>
> Today, if I tell you EdDSA, you don't know if it's from an Ed25519 or
> Ed448 key.
>
>
> I’ve given lots of examples now of how “fully specified” depends on the
> context. You keep coming back to EdDSA, but the draft says that all “alg”
> identifiers should be “fully specified”. That is much broader than EdDSA.
>

Thats because its the strongest example : )

We don't have to register anything new... we could cover only forward
guidance, we could cover encryption or omit it, etc.


>
>
>> [snip the rest]
>>
>> In short, I don't think this draft improves anything and it makes some
>> things worse so should be rejected on that basis.
>>
>
> There are at least 3 parts of your arguments (thank you again), that I
> don't feel can be dismissed:
>
> 1. What cost for more precision is worth bearing in implementations and
> registry maintenance... If the current draft is "too costly" it should be
> rejected.
> 2. What should "fully specified" mean, for a series of processes, such as
> hash algorithm, then sign algorithm or key establishment, and then
> symmetric encryption.
> 3. Is the guidance we give on how to create new registries likely to cause
> problems in the future, including repeating very long debates, regarding
> how things were done, vs how they should be done.
>
> ECDSA with P-521 can be used with lots of different hash first
> approaches.... Are all those worth registering?... No! ECDSA P-521 with
> SHA-1 makes no sense... arguing that it MUST be registered and that it
> would not be used is a straw man fallacy.
>
>
> That’s not what I argued.
>

You seem to be primarily arguing against the redundant code points.

I am saying the set of redundant code points registered in the draft could
be 0.



>
>
> Fully specifying things does not imply registering things that don't make
> sense to fully specify or to use in 2024.
>
> Maintaining the registries is not about "what is possible". It is about
> "what is good for interoperability", "what lowers implementation burden",
> and "what improves security", and most importantly in this draft, providing
> guidance for new entries, that eliminates optionality, ambiguity and
> hopefully makes future discussions on this topic shorter and more
> satisfactory.
>
> In your earlier reply you said "I’m fairly receptive to it in general, but
> I think it might be closing the stable door after the horse has already
> bolted."
>
> It seems like part of standards is watching a different horse escape over
> and over again, until consensus is documented to not leave doors open : )
>
>
> If you really want to close that door then the advice should be to not
> rely solely on a single algorithm identifier.
>

Thats fair : )

I think I framed your argument here correctly in my message to the TLS list:

https://mailarchive.ietf.org/arch/msg/tls/CS_WD9StIvxOIBJSlAPJmhRMEBU/

But please correct anything I got wrong.


>
> — Neil
>


-- 


ORIE STEELE
Chief Technology Officer
www.transmute.industries

<https://transmute.industries>