Re: [quicwg/base-drafts] Receiver's behavior on key update (#2791)

MikkelFJ <> Wed, 19 June 2019 07:26 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id AFB15120417 for <>; Wed, 19 Jun 2019 00:26:31 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -8.009
X-Spam-Status: No, score=-8.009 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, 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, T_DKIMWL_WL_HIGH=-0.01] 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 2Ei51lOMqCfW for <>; Wed, 19 Jun 2019 00:26:29 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id DB027120446 for <>; Wed, 19 Jun 2019 00:26:28 -0700 (PDT)
Date: Wed, 19 Jun 2019 00:26:26 -0700
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=pf2014; t=1560929186; bh=gBvgIwYEoMasmTMliRRAF8r09WqtdDw+7YLbX5Pdaeg=; h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:List-ID: List-Archive:List-Post:List-Unsubscribe:From; b=AjdY5C4BhwTtc4C2leaU68mgq7kzOotTOf8W7HWRvTzS+xEd4X+8Uj13jvZALYsk6 DvnzOr2typejGLmJRzDRV8fdwdViXav3jx2Kjj3gVM4AybFGGG3A2l8s9fUKH2a65M TSnq9nOueditNnCG8WQLMCcv3P7H8WYk1vDGaIxA=
From: MikkelFJ <>
Reply-To: quicwg/base-drafts <>
To: quicwg/base-drafts <>
Cc: Subscribed <>
Message-ID: <quicwg/base-drafts/pull/2791/>
In-Reply-To: <quicwg/base-drafts/pull/>
References: <quicwg/base-drafts/pull/>
Subject: Re: [quicwg/base-drafts] Receiver's behavior on key update (#2791)
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="--==_mimepart_5d09e3a2bfcea_60043fdbf66cd95c164548"; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: mikkelfj
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, 19 Jun 2019 07:26:32 -0000

I read through the latest commit and I think it is largely fine, but I found the attack discussion a bit difficult, and the text is not distinguishing between receiving a key and authenticating a key. Also, it is probably not clear to the reader that the intent is to compute a key ahead of time when reading the first section. Furthermore, there is also an attack on send since if you compute the send key when you respond immediately, that can be timed.

The text also does not discuss what to do with a packet that does not authenticate. Do you drop, or something else. After trying to formulate that, I ended up with some problems that you can hopefully help clarify.

Here is my proposed text:

Packets received with the current key phase are unprotected using the
corresponding receive key.  When a packet arrives with the opposite key phase,
an endpoint determines which receive key to use by tracking the lowest packet
number among the packets received and successfully decrypted and authenticate
with the currently key phase. If a packet is received that has a different
KEY_PHASE bit and a lower packet number than this value, the endpoint uses the
receive key of the previous key phase for unprotecting the packet, if that key
is available.

If the packet has a higher packet number and it can be decrypted and
authenticated with the receive key of the next key phase, the receiver switches
to the new keyphase.

An an endpoint SHOULD compute the secret and related receive and send keys of
the next keyphase ahead of time to protect against timing attacks. The receiver
therefore has at least two installed receive keys but SHOULD transitionally
maintain older an older key to deal with late arriving packets for a duration of
3 PTO after switching to a new key phase.

The endpoint derives keys of the next key phase by calculating the
next secret (see Section 7.2 of {{!TLS13}}), the corresponding read key and IV
using the KDF function provided by TLS.

Once an endpoint has sent a packet encrypted with a given key phase, it MUST NOT
send a packet encrypted with an older key phase. (EDITORIAL: see note below)
If packet cannot be decrypted the reciever drops the packet but MAY also close
the connection with a PROTOCOL_VIOLOATION error if it finds that it can decrypt
and authenticate a packet with receive key that is retired for that packet number. 

(EDITORIAL NOTE: I'm struggling with when a key is fully retired and in violation because
it is always possible that an earlier packet is received after a key switch
which also carries the new key phase. You could formulate something but it gets

Maybe we can just use "successfully unprotect" instead of decrypt and authenticate. Or perhaps it is enough to authenticate without decrypting. Noting that these are parallel and separate steps in GCM that can be processed separately.

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