@@ -260,8 +260,8 @@ need to validate the 5-tuple of all handshake packets, including the converted
260
260
first flight.
261
261
262
262
Note also that the client can disable compatible version negotiation by only
263
- including the Chosen Version in the Other Versions field of the Version
264
- Information transport parameter ; see {{vers-info}}.
263
+ including the Chosen Version in the Available Versions field of the Version
264
+ Information; see {{vers-info}}.
265
265
266
266
If the server does not find a compatible version (including the client's chosen
267
267
version), it will perform incompatible version negotiation instead, see
@@ -274,11 +274,11 @@ and C is compatible with D, the following scenario could occur:
274
274
~~~
275
275
Client Server
276
276
277
- Chosen = A, Other Versions = (A, B) ---- ------------->
277
+ Chosen = A, Available Versions = (A, B) ------------->
278
278
<------------------------ Version Negotiation = (D, C)
279
279
280
- Chosen = C, Other Versions = (C, D) ---- ------------->
281
- <----------------- Chosen = D, Other Versions = (D, C)
280
+ Chosen = C, Available Versions = (C, D) ------------->
281
+ <------------- Chosen = D, Available Versions = (D, C)
282
282
~~~
283
283
{: # fig-dual-example title="Combined Negotiation Example"}
284
284
@@ -323,8 +323,8 @@ client's first flight.
323
323
# Version Information {#vers-info}
324
324
325
325
During the handshake, endpoints will exchange Version Information, which
326
- consists of a chosen version and a list of other versions. Any version of QUIC
327
- that supports this mechanism MUST provide a mechanism to exchange Version
326
+ consists of a chosen version and a list of available versions. Any version of
327
+ QUIC that supports this mechanism MUST provide a mechanism to exchange Version
328
328
Information in both directions during the handshake, such that this data is
329
329
authenticated.
330
330
@@ -336,7 +336,7 @@ contents of Version Information are shown below (using the notation from the
336
336
~~~
337
337
Version Information {
338
338
Chosen Version (32),
339
- Other Versions (32) ...,
339
+ Available Versions (32) ...,
340
340
}
341
341
~~~
342
342
{: # fig-vi-format title="Version Information Format"}
@@ -349,29 +349,29 @@ cases, this field will be equal to the value of the Version field in the long
349
349
header that carries this data; however future versions or extensions can choose
350
350
to set different values in the long header Version field.
351
351
352
- The contents of the Other Versions field depends on whether it is sent by the
353
- client or by the server.
352
+ The contents of the Available Versions field depends on whether it is sent by
353
+ the client or by the server.
354
354
355
- Client-Sent Other Versions :
356
- : When sent by a client, the Other Versions field lists all the versions that
357
- this first flight is compatible with, ordered by descending preference. Note
358
- that the version in the Chosen Version field MUST be included in this list to
359
- allow the client to communicate the chosen version's preference. Note that this
360
- preference is only advisory, servers MAY choose to use their own preference
355
+ Client-Sent Available Versions :
356
+ : When sent by a client, the Available Versions field lists all the versions
357
+ that this first flight is compatible with, ordered by descending preference.
358
+ Note that the version in the Chosen Version field MUST be included in this list
359
+ to allow the client to communicate the chosen version's preference. Note that
360
+ this preference is only advisory, servers MAY choose to use their own preference
361
361
instead.
362
362
363
- Server-Sent Other Versions :
364
- : When sent by a server, the Other Versions field lists all the Fully-Deployed
365
- Versions of this server deployment, see {{server-fleet}}. Note that the version
366
- in the Chosen Version field is not necessarily included in this list, because
367
- the server operator could be in the process of removing support for this
368
- version. For the same reason, the Other Versions field MAY be empty.
369
- {: spacing="compact"}
363
+ Server-Sent Available Versions :
364
+ : When sent by a server, the Available Versions field lists all the
365
+ Fully-Deployed Versions of this server deployment, see {{server-fleet}}. Note
366
+ that the version in the Chosen Version field is not necessarily included in this
367
+ list, because the server operator could be in the process of removing support
368
+ for this version. For the same reason, the Available Versions field MAY be empty.
369
+ {:spacing="compact"}
370
370
371
371
Clients and servers MAY both include versions following the pattern 0x?a?a?a?a
372
- in their Other Versions list. Those versions are reserved to exercise version
373
- negotiation (see the Versions section of {{QUIC}}), and will never be selected
374
- when choosing a version to use.
372
+ in their Available Versions list. Those versions are reserved to exercise
373
+ version negotiation (see the Versions section of {{QUIC}}), and will never be
374
+ selected when choosing a version to use.
375
375
376
376
377
377
# Version Downgrade Prevention {#downgrade}
@@ -391,8 +391,8 @@ If parsing the Version Information failed (for example, if it is too short or if
391
391
its length is not divisible by four), then the endpoint MUST close the
392
392
connection; if the connection was using QUIC version 1, that connection closure
393
393
MUST use a transport error of type TRANSPORT_PARAMETER_ERROR. If an endpoint
394
- receives a Chosen Version equal to zero, or any Other Version equal to zero, it
395
- MUST treat it as a parsing failure.
394
+ receives a Chosen Version equal to zero, or any Available Version equal to zero,
395
+ it MUST treat it as a parsing failure.
396
396
397
397
Every QUIC version that supports version negotiation MUST define a method for
398
398
closing the connection with a version negotiation error. For QUIC version 1,
@@ -405,17 +405,18 @@ the Version Information was missing, the client MUST close the connection with a
405
405
version negotiation error.
406
406
407
407
If the client received and acted on a Version Negotiation packet, the client
408
- MUST validate the server's Other Versions field. The Other Versions field is
409
- validated by confirming that the client would have attempted the same version
410
- with knowledge of the versions the server supports. That is, the client would
411
- have selected the same version if it received a Version Negotiation packet that
412
- listed the versions in the server's Other Versions field, plus the negotiated
413
- version. If the client would have selected a different version, the client MUST
414
- close the connection with a version negotiation error. In particular, if the
415
- client reacted to a Version Negotiation packet and the server's Other Versions
416
- field is empty, the client MUST close the connection with a version negotiation
417
- error. These connection closures prevent an attacker from being able to use
418
- forged Version Negotiation packets to force a version downgrade.
408
+ MUST validate the server's Available Versions field. The Available Versions
409
+ field is validated by confirming that the client would have attempted the same
410
+ version with knowledge of the versions the server supports. That is, the client
411
+ would have selected the same version if it received a Version Negotiation packet
412
+ that listed the versions in the server's Available Versions field, plus the
413
+ negotiated version. If the client would have selected a different version, the
414
+ client MUST close the connection with a version negotiation error. In
415
+ particular, if the client reacted to a Version Negotiation packet and the
416
+ server's Available Versions field is empty, the client MUST close the connection
417
+ with a version negotiation error. These connection closures prevent an attacker
418
+ from being able to use forged Version Negotiation packets to force a version
419
+ downgrade.
419
420
420
421
As an example, let's assume a client supports hypothetical QUIC versions 10, 12,
421
422
and 14 with a preference for higher versions. The client initiates a connection
@@ -424,21 +425,22 @@ attempt with version 12. Let's explore two independent example scenarios:
424
425
* In the first scenario, the server supports versions 10, 13, and 14 but only 13
425
426
and 14 are Fully-Deployed. The server sends a Version Negotiation packet with
426
427
versions 10, 13, and 14. This triggers an incompatible version negotiation and
427
- the client initiates a new connection with version 14. Then the server's Other
428
- Versions field contains 13 and 14. In that scenario, the client would have
429
- also picked 14 if it had received a Version Negotiation packet with versions
430
- 13 and 14, therefore the handshake succeeds using negotiated version 14.
428
+ the client initiates a new connection with version 14. Then the server's
429
+ Available Versions field contains 13 and 14. In that scenario, the client
430
+ would have also picked 14 if it had received a Version Negotiation packet with
431
+ versions 13 and 14, therefore the handshake succeeds using negotiated version
432
+ 14.
431
433
432
434
* In the second scenario, the server supports versions 10, 13, and 14 and they
433
435
are all Fully-Deployed. However, the attacker forges a Version Negotiation
434
436
packet with versions 10 and 13. This triggers an incompatible version
435
437
negotiation and the client initiates a new connection with version 10. Then
436
- the server's Other Versions field contains 10, 13 and 14. In that scenario,
437
- the client would have picked 14 instead of 10 if it had received a Version
438
- Negotiation packet with versions 10, 13 and 14, therefore the client aborts
439
- the handshake with a version negotiation error.
438
+ the server's Available Versions field contains 10, 13 and 14. In that
439
+ scenario, the client would have picked 14 instead of 10 if it had received a
440
+ Version Negotiation packet with versions 10, 13 and 14, therefore the client
441
+ aborts the handshake with a version negotiation error.
440
442
441
- This validation of Other Versions is not sufficient to prevent downgrade.
443
+ This validation of Available Versions is not sufficient to prevent downgrade.
442
444
Downgrade prevention also depends on the client ignoring Version Negotiation
443
445
packets that contain the original version; see {{incompat-vn}}.
444
446
@@ -620,7 +622,7 @@ is starting a QUIC version 1 connection in response to a received Version
620
622
Negotiation packet, and the version_information transport parameter is missing
621
623
from the server's transport parameters, then the client SHALL proceed as if the
622
624
server's transport parameters contained a version_information transport
623
- parameter with a Chosen Version set to 0x00000001 and an Other Version list
625
+ parameter with a Chosen Version set to 0x00000001 and an Available Version list
624
626
containing exactly one version set to 0x00000001. This allows version
625
627
negotiation to work with servers that only support QUIC version 1. Note that
626
628
implementations which wish to use version negotiation to negotiate versions
0 commit comments