[TLS] Re: Ambiguity of TLS Certificate Compression (RFC 8879)
David Benjamin <davidben@chromium.org> Wed, 11 February 2026 02:18 UTC
Return-Path: <davidben@google.com>
X-Original-To: tls@mail2.ietf.org
Delivered-To: tls@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id F08FDB51BE01 for <tls@mail2.ietf.org>; Tue, 10 Feb 2026 18:18:57 -0800 (PST)
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -9.499
X-Spam-Level:
X-Spam-Status: No, score=-9.499 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, USER_IN_DEF_SPF_WL=-7.5] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (1024-bit key) header.d=chromium.org
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fk6A0kal8Mfb for <tls@mail2.ietf.org>; Tue, 10 Feb 2026 18:18:57 -0800 (PST)
Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [IPv6:2a00:1450:4864:20::62a]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id EE3B3B51BDFA for <tls@ietf.org>; Tue, 10 Feb 2026 18:18:56 -0800 (PST)
Received: by mail-ej1-x62a.google.com with SMTP id a640c23a62f3a-b885e8c679bso658535666b.1 for <tls@ietf.org>; Tue, 10 Feb 2026 18:18:56 -0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1770776336; cv=none; d=google.com; s=arc-20240605; b=EtAKeywmFXn/1E/bPOkVz6xan3U/OIu/A1yzKo+3f8Y4ln3FdI+KZBwURqqjO5SpWj hR0IbPLAz4D409pXLd4Kxi9/VS8y34SaqpQ66Zj5gE6s5Yv1jU9/RvP5IL5GYcmcr0BF XZIZPFpGverwKor5E+G50LlGzuxZG1YIwXj0omMQnNI/HOLRale/3u/Bdkw4cYVNjjMJ SkDj+Ypi1E7iLHt4OL40NMDYrP8guOLoWXenFFVXEwvArEXD3aNNObSsBVFk9upyqTlU 148cD/NvlOcGhawdBceEQOLwFzLNQ9YQmAV6pmIGJ2QNIHaFKdQU1IIKYTpMuco+vwpF 6Jiw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=1erabyX1TTudoSw4ckObbaMuaUKy9iNzIaNd81X++7M=; fh=rgsnPyAY6kgyMb14Y5KDzsQ4wHOJo1zX8ZdeFENw54w=; b=HgRDdx8VLAEi31xE3o/ksXp+4u45OdEAz3mwhR34Djb+OLW3YTYPcTCMdEPL9XPd+B 5DLzkBdk3eLdiUa4c0XzGC0+RRjklAoLbs9hFcbXyieQcEFr1AiiqBU3uXmLifVxr3XI XJnMDQ+NixH8plXKewy99ecPbWyhlw29wwkDHSwx5Y++ZJAaSPPEvleBxgiB0Vkw7nN/ UeCC0tQRpm+tZtwW9PDomYM05a+sh8THyN82qRzc8oVZCDpSb3sdfR5qJZZacg9TD9FE dUJWQTCLrrlLnW45Sq+RPlgF/PicSVM6PeZPLWM7iBVH88rTNClI4yFMcQ+Vpk1ejVe0 gNKw==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1770776336; x=1771381136; 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=1erabyX1TTudoSw4ckObbaMuaUKy9iNzIaNd81X++7M=; b=ZKQgkGL0UfCYUOA0cpF6LueFWgnr+ITsLqKHuxMAfTdJkSNHw0EVHB+sPC6vANUFBV ygTVsxUIlj/LOg35t8+wRt/dnj+xtEk96inc3jBWaEhFo+RCOhqXPP9tjJggxUu8BOCY i9AGQIKdKaPZvVYhdx+vn3iHiiKRK/PlWFCXc=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770776336; x=1771381136; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=1erabyX1TTudoSw4ckObbaMuaUKy9iNzIaNd81X++7M=; b=oqFNhId34uNzUE1T5p5hENRQguOZAC2rfxh6pyjO0zNhFttX6HT81TPfS857W1EBa/ TK10pkdH9HnUbNwPfATQv7einOAVdHXjueyxTOTphYDbIfjvsNGYp3S8GJh7oirY01ZI f9K1vWkl2t5PqvLm2p8cUUVg3aVUIF1KuY+olPVPpXx+/98oW//XqFHahKj94BITSoRa gjoGaRFAfwIeccDJ/EODfQXJxuxHLGlwBxHR+PtrajF2FsDuTBrjW0/UXgCuf2lf2coP /W71V3unt/ikyWd0jKJqgF6pf7F2XL4U8AQBfcxwhJZp8PsZGucJF/tqfr2V3GIuaF1a ljcg==
X-Forwarded-Encrypted: i=1; AJvYcCWZv3tn42U7BzowtBspxCzQ3q3EKmgBOFkhwB9koE21z4WyyvDqkH7JiTZb44r2TRct4hw=@ietf.org
X-Gm-Message-State: AOJu0Ywc8bQarTAEIu/AzxMsJNRa1viPXIkOhIYprPivNBdRVbjO+xg6 AUHaaLkSzYSOGKu8VE1Flc7i12eZw09uKtWnwvZEtsi9gQNa47xD8VIPIYFSBslSv/VJYeVJIRz ZwDR6h7CBKbnbmMY7Ff1R3ZD6vRxc0YY3sjHbtp4=
X-Gm-Gg: AZuq6aIFitJOmdKW1Zlo1ry1CWc3eOkeScJeP46YJih8KRZQCJITVC3sr7LfCsXxOCW +ItW9q/unOeXrFXLaAN3JTYKncKoJppWLcBmFTSuxnoRk4jbVdOmd1bChZdiiK5JFfOFaUprFpx TsQAeOn+9HNZIEh5PxfRYzh62TOVby2vAARWNv9VqOn6LhafNPArSayokZDWbd8uiCleuNNomNd c0bBjbSzUveMLd4UQ63bNp5cb85WndVzkku82k+Nn/WnbeZ1TCgsW8vr4PJESJGTvmLTCqI0eVD yCWCGyoEOEVAxlIAke08FyU6lFoGyZvM/Da2kWJYVQiQjKjJ
X-Received: by 2002:a17:907:96aa:b0:b88:775c:bd68 with SMTP id a640c23a62f3a-b8f6aa11e7cmr81385966b.28.1770776335578; Tue, 10 Feb 2026 18:18:55 -0800 (PST)
MIME-Version: 1.0
References: <20260130.124640.484427558490648192.kazu@iij.ad.jp> <aYLj37WY/VbA5rkq@ubby>
In-Reply-To: <aYLj37WY/VbA5rkq@ubby>
From: David Benjamin <davidben@chromium.org>
Date: Tue, 10 Feb 2026 21:18:38 -0500
X-Gm-Features: AZwV_QjpuH40oYwv6_9fcp2zp5NGINAHOtJ7lFKOQHeWVWLmVOzBqIAtyUhk6Kw
Message-ID: <CAF8qwaAfAs=tMABHs30M+FFdvkWQko3nV4RTA-kMeAOfZ5hxyQ@mail.gmail.com>
To: Nico Williams <nico@cryptonector.com>
Content-Type: multipart/alternative; boundary="00000000000076435f064a82fe72"
Message-ID-Hash: 63K6Z4AWQVBHXP7FN7S2OSKFME4R7B7W
X-Message-ID-Hash: 63K6Z4AWQVBHXP7FN7S2OSKFME4R7B7W
X-MailFrom: davidben@google.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-tls.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: "Kazu Yamamoto (山本和彦)" <kazu=40iij.ad.jp@dmarc.ietf.org>, tls@ietf.org
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [TLS] Re: Ambiguity of TLS Certificate Compression (RFC 8879)
List-Id: "This is the mailing list for the Transport Layer Security working group of the IETF." <tls.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/tls/l3nDvnaYS_8TZR13sEppAXaLzwk>
List-Archive: <https://mailarchive.ietf.org/arch/browse/tls>
List-Help: <mailto:tls-request@ietf.org?subject=help>
List-Owner: <mailto:tls-owner@ietf.org>
List-Post: <mailto:tls@ietf.org>
List-Subscribe: <mailto:tls-join@ietf.org>
List-Unsubscribe: <mailto:tls-leave@ietf.org>
I think it says something about the ambiguity that I'm not entirely sure which interpretation you are saying is clearly the correct one, so I'm going to discuss both. :-) Like many extensions, RFC 8879 changes the messages that are sent over the handshake stream, both in contents (new extensions added to ClientHello and CertificateRequest) and in type (CompressedCertificate is sent instead of Certificate). While it is rare that we change the message types, it's not unheard of. For example, RFC 6066 introduced the CertificateStatus message. When that happens, such changes are reflected in the handshake transcript. The handshake transcript is all the messages that are sent or received over the handshake stream, and RFC 8879 replaces the Certificate message with the CompressedCertificate message. Thus, by the sent/received interpretation, the transcript should include CompressedCertificate and not Certificate. This matches how every TLS stack I'm aware of is structured. Indeed some handle the transcript automatically under the handshake layer and would *only* be able to implement this version. (Ours used to be like that. We've since gotten more flexible as a consequence of some work to control the timing a bit better, but I suspect other stacks of our lineage are still architectured this way.) It's also what was interoperably implemented by multiple stacks, so practically speaking, it is the interpretation we need to settle on. Yes, it happens that RFC 8879's CompressedCertificate message contains a compressed string, which uncompresses to another string formatted like a Certificate structure (without the Handshake header[*[). And it happens that other TLS handshake mechanisms interact with the result of that decompression as if they saw a vanilla Certificate message, but that's all within the handshake proper and about the handshake stream that we transcribe. Extensions change what goes on in the handshake. RFC 8879 is defined as a handshake-level mechanism, not a filter over the handshake stream. (It has to be, because it needs to add an extension to CH and CR, and correlate that to its new message.) But then the problem is the transcript in RFC 8446 is not actually defined in terms of what's actually sent/received over the handshake stream. It is defined in reference to particular messages, albeit with some "..."s in between. It also says this: For concreteness, the transcript hash is always taken from the following sequence of handshake messages, starting at the first ClientHello and including only those messages that were sent: ClientHello, HelloRetryRequest, ClientHello, ServerHello, EncryptedExtensions, server CertificateRequest, server Certificate, server CertificateVerify, server Finished, EndOfEarlyData, client Certificate, client CertificateVerify, client Finished. https://www.rfc-editor.org/rfc/rfc8446#section-4.4.1:~:text=For%20concreteness%2C%20the,CertificateVerify%2C%20client%20Finished . Taken literally, this text would suggest that, if an extension adds or modifies handshake messages, it's not reflected in the transcript, unless it says otherwise. That's not what we want, both by how real implementations work, or by the security goals of the transcript. We *want* message modifications to show up in the transcript by default, but the formal text does not say this. And thus the ambiguity. David [*] Actually, this seems to also be a point of ambiguity. The spec says you compress a Certificate, and the Certificate structure indeed does not have the four-byte header. Looking at our implementation, we indeed only compress that portion and not the header. I assume (but haven't checked) that's what other implementations do because we'd probably have heard of an interop issue by now. But in TLS we're sloppy enough about messages with and without the header that it's worth being explicit. On Wed, Feb 4, 2026 at 1:17 AM Nico Williams <nico@cryptonector.com> wrote: > On Fri, Jan 30, 2026 at 12:46:40PM +0900, Kazu Yamamoto (山本和彦) wrote: > > But RFC 8879 says: > > > > After decompression, the Certificate message MUST be processed as > > if it were encoded without being compressed. > > In my opinion the quoted text is not ambiguous, and no errata is > necessary. > > First, RFC 8879 does not change how TLS 1.3 computes its transcripts. > More on this below. > > Second, the quoted sentence is superfluous and unnecessary. What > "processing" does one do with the Certificate message? One validates > the certificate. But RFC 8879 does not provide a way to validate > compressed certificates apart from decompressing them and then > validating them as usual. And what other validation method could one > design other than decompress then validate as usual? Therefore the > quoted sentence was never necessary: because it's obvious. > > Third, the next sentence in the RFC says: > > [...]. This way, the parsing and > the verification have the same security properties as they would have > in TLS normally. > > but one does use "parsed" messages to compute the TLS handshake > transcript hash. So clearly the first sentence would not be consistent > with any intent to change the way the transcript hash is computed. More > below. > > > I think the following original interpretation is possible for the > > content: > > > > Transcript-Hash(Handshake Context, Certificate) > > RFC 8879 does not change how TLS 1.3 computes its transcripts. Nor > should it. And if it did it would have to be explicit about it. > > The point of the transcript being > > Transcript-Hash(M1, M2, ... Mn) = Hash(M1 || M2 || ... || Mn) > > is that M1, M2, .., Mn are the N messages sent / received _as they are > sent or received_ without any alterations. The whole point of the > transcript hash is to _detect alterations_. Therefore no compression of > any part of the handshake should alter the Transcript-Hash() function. > > The handshake transacript is such a critical and core design point of > TLS that, had the Internet-Draft preceding RFC 8879 meant to alter the > Transcript-Hash() function then surely it would never have managed WG > consensus. > > Nico > -- > > _______________________________________________ > TLS mailing list -- tls@ietf.org > To unsubscribe send an email to tls-leave@ietf.org >
- [TLS] Ambiguity of TLS Certificate Compression (R… Kazu Yamamoto
- [TLS] Re: Ambiguity of TLS Certificate Compressio… David Benjamin
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Martin Thomson
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Kazu Yamamoto
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Sean Turner
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Kazu Yamamoto
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Nico Williams
- [TLS] Re: Ambiguity of TLS Certificate Compressio… David Benjamin
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Eric Rescorla
- [TLS] Re: Ambiguity of TLS Certificate Compressio… David Benjamin
- [TLS] Re: Ambiguity of TLS Certificate Compressio… David Benjamin
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Muhammad Usama Sardar
- [TLS] Re: Ambiguity of TLS Certificate Compressio… David Benjamin
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Muhammad Usama Sardar
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Nico Williams
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Muhammad Usama Sardar
- [TLS] Re: Ambiguity of TLS Certificate Compressio… David Benjamin
- [TLS] Re: Ambiguity of TLS Certificate Compressio… Muhammad Usama Sardar