1package handshake 2 3import ( 4 "github.com/lucas-clemente/quic-go/internal/protocol" 5 "github.com/lucas-clemente/quic-go/internal/qtls" 6) 7 8const quicTLSExtensionType = 0xffa5 9 10type extensionHandler struct { 11 ourParams []byte 12 paramsChan chan []byte 13 14 perspective protocol.Perspective 15} 16 17var _ tlsExtensionHandler = &extensionHandler{} 18 19// newExtensionHandler creates a new extension handler 20func newExtensionHandler(params []byte, pers protocol.Perspective) tlsExtensionHandler { 21 return &extensionHandler{ 22 ourParams: params, 23 paramsChan: make(chan []byte), 24 perspective: pers, 25 } 26} 27 28func (h *extensionHandler) GetExtensions(msgType uint8) []qtls.Extension { 29 if (h.perspective == protocol.PerspectiveClient && messageType(msgType) != typeClientHello) || 30 (h.perspective == protocol.PerspectiveServer && messageType(msgType) != typeEncryptedExtensions) { 31 return nil 32 } 33 return []qtls.Extension{{ 34 Type: quicTLSExtensionType, 35 Data: h.ourParams, 36 }} 37} 38 39func (h *extensionHandler) ReceivedExtensions(msgType uint8, exts []qtls.Extension) { 40 if (h.perspective == protocol.PerspectiveClient && messageType(msgType) != typeEncryptedExtensions) || 41 (h.perspective == protocol.PerspectiveServer && messageType(msgType) != typeClientHello) { 42 return 43 } 44 45 var data []byte 46 for _, ext := range exts { 47 if ext.Type == quicTLSExtensionType { 48 data = ext.Data 49 break 50 } 51 } 52 53 h.paramsChan <- data 54} 55 56func (h *extensionHandler) TransportParameters() <-chan []byte { 57 return h.paramsChan 58} 59