LGTM1
On Wednesday, October 21, 2026 at 12:09:28 PM UTC-7 Chromestatus wrote:
*Contact emails*
[email protected], [email protected]
*Explainer*
https://github.com/w3c/webtransport/blob/main/explainer.md
<https://github.com/w3c/webtransport/blob/main/explainer.md>
*Specification*
https://www.w3.org/TR/webtransport/#dom-webtransport-exportkeyingmaterial
<https://www.w3.org/TR/webtransport/#dom-webtransport-exportkeyingmaterial>
*Summary*
Adds WebTransport.exportKeyingMaterial(), which allows an
application to derive cryptographic keying material bound to an
established WebTransport session. The method accepts application
provided binary label and context values and a requested output
length and returns a Promise<Uint8Array>. Chromium supports label
and context values up to 255 bytes and output lengths from 1
through 4096 bytes. For WebTransport over HTTP/3, Chromium
includes the WebTransport CONNECT stream ID in the TLS exporter
context. This ensures that separate WebTransport sessions derive
different keying material even when they share the same underlying
HTTP/3 connection.
*Blink component*
Blink>Network>WebTransport
<https://issues.chromium.org/issues?q=customfield1222907:%22Blink%3ENetwork%3EWebTransport%22>
*Web Feature ID*
webtransport <https://webstatus.dev/features/webtransport>
*Motivation*
Applications sometimes need cryptographic keying material bound to
an authenticated transport session, for example to bind an
application protocol, authentication exchange, or
application-level encryption context to a WebTransport session
without performing an additional key exchange. TLS exporters
derive application-specific secret material without exposing the
TLS traffic keys. WebTransport.exportKeyingMaterial() exposes
this mechanism through application-provided binary label and
context values and an explicit output length. Multiple
WebTransport sessions can share one HTTP/3 connection. Chromium
therefore includes the WebTransport CONNECT stream ID in the
exporter context, ensuring that different sessions derive
different keying material even when callers use identical
application labels and contexts.
*Initial public proposal*
https://github.com/w3c/webtransport/issues/411
<https://github.com/w3c/webtransport/issues/411>
*TAG review*
This is an incremental method within the existing WebTransport
specification. WebTransport has an umbrella TAG review, and a
separate feature-level review is not currently planned.
*TAG review status*
Not applicable
*Goals for experimentation*
None
*Risks*
*Interoperability and Compatibility*
Interoperability risk: Medium. The current WebTransport
specification and upstream WPT define the required three-argument
exportKeyingMaterial(label, context, outputLength) method.
Chromium and WebKit implement this shape. Firefox currently
exposes the earlier two-argument form without outputLength , so
API-shape interoperability is not yet complete. Implementations
and servers must also use the same fixed exporter label and
exporter-context construction, including the WebTransport session
ID, application label, application context, and requested output
length. A mismatch produces different bytes without an explicit
protocol error. Compatibility risk: Low. The method is additive
and does not change existing WebTransport construction, streams,
datagrams, or connection behavior. Applications can use feature
detection with "exportKeyingMaterial" in WebTransport.prototype.
/Gecko/:
Positive (https://bugzilla.mozilla.org/show_bug.cgi?id=2079306
<https://bugzilla.mozilla.org/show_bug.cgi?id=2079306>) Firefox is
updating its implementation to the current three-argument API.
/WebKit/: In
development (https://github.com/WebKit/WebKit/pull/69982
<https://github.com/WebKit/WebKit/pull/69982>) WebKit has landed
an implementation of the current three-argument
WebTransport.exportKeyingMaterial(label, context, outputLength) API.
/Web developers/:
Positive (https://github.com/w3c/webtransport/issues/411
<https://github.com/w3c/webtransport/issues/411>) The proposal
received 10 👍 reactions and requests from developers, including
libp2p, for TLS-session binding and channel-binding use cases.
/Other signals/:
*Ergonomics*
Ergonomics risk is moderate because this is a low-level
cryptographic primitive. Binary BufferSource label and context
values avoid string-encoding ambiguity, while the explicit output
length avoids an implicit key-size choice. Calls made while the
WebTransport session is connecting are queued until the connection
is established. Calls after closure or failure reject with
InvalidStateError . Label or context values over 255 bytes and
zero or unsupported output lengths reject with RangeError .
Documentation should recommend protocol-specific domain-separation
values and secure handling of the resulting bytes.
*Activation*
Activation risk is moderate but bounded. The API is additive and
has no effect unless a site explicitly invokes it. It introduces
no new network messages or additional protocol negotiation. The
main activation risk is a mismatch between client and server
implementations in the exporter construction, including the fixed
exporter label, WebTransport session ID serialization, application
label or context, and output length. Such a mismatch causes the
endpoints to derive different bytes without an explicit error.
Chromium mitigates this risk through validation in Blink and
across the renderer/network-service boundary, fixed input limits,
session-specific domain separation, lifecycle checks, unit and Web
Platform Tests, and the WebTransportExportKeyingMaterial
runtime/Finch feature gate.
*Security*
This API exposes secret-derived material to script and therefore
requires careful domain separation and lifecycle handling. It does
not expose TLS traffic keys or allow callers to decrypt
WebTransport traffic. Chromium uses the fixed TLS exporter label
"EXPORTER-WebTransport" and constructs an exporter context
containing the WebTransport CONNECT stream ID, application label,
and application context. Including the CONNECT stream ID prevents
different WebTransport sessions sharing one HTTP/3 connection from
deriving identical keying material when given the same application
inputs. Chromium limits label and context values to 255 bytes and
output to 4096 bytes, validates requests in both Blink and the
network service, verifies the returned output length, and rejects
calls after the session has closed or failed. Applications remain
responsible for treating the result as secret keying material and
using protocol-specific label and context values Security
questionnaire:
https://github.com/w3c/webtransport/blob/main/security-questionnaire.md
<https://github.com/w3c/webtransport/blob/main/security-questionnaire.md>
*WebView application risks*
Does this intent deprecate or change behavior of existing APIs,
such that it has potentially high risk for Android WebView-based
applications?
Low. This is an additive API implemented in shared Blink and
network-service code. The CL updates the Android WebView
Web-exposed interface expectation and requires no WebView-specific
integration. Stable WebView exposure should follow the existing
availability and launch process for WebTransport in WebView.
*Debuggability*
Developers can inspect the label, context, output length, returned
Uint8Array, and any rejected exception through JavaScript
breakpoints or the Console. CDP exposes WebTransport creation,
connection-establishment, and closure events. NetLog provides
additional WebTransport version, QUIC lifecycle, and stream
diagnostics. Neither CDP nor NetLog records exporter invocations,
exported bytes, or compares the client-derived value with the
server-derived value. A client/server derivation mismatch
therefore requires server cooperation, preferably through a
key-confirmation challenge or MAC rather than logging raw keying
material.
*Will this feature be supported on all six Blink platforms
(Windows, Mac, Linux, ChromeOS, Android, and Android WebView)?*
Yes
All Blink platforms on which WebTransport over HTTP/3 is
supported. The Web-exposed implementation is cross-platform Blink
code, while key derivation uses Chromium’s existing HTTP/3/QUIC
TLS exporter path.
*Is this feature fully tested by web-platform-tests
<https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>?*
Yes
https://wpt.fyi/results/webtransport/export-keying-material.https.any.html?label=experimental&label=master&aligned
<https://wpt.fyi/results/webtransport/export-keying-material.https.any.html?label=experimental&label=master&aligned>,
https://wpt.fyi/results/webtransport/idlharness.https.sub.any.html?label=experimental&label=master&aligned
<https://wpt.fyi/results/webtransport/idlharness.https.sub.any.html?label=experimental&label=master&aligned>
*Flag name on about://flags*
chrome://flags/#enable-experimental-web-platform-features
*Finch feature name*
WebTransportExportKeyingMaterial
*Rollout plan*
Will ship enabled for all users
*Requires code in //chrome?*
False
*Tracking bug*
https://issues.chromium.org/issues/556304550
<https://issues.chromium.org/issues/556304550>
*Measurement*
Measure correctness and interoperability through Web Platform
Tests, the WebTransport IDL harness, wpt.fyi results, and feedback
from WebTransport application and server implementers. Usage will
be measured with a WebFeature use counter recorded when
WebTransport.exportKeyingMaterial() is called. No dedicated UMA
metric is currently planned, the use counter is sufficient to
measure web-exposed API adoption
*Availability expectation*
Expected to become available across major browser engines as part
of the W3C WebTransport specification. WebKit has landed the
current three-argument API in WebKit main, although stable Safari
availability has not yet been verified. Firefox currently
implements the earlier two-argument form without the required
outputLength argument.
*Adoption expectation*
Expected to be used by specialized WebTransport protocols that
require transport-bound authentication, channel binding, or
application key derivation. It is not expected to be used by most
basic WebTransport applications.
*Adoption plan*
Adoption is expected to occur through WebTransport documentation,
interoperable WPT coverage, and use by protocol implementations
that require transport-bound keying material. No origin trial or
broad developer campaign is currently planned
*Estimated milestones*
Shipping on desktop 158
Shipping on Android 158
Shipping on WebView 158
*Anticipated spec changes*
Open questions about a feature may be a source of future web
compat or interop issues. Please list open issues (e.g. links to
known github issues in the project for the feature specification)
whose resolution may introduce web compat/interop risk (e.g.,
changing to naming or structure of the API in a
non-backward-compatible way).
No API-shape changes are currently anticipated. Chromium
implements the current required three-argument method and matches
the WebTransport-over-HTTP/3 exporter construction, including the
fixed exporter label and session-specific context encoding.
https://github.com/w3c/webtransport/issues/791
<https://github.com/w3c/webtransport/issues/791> tracks making the
specification’s reference to the protocol-level exporter
construction more explicit. This is currently an editorial clarity
issue rather than a known behavior change.
*Link to entry on the Chrome Platform Status*
https://chromestatus.com/feature/4860330806214656?gate=6662931365363712
<https://chromestatus.com/feature/4860330806214656?gate=6662931365363712>
*Links to previous Intent discussions*
Intent to Prototype:
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/6aa97628.f13237a8.13ec.001a.GAE%40google.com
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/6aa97628.f13237a8.13ec.001a.GAE%40google.com>
This intent message was generated by Chrome Platform Status
<https://chromestatus.com>.
--
You received this message because you are subscribed to the Google
Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected].
To view this discussion visit
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/3a5388d9-892a-48a3-b39a-ebc57635aa98n%40chromium.org
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/3a5388d9-892a-48a3-b39a-ebc57635aa98n%40chromium.org?utm_medium=email&utm_source=footer>.