@@ -43,6 +43,8 @@ type serverHandshakeStateTLS13 struct {
4343 transcript hash.Hash
4444 clientFinished []byte
4545 certReq * certificateRequestMsgTLS13
46+ peerTLSFlags []TLSFlag
47+ tlsFlags []TLSFlag
4648
4749 hsTimings CFEventTLS13ServerHandshakeTimingInfo
4850}
@@ -132,7 +134,9 @@ func (hs *serverHandshakeStateTLS13) handshake() error {
132134
133135 c .handleCFEvent (hs .hsTimings )
134136 c .isHandshakeComplete .Store (true )
135-
137+ c .agreedTLSFlags = hs .tlsFlags
138+ c .peerTLSFlags = hs .peerTLSFlags
139+ c .requestClientCert = hs .requestClientCert ()
136140 return nil
137141}
138142
@@ -317,6 +321,29 @@ GroupSelection:
317321 c .sendAlert (alertIllegalParameter )
318322 return errors .New ("tls: invalid client key share" )
319323 }
324+ if len (hs .clientHello .tlsFlags ) != 0 {
325+ supportedFlags , err := encodeFlags (hs .c .config .TLSFlagsSupported )
326+ if err != nil {
327+ return errors .New ("tls: invalid server flags" )
328+ }
329+ var mutuallySupportedFlags []byte
330+ for i , sFB := range supportedFlags {
331+ if i >= len (hs .clientHello .tlsFlags ) {
332+ break
333+ }
334+ mutuallySupportedFlags = append (mutuallySupportedFlags , hs .clientHello .tlsFlags [i ]& sFB )
335+ }
336+
337+ peerTLSFlags , err := decodeFlags (hs .clientHello .tlsFlags )
338+ if err == nil {
339+ hs .peerTLSFlags = peerTLSFlags
340+ }
341+
342+ tlsFlags , err := decodeFlags (mutuallySupportedFlags )
343+ if err == nil {
344+ hs .tlsFlags = tlsFlags
345+ }
346+ }
320347
321348 selectedProto , err := negotiateALPN (c .config .NextProtos , hs .clientHello .alpnProtocols , c .quic != nil )
322349 if err != nil {
@@ -356,6 +383,23 @@ GroupSelection:
356383 return nil
357384}
358385
386+ func decodeFlags (flagBytes []byte ) ([]TLSFlag , error ) {
387+ var flags []TLSFlag
388+ for byteIndex , b := range flagBytes {
389+ for i := 0 ; ! (b == 0 ); i ++ {
390+ if (b & 1 ) == 1 {
391+ flagNo := byteIndex * 8 + i
392+ if flagNo >= int (maxTLSFlag ) {
393+ return nil , fmt .Errorf ("TLS flag is out of range: %d" , flagNo )
394+ }
395+ flags = append (flags , TLSFlag (flagNo ))
396+ }
397+ b >>= 1
398+ }
399+ }
400+ return flags , nil
401+ }
402+
359403func (hs * serverHandshakeStateTLS13 ) checkForResumption () error {
360404 c := hs .c
361405
@@ -892,6 +936,11 @@ func (hs *serverHandshakeStateTLS13) sendServerParameters() error {
892936}
893937
894938func (hs * serverHandshakeStateTLS13 ) requestClientCert () bool {
939+ for _ , flag := range hs .tlsFlags {
940+ if flag == FlagSupportMTLS {
941+ return true
942+ }
943+ }
895944 return hs .c .config .ClientAuth >= RequestClientCert && ! hs .usingPSK
896945}
897946
0 commit comments