Re: [TLS] Quest for Unified Solution to TLS Renegotiation

Nelson B Bolyard <nelson@bolyard.me> Fri, 27 November 2009 05:58 UTC

Return-Path: <nelson@bolyard.me>
X-Original-To: tls@core3.amsl.com
Delivered-To: tls@core3.amsl.com
Received: from localhost (localhost [127.0.0.1]) by core3.amsl.com (Postfix) with ESMTP id 14F2C3A67FB for <tls@core3.amsl.com>; Thu, 26 Nov 2009 21:58:36 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.445
X-Spam-Level:
X-Spam-Status: No, score=-2.445 tagged_above=-999 required=5 tests=[AWL=0.154, BAYES_00=-2.599]
Received: from mail.ietf.org ([64.170.98.32]) by localhost (core3.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qESmRUDcDnjB for <tls@core3.amsl.com>; Thu, 26 Nov 2009 21:58:35 -0800 (PST)
Received: from p3plsmtpa01-01.prod.phx3.secureserver.net (p3plsmtpa01-01.prod.phx3.secureserver.net [72.167.82.81]) by core3.amsl.com (Postfix) with SMTP id 4AD713A63D3 for <tls@ietf.org>; Thu, 26 Nov 2009 21:58:35 -0800 (PST)
Received: (qmail 9643 invoked from network); 27 Nov 2009 05:58:29 -0000
Received: from unknown (24.5.142.42) by p3plsmtpa01-01.prod.phx3.secureserver.net (72.167.82.81) with ESMTP; 27 Nov 2009 05:58:29 -0000
Message-ID: <4B0F6B04.1090103@bolyard.me>
Date: Thu, 26 Nov 2009 22:00:36 -0800
From: Nelson B Bolyard <nelson@bolyard.me>
Organization: Network Security Services
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.9.1b1pre) Gecko/20081004 NOT Firefox/2.0 SeaMonkey/2.0a2pre
MIME-Version: 1.0
To: IETF TLS Working Group <tls@ietf.org>
References: <C7342F07.6C8C%uri@ll.mit.edu> <32C4392B-749C-47D7-B625-C769A18DE9DE@checkpoint.com>
In-Reply-To: <32C4392B-749C-47D7-B625-C769A18DE9DE@checkpoint.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Subject: Re: [TLS] Quest for Unified Solution to TLS Renegotiation
X-BeenThere: tls@ietf.org
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: "This is the mailing list for the Transport Layer Security working group of the IETF." <tls.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/listinfo/tls>, <mailto:tls-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/tls>
List-Post: <mailto:tls@ietf.org>
List-Help: <mailto:tls-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/tls>, <mailto:tls-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 27 Nov 2009 05:58:36 -0000

>> On 11/26/09  12:23 , "David-Sarah Hopwood" <david-sarah@jacaranda.org>
>> wrote:
>>> Blumenthal, Uri - 0662 - MITLL wrote:
>>>> Yes, previous_verify_data MUST be a part of the input to the PRF.
>>>> What Yoav Nir said (XOR-ing it with the master_secret), should work
>>>> (out of hand - anybody sees a problem with it?).

I replied to that in another message, but yes, don't mix key and non-key
data together like that in the PRF definition.  If you want to XOR the
new data with something, or append it to something, do it with some other
non-key (and non-constant) data that is input to the PRF, or else plan to
replace hardware.

>>> The previous_verify_data is not necessarily secret, so this requires the
>>> PRF to be secure against related-key attack. The particular PRFs used in
>>> SSLv3 and TLS 1.0 to 1.2 should be secure in that sense, but (if we
>>> decide to use this approach) I still prefer what I suggested before:
>>>
>>>    verify_data =
>>>      PRF(master_secret, finished_label, Hash(handshake_messages)
>>>                                         + previous_verify_data)
>>>        [0..verify_data_length-1];
>>>
>>> which uses the PRF in a more conventional way.

This would be OK for HSMs.  It doesn't change the definition of PRF.
It doesn't combine key and non-key data in a common input.
It doesn't change constants that may be in silicon.

On 2009-11-26 14:38 PST, Yoav Nir wrote:

> I don't see why my suggestion doesn't hold for SSLv3 as well. Here's from
> the spec:
>
> enum { client(0x434C4E54), server(0x53525652) } Sender;
>
> struct {
>         opaque md5_hash[16];
>         opaque sha_hash[20];
> } Finished;
>
> md5_hash
>         MD5(master_secret + pad2 + MD5(handshake_messages +
>                 Sender + master_secret + pad1));
>
> sha_hash
>         SHA(master_secret + pad2 + SHA(handshake_messages +
>                 Sender + master_secret + pad1));
>
> So this could be changed in renegotiation to the following, or the Sender
> field could be replaced with the contents of the previous Finished
> message (it's like the finished label)
>
> enum { client(0x434C4E54), server(0x53525652) } Sender;
>
> struct {
>         opaque md5_hash[16];
>         opaque sha_hash[20];
> } Finished;
>
> md5_hash
>         MD5(master_secret^previous_Finished_message + pad2 +
>                 MD5(handshake_messages +
>                 Sender + master_secret + pad1));
>
> sha_hash
>         SHA(master_secret^previous_Finished_message + pad2 +
>                 SHA(handshake_messages +
>                 Sender + master_secret + pad1));

For hardware security modules that implement SSL3, that change means
replacing the HSM.  The only change you can make to the definitions of
md5_hash and sha_hash that won't require the hardware to be replaced is
to change the definition of "handshake_messages".  That means somehow
making the additional data part of the data stream that gets input into
that MD5 or SHA function before "Sender", perhaps as if it was a pseudo
handshake message.