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