> I absolutely agree both that we seem to be almost
> happily adding complexity 

I don't think you have to assume bad intent (or negligence). Several people 
brought up valid concerns and we're trying to address them.

> On Apr 1, 2021, at 4:46 AM, Stephen Farrell <stephen.farr...@cs.tcd.ie> wrote:
> 
> 
> I'm not sure I agree with all of Martin's remarks below,
> but I absolutely agree both that we seem to be almost
> happily adding complexity and that that's a bad plan.
> 
> S.
> 
> On 01/04/2021 02:57, Martin Thomson wrote:
>> I just reviewed the proposal to split HelloRetryRequest into outer and 
>> (encrypted) inner.
>> https://github.com/tlswg/draft-ietf-tls-esni/pull/407/files
>> I'm strongly opposed to taking the change.  It complicates the design 
>> greatly and unnecessarily.
>> The existing design has some flaws, but they can be fixed more elegantly 
>> than this.
>> (Apologies if this seems a little long.  I'm writing down every possible 
>> argument I can think of, because I can't guarantee that I will be coherent 
>> at the meeting.)
>> # HelloRetryRequest Has a Narrow Purpose
>> Let's first address the key question of what HelloRetryRequest exists to do. 
>>  It exists to ensure that the client and server are able to jointly agree on 
>> keys to use for the remainder of the handshake.  This is a very narrow scope.
>> Furthermore, the particulars of key agreement are public.  This is important 
>> as we can also say that all hidden servers need to use the same 
>> configuration as it relates to cipher suites, key exchange, and related 
>> parameters, as the results of negotiation are sent in the clear in the 
>> ServerHello.
>> My claim here is that there is no value in protecting any parameter that 
>> might change in response to HelloRetryRequest.
>> # Don't Seek Complexity
>> It is entirely possible to imagine scenarios where an inner ClientHello has 
>> different preferences from an outer ClientHello.  While in theory we can 
>> construct a design that would support that (the pull request does this well 
>> enough), to do so only serves to increase complexity.  It does not address 
>> any real use case or problem that I'm aware of.
>> If we allow for the client to provide different values in inner and outer 
>> ClientHello messages, then the current design means that the client is faced 
>> with some ambiguity about which of the two messages a HelloRetryRequest 
>> applies to.  If we try to create an indicator, then that leaks.
>> We could solve the problem by making the protocol more complex.  Or we could 
>> avoid it.
>> This problem is entirely avoidable.
>> # Matching Inner and Outer Values
>> When we get right down to it, there are a very small number of things that 
>> truly change in response to HelloRetryRequest.  And all of these changes are 
>> to values that do not need confidentiality protection.
>> The draft lists three fields that change: ciphersuites, key_share, and 
>> version.  From my perspective, changing cipher suites, supported groups, or 
>> versions would be a big mistake.  So what changes is even more limited.  
>> Just the shares in key_share.
>> On this basis, a client that offers cipher suites, groups, versions, and key 
>> shares that are identical in both inner and outer ClientHello messages will 
>> always receive a HelloRetryRequest that applies equally to both messages.
>> The only adjustment that is acceptable with respect to these fields being 
>> identical is the addition of TLS 1.2-only options to the outer ClientHello 
>> (or the removal of the same from the inner ClientHello if you prefer it that 
>> way around).  This is a fine optimization on the basis that accepting ECH 
>> represents a commitment to support TLS 1.3 (or higher).  But it is really 
>> just an optimization (the draft makes this mandatory, which is silly).  The 
>> client can therefore remove options from the inner ClientHello only if it is 
>> impossible to select them with TLS 1.3 or higher.
>> For new extensions, if they define a means of adjustment or correction via 
>> HelloRetryRequest (there is currently just one: password_salt, which I 
>> haven't examined), then they too need to follow this restriction.   It's not 
>> an onerous one.
>> Follow this simple constraint and HelloRetryRequest will always apply 
>> equally to both inner and outer ClientHello and everything works.  
>> Conveniently, this is more or less exactly what the current draft says.  
>> Almost.
>> The draft currently allows inner and outer ClientHello to have different 
>> types of key share.  The way it handles this is terrible: it recommends 
>> breaking the transcript.  To me, that seems like it would only serve to open 
>> the protocol up to downgrade attack.
>> Incidentally, I don't see a problem with having a different key share 
>> *value* in inner and outer ClientHello.  There's no point in doing that 
>> unless you believe that these values leak information (they really 
>> shouldn't), but it wouldn't break this model if a client decided to do that.
>> https://github.com/tlswg/draft-ietf-tls-esni/issues/333 appears to be 
>> concerned about the cookie only applying to one or other ClientHello.  I 
>> don't see how is the case, so I'm just going to say that this is fixed by 
>> having HelloRetryRequest apply to both inner and outer ClientHello messages. 
>>  If the client receives HelloRetryRequest that applies to just one of the 
>> two, then the problem is that the client is faulty.  That would be treated 
>> as a programming error as normal (crash, open a bug report, send an 
>> internal_error alert, etc...).
>> Then there are the things that more or less have to change in response to 
>> HelloRetryRequest, but really only because the ClientHello changes: padding, 
>> pre_shared_key, and ECH itself.  For those, we need to address a minor 
>> inconsistency problem at the level of the core protocol itself.
>> # Addressing Minor HelloRetryRequest Problems
>> We do need to fix RFC 8446 rules regarding HelloRetryRequest.  David already 
>> suggested some minute adjustments for that problem in 
>> https://github.com/tlswg/draft-ietf-tls-esni/issues/358 .  The short version 
>> is that extensions can define their own rules for how they change after 
>> HelloRetryRequest.  This is a good amendment, especially as it relates to 
>> extensions that are not known to the server.
>> That tweak does have deployment issues, because the original rules have been 
>> interpreted too literally in some cases, but that should not affect ECH 
>> specifically.  Servers that have this bug won't be able to deploy ECH 
>> without fixing the bug and that's OK.  Other servers will only see grease.
>> The draft currently mandates that greasing values not change after 
>> HelloRetryRequest, which will avoid this compatibility bug, but also reveal 
>> the fraud.  I can tolerate that small amount of leakage.
>> # Avoiding HelloRetryRequest
>> I think that Nick's suggestion for helping avoid HelloRetryRequest by 
>> placing hints about key shares in DNS SVCB/HTTPS records is a fine one.
>> I see the arguments about this being about the configuration needing to 
>> speak for backend servers when the record relates to frontend servers.  But 
>> my perspective here is that you already need to ensure that backend servers 
>> have a consistent cryptographic support profile; adding a small number of 
>> frontend servers to the set that need to be made consistent isn't that 
>> difficult.  If this consistency is not possible in some deployments, that's 
>> understandable, but then it is an optional enhancement that won't be 
>> available to those deployments, that's all.
>> Of course, this is an extension that we can pursue separately.
>> # Conclusion
>> I'm firmly opposed to splitting HelloRetryRequest.  I would like to deploy 
>> ECH and this doesn't really help with that.
>> I don't agree that there is a problem that needs to be fixed with the 
>> current draft.
>> On the other hand, I can guarantee that this change will delay Firefox 
>> deployment significantly (that is, for an indefinite period).  It would 
>> require rearchitecting a piece of code that is rarely used already (despite 
>> being a source of significant complexity) and replacing it with code that is 
>> even more complex and would include paths that are even more lightly used.
>> _______________________________________________
>> TLS mailing list
>> TLS@ietf.org
>> https://www.ietf.org/mailman/listinfo/tls
> <OpenPGP_0x5AB2FAF17B172BEA.asc>_______________________________________________
> TLS mailing list
> TLS@ietf.org
> https://www.ietf.org/mailman/listinfo/tls

_______________________________________________
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls

Reply via email to