@@ -43,6 +43,8 @@ type serverHandshakeStateTLS13 struct {
43
43
transcript hash.Hash
44
44
clientFinished []byte
45
45
certReq * certificateRequestMsgTLS13
46
+ peerTLSFlags []TLSFlag
47
+ tlsFlags []TLSFlag
46
48
47
49
hsTimings CFEventTLS13ServerHandshakeTimingInfo
48
50
}
@@ -132,7 +134,9 @@ func (hs *serverHandshakeStateTLS13) handshake() error {
132
134
133
135
c .handleCFEvent (hs .hsTimings )
134
136
c .isHandshakeComplete .Store (true )
135
-
137
+ c .agreedTLSFlags = hs .tlsFlags
138
+ c .peerTLSFlags = hs .peerTLSFlags
139
+ c .requestClientCert = hs .requestClientCert ()
136
140
return nil
137
141
}
138
142
@@ -317,6 +321,29 @@ GroupSelection:
317
321
c .sendAlert (alertIllegalParameter )
318
322
return errors .New ("tls: invalid client key share" )
319
323
}
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
+ }
320
347
321
348
selectedProto , err := negotiateALPN (c .config .NextProtos , hs .clientHello .alpnProtocols , c .quic != nil )
322
349
if err != nil {
@@ -356,6 +383,23 @@ GroupSelection:
356
383
return nil
357
384
}
358
385
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
+
359
403
func (hs * serverHandshakeStateTLS13 ) checkForResumption () error {
360
404
c := hs .c
361
405
@@ -892,6 +936,11 @@ func (hs *serverHandshakeStateTLS13) sendServerParameters() error {
892
936
}
893
937
894
938
func (hs * serverHandshakeStateTLS13 ) requestClientCert () bool {
939
+ for _ , flag := range hs .tlsFlags {
940
+ if flag == FlagSupportMTLS {
941
+ return true
942
+ }
943
+ }
895
944
return hs .c .config .ClientAuth >= RequestClientCert && ! hs .usingPSK
896
945
}
897
946
0 commit comments