[I trimmed a couple things that already had sub-threads spun off;
leaving in others even where I don't have a comment right now]
On 10/17/2016 01:10 PM, Ilari Liusvaara wrote:
>
>> Finally, the client and server exchange Authentication messages. TLS
>> uses the same set of messages every time that authentication is needed.
>> Specifically:
>>
>> Certificate.
>> : the certificate of the endpoint. This message is omitted if the
>> server is not authenticating with a certificate. Note that if raw
>> public keys {{RFC7250}} or the cached information extension
>> {{?RFC7924}} are in use, then this message will not
>> contain a certificate but rather some other value corresponding to
>> the server's long-term key. [{{certificate}}]
> This is also omitted for client if CertificateRequest was not sent,
> right?
That as my understanding.
>> CertificateVerify.
>> : a signature over the entire handshake using the public key
>> in the Certificate message. This message is omitted if the
>> server is not authenticating via a certificate. [{{certificate-verify}}]
> Same as above. And additionally, for client, doesn't sending an
> empty certificate omit this?
For post-handshake, that is explicitly stated. It is also implicitly
stated for in-handshake ("Clients MUST send this message
[CertificateVerify] whenever authenticating via a Certificate (i.e.,
when the Certificate message is non-empty)."
>> ## Zero-RTT Data
>>
>> With the Zero-RTT mode, clients can send data on their first flight
>> ("early data") whereby the client uses a PSK either obtained
>> out-of-band or as a ticket (i.e., one with the "early_data_info"
>> extension) from an earlier exchange to authenticate to the server.
>>
>> When clients use a PSK obtained out-of-band then the following
>> information MUST be provisioned to both parties:
>>
>> * The PSK identity
>> * The cipher suite for use with this PSK
>> * The key exchange and authentication modes this PSK is allowed to be used
>> with
>> * The Application-Layer Protocol Negotiation (ALPN) label(s)
>> * The Server Name Indication (SNI), if any is to be used
> The ALPN labels can't be plural. There must (nothing else will work) be
> a single ALP (possibly being the implicit default ALP) for any 0-RTT-
> capable PSK.
I pointed this out on Kyle's declined pull request and he fixed it in a
later one that has already been merged.
> Also, AFAIK, the reason why ticket_age exists in PSK is to support
> 0-RTT anti-replay. Without 0-RTT data, there is no point in using
> anything that doesn't involve server-side contribution anyway (and
> thus would get superrior security properties).
>
I basically agree, and see only minimal reason why the ticket_age_add
needs to be mandatory. Sure, it can give the server some insight into
rejecting stale tickets, but there are other ways to do so.
>> 2. There are no guarantees of non-replay between connections.
>> Unless the server takes special measures outside those provided by TLS,
>> the server has no guarantee that the same
>> 0-RTT data was not transmitted on multiple 0-RTT connections
>> (See {{replay-time}} for more details).
>> This is especially relevant if the data is authenticated either
>> with TLS client authentication or inside the application layer
>> protocol. However, 0-RTT data cannot be duplicated within a connection
>> (i.e., the server
>> will not process the same data twice for the same connection) and
>> an attacker will not be able to make 0-RTT data appear to be
>> 1-RTT data (because it is protected with different keys.)
> Of course, if the server TLS library provodes the difference between
> 0-RTT and 1-RTT data is a different matter...
Yes, the library has to tell the application that 0-RTT data and 1-RTT
data are different, or bad things happen. Watson had some text to that
effect in PR 694, which was not accepted (some text in a
counter-proposal by Martin Thomson was accepted).
>> ### Server Hello
>>
>> version
>> : This field contains the version of TLS negotiated for this session.
>> Servers
>> MUST select the lower of the highest supported server version and the
>> version
>> offered by the client in the ClientHello. In particular, servers MUST
>> accept
>> ClientHello messages with versions higher than those supported and
>> negotiate
>> the highest mutually supported version. For this version of the
>> specification, the version is { 3, 4 }. (See {{backward-compatibility}}
>> for
>> details about backward compatibility.)
> Err, don't they have to select highest client indicated version that they
> support (now that version negotiation is with extensions)?
>
Basically. It is not clear to me whether there is consensus to say
"highest version" or just "server picks".
>> ## Hello Extensions
>>
>> An extension type MUST NOT appear in the ServerHello or HelloRetryRequest
>> unless the same extension type appeared in the corresponding ClientHello.
>> If a client receives an extension type in ServerHello or HelloRetryRequest
>> that it did not request in the associated ClientHello, it MUST abort the
>> handshake with an "unsupported_extension" fatal alert.
> Add note that Cookie is an exception to this?
I thought there was already an exception for cookie:
[...] As with
ServerHello, a HelloRetryRequest MUST NOT contain any extensions that
were not first offered by the client in its ClientHello, with the
exception of optionally the "cookie" (see Section 4.2.2
<https://tools.ietf.org/html/draft-ietf-tls-tls13-16#section-4.2.2>) extension.
Though perhaps it is still worth duplicating that guidance so it's
easier to find.
>> When multiple extensions of different types are present in the ClientHello or
>> ServerHello messages, the extensions MAY appear in any order. There MUST NOT
>> be
>> more than one extension of the same type.
> pre_shared_key is an exception to this in ClientHello, right?
Yes.
>> In general, the specification of each extension type needs to describe the
>> effect of the extension both during full handshake and session resumption.
>> Most
>> current TLS extensions are relevant only when a session is initiated: when an
>> older session is resumed, the server does not process these extensions in
>> ClientHello, and does not include them in ServerHello. However, some
>> extensions may specify different behavior during session resumption.
>> [[TODO: update this and the previous paragraph to cover PSK-based
>> resumption.]]
> Basically, treating any extension specially with regards to full
> handshake versus "resumption" is very likely to be a Bad Idea and
> there should be good justifications on doing so.
>
> (Such difference would likely be a major source of implementation bugs.)
>
>> ### Signature Algorithms
>>
>> The client uses the "signature_algorithms" extension to indicate to the
>> server
>> which signature algorithms may be used in digital signatures. Clients which
>> desire the server to authenticate via a certificate MUST send this extension.
>> If a server
>> is authenticating via a certificate and the client has not sent a
>> "signature_algorithms" extension then the server MUST
>> abort the handshake with a "missing_extension" alert
>> (see {{mti-extensions}}).
>>
>> Servers which are authenticating via a certificate MUST indicate so
>> by sending the client an empty "signature_algorithms" extension.
> This looks to be a Bad Idea. It was to support that poorly tought-out
> server certificate authentication in PSK mode, right?
>
> Basically, offering any means (even if there is "MUST" to "prevent" the
> use) of disabling server authentication in non-PSK mode is a footgun.
>
>> ### Negotiated Groups
>>
>> As of TLS 1.3, servers are permitted to send the "supported_groups"
>> extension to the client. If the server has a group it prefers to the
>> ones in the "key_share" extension but is still willing to accept the
>> ClientHello, it SHOULD send "supported_groups" to update the client's
>> view of its preferences; this extension SHOULD contain all groups
>> the server supports, regardless of whether they are currently
>> supported by the client. Clients MUST NOT act upon any information
>> found in "supported_groups" prior to successful completion of the
>> handshake, but MAY use the information learned from a successfully
>> completed handshake to change what groups they offer to a server in
>> subsequent connections.
> This means altering the set of key shares they offer to the server,
> right? Not the set of groups they indicate as supported?
>
>> ### Key Share
>>
>> Upon receipt of this extension in a HelloRetryRequest, the client MUST first
>> verify that the selected_group field corresponds to a group which was
>> provided
>> in the "supported_groups" extension in the original ClientHello. It MUST then
>> verify that the selected_group field does not correspond to a group which was
>> provided in the "key_share" extension in the original ClientHello. If either
>> of
>> these checks fails, then the client MUST abort the handshake with an
>> "illegal_parameter" alert. Otherwise, when sending the new ClientHello, the
>> client MUST append a new KeyShareEntry for the group indicated in the
>> selected_group field to the groups in its original KeyShare. The remaining
>> KeyShareEntry values MUST be preserved.
> Err... Hasn't the KeyShare behaviour been changed from "append" to
> "replace"?
I thought so, yes.
>> ### Pre-Shared Key Extension
>>
>> obfuscated_ticket_age
>> : For each ticket, the time since the client learned about the server
>> configuration that it is using, in milliseconds. This value is
>> added modulo 2^32 to with the "ticket_age_add" value that was
>> included with the ticket, see {{NewSessionTicket}}. This addition
>> prevents passive observers from correlating sessions unless tickets
>> are reused. Note: because ticket lifetimes are restricted to a
>> week, 32 bits is enough to represent any plausible age, even in
>> milliseconds. External tickets SHOULD use an obfuscated_ticket_age of
>> 0; servers MUST ignore this value for external tickets.
> The comment above about purpose of ticket_age also applies here.
>
>> ### Pre-Shared Key Exchange Modes
>>
>> In order to use PSKs, clients MUST also send a "psk_key_exchange_modes"
>> extension. The semantics of this extension are that the client only
>> supports the use of PSKs with these modes, which restricts both the
>> use of PSKs offered in this ClientHello and those which the server
>> might supply via NewSessionTicket.
> Why is this a separate extension and not part of pre_shared_key, given
> that if the latter is present, this must be too?
>
> Seems like more complexity for absolutely no reason. I would understand
> if this extension was optional if PSK is present, but it is not.
The justification for making it separate is that the
psk_key_exchange_modes also applies to what the server will send back in
NST, so in theory one could send psk_key_exchange_modes but not
pre_shared_key. I'm still a little dubious, but accepted the justification.
>
>> ### Early Data Indication
>>
>> When PSK resumption is used, the client can send application data
>> in its first flight of messages. If the client opts to do so, it MUST
>> supply an "early_data" extension as well as the "pre_shared_key"
>> extension.
> Can't early data now be used with any type of PSK, not just ones
> provisioned by NewSessionTicket?
Yes.
-Ben
>> A server MUST validate that the ticket age for the selected PSK
>> identity (computed by un-masking PskIdentity.obfuscated_ticket_age)
>> is within a small tolerance of the time since the ticket was
>> issued (see {{replay-time}}). If it is not, the server SHOULD proceed
>> with the handshake but reject 0-RTT, and SHOULD NOT take any other action
>> that assumes that this ClientHello is fresh.
> PSKs that are externally provisioned don't have any valid ticket age...
>
>> In order to accept early data, the server server MUST have accepted a
>> PSK cipher suite and selected the the first key offered in the
>> client's "pre_shared_key" extension. In addition, it MUST verify that
>> the following values are consistent with those negotiated in the
>> connection during which the ticket was established.
>>
>> - The TLS version number, AEAD algorithm, and the hash for HKDF.
>> - The selected ALPN {{!RFC7443}} value, if any.
> Actually, it must verify that the record protection matches, not
> just the HKDF.
>
>> ## Server Parameters
>>
>> The same extension types MUST NOT appear in both the ServerHello and
>> EncryptedExtensions. All server-sent extensions other than those explicitly
>> listed in {{server-hello}} or designated in the IANA registry MUST only
>> appear in EncryptedExtensions. Extensions which are designated to
>> appear in ServerHello MUST NOT appear in EncryptedExtensions. Clients
>> MUST check EncryptedExtensions for the presence of any forbidden
>> extensions and if any are found MUST abort the handshake with an
>> "illegal_parameter" alert.
> Also there are extensions in Certificates as well...
>
>> #### Receiving a Certificate Message
>>
>> Any endpoint receiving any certificate signed using any signature algorithm
>> using an MD5 hash MUST abort the handshake with a "bad_certificate" alert.
>> SHA-1 is deprecated and it is RECOMMENDED that
>> any endpoint receiving any certificate signed using any signature algorithm
>> using a SHA-1 hash abort the handshake with a "bad_certificate" alert.
>> All endpoints are RECOMMENDED to transition to SHA-256 or better as soon
>> as possible to maintain interoperability with implementations
>> currently in the process of phasing out SHA-1 support.
> These requirements are problematic, and I have absolutely no intention
> of ever implementing this in my TLS libs. They treat signatures involving
> MD5 or SHA1 the same as unknown signature algorithm (which is not a fatal
> error).
>
> To be clear, MD5 (and SHOULD for SHA-1) signatures are absolutely not
> to be trusted. But those should be treated as unknown with no special
> handling.
>
> Also, if there are self-signed certs, the self-signature is just to be
> ignored. There are still CA root certs out there with MD5 signatures.
>
>> %%% Authentication Messages
>> If sent by a server, the signature algorithm MUST be one offered in the
>> client's "signature_algorithms" extension unless no valid certificate chain
>> can be
>> produced without unsupported algorithms (see {{signature-algorithms}}).
> This is seemingly about server signatures. In that context, an
> unknown algorithm has absolutely no chance of working.
>
>> ### New Session Ticket Message {#NewSessionTicket}
>>
>> Any ticket MUST only be resumed with a cipher suite that is identical
>> to that negotiated connection where the ticket was established.
> This kind of requirement is problematic when "external" PSKs have
> requirement that just the hash matches. (Implementation bugs).
>
>
>
> -Ilari
>
> _______________________________________________
> TLS mailing list
> [email protected]
> https://www.ietf.org/mailman/listinfo/tls
_______________________________________________
TLS mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/tls