Re: [quicwg/base-drafts] Add retry integrity tag (#3120)

Mike Bishop <> Wed, 23 October 2019 20:23 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 85B6F120274 for <>; Wed, 23 Oct 2019 13:23:24 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -8
X-Spam-Status: No, score=-8 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, HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_HI=-5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: (amavisd-new); dkim=pass (1024-bit key)
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id P1-BMFUVtbP4 for <>; Wed, 23 Oct 2019 13:23:22 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 87E6912012D for <>; Wed, 23 Oct 2019 13:23:22 -0700 (PDT)
Received: from ( []) by (Postfix) with ESMTP id 8F9EDC62052 for <>; Wed, 23 Oct 2019 13:23:21 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=pf2014; t=1571862201; bh=jX1we1MBWzVMSf/W4g4z346QFQZ9gAV/sPnyyQrD2ss=; h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:List-ID: List-Archive:List-Post:List-Unsubscribe:From; b=v8LbGbFsgjbuEuWhgT2JGt4FVKr3rnZh7w2mPsWp65IENm2Ud4rk05E7U/Qt1VR4o BYAUx0vRYPTSmh1yPUZzeHpPcCSmI2807vgjq5aehrQ28qME1qsrh1is+7fjTlRoVw E+7oQt+FulyKUoMlSsWyvlwTcin/J2eCj2/nDR2w=
Date: Wed, 23 Oct 2019 13:23:21 -0700
From: Mike Bishop <>
Reply-To: quicwg/base-drafts <>
To: quicwg/base-drafts <>
Cc: Subscribed <>
Message-ID: <quicwg/base-drafts/pull/3120/review/>
In-Reply-To: <quicwg/base-drafts/pull/>
References: <quicwg/base-drafts/pull/>
Subject: Re: [quicwg/base-drafts] Add retry integrity tag (#3120)
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="--==_mimepart_5db0b6b980036_430e3ff48d2cd9601466fe"; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: MikeBishop
X-GitHub-Recipient: quic-issues
X-GitHub-Reason: subscribed
X-Auto-Response-Suppress: All
Archived-At: <>
X-Mailman-Version: 2.1.29
List-Id: Notification list for GitHub issues related to the QUIC WG <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Wed, 23 Oct 2019 20:23:25 -0000

MikeBishop approved this pull request.

> @@ -1197,6 +1197,64 @@ TLS ClientHello.  The server MAY retain these packets for later decryption in
 anticipation of receiving a ClientHello.
+## Retry Packet Integrity {#retry-integrity}
+Retry packets (see the Retry Packet section of {{QUIC-TRANSPORT}}) carry a
+Retry Integrity Tag that provides two properties: it allows discarding
+packets that have accidentally been corrupted by the network, and it mitigates
+off-path attackers' ability to send valid Retry packets.
+The Retry Integrity Tag is a 128-bit field that is computed as the output of
+AEAD_AES_128_GCM {{!AEAD=RFC5116}} used with the following inputs:
+- The secret key, K, is 128 bits all set to zero.
+- The nonce, N, is 96 bits all set to zero.
+- The plaintext is empty.
+- The associated data is the contents of the Retry Pseudo-Packet, as described

I'd use a different verb than "described" when referencing the figure.  We've tried to follow the rule that illustrations aren't normative, they're just helpful illustrations of what the text says.

> +|                         Version (32)                          |
+| DCID Len (8)  |
+|               Destination Connection ID (0..160)            ...
+| SCID Len (8)  |
+|                 Source Connection ID (0..160)               ...
+|                        Retry Token (*)                      ...
+{: #retry-pseudo title="Retry Pseudo-Packet"}
+The Retry Pseudo-Packet is not sent over the wire. It is computed by taking

@martinthomson is the editor of both documents, so I'd say he gets to hold the baton here.

> @@ -2736,7 +2736,7 @@ available.
 ## Protected Packets {#packet-protected}
-All QUIC packets except Version Negotiation and Retry packets use authenticated
+All QUIC packets except Version Negotiation packets use authenticated
 encryption with additional data (AEAD) {{!RFC5116}} to provide confidentiality

They're not encrypted, so kind of by definition....

> @@ -4111,37 +4111,31 @@ wishes to perform a retry (see {{validate-handshake}}).
 |                 Source Connection ID (0..160)               ...
-| ODCID Len (8) |
-|          Original Destination Connection ID (0..160)        ...
 |                        Retry Token (*)                      ...

We have a convention of having the final variable-length field have an implicit length.  It reduces the possibility of "impossible" packets.  I'm inclined to keep the PR as-is.

> @@ -4163,10 +4157,10 @@ A client MUST accept and process at most one Retry packet for each connection
 attempt.  After the client has received and processed an Initial or Retry packet
 from the server, it MUST discard any subsequent Retry packets that it receives.
-Clients MUST discard Retry packets that contain an Original Destination
-Connection ID field that does not match the Destination Connection ID from its
-Initial packet.  This prevents an off-path attacker from injecting a Retry
+Clients MUST discard Retry packets whose Retry Integrity Tag cannot be
+validated, see the Retry Packet Integrity section of {{QUIC-TLS}}. This
+mitigates an off-path attacker's ability to inject a Retry packet, and protects

mitigates an off-path attacker's ability to inject a Retry packet and protects

You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub: