[Seat] Re: A continuity-and-revocation layer above attested TLS, with running code
Serhii Nikolaichuk <nikolaichuk.s.f@gmail.com> Thu, 24 September 2026 16:39 UTC
Received: from mail-wr2-x16.google.com (mail-wr2-x16.google.com [IPv6:2a00:1450:4864:30::16]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by mx.ietf.org (Postfix) with ESMTPS id A395031 for <seat@ietf.org>; Thu, 24 Sep 2026 16:39:14 +0000 (UTC)
Authentication-Results: mx.ietf.org; dkim=pass header.d=gmail.com header.s=20251104 header.b=U8NshUe4; arc=pass ("google.com:s=arc-20260327:i=1"); dmarc=pass (policy=none) header.from=gmail.com; spf=pass (mx.ietf.org: domain of nikolaichuk.s.f@gmail.com designates 2a00:1450:4864:30::16 as permitted sender) smtp.mailfrom=nikolaichuk.s.f@gmail.com
Received: by mail-wr2-x16.google.com with SMTP id ffacd0b85a97d-4834977ae75so1647241f8f.3 for <seat@ietf.org>; Thu, 24 Sep 2026 09:39:14 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1790267947; cv=none; d=google.com; s=arc-20260327; b=h4JutTbIuPl51+tfzq8iIFc4i6LKyx6P6IId/h//WhoLB6g6Nfppw9engOEd+Byso9 uTrucRyxR3dsBHcMB1K4DeiBlQd/JePjJLnb0H/2hOT+ciaxluSHzntsghqvWf2Uvpwz 2oER1Z+AqnUzPMlxHk3HxP8DTujz3Kckhou2TFvVk9/43PKrYq9hQUexPT6bYOTW6sS9 Gtzsemu1QhbnH3KiP1FlB0mgy08A4uq+5oDlPM42erm3qsSMXN7tb+ofIryRqHLQIb44 uyZiIHMO8nTrTzyWm3LbxEPC64OeOHJPQhksiParmpVkUoAFA+IgE3DU9GBPICmHO6jS jq9g==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:mime-version:references:in-reply-to :from:dkim-signature; bh=L7m5LHEzVTNCntxRZcHY9qeGHXEm3042Kp0/PYj9grg=; fh=tkpYDYLXwySE737A1nHEi/CdxprzjGr7dorEP4Jhq9U=; b=Zw0BXIs/R2jt79XjqQ6nF7Cfsz1SfAdhf0BrwvINFvtFR/c7slZ1ZOBA1CeiBDJLrp Zh657d8VAjZ4LAbq3A757IVazK3KEnFO4Cv6H4l4vdrRfGal1S1Mmjj88vDRgrANz6k8 LuAOOC9Jfx66Id4iM7d2KuYz5cmVBW+PgoqJ5E2r5o+8iqmjnyJvCifd7UBHMg/H4+k+ 1EavonGRbogvPdI7zs4/qZ/4JgFNaXJhMxInhlG//uQkWasCXkENCD5sRcTY60lUpQ5W j7NZxzIlhOHalzVYkVVUW8rpMSg9zTs9aUPFymNW6mNmR5x2NqDcXmMYbdiYNP0XYoMu sVGA==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790267947; x=1790872747; darn=ietf.org; h=content-type:cc:to:subject:message-id:date:mime-version:references :in-reply-to:from:from:to:cc:subject:date:message-id:reply-to :content-type; bh=L7m5LHEzVTNCntxRZcHY9qeGHXEm3042Kp0/PYj9grg=; b=U8NshUe4WXlmASvco51VGOOSegTJ+trUayBX2gZrEpJS3zIn8ENjPZ5VcQ65vOrZA5 z73jDQrjptNAqa6xa1HoQyYMGa7aau0V9bGxfPjubchd5U8o+q9NJ1A2uelMvbRToyFv bhX7X1gfcYq2TUl3DtkUFq5dHOy2/DqRJLDaC9icqhJh2robdU1qUs6okLhF7TBli3sB Gda3SAKzf0aF9EWtqxJ+XEBxskB1VbyG3jfqQ08pJMJUncOIcTAaXWB7upCwfyb/iZNN JypiKmeSySCW1R929K91YZJBGG4+Sbt4/4rO01v2weSZWyufS0Fn2FHkG6qkVeTrgMZP X5Fw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790267947; x=1790872747; h=content-type:cc:to:subject:message-id:date:mime-version:references :in-reply-to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=L7m5LHEzVTNCntxRZcHY9qeGHXEm3042Kp0/PYj9grg=; b=EoJL97sg7Jb4pwIHhZbq/EX7WJL+vZGpv7u15q5I2BBGSLPdibNXVFZThDJtqJIScF bIn+lLqG7uPW1kcfN4kAK1/6nrjTswU1WIGvY+8dc9N7Y/RYlakjukhnJMDVl4zAy00d 3bH+xdLnbODBh/ummXwbnk27L1uwZ9nKx5fSvdpWL54p1NkSd2b4G6CAc8ts8bwqyc/I s2kmJkXnByx4G5HPtWHmsy7OXQoj1gIjW/FEmS2V8NjnjJ9OMYuBxtrCvKT7sE2vvBNy O1kma/QImvFcigJBL26oolJlnw3cwQtIfNCphmPjXX0GhpF2ZKnWFWwpe2pD9BBVrfS+ 1BMg==
X-Forwarded-Encrypted: i=1; AKwUvBzSrexCur43YM0LjsQDcnzKg1KgR0AfjEfiExbEs9Ex0rJSV5BwltQ/DfDyIRXsQIElp8Ji@ietf.org
X-Gm-Message-State: AFuF++lsZSCzpohYECXm31Egpb0cbdk+b7EBYKQeNqzm8UcfG4AiwHMH WsW6lR7vZE6VzSKnIX9Razsx2LyzFfwiQU5ZieZ2J26wwXklbtxD2HFxavN9WiYwB45ZLS1nghI wvKcYues+YWGuWlk+lN63TnjZE0glkw==
X-Gm-Gg: AYBFou1pmkRiM/LIWBaj+3de38RAuF01aYEPw1tgsN+f4WYB84pD+TqGbPGYVUP7q/Z C8h5jm6c80knr8JkaU1DbrqLv0D3TeFJF8+hZlYT3tUWyaCiVw+in7xD6OrwgdViEWlWKvFqHou Tu5rJ+8csmajdjyvHskBBRzQkyjtJGMUN8Qj+ERTjHy/eE1fitXWQSxIHqYK/2SDFnyWc6FhzoP Mib/cq/KsmTYSjfVsIE4vg5lPdAALiUJ9p+VPZ44NgF6kyBdUFWSkmxiyBm7Nbwy9DzfMbvF645 REgp8+0k5qlmNZ0Es3nJROe0q1EgIag9DJr0fuFzCfAvkjTUuarz+MWWz6ZVf+l9Sk9sHq28v8h 09I1LHlwwQRfEH6aGXXjqSMMUUYit/EH8nvfMZTQENmXeJaL9aWYlkoFJLwztI9ymrTgfUoaAki /w+1v1LiJZMM+zPw02Eiw=
X-Received: by 2002:a05:600c:4e8b:b0:49f:ce78:356a with SMTP id 5b1f17b1804b1-49fe66fb018mr53347565e9.27.1790267947204; Thu, 24 Sep 2026 09:39:07 -0700 (PDT)
Received: from 101988054943 named unknown by gmailapi.google.com with HTTPREST; Thu, 24 Sep 2026 09:39:05 -0700
Received: from 101988054943 named unknown by gmailapi.google.com with HTTPREST; Thu, 24 Sep 2026 09:39:05 -0700
From: Serhii Nikolaichuk <nikolaichuk.s.f@gmail.com>
In-Reply-To: <1790259854301135389.1790259854@vision4d.ai>
References: <1790259854301135389.1790259854@vision4d.ai>
MIME-Version: 1.0
Date: Thu, 24 Sep 2026 09:39:05 -0700
X-Gm-Features: AclHuK_kObysJMjY9_36ouzxRGjWk534B6C56F_qhRHkCIUvjek-9VctY78Te6g
Message-ID: <CADj3X6tWMiXcu86JC1OaAugDMw4rg14W9bm_ZJGftfD_Lv3HPg@mail.gmail.com>
To: waqas.nawaz@vision4d.ai
Content-Type: multipart/alternative; boundary="0000000000000bc654065c3d3d29"
X-Spamd-Bar: -
Message-ID-Hash: 37DIVQPIJGJHIIW6TNCPT6DSN2GGCESB
X-Message-ID-Hash: 37DIVQPIJGJHIIW6TNCPT6DSN2GGCESB
X-MailFrom: nikolaichuk.s.f@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-seat.ietf.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: rats@ietf.org, seat@ietf.org
X-Mailman-Version: 3.3.10
Precedence: list
Subject: [Seat] Re: A continuity-and-revocation layer above attested TLS, with running code
List-Id: "Secure Evidence and Attestation Transport (SEAT) WG" <seat.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/seat/UVI1vgRUGqYaVzD4MesnN9XFeb4>
List-Archive: <https://mailarchive.ietf.org/arch/browse/seat>
List-Help: <mailto:seat-request@ietf.org?subject=help>
List-Owner: <mailto:seat-owner@ietf.org>
List-Post: <mailto:seat@ietf.org>
List-Subscribe: <mailto:seat-join@ietf.org>
List-Unsubscribe: <mailto:seat-leave@ietf.org>
Waqas, Three answers. Why the labels. RFC 5705, Section 4: a label beginning with EXPERIMENTAL may be used without registration; every other label must be registered, and a registered label should begin with EXPORTER -- RFC 9847 now has the expert check that. The draft you implement did exactly this on 19 September: -03 said "Attestation", -04 says EXPORTER-cmw-attestation and asks IANA for the entry in 9.2. HATLS's two exporters are neither TLS key-schedule secrets nor registered, so they live under EXPERIMENTAL-hatls-. They are also not expat's value: expat exports 32 bytes under certificate_request_context to bind one exchange; HATLS exports a 48-byte session context and a separate 32-byte continuity exporter that seeds a counter-chained sequence of links. Different inputs, lengths and meanings need different names; one name is how two protocols end up deriving the same bytes for different purposes. My first commit on the 21st got this wrong -- it borrowed RFC 9266's EXPORTER-Channel-Binding and TLS's own "tls13 " prefix -- and commit 0f51084 replaced both the same day, before the first tag, with the reason in the message. What the code solves. expat answers "is this endpoint a genuine TEE, on this connection, now", and 7.4 re-asks with a fresh context each time. 5.2 states its assumption: the AIK is generated in the TEE and never leaves it. AIK_pub_hash then proves that the TEE which signed the Evidence claims the key, not that it is the TEE the key was born on; a thief's own TEE vouches for a stolen key as readily as the owner's does. HATLS is for the case where that assumption has failed. The mandate enrols the identity on one instance -- REPORT_ID, bound to a CSR the chip's report covers -- and from then on the same key from any other instance is refused on its first message; every later link chains from the last one accepted, so a report cannot be replayed, reordered or moved across sessions. How that was measured, since you ask what the conclusions rest on. Two live SEV-SNP guests on GCP, one identity key deliberately shipped to both (scripts/launch.sh), the mandate enrolled on guest A: guest B refused on its first message, guest A still served (evidence/enroll-20260921T144800Z/; the same on AWS, where the reports are VLEK-signed). The counts -- 0 missed in 500 stolen-key presentations, 0 false rejects in 500 reconnects, 0 relayed exporters accepted in 500 -- are bench/benchmark.py against the same mandate code with a mock TEE, no hardware needed. The same properties, plus order, hold in ProVerif against a thief who holds the key, whose own TEE signs whatever it asks, and who is the TLS peer of both ends; the model with the v0.1 defect put back fails exactly the property the defect broke, so the check is not vacuous (formal/). All of it is in the tag: https://www.google.com/url?q=https://github.com/nikolaichuk7/hatls/releases/tag/v0.3.0&source=gmail&ust=1790354345203000&sa=E If your expat implementation is public, point me to it. The chain does not care what carried the first report, and I would rather run it above your code than describe it. Serhii On Thu, Sep 24, 2026 09:33 AM, waqas.nawaz@vision4d.ai wrote: > Serhii, inline with [WN] > > On Thu, Sep 24, 2026 at 2:12 PM Serhii Nikolaichuk < > nikolaichuk.s.f@gmail.com> wrote: > > Waqas, > > VCEK on the runs in the release: the GCP guests sign with the chip's VCEK, > fetched from AMD's KDS by CHIP_ID and path-validated to the ARK. The > verifier also takes VLEK-signed reports (the AWS captures in the > repository), chaining through the VLEK certificate the guest reads from the > host's certificate table, and refuses a VLEK report that arrives without > that leaf. Nothing in the continuity anchor rests on which key signed: the > instance is REPORT_ID, and the VLEK case is the reason -- one key per > region, CHIP_ID zeroed. > > Yes, exporters: RFC 8446 Section 7.5, through the stack's standard call > (SSL_export_keying_material in OpenSSL; Go, rustls and BoringSSL have the > same), under two labels of our own, EXPERIMENTAL-hatls-continuity-exporter > for the chain and EXPERIMENTAL-hatls-session-context for the first link; > the working group's own post-handshake document binds the same way > (draft-fossati-seat-expat, EXPORTER-cmw-attestation). > > [WN] I already implemented this draft. I matched label this week. What > problem does your code solve? Why you change the labels? > Thanks, > Waqas > > Each endpoint derives both from its own key schedule; nothing that binds > is sent on the wire. The v0.1 client read the exporter off the wire instead > -- that is the relay defect recorded in docs/AUDIT.md and closed before > v0.3.0. The limit that comes with exporters: the endpoint that holds the > TEE must also hold the TLS session, so behind a TLS-terminating proxy there > is nothing to bind. That is a property of channel binding, not of this > layer. > > The review is welcome. Start with the test suite (PYTHONPATH=. python3 -m > pytest tests/ -q, no hardware needed) and docs/AUDIT.md, which lists every > defect I found in my own code first. > > Serhii > > On Thu, Sep 24, 2026 06:17 AM, waqas.nawaz@vision4d.ai wrote: > >> Serhii, >> You say SEV-SNP. Do you use VLEK or VCEK? >> Don't you require exporters? How do you do that? I will review your code >> next week. >> >> Thanks, >> Waqas >> >> @IETF Admin: I get three separate copies of Serhii's email. Is this my >> configuration problem or is it normal? Is it fixable? >> >> >> >> On Thu, Sep 24, 2026 at 2:55 AM Serhii Nikolaichuk < >> nikolaichuk.s.f@gmail.com> wrote: >> >> Waqas, >> >> Nothing in HATLS adds early attestation. The layer starts where the >> handshake ends: every value it binds comes out of the completed TLS 1.3 key >> schedule, it runs over plain TLS 1.3 with no attestation extension >> underneath, and its README says so in as many words. >> >> What it adds is what the use-cases document asks for and leaves >> unspecified (3.8.1, 4.8): continuity across a connection's lifetime -- a >> re-attestation that cannot be answered with an earlier report, and a stolen >> identity key re-hosted on another chip refused on its first message -- >> proved in ProVerif and measured on live SEV-SNP, reproducible from a clone >> of the tagged release. >> >> I signed the abstract you quote, and my numbers say what it says: with >> the 5.1.1 binder an earlier report is accepted at a later reattestation, >> which 8.4 concedes in prose and #60 shows with two AMD-signed reports >> carrying byte-identical REPORT_DATA; a TDX quote in the first flight costs >> an extra round trip against a long certificate chain and a post-quantum key >> share, while post-handshake conveyance leaves the first flight untouched. >> #74 and #75 are two more defects in the same document. I file measurements >> where the working group keeps its issues, whatever I think of the document; >> that is what a tracker is for. >> >> If you find a line in the release where the chain depends on early >> attestation, show me the line. >> >> Serhii >> >> On Wed, Sep 23, 2026 03:44 PM, waqas.nawaz@vision4d.ai wrote: >> >>> As you say in abstract of your draft and cite MITRE document, key point >>> separately from attacks is need for continuous attestation. Then why add >>> the complexity and attacks of early attestation at all? >>> >>> Cheers, >>> Waqas >>> >>> >>> On Tue, Sep 22, 2026 at 6:17 PM Serhii Nikolaichuk < >>> nikolaichuk.s.f@gmail.com> wrote: >>> >>> Following up on my two notes of the 21st. The parts of this that belong >>> to the working >>> group's documents are now in their trackers rather than on the list, and >>> everything else >>> is in one tagged release with the raw hardware reports. Pointers, so the >>> list has them: >>> >>> On draft-fossati-seat-early-attestation (yaronf/draft-fossati-seat-ear >>> ly-attestation): >>> >>> #74 With a HelloRetryRequest, "Hash(ClientHello...ServerHello)" in >>> 5.1.1 has four >>> defensible readings, and they give four different binders in 200 of 200 >>> handshakes; >>> Appendix C steers toward the wrong ones and 5.1.2 makes the disagreement >>> a fatal >>> attestation_failed. A one-sentence fix is proposed. >>> https://www.google.com/url?q=https://github.com/yaronf/draft >>> -fossati-seat-early-attestation/issues/74&source=gmail&ust=1 >>> 790180231627000&sa=E >>> >>> #75 A resumed TLS 1.3 handshake carries no Certificate message, so the >>> extension of >>> 4.1 has no carrier there; the only MUST about resumption is in the >>> document history >>> while 8.6 says a resumed connection inherits the appraisal. >>> https://www.google.com/url?q=https://github.com/yaronf/draft >>> -fossati-seat-early-attestation/issues/75&source=gmail&ust=1 >>> 790180231627000&sa=E >>> >>> #60 Section 8.4 reproduced on a live SEV-SNP guest with the 5.1.1 binder >>> computed as >>> written from the real transcript: two genuine reports in one connection >>> carry >>> byte-identical REPORT_DATA and the stale one is accepted at >>> reattestation. ProVerif >>> finds that trace with a constant binder and proves order with a chained >>> one. Of the >>> 5.4 options, Extended Key Update would give order for free; >>> post-handshake auth and >>> CertificateUpdate would not. >>> https://www.google.com/url?q=https://github.com/yaronf/draft >>> -fossati-seat-early-attestation/issues/60%23issuecomment-577 >>> 9862051&source=gmail&ust=1790180231627000&sa=E >>> >>> On draft-ietf-seat-use-cases (ietf-wg-seat/draft-ietf-seat-use-cases): >>> >>> #8 What "the identifier provided to the machine" actually is, read at >>> the ABI offsets >>> across 87 SEV-SNP reports from two clouds and two TDX guests: VCEK names >>> the chip, >>> VLEK the region, REPORT_ID the instance; CHIP_ID is all-zero on AWS >>> while the >>> report's MASK_CHIP_KEY flag reads 0; on TDX only the host-supplied >>> MROWNER differs, >>> unless the guest extends an RTMR, which I measured on two TDs. >>> https://www.google.com/url?q=https://github.com/ietf-wg-seat >>> /draft-ietf-seat-use-cases/issues/8%23issuecomment-577986301 >>> 4&source=gmail&ust=1790180231627000&sa=E >>> >>> #60 On key migration between trusted environments: the firmware ABI >>> marks ReportID as >>> migrating with the guest, and an owner-authorised transfer, honoured >>> only toward an >>> instance the relying party has itself seen attest, measured on live >>> SEV-SNP. >>> https://www.google.com/url?q=https://github.com/ietf-wg-seat >>> /draft-ietf-seat-use-cases/issues/60%23issuecomment-57798641 >>> 03&source=gmail&ust=1790180231627000&sa=E >>> >>> Section 4 of the use-cases draft asks proposals to state which of its >>> goals they meet and >>> how. That statement, goal by goal, with three goals not met and said so, >>> is here: >>> https://www.google.com/url?q=https://github.com/nikolaichuk7 >>> /hatls/blob/v0.3.0/docs/SEAT-GOALS.md&source=gmail&ust=17901 >>> 80231627000&sa=E >>> >>> Two corrections of my own from the same pass: the guest probe in my >>> repository had been >>> unable to answer a connection since v0.2.0 (recorded results predate the >>> defect; the >>> "clone it and run it" invitation did not), and a "7.96 ms beacon" I had >>> quoted as a rate >>> was one report's latency while my own file held a 10 s maximum: the host >>> throttles a >>> guest to about ten SEV-SNP reports per ten seconds. Both are fixed and >>> written up. >>> >>> Release, with every measurement reproducible from a clone: >>> https://www.google.com/url?q=https://github.com/nikolaichuk7 >>> /hatls/releases/tag/v0.3.0&source=gmail&ust=1790180231627000&sa=E >>> >>> I will keep further detail on the issues rather than here. >>> >>> Serhii Nikolaichuk >>> The Capital Index, Austin, Texas >>> >>> >> >
- [Seat] A continuity-and-revocation layer above at… Serhii Nikolaichuk
- [Seat] Re: A continuity-and-revocation layer abov… Serhii Nikolaichuk
- [Seat] Re: A continuity-and-revocation layer abov… Serhii Nikolaichuk
- [Seat] Re: A continuity-and-revocation layer abov… waqas.nawaz
- [Seat] Re: A continuity-and-revocation layer abov… Serhii Nikolaichuk
- [Seat] Re: A continuity-and-revocation layer abov… waqas.nawaz
- [Seat] Re: A continuity-and-revocation layer abov… Serhii Nikolaichuk
- [Seat] Re: A continuity-and-revocation layer abov… waqas.nawaz
- [Seat] Re: A continuity-and-revocation layer abov… Serhii Nikolaichuk