From: TLS <tls-boun...@ietf.org> On Behalf Of Eric Rescorla
Sent: 09 March 2021 06:27
To: Dan Harkins <dhark...@lounge.org>
Cc: <tls@ietf.org> <tls@ietf.org>
Subject: Re: [TLS] Comments on draft-friel-tls-eap-dpp-01



On Mon, Mar 8, 2021 at 1:18 PM Dan Harkins 
<dhark...@lounge.org<mailto:dhark...@lounge.org>> wrote:

  Hi Eric,
On 3/8/21 8:00 AM, Eric Rescorla wrote:
Taking a step back from the crypto, I'm trying to make sure I
understand the desired security properties. As I understand the
situation:

- the client has a preconfigured key pair (X_c, Y_c)
- the server is anonymous (i.e., doesn't have a valid TLS cert).

[ofriel]Its not true that the server does not have a valid TLS cert, the EAP 
server will have a cert but the client will have no way of verifying it. Its 
more https://tools.ietf.org/html/rfc8446#appendix-C.5.


- the server is preconfigured with information about each
  client (in this case, Y_c).

And the desired property you are looking for is that:

1. The client authenticates to the server using X_c
2. The client will only connect to servers that know the
   per-client information

Is this correct?

  Yes.



Assuming it is, it seems like we could accomplish this with
less change to TLS. Here is one proposal (warning: not
at all analyzed so may be totally broken).

- Have the client take on the TLS server role, and use RFC 7250 raw
  public keys. This addresses requirement 1.

  This breaks the use of (T)EAP. In the case of EAP, the server is the
one that grants access to the network and the client is the one that
asks for access (which is why it's known as the "supplicant"). The
EAP roles match the TLS roles so it wouldn't be possible for an EAP
client to act as a TLS server in the EAP method.

Thanks for the clarification. This is party of why it's helpful to understand 
the requirements.



- Store a separate per-client value K_c (this can be derived from the
  X_c to ease the burden on the client) and use RFC 8773 external PSK
  with cert authentication to inject K_c into the key schedule.

  There's no certs involved here. There is trust by the server in a
raw public key and there's an assurance (not quite authentication) of
the client based on who knows that public key

To clarify, what I was proposing was that that you replace knowledge of the 
pubkey
with knowledge of the PSK and have the client (acting as the server) present its
public key in the RFC 7250 Raw Public Key mode. The reason certs come
into play is that TLS 1.3 prohibits the use of certificate based exchanges 
(which
should include Raw Public Key) with PSKs, and 8773 relaxes that.

However, if you can't have the client act as the server, then we'll need to find
another approach. As I indicated on the call, what would be helpful to me would
be a description of the externally visible invariants that we need to satisfy.

[ofriel] Another requirement is that the full public key Y_c is not transmitted 
as part of TLS handshake from client to server. We cannot not use RFC 7250 as 
is. Instead, something like the Known Certificates proposal in cTLS 
https://tools.ietf.org/html/draft-ietf-tls-ctls-01#section-5.1.3 would work.

Something like this could work:

Setup:

Client has X_c, Y_c
Server is provisioned with Y_c (the bootstrap RPK)

Both sides could derive (using some suitable hashing algorithm):

keyID = H1(Y_c)
PSK = H2(Y_c)

Server keeps a map of keyID to Y_c.

keyID could be common or unique for the PSK and RPK.

C->S: Client sends the keyID for the derived PSK

ClientHello
+tls_cert_with_extern_psk
+pre_shared_key identity=keyID

S->C: Server looks up the Y_c, derives PSK, and injects into key_schedule. 
Server sends its PKI Certificate/CertificateVerify which client ignores. Server 
requests client cert so that client can prove it knows X_c.

ServerHello
+pre_shared_key selected_identity=keyID
{EncryptedExtensions}
{CertificateRequest}
{Certificate}
{CertificateVerify}
{Finished}

C->S: Ignores server Certificate/CertificateVerify. If handshake reaches here, 
at this stage, server has proven knowledge of Y_c via derived PSK.

{Certificate, cert_data does not include RPK, but instead keyID as per cTLS}
{CertificateVerify}
{Finished}

Server verifies Finished. At this stage, client has proven knowledge of X_c.

I believe this meets the requirements that:
- server proves knowledge of Y_c
- client proves knowledge of X_c
- Y_c is not send over the wire in cleartext
- reuse existing RFCs, aligns better with existing TLS flows, no new extensions 
(well we need to do something for Certificate including keyID)

-Ekr

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

Reply via email to