@@ -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+
298327func 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