From 870b0adc80726d380e670ea9e985794d94127ff6 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 27 Mar 2019 10:21:30 +0100 Subject: [PATCH 1/8] draft some text about the version_aliases transport parameter --- draft-ietf-quic-transport.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 7683ab27c2..3f01decece 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -3246,7 +3246,20 @@ Implementors are encouraged to register version numbers of QUIC that they are using for private experimentation on the GitHub wiki at \. +## Version Aliases +In order to avoid ossification of the version number defined by this draft, +servers announce a list of version numbers that they interpret as an alias for +the version number used in this draft. Alias versions MUST NOT be a reserved +version. Servers SHOULD send at least one version alias, and SHOULD frequently +change the value that they announce. Each version alias contains a lifetime, +which indicates how long the server will accept this version alias. The list +of version aliases is sent in the server's Transport Parameters (see +{{transport-parameter-definitions}}). + +Clients SHOULD remember the aliases and use it for subsequent connections to the +same server in the future. This applies to both 0-RTT connection as well as +connections that don't use 0-RTT. # Variable-Length Integer Encoding {#integer-encoding} @@ -3955,6 +3968,7 @@ language from Section 3 of {{!TLS13=RFC8446}}. max_ack_delay(11), disable_migration(12), preferred_address(13), + version_aliases(14), (65535) } TransportParameterId; @@ -4115,6 +4129,24 @@ preferred_address (0x000d): ~~~ {: #fig-preferred-address title="Preferred Address format"} +version_aliases (0x000e): + +: A list of version numbers that the server accepts as an alias for the + currently used versions. This transport parameter is only sent by the server. + Every version alias contains a lifetime in seconds. The alias is only valid + for that lifetime, clients MUST NOT use it after expiry. + +~~~ + struct { + uint32 VersionNumber; + uint32 Lifetime; + } VersionAlias; + + VersionAliases VersionAlias<0..2^16-1>; +~~~ +{: #fig-version-aliases title="Version Aliases format"} + + If present, transport parameters that set initial flow control limits (initial_max_stream_data_bidi_local, initial_max_stream_data_bidi_remote, and initial_max_stream_data_uni) are equivalent to sending a MAX_STREAM_DATA frame From 077e03ca881dfedd25e446ad5bad6500b3efcf03 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 27 Mar 2019 15:12:07 +0100 Subject: [PATCH 2/8] add an initial secret to the version alias --- draft-ietf-quic-transport.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 3f01decece..7bea30b656 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -3253,9 +3253,10 @@ servers announce a list of version numbers that they interpret as an alias for the version number used in this draft. Alias versions MUST NOT be a reserved version. Servers SHOULD send at least one version alias, and SHOULD frequently change the value that they announce. Each version alias contains a lifetime, -which indicates how long the server will accept this version alias. The list -of version aliases is sent in the server's Transport Parameters (see -{{transport-parameter-definitions}}). +which indicates how long the server will accept this version alias. It also +contains an initial salt, which is used instead of the initial salt as defined +in section 5.2 of {{QUIC-TLS}}. The list of version aliases is sent in the +server's Transport Parameters (see {{transport-parameter-definitions}}). Clients SHOULD remember the aliases and use it for subsequent connections to the same server in the future. This applies to both 0-RTT connection as well as @@ -4140,6 +4141,7 @@ version_aliases (0x000e): struct { uint32 VersionNumber; uint32 Lifetime; + opaque InitialSecret<20>; } VersionAlias; VersionAliases VersionAlias<0..2^16-1>; From 2e3a99eb39f54b4ccb35f1a5d0a8ebfe31e41314 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 1 Apr 2019 10:53:32 +0900 Subject: [PATCH 3/8] make the version alias lifetime a varint --- draft-ietf-quic-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 7bea30b656..66d8fc8901 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -4140,7 +4140,7 @@ version_aliases (0x000e): ~~~ struct { uint32 VersionNumber; - uint32 Lifetime; + varint Lifetime; opaque InitialSecret<20>; } VersionAlias; From 9d1090e27f4f596ceedd0841a7929a914af7623d Mon Sep 17 00:00:00 2001 From: Martin Thomson Date: Tue, 9 Apr 2019 11:35:05 +0900 Subject: [PATCH 4/8] make the lifetime a uint32 Co-Authored-By: marten-seemann --- draft-ietf-quic-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 66d8fc8901..85c4144f83 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -4140,7 +4140,7 @@ version_aliases (0x000e): ~~~ struct { uint32 VersionNumber; - varint Lifetime; + uint32 lifetime_ms; opaque InitialSecret<20>; } VersionAlias; From 9e77f1168e0b19e3fe0c40344acd430d6c1f705f Mon Sep 17 00:00:00 2001 From: MikkelFJ Date: Tue, 9 Apr 2019 18:54:10 +0900 Subject: [PATCH 5/8] change the lifetime to milliseconds Co-Authored-By: marten-seemann --- draft-ietf-quic-transport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 85c4144f83..8a3d9dcc33 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -4134,7 +4134,7 @@ version_aliases (0x000e): : A list of version numbers that the server accepts as an alias for the currently used versions. This transport parameter is only sent by the server. - Every version alias contains a lifetime in seconds. The alias is only valid + Every version alias contains a lifetime in milliseconds. The alias is only valid for that lifetime, clients MUST NOT use it after expiry. ~~~ From 4e3089df90e67867a6c65b6283515b052cdd723e Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Thu, 18 Apr 2019 15:53:32 -0700 Subject: [PATCH 6/8] Rewrap --- draft-ietf-quic-transport.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 8a3d9dcc33..53c0dc43f3 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -4134,8 +4134,8 @@ version_aliases (0x000e): : A list of version numbers that the server accepts as an alias for the currently used versions. This transport parameter is only sent by the server. - Every version alias contains a lifetime in milliseconds. The alias is only valid - for that lifetime, clients MUST NOT use it after expiry. + Every version alias contains a lifetime in milliseconds. The alias is only + valid for that lifetime, clients MUST NOT use it after expiry. ~~~ struct { From d887ca784bd50f2f69c959f7b3a64365e6736dec Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 19 Apr 2019 08:46:14 +0900 Subject: [PATCH 7/8] Mike's suggestions --- draft-ietf-quic-transport.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 53c0dc43f3..872c37eea8 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -3249,7 +3249,7 @@ using for private experimentation on the GitHub wiki at ## Version Aliases In order to avoid ossification of the version number defined by this draft, -servers announce a list of version numbers that they interpret as an alias for +servers announce a list of version numbers that they interpret as aliases for the version number used in this draft. Alias versions MUST NOT be a reserved version. Servers SHOULD send at least one version alias, and SHOULD frequently change the value that they announce. Each version alias contains a lifetime, @@ -3258,9 +3258,9 @@ contains an initial salt, which is used instead of the initial salt as defined in section 5.2 of {{QUIC-TLS}}. The list of version aliases is sent in the server's Transport Parameters (see {{transport-parameter-definitions}}). -Clients SHOULD remember the aliases and use it for subsequent connections to the -same server in the future. This applies to both 0-RTT connection as well as -connections that don't use 0-RTT. +Clients SHOULD remember the list of aliases and use it for subsequent +connections to the same server in the future. This applies to both 0-RTT +connection as well as connections that don't use 0-RTT. # Variable-Length Integer Encoding {#integer-encoding} @@ -4132,10 +4132,10 @@ preferred_address (0x000d): version_aliases (0x000e): -: A list of version numbers that the server accepts as an alias for the - currently used versions. This transport parameter is only sent by the server. +: A list of version numbers that the server accepts as aliases for the + currently used version. This transport parameter is only sent by the server. Every version alias contains a lifetime in milliseconds. The alias is only - valid for that lifetime, clients MUST NOT use it after expiry. + valid for that lifetime. Clients MUST NOT use an expired alias. ~~~ struct { From b085787323b8ba247f239ee0178fb2637e950ce7 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 19 Apr 2019 08:52:58 +0900 Subject: [PATCH 8/8] be pedantic about supporting alias versions --- draft-ietf-quic-transport.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 872c37eea8..eae9f50f2a 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -3251,12 +3251,17 @@ using for private experimentation on the GitHub wiki at In order to avoid ossification of the version number defined by this draft, servers announce a list of version numbers that they interpret as aliases for the version number used in this draft. Alias versions MUST NOT be a reserved -version. Servers SHOULD send at least one version alias, and SHOULD frequently -change the value that they announce. Each version alias contains a lifetime, -which indicates how long the server will accept this version alias. It also -contains an initial salt, which is used instead of the initial salt as defined -in section 5.2 of {{QUIC-TLS}}. The list of version aliases is sent in the -server's Transport Parameters (see {{transport-parameter-definitions}}). +version. A server MUST NOT advertise an alias version number for a version that +it actually supports. If the server advertises an alias version number that the +client actually supports, the client MUST assume the server doesn't support +that version and ignore the alias. + +Servers SHOULD send at least one version alias, and SHOULD frequently change the +value that they announce. Each version alias contains a lifetime, which +indicates how long the server will accept this version alias. It also contains +an initial salt, which is used instead of the initial salt as defined in section +5.2 of {{QUIC-TLS}}. The list of version aliases is sent in the server's +Transport Parameters (see {{transport-parameter-definitions}}). Clients SHOULD remember the list of aliases and use it for subsequent connections to the same server in the future. This applies to both 0-RTT