Skip to content

Commit d42b240

Browse files
committed
tls: report CurveIDs for TLS <1.2 kexes (#132)
1 parent abb10c1 commit d42b240

File tree

6 files changed

+34
-25
lines changed

6 files changed

+34
-25
lines changed

src/crypto/tls/cfkem_test.go

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func testHybridKEX(t *testing.T, scheme kem.Scheme, clientPQ, serverPQ,
3131
}
3232
clientConfig.CFEventHandler = func(ev CFEvent) {
3333
switch e := ev.(type) {
34-
case CFEventTLS13NegotiatedKEX:
34+
case CFEventTLSNegotiatedNamedKEX:
3535
clientSelectedKEX = &e.KEX
3636
case CFEventTLS13HRR:
3737
retry = true
@@ -75,31 +75,25 @@ func testHybridKEX(t *testing.T, scheme kem.Scheme, clientPQ, serverPQ,
7575
var expectedKEX CurveID
7676
var expectedRetry bool
7777

78-
if clientPQ && serverPQ {
78+
if clientPQ && serverPQ && !clientTLS12 && !serverTLS12 {
7979
expectedKEX = kemSchemeKeyToCurveID(scheme)
8080
} else {
8181
expectedKEX = X25519
8282
}
83-
if clientPQ && !serverPQ {
83+
if !clientTLS12 && clientPQ && !serverPQ {
8484
expectedRetry = true
8585
}
8686

87-
if !serverTLS12 && !clientTLS12 {
88-
if clientSelectedKEX == nil {
89-
t.Error("No TLS 1.3 KEX happened?")
90-
}
87+
if clientSelectedKEX == nil {
88+
t.Error("No KEX happened?")
89+
}
9190

92-
if *clientSelectedKEX != expectedKEX {
93-
t.Errorf("failed to negotiate: expected %d, got %d",
94-
expectedKEX, *clientSelectedKEX)
95-
}
96-
if expectedRetry != retry {
97-
t.Errorf("Expected retry=%v, got retry=%v", expectedRetry, retry)
98-
}
99-
} else {
100-
if clientSelectedKEX != nil {
101-
t.Error("TLS 1.3 KEX happened?")
102-
}
91+
if *clientSelectedKEX != expectedKEX {
92+
t.Errorf("failed to negotiate: expected %d, got %d",
93+
expectedKEX, *clientSelectedKEX)
94+
}
95+
if expectedRetry != retry {
96+
t.Errorf("Expected retry=%v, got retry=%v", expectedRetry, retry)
10397
}
10498
}
10599

src/crypto/tls/handshake_client.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,12 @@ func (hs *clientHandshakeState) doFullHandshake() error {
582582
return err
583583
}
584584

585+
if eccKex, ok := keyAgreement.(*ecdheKeyAgreement); ok {
586+
c.handleCFEvent(CFEventTLSNegotiatedNamedKEX{
587+
KEX: eccKex.params.CurveID(),
588+
})
589+
}
590+
585591
msg, err = c.readHandshake()
586592
if err != nil {
587593
return err

src/crypto/tls/handshake_client_tls13.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ func (hs *clientHandshakeStateTLS13) processServerHello() error {
518518
return errors.New("tls: server selected unsupported group")
519519
}
520520

521-
c.handleCFEvent(CFEventTLS13NegotiatedKEX{
521+
c.handleCFEvent(CFEventTLSNegotiatedNamedKEX{
522522
KEX: hs.serverHello.serverShare.group,
523523
})
524524

src/crypto/tls/handshake_server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,11 @@ func (hs *serverHandshakeState) doFullHandshake() error {
638638
c.sendAlert(alertHandshakeFailure)
639639
return err
640640
}
641+
if eccKex, ok := keyAgreement.(*ecdheKeyAgreement); ok {
642+
c.handleCFEvent(CFEventTLSNegotiatedNamedKEX{
643+
KEX: eccKex.params.CurveID(),
644+
})
645+
}
641646
hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
642647
if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
643648
c.sendAlert(alertInternalError)

src/crypto/tls/handshake_server_tls13.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ GroupSelection:
308308
}
309309

310310
c.serverName = hs.clientHello.serverName
311-
c.handleCFEvent(CFEventTLS13NegotiatedKEX{
311+
c.handleCFEvent(CFEventTLSNegotiatedNamedKEX{
312312
KEX: selectedGroup,
313313
})
314314

src/crypto/tls/tls_cf.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,18 @@ func (e CFEventECHPublicNameMismatch) Name() string {
219219
return "ech public name does not match outer sni"
220220
}
221221

222-
// CFEventTLS13NegotiatedKEX is emitted when a key agreement mechanism has been
223-
// established.
224-
type CFEventTLS13NegotiatedKEX struct {
222+
// For backwards compatibility.
223+
type CFEventTLS13NegotiatedKEX = CFEventTLSNegotiatedNamedKEX
224+
225+
// CFEventTLSNegotiatedNamedKEX is emitted when a key agreement mechanism has been
226+
// established that uses a named group. This includes all key agreements
227+
// in TLSv1.3, but excludes RSA and DH in TLS 1.2 and earlier.
228+
type CFEventTLSNegotiatedNamedKEX struct {
225229
KEX CurveID
226230
}
227231

228-
func (e CFEventTLS13NegotiatedKEX) Name() string {
229-
return "CFEventTLS13NegotiatedKEX"
232+
func (e CFEventTLSNegotiatedNamedKEX) Name() string {
233+
return "CFEventTLSNegotiatedNamedKEX"
230234
}
231235

232236
// CFEventTLS13HRR is emitted when a HRR is sent or received

0 commit comments

Comments
 (0)