Skip to content

Commit f0a790c

Browse files
cohoshdaenney
authored andcommitted
Add test for supported_groups extension
Ensure that the ServerHello message does not send the supported_groups extension.
1 parent 5b604f1 commit f0a790c

1 file changed

Lines changed: 123 additions & 37 deletions

File tree

conn_test.go

Lines changed: 123 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,35 @@ func testServer(ctx context.Context, c net.Conn, cfg *Config, generateCertificat
295295
return ServerWithContext(ctx, c, cfg)
296296
}
297297

298+
func sendClientHello(cookie []byte, ca net.Conn, sequenceNumber uint64, extensions []extension.Extension) error {
299+
packet, err := (&recordlayer.RecordLayer{
300+
Header: recordlayer.Header{
301+
Version: protocol.Version1_2,
302+
SequenceNumber: sequenceNumber,
303+
},
304+
Content: &handshake.Handshake{
305+
Header: handshake.Header{
306+
MessageSequence: uint16(sequenceNumber),
307+
},
308+
Message: &handshake.MessageClientHello{
309+
Version: protocol.Version1_2,
310+
Cookie: cookie,
311+
CipherSuiteIDs: cipherSuiteIDs(defaultCipherSuites()),
312+
CompressionMethods: defaultCompressionMethods(),
313+
Extensions: extensions,
314+
},
315+
},
316+
}).Marshal()
317+
if err != nil {
318+
return err
319+
}
320+
321+
if _, err = ca.Write(packet); err != nil {
322+
return err
323+
}
324+
return nil
325+
}
326+
298327
func TestHandshakeWithAlert(t *testing.T) {
299328
// Limit runtime in case of deadlocks
300329
lim := test.TimeOut(time.Second * 20)
@@ -1931,41 +1960,6 @@ func TestRenegotationInfo(t *testing.T) {
19311960
} {
19321961
test := testCase
19331962
t.Run(test.Name, func(t *testing.T) {
1934-
sendClientHello := func(cookie []byte, ca net.Conn, sequenceNumber uint64) {
1935-
extensions := []extension.Extension{}
1936-
if test.SendRenegotiationInfo {
1937-
extensions = append(extensions, &extension.RenegotiationInfo{
1938-
RenegotiatedConnection: 0,
1939-
})
1940-
}
1941-
1942-
packet, err := (&recordlayer.RecordLayer{
1943-
Header: recordlayer.Header{
1944-
Version: protocol.Version1_2,
1945-
SequenceNumber: sequenceNumber,
1946-
},
1947-
Content: &handshake.Handshake{
1948-
Header: handshake.Header{
1949-
MessageSequence: uint16(sequenceNumber),
1950-
},
1951-
Message: &handshake.MessageClientHello{
1952-
Version: protocol.Version1_2,
1953-
Cookie: cookie,
1954-
CipherSuiteIDs: cipherSuiteIDs(defaultCipherSuites()),
1955-
CompressionMethods: defaultCompressionMethods(),
1956-
Extensions: extensions,
1957-
},
1958-
},
1959-
}).Marshal()
1960-
if err != nil {
1961-
t.Fatal(err)
1962-
}
1963-
1964-
if _, err = ca.Write(packet); err != nil {
1965-
t.Fatal(err)
1966-
}
1967-
}
1968-
19691963
ca, cb := dpipe.Pipe()
19701964
defer func() {
19711965
if err := ca.Close(); err != nil {
@@ -1984,7 +1978,16 @@ func TestRenegotationInfo(t *testing.T) {
19841978

19851979
time.Sleep(50 * time.Millisecond)
19861980

1987-
sendClientHello([]byte{}, ca, 0)
1981+
extensions := []extension.Extension{}
1982+
if test.SendRenegotiationInfo {
1983+
extensions = append(extensions, &extension.RenegotiationInfo{
1984+
RenegotiatedConnection: 0,
1985+
})
1986+
}
1987+
err := sendClientHello([]byte{}, ca, 0, extensions)
1988+
if err != nil {
1989+
t.Fatal(err)
1990+
}
19881991
n, err := ca.Read(resp)
19891992
if err != nil {
19901993
t.Fatal(err)
@@ -1996,7 +1999,10 @@ func TestRenegotationInfo(t *testing.T) {
19961999

19972000
helloVerifyRequest := r.Content.(*handshake.Handshake).Message.(*handshake.MessageHelloVerifyRequest)
19982001

1999-
sendClientHello(helloVerifyRequest.Cookie, ca, 1)
2002+
err = sendClientHello(helloVerifyRequest.Cookie, ca, 1, extensions)
2003+
if err != nil {
2004+
t.Fatal(err)
2005+
}
20002006
if n, err = ca.Read(resp); err != nil {
20012007
t.Fatal(err)
20022008
}
@@ -2104,3 +2110,83 @@ func TestServerNameIndicationExtension(t *testing.T) {
21042110
})
21052111
}
21062112
}
2113+
2114+
// Make sure the supported_groups extension is not included in the ServerHello
2115+
func TestSupportedGroupsExtension(t *testing.T) {
2116+
// Limit runtime in case of deadlocks
2117+
lim := test.TimeOut(time.Second * 20)
2118+
defer lim.Stop()
2119+
2120+
// Check for leaking routines
2121+
report := test.CheckRoutines(t)
2122+
defer report()
2123+
2124+
t.Run("ServerHello Supported Groups", func(t *testing.T) {
2125+
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
2126+
defer cancel()
2127+
2128+
ca, cb := dpipe.Pipe()
2129+
go func() {
2130+
if _, err := testServer(ctx, cb, &Config{}, true); !errors.Is(err, context.Canceled) {
2131+
t.Error(err)
2132+
}
2133+
}()
2134+
extensions := []extension.Extension{
2135+
&extension.SupportedEllipticCurves{
2136+
EllipticCurves: []elliptic.Curve{elliptic.X25519, elliptic.P256, elliptic.P384},
2137+
},
2138+
&extension.SupportedPointFormats{
2139+
PointFormats: []elliptic.CurvePointFormat{elliptic.CurvePointFormatUncompressed},
2140+
},
2141+
}
2142+
2143+
time.Sleep(50 * time.Millisecond)
2144+
2145+
resp := make([]byte, 1024)
2146+
err := sendClientHello([]byte{}, ca, 0, extensions)
2147+
if err != nil {
2148+
t.Fatal(err)
2149+
}
2150+
2151+
// Receive ServerHello
2152+
n, err := ca.Read(resp)
2153+
if err != nil {
2154+
t.Fatal(err)
2155+
}
2156+
r := &recordlayer.RecordLayer{}
2157+
if err = r.Unmarshal(resp[:n]); err != nil {
2158+
t.Fatal(err)
2159+
}
2160+
2161+
helloVerifyRequest := r.Content.(*handshake.Handshake).Message.(*handshake.MessageHelloVerifyRequest)
2162+
2163+
err = sendClientHello(helloVerifyRequest.Cookie, ca, 1, extensions)
2164+
if err != nil {
2165+
t.Fatal(err)
2166+
}
2167+
if n, err = ca.Read(resp); err != nil {
2168+
t.Fatal(err)
2169+
}
2170+
2171+
messages, err := recordlayer.UnpackDatagram(resp[:n])
2172+
if err != nil {
2173+
t.Fatal(err)
2174+
}
2175+
2176+
if err := r.Unmarshal(messages[0]); err != nil {
2177+
t.Fatal(err)
2178+
}
2179+
2180+
serverHello := r.Content.(*handshake.Handshake).Message.(*handshake.MessageServerHello)
2181+
gotGroups := false
2182+
for _, v := range serverHello.Extensions {
2183+
if _, ok := v.(*extension.SupportedEllipticCurves); ok {
2184+
gotGroups = true
2185+
}
2186+
}
2187+
2188+
if gotGroups {
2189+
t.Errorf("TestSupportedGroups: supported_groups extension was sent in ServerHello")
2190+
}
2191+
})
2192+
}

0 commit comments

Comments
 (0)