• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runner
6
7import (
8	"encoding/binary"
9	"errors"
10	"fmt"
11)
12
13func writeLen(buf []byte, v, size int) {
14	for i := 0; i < size; i++ {
15		buf[size-i-1] = byte(v)
16		v >>= 8
17	}
18	if v != 0 {
19		panic("length is too long")
20	}
21}
22
23type byteBuilder struct {
24	buf       *[]byte
25	start     int
26	prefixLen int
27	child     *byteBuilder
28}
29
30func newByteBuilder() *byteBuilder {
31	buf := make([]byte, 0, 32)
32	return &byteBuilder{buf: &buf}
33}
34
35func (bb *byteBuilder) len() int {
36	return len(*bb.buf) - bb.start - bb.prefixLen
37}
38
39func (bb *byteBuilder) data() []byte {
40	bb.flush()
41	return (*bb.buf)[bb.start+bb.prefixLen:]
42}
43
44func (bb *byteBuilder) flush() {
45	if bb.child == nil {
46		return
47	}
48	bb.child.flush()
49	writeLen((*bb.buf)[bb.child.start:], bb.child.len(), bb.child.prefixLen)
50	bb.child = nil
51	return
52}
53
54func (bb *byteBuilder) finish() []byte {
55	bb.flush()
56	return *bb.buf
57}
58
59func (bb *byteBuilder) addU8(u uint8) {
60	bb.flush()
61	*bb.buf = append(*bb.buf, u)
62}
63
64func (bb *byteBuilder) addU16(u uint16) {
65	bb.flush()
66	*bb.buf = append(*bb.buf, byte(u>>8), byte(u))
67}
68
69func (bb *byteBuilder) addU24(u int) {
70	bb.flush()
71	*bb.buf = append(*bb.buf, byte(u>>16), byte(u>>8), byte(u))
72}
73
74func (bb *byteBuilder) addU32(u uint32) {
75	bb.flush()
76	*bb.buf = append(*bb.buf, byte(u>>24), byte(u>>16), byte(u>>8), byte(u))
77}
78
79func (bb *byteBuilder) addU64(u uint64) {
80	bb.flush()
81	var b [8]byte
82	binary.BigEndian.PutUint64(b[:], u)
83	*bb.buf = append(*bb.buf, b[:]...)
84}
85
86func (bb *byteBuilder) addU8LengthPrefixed() *byteBuilder {
87	return bb.createChild(1)
88}
89
90func (bb *byteBuilder) addU16LengthPrefixed() *byteBuilder {
91	return bb.createChild(2)
92}
93
94func (bb *byteBuilder) addU24LengthPrefixed() *byteBuilder {
95	return bb.createChild(3)
96}
97
98func (bb *byteBuilder) addU32LengthPrefixed() *byteBuilder {
99	return bb.createChild(4)
100}
101
102func (bb *byteBuilder) addBytes(b []byte) {
103	bb.flush()
104	*bb.buf = append(*bb.buf, b...)
105}
106
107func (bb *byteBuilder) createChild(lengthPrefixSize int) *byteBuilder {
108	bb.flush()
109	bb.child = &byteBuilder{
110		buf:       bb.buf,
111		start:     len(*bb.buf),
112		prefixLen: lengthPrefixSize,
113	}
114	for i := 0; i < lengthPrefixSize; i++ {
115		*bb.buf = append(*bb.buf, 0)
116	}
117	return bb.child
118}
119
120func (bb *byteBuilder) discardChild() {
121	if bb.child == nil {
122		return
123	}
124	*bb.buf = (*bb.buf)[:bb.child.start]
125	bb.child = nil
126}
127
128type byteReader []byte
129
130func (br *byteReader) readInternal(out *byteReader, n int) bool {
131	if len(*br) < n {
132		return false
133	}
134	*out = (*br)[:n]
135	*br = (*br)[n:]
136	return true
137}
138
139func (br *byteReader) readBytes(out *[]byte, n int) bool {
140	var child byteReader
141	if !br.readInternal(&child, n) {
142		return false
143	}
144	*out = []byte(child)
145	return true
146}
147
148func (br *byteReader) readUint(out *uint64, n int) bool {
149	var b []byte
150	if !br.readBytes(&b, n) {
151		return false
152	}
153	*out = 0
154	for _, v := range b {
155		*out <<= 8
156		*out |= uint64(v)
157	}
158	return true
159}
160
161func (br *byteReader) readU8(out *uint8) bool {
162	var b []byte
163	if !br.readBytes(&b, 1) {
164		return false
165	}
166	*out = b[0]
167	return true
168}
169
170func (br *byteReader) readU16(out *uint16) bool {
171	var v uint64
172	if !br.readUint(&v, 2) {
173		return false
174	}
175	*out = uint16(v)
176	return true
177}
178
179func (br *byteReader) readU24(out *uint32) bool {
180	var v uint64
181	if !br.readUint(&v, 3) {
182		return false
183	}
184	*out = uint32(v)
185	return true
186}
187
188func (br *byteReader) readU32(out *uint32) bool {
189	var v uint64
190	if !br.readUint(&v, 4) {
191		return false
192	}
193	*out = uint32(v)
194	return true
195}
196
197func (br *byteReader) readU64(out *uint64) bool {
198	return br.readUint(out, 8)
199}
200
201func (br *byteReader) readLengthPrefixed(out *byteReader, n int) bool {
202	var length uint64
203	return br.readUint(&length, n) &&
204		uint64(len(*br)) >= length &&
205		br.readInternal(out, int(length))
206}
207
208func (br *byteReader) readLengthPrefixedBytes(out *[]byte, n int) bool {
209	var length uint64
210	return br.readUint(&length, n) &&
211		uint64(len(*br)) >= length &&
212		br.readBytes(out, int(length))
213}
214
215func (br *byteReader) readU8LengthPrefixed(out *byteReader) bool {
216	return br.readLengthPrefixed(out, 1)
217}
218func (br *byteReader) readU8LengthPrefixedBytes(out *[]byte) bool {
219	return br.readLengthPrefixedBytes(out, 1)
220}
221
222func (br *byteReader) readU16LengthPrefixed(out *byteReader) bool {
223	return br.readLengthPrefixed(out, 2)
224}
225func (br *byteReader) readU16LengthPrefixedBytes(out *[]byte) bool {
226	return br.readLengthPrefixedBytes(out, 2)
227}
228
229func (br *byteReader) readU24LengthPrefixed(out *byteReader) bool {
230	return br.readLengthPrefixed(out, 3)
231}
232func (br *byteReader) readU24LengthPrefixedBytes(out *[]byte) bool {
233	return br.readLengthPrefixedBytes(out, 3)
234}
235
236func (br *byteReader) readU32LengthPrefixed(out *byteReader) bool {
237	return br.readLengthPrefixed(out, 4)
238}
239func (br *byteReader) readU32LengthPrefixedBytes(out *[]byte) bool {
240	return br.readLengthPrefixedBytes(out, 4)
241}
242
243type keyShareEntry struct {
244	group       CurveID
245	keyExchange []byte
246}
247
248type pskIdentity struct {
249	ticket              []uint8
250	obfuscatedTicketAge uint32
251}
252
253type HPKECipherSuite struct {
254	KDF  uint16
255	AEAD uint16
256}
257
258type ECHConfig struct {
259	Raw          []byte
260	ConfigID     uint8
261	KEM          uint16
262	PublicKey    []byte
263	MaxNameLen   uint8
264	PublicName   string
265	CipherSuites []HPKECipherSuite
266	// The following fields are only used by CreateECHConfig().
267	UnsupportedExtension          bool
268	UnsupportedMandatoryExtension bool
269}
270
271func CreateECHConfig(template *ECHConfig) *ECHConfig {
272	bb := newByteBuilder()
273	// ECHConfig reuses the encrypted_client_hello extension codepoint as a
274	// version identifier.
275	bb.addU16(extensionEncryptedClientHello)
276	contents := bb.addU16LengthPrefixed()
277	contents.addU8(template.ConfigID)
278	contents.addU16(template.KEM)
279	contents.addU16LengthPrefixed().addBytes(template.PublicKey)
280	cipherSuites := contents.addU16LengthPrefixed()
281	for _, suite := range template.CipherSuites {
282		cipherSuites.addU16(suite.KDF)
283		cipherSuites.addU16(suite.AEAD)
284	}
285	contents.addU8(template.MaxNameLen)
286	contents.addU8LengthPrefixed().addBytes([]byte(template.PublicName))
287	extensions := contents.addU16LengthPrefixed()
288	// Mandatory extensions have the high bit set.
289	if template.UnsupportedExtension {
290		extensions.addU16(0x1111)
291		extensions.addU16LengthPrefixed().addBytes([]byte("test"))
292	}
293	if template.UnsupportedMandatoryExtension {
294		extensions.addU16(0xaaaa)
295		extensions.addU16LengthPrefixed().addBytes([]byte("test"))
296	}
297
298	// This ought to be a call to a function like ParseECHConfig(bb.finish()),
299	// but this constrains us to constructing ECHConfigs we are willing to
300	// support. We need to test the client's behavior in response to unparsable
301	// or unsupported ECHConfigs, so populate fields from the template directly.
302	ret := *template
303	ret.Raw = bb.finish()
304	return &ret
305}
306
307func CreateECHConfigList(configs ...[]byte) []byte {
308	bb := newByteBuilder()
309	list := bb.addU16LengthPrefixed()
310	for _, config := range configs {
311		list.addBytes(config)
312	}
313	return bb.finish()
314}
315
316type ServerECHConfig struct {
317	ECHConfig *ECHConfig
318	Key       []byte
319}
320
321const (
322	echClientTypeOuter byte = 0
323	echClientTypeInner byte = 1
324)
325
326type echClientOuter struct {
327	kdfID    uint16
328	aeadID   uint16
329	configID uint8
330	enc      []byte
331	payload  []byte
332}
333
334type clientHelloMsg struct {
335	raw                                      []byte
336	isDTLS                                   bool
337	isV2ClientHello                          bool
338	vers                                     uint16
339	random                                   []byte
340	v2Challenge                              []byte
341	sessionID                                []byte
342	cookie                                   []byte
343	cipherSuites                             []uint16
344	compressionMethods                       []uint8
345	nextProtoNeg                             bool
346	serverName                               string
347	echOuter                                 *echClientOuter
348	echInner                                 bool
349	invalidECHInner                          []byte
350	ocspStapling                             bool
351	supportedCurves                          []CurveID
352	supportedPoints                          []uint8
353	hasKeyShares                             bool
354	keyShares                                []keyShareEntry
355	keySharesRaw                             []byte
356	trailingKeyShareData                     bool
357	pskIdentities                            []pskIdentity
358	pskKEModes                               []byte
359	pskBinders                               [][]uint8
360	hasEarlyData                             bool
361	tls13Cookie                              []byte
362	ticketSupported                          bool
363	sessionTicket                            []uint8
364	signatureAlgorithms                      []signatureAlgorithm
365	signatureAlgorithmsCert                  []signatureAlgorithm
366	supportedVersions                        []uint16
367	secureRenegotiation                      []byte
368	alpnProtocols                            []string
369	quicTransportParams                      []byte
370	quicTransportParamsLegacy                []byte
371	duplicateExtension                       bool
372	channelIDSupported                       bool
373	extendedMasterSecret                     bool
374	srtpProtectionProfiles                   []uint16
375	srtpMasterKeyIdentifier                  string
376	sctListSupported                         bool
377	customExtension                          string
378	hasGREASEExtension                       bool
379	omitExtensions                           bool
380	emptyExtensions                          bool
381	pad                                      int
382	compressedCertAlgs                       []uint16
383	delegatedCredentials                     bool
384	alpsProtocols                            []string
385	outerExtensions                          []uint16
386	reorderOuterExtensionsWithoutCompressing bool
387	prefixExtensions                         []uint16
388	// The following fields are only filled in by |unmarshal| and ignored when
389	// marshaling a new ClientHello.
390	echPayloadStart int
391	echPayloadEnd   int
392	rawExtensions   []byte
393}
394
395func (m *clientHelloMsg) marshalKeyShares(bb *byteBuilder) {
396	keyShares := bb.addU16LengthPrefixed()
397	for _, keyShare := range m.keyShares {
398		keyShares.addU16(uint16(keyShare.group))
399		keyExchange := keyShares.addU16LengthPrefixed()
400		keyExchange.addBytes(keyShare.keyExchange)
401	}
402	if m.trailingKeyShareData {
403		keyShares.addU8(0)
404	}
405}
406
407type clientHelloType int
408
409const (
410	clientHelloNormal clientHelloType = iota
411	clientHelloEncodedInner
412)
413
414func (m *clientHelloMsg) marshalBody(hello *byteBuilder, typ clientHelloType) {
415	hello.addU16(m.vers)
416	hello.addBytes(m.random)
417	sessionID := hello.addU8LengthPrefixed()
418	if typ != clientHelloEncodedInner {
419		sessionID.addBytes(m.sessionID)
420	}
421	if m.isDTLS {
422		cookie := hello.addU8LengthPrefixed()
423		cookie.addBytes(m.cookie)
424	}
425	cipherSuites := hello.addU16LengthPrefixed()
426	for _, suite := range m.cipherSuites {
427		cipherSuites.addU16(suite)
428	}
429	compressionMethods := hello.addU8LengthPrefixed()
430	compressionMethods.addBytes(m.compressionMethods)
431
432	type extension struct {
433		id   uint16
434		body []byte
435	}
436	var extensions []extension
437
438	if m.duplicateExtension {
439		// Add a duplicate bogus extension at the beginning and end.
440		extensions = append(extensions, extension{id: extensionDuplicate})
441	}
442	if m.nextProtoNeg {
443		extensions = append(extensions, extension{id: extensionNextProtoNeg})
444	}
445	if len(m.serverName) > 0 {
446		// RFC 3546, section 3.1
447		//
448		// struct {
449		//     NameType name_type;
450		//     select (name_type) {
451		//         case host_name: HostName;
452		//     } name;
453		// } ServerName;
454		//
455		// enum {
456		//     host_name(0), (255)
457		// } NameType;
458		//
459		// opaque HostName<1..2^16-1>;
460		//
461		// struct {
462		//     ServerName server_name_list<1..2^16-1>
463		// } ServerNameList;
464
465		serverNameList := newByteBuilder()
466		serverName := serverNameList.addU16LengthPrefixed()
467		serverName.addU8(0) // NameType host_name(0)
468		hostName := serverName.addU16LengthPrefixed()
469		hostName.addBytes([]byte(m.serverName))
470
471		extensions = append(extensions, extension{
472			id:   extensionServerName,
473			body: serverNameList.finish(),
474		})
475	}
476	if m.echOuter != nil {
477		body := newByteBuilder()
478		body.addU8(echClientTypeOuter)
479		body.addU16(m.echOuter.kdfID)
480		body.addU16(m.echOuter.aeadID)
481		body.addU8(m.echOuter.configID)
482		body.addU16LengthPrefixed().addBytes(m.echOuter.enc)
483		body.addU16LengthPrefixed().addBytes(m.echOuter.payload)
484		extensions = append(extensions, extension{
485			id:   extensionEncryptedClientHello,
486			body: body.finish(),
487		})
488	}
489	if m.echInner {
490		body := newByteBuilder()
491		body.addU8(echClientTypeInner)
492		// If unset, invalidECHInner is empty, which is the correct serialization.
493		body.addBytes(m.invalidECHInner)
494		extensions = append(extensions, extension{
495			id:   extensionEncryptedClientHello,
496			body: body.finish(),
497		})
498	}
499	if m.ocspStapling {
500		certificateStatusRequest := newByteBuilder()
501		// RFC 4366, section 3.6
502		certificateStatusRequest.addU8(1) // OCSP type
503		// Two zero valued uint16s for the two lengths.
504		certificateStatusRequest.addU16(0) // ResponderID length
505		certificateStatusRequest.addU16(0) // Extensions length
506		extensions = append(extensions, extension{
507			id:   extensionStatusRequest,
508			body: certificateStatusRequest.finish(),
509		})
510	}
511	if len(m.supportedCurves) > 0 {
512		// http://tools.ietf.org/html/rfc4492#section-5.1.1
513		supportedCurvesList := newByteBuilder()
514		supportedCurves := supportedCurvesList.addU16LengthPrefixed()
515		for _, curve := range m.supportedCurves {
516			supportedCurves.addU16(uint16(curve))
517		}
518		extensions = append(extensions, extension{
519			id:   extensionSupportedCurves,
520			body: supportedCurvesList.finish(),
521		})
522	}
523	if len(m.supportedPoints) > 0 {
524		// http://tools.ietf.org/html/rfc4492#section-5.1.2
525		supportedPointsList := newByteBuilder()
526		supportedPoints := supportedPointsList.addU8LengthPrefixed()
527		supportedPoints.addBytes(m.supportedPoints)
528		extensions = append(extensions, extension{
529			id:   extensionSupportedPoints,
530			body: supportedPointsList.finish(),
531		})
532	}
533	if m.hasKeyShares {
534		keyShareList := newByteBuilder()
535		m.marshalKeyShares(keyShareList)
536		extensions = append(extensions, extension{
537			id:   extensionKeyShare,
538			body: keyShareList.finish(),
539		})
540	}
541	if len(m.pskKEModes) > 0 {
542		pskModesExtension := newByteBuilder()
543		pskModesExtension.addU8LengthPrefixed().addBytes(m.pskKEModes)
544		extensions = append(extensions, extension{
545			id:   extensionPSKKeyExchangeModes,
546			body: pskModesExtension.finish(),
547		})
548	}
549	if m.hasEarlyData {
550		extensions = append(extensions, extension{id: extensionEarlyData})
551	}
552	if len(m.tls13Cookie) > 0 {
553		body := newByteBuilder()
554		body.addU16LengthPrefixed().addBytes(m.tls13Cookie)
555		extensions = append(extensions, extension{
556			id:   extensionCookie,
557			body: body.finish(),
558		})
559	}
560	if m.ticketSupported {
561		// http://tools.ietf.org/html/rfc5077#section-3.2
562		extensions = append(extensions, extension{
563			id:   extensionSessionTicket,
564			body: m.sessionTicket,
565		})
566	}
567	if len(m.signatureAlgorithms) > 0 {
568		// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
569		signatureAlgorithmsExtension := newByteBuilder()
570		signatureAlgorithms := signatureAlgorithmsExtension.addU16LengthPrefixed()
571		for _, sigAlg := range m.signatureAlgorithms {
572			signatureAlgorithms.addU16(uint16(sigAlg))
573		}
574		extensions = append(extensions, extension{
575			id:   extensionSignatureAlgorithms,
576			body: signatureAlgorithmsExtension.finish(),
577		})
578	}
579	if len(m.signatureAlgorithmsCert) > 0 {
580		signatureAlgorithmsCertExtension := newByteBuilder()
581		signatureAlgorithmsCert := signatureAlgorithmsCertExtension.addU16LengthPrefixed()
582		for _, sigAlg := range m.signatureAlgorithmsCert {
583			signatureAlgorithmsCert.addU16(uint16(sigAlg))
584		}
585		extensions = append(extensions, extension{
586			id:   extensionSignatureAlgorithmsCert,
587			body: signatureAlgorithmsCertExtension.finish(),
588		})
589	}
590	if len(m.supportedVersions) > 0 {
591		supportedVersionsExtension := newByteBuilder()
592		supportedVersions := supportedVersionsExtension.addU8LengthPrefixed()
593		for _, version := range m.supportedVersions {
594			supportedVersions.addU16(uint16(version))
595		}
596		extensions = append(extensions, extension{
597			id:   extensionSupportedVersions,
598			body: supportedVersionsExtension.finish(),
599		})
600	}
601	if m.secureRenegotiation != nil {
602		secureRenegoExt := newByteBuilder()
603		secureRenegoExt.addU8LengthPrefixed().addBytes(m.secureRenegotiation)
604		extensions = append(extensions, extension{
605			id:   extensionRenegotiationInfo,
606			body: secureRenegoExt.finish(),
607		})
608	}
609	if len(m.alpnProtocols) > 0 {
610		// https://tools.ietf.org/html/rfc7301#section-3.1
611		alpnExtension := newByteBuilder()
612		protocolNameList := alpnExtension.addU16LengthPrefixed()
613		for _, s := range m.alpnProtocols {
614			protocolName := protocolNameList.addU8LengthPrefixed()
615			protocolName.addBytes([]byte(s))
616		}
617		extensions = append(extensions, extension{
618			id:   extensionALPN,
619			body: alpnExtension.finish(),
620		})
621	}
622	if len(m.quicTransportParams) > 0 {
623		extensions = append(extensions, extension{
624			id:   extensionQUICTransportParams,
625			body: m.quicTransportParams,
626		})
627	}
628	if len(m.quicTransportParamsLegacy) > 0 {
629		extensions = append(extensions, extension{
630			id:   extensionQUICTransportParamsLegacy,
631			body: m.quicTransportParamsLegacy,
632		})
633	}
634	if m.channelIDSupported {
635		extensions = append(extensions, extension{id: extensionChannelID})
636	}
637	if m.duplicateExtension {
638		// Add a duplicate bogus extension at the beginning and end.
639		extensions = append(extensions, extension{id: extensionDuplicate})
640	}
641	if m.extendedMasterSecret {
642		// https://tools.ietf.org/html/rfc7627
643		extensions = append(extensions, extension{id: extensionExtendedMasterSecret})
644	}
645	if len(m.srtpProtectionProfiles) > 0 {
646		// https://tools.ietf.org/html/rfc5764#section-4.1.1
647		useSrtpExt := newByteBuilder()
648
649		srtpProtectionProfiles := useSrtpExt.addU16LengthPrefixed()
650		for _, p := range m.srtpProtectionProfiles {
651			srtpProtectionProfiles.addU16(p)
652		}
653		srtpMki := useSrtpExt.addU8LengthPrefixed()
654		srtpMki.addBytes([]byte(m.srtpMasterKeyIdentifier))
655
656		extensions = append(extensions, extension{
657			id:   extensionUseSRTP,
658			body: useSrtpExt.finish(),
659		})
660	}
661	if m.sctListSupported {
662		extensions = append(extensions, extension{id: extensionSignedCertificateTimestamp})
663	}
664	if len(m.customExtension) > 0 {
665		extensions = append(extensions, extension{
666			id:   extensionCustom,
667			body: []byte(m.customExtension),
668		})
669	}
670	if len(m.compressedCertAlgs) > 0 {
671		body := newByteBuilder()
672		algIDs := body.addU8LengthPrefixed()
673		for _, v := range m.compressedCertAlgs {
674			algIDs.addU16(v)
675		}
676		extensions = append(extensions, extension{
677			id:   extensionCompressedCertAlgs,
678			body: body.finish(),
679		})
680	}
681	if m.delegatedCredentials {
682		body := newByteBuilder()
683		signatureSchemeList := body.addU16LengthPrefixed()
684		for _, sigAlg := range m.signatureAlgorithms {
685			signatureSchemeList.addU16(uint16(sigAlg))
686		}
687		extensions = append(extensions, extension{
688			id:   extensionDelegatedCredentials,
689			body: body.finish(),
690		})
691	}
692	if len(m.alpsProtocols) > 0 {
693		body := newByteBuilder()
694		protocolNameList := body.addU16LengthPrefixed()
695		for _, s := range m.alpsProtocols {
696			protocolNameList.addU8LengthPrefixed().addBytes([]byte(s))
697		}
698		extensions = append(extensions, extension{
699			id:   extensionApplicationSettings,
700			body: body.finish(),
701		})
702	}
703
704	// The PSK extension must be last. See https://tools.ietf.org/html/rfc8446#section-4.2.11
705	if len(m.pskIdentities) > 0 {
706		pskExtension := newByteBuilder()
707		pskIdentities := pskExtension.addU16LengthPrefixed()
708		for _, psk := range m.pskIdentities {
709			pskIdentities.addU16LengthPrefixed().addBytes(psk.ticket)
710			pskIdentities.addU32(psk.obfuscatedTicketAge)
711		}
712		pskBinders := pskExtension.addU16LengthPrefixed()
713		for _, binder := range m.pskBinders {
714			pskBinders.addU8LengthPrefixed().addBytes(binder)
715		}
716		extensions = append(extensions, extension{
717			id:   extensionPreSharedKey,
718			body: pskExtension.finish(),
719		})
720	}
721
722	extensionsBB := hello.addU16LengthPrefixed()
723	extMap := make(map[uint16][]byte)
724	extsWritten := make(map[uint16]struct{})
725	for _, ext := range extensions {
726		extMap[ext.id] = ext.body
727	}
728	// Write each of the prefix extensions, if we have it.
729	for _, extID := range m.prefixExtensions {
730		if body, ok := extMap[extID]; ok {
731			extensionsBB.addU16(extID)
732			extensionsBB.addU16LengthPrefixed().addBytes(body)
733			extsWritten[extID] = struct{}{}
734		}
735	}
736	// Write outer extensions, possibly in compressed form.
737	if m.outerExtensions != nil {
738		if typ == clientHelloEncodedInner && !m.reorderOuterExtensionsWithoutCompressing {
739			extensionsBB.addU16(extensionECHOuterExtensions)
740			list := extensionsBB.addU16LengthPrefixed().addU8LengthPrefixed()
741			for _, extID := range m.outerExtensions {
742				list.addU16(extID)
743				extsWritten[extID] = struct{}{}
744			}
745		} else {
746			for _, extID := range m.outerExtensions {
747				// m.outerExtensions may intentionally contain duplicates to test the
748				// server's reaction. If m.reorderOuterExtensionsWithoutCompressing
749				// is set, we are targetting the second ClientHello and wish to send a
750				// valid first ClientHello. In that case, deduplicate so the error
751				// only appears later.
752				if _, written := extsWritten[extID]; m.reorderOuterExtensionsWithoutCompressing && written {
753					continue
754				}
755				if body, ok := extMap[extID]; ok {
756					extensionsBB.addU16(extID)
757					extensionsBB.addU16LengthPrefixed().addBytes(body)
758					extsWritten[extID] = struct{}{}
759				}
760			}
761		}
762	}
763
764	// Write each of the remaining extensions in their original order.
765	for _, ext := range extensions {
766		if _, written := extsWritten[ext.id]; !written {
767			extensionsBB.addU16(ext.id)
768			extensionsBB.addU16LengthPrefixed().addBytes(ext.body)
769		}
770	}
771
772	if m.pad != 0 && hello.len()%m.pad != 0 {
773		extensionsBB.addU16(extensionPadding)
774		padding := extensionsBB.addU16LengthPrefixed()
775		// Note hello.len() has changed at this point from the length
776		// prefix.
777		if l := hello.len() % m.pad; l != 0 {
778			padding.addBytes(make([]byte, m.pad-l))
779		}
780	}
781
782	if m.omitExtensions || m.emptyExtensions {
783		// Silently erase any extensions which were sent.
784		hello.discardChild()
785		if m.emptyExtensions {
786			hello.addU16(0)
787		}
788	}
789}
790
791func (m *clientHelloMsg) marshalForEncodedInner() []byte {
792	hello := newByteBuilder()
793	m.marshalBody(hello, clientHelloEncodedInner)
794	return hello.finish()
795}
796
797func (m *clientHelloMsg) marshal() []byte {
798	if m.raw != nil {
799		return m.raw
800	}
801
802	if m.isV2ClientHello {
803		v2Msg := newByteBuilder()
804		v2Msg.addU8(1)
805		v2Msg.addU16(m.vers)
806		v2Msg.addU16(uint16(len(m.cipherSuites) * 3))
807		v2Msg.addU16(uint16(len(m.sessionID)))
808		v2Msg.addU16(uint16(len(m.v2Challenge)))
809		for _, spec := range m.cipherSuites {
810			v2Msg.addU24(int(spec))
811		}
812		v2Msg.addBytes(m.sessionID)
813		v2Msg.addBytes(m.v2Challenge)
814		m.raw = v2Msg.finish()
815		return m.raw
816	}
817
818	handshakeMsg := newByteBuilder()
819	handshakeMsg.addU8(typeClientHello)
820	hello := handshakeMsg.addU24LengthPrefixed()
821	m.marshalBody(hello, clientHelloNormal)
822	m.raw = handshakeMsg.finish()
823	// Sanity-check padding.
824	if m.pad != 0 && (len(m.raw)-4)%m.pad != 0 {
825		panic(fmt.Sprintf("%d is not a multiple of %d", len(m.raw)-4, m.pad))
826	}
827	return m.raw
828}
829
830func parseSignatureAlgorithms(reader *byteReader, out *[]signatureAlgorithm, allowEmpty bool) bool {
831	var sigAlgs byteReader
832	if !reader.readU16LengthPrefixed(&sigAlgs) {
833		return false
834	}
835	if !allowEmpty && len(sigAlgs) == 0 {
836		return false
837	}
838	*out = make([]signatureAlgorithm, 0, len(sigAlgs)/2)
839	for len(sigAlgs) > 0 {
840		var v uint16
841		if !sigAlgs.readU16(&v) {
842			return false
843		}
844		*out = append(*out, signatureAlgorithm(v))
845	}
846	return true
847}
848
849func checkDuplicateExtensions(extensions byteReader) bool {
850	seen := make(map[uint16]struct{})
851	for len(extensions) > 0 {
852		var extension uint16
853		var body byteReader
854		if !extensions.readU16(&extension) ||
855			!extensions.readU16LengthPrefixed(&body) {
856			return false
857		}
858		if _, ok := seen[extension]; ok {
859			return false
860		}
861		seen[extension] = struct{}{}
862	}
863	return true
864}
865
866func (m *clientHelloMsg) unmarshal(data []byte) bool {
867	m.raw = data
868	reader := byteReader(data[4:])
869	if !reader.readU16(&m.vers) ||
870		!reader.readBytes(&m.random, 32) ||
871		!reader.readU8LengthPrefixedBytes(&m.sessionID) ||
872		len(m.sessionID) > 32 {
873		return false
874	}
875	if m.isDTLS {
876		if !reader.readU8LengthPrefixedBytes(&m.cookie) ||
877			len(m.cookie) > 32 {
878			return false
879		}
880	}
881	var cipherSuites byteReader
882	if !reader.readU16LengthPrefixed(&cipherSuites) ||
883		!reader.readU8LengthPrefixedBytes(&m.compressionMethods) {
884		return false
885	}
886
887	m.cipherSuites = make([]uint16, 0, len(cipherSuites)/2)
888	for len(cipherSuites) > 0 {
889		var v uint16
890		if !cipherSuites.readU16(&v) {
891			return false
892		}
893		m.cipherSuites = append(m.cipherSuites, v)
894		if v == scsvRenegotiation {
895			m.secureRenegotiation = []byte{}
896		}
897	}
898
899	m.nextProtoNeg = false
900	m.serverName = ""
901	m.ocspStapling = false
902	m.keyShares = nil
903	m.pskIdentities = nil
904	m.hasEarlyData = false
905	m.ticketSupported = false
906	m.sessionTicket = nil
907	m.signatureAlgorithms = nil
908	m.signatureAlgorithmsCert = nil
909	m.supportedVersions = nil
910	m.alpnProtocols = nil
911	m.extendedMasterSecret = false
912	m.customExtension = ""
913	m.delegatedCredentials = false
914	m.alpsProtocols = nil
915
916	if len(reader) == 0 {
917		// ClientHello is optionally followed by extension data
918		return true
919	}
920
921	var extensions byteReader
922	if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 || !checkDuplicateExtensions(extensions) {
923		return false
924	}
925	m.rawExtensions = extensions
926	for len(extensions) > 0 {
927		var extension uint16
928		var body byteReader
929		if !extensions.readU16(&extension) ||
930			!extensions.readU16LengthPrefixed(&body) {
931			return false
932		}
933		switch extension {
934		case extensionServerName:
935			var names byteReader
936			if !body.readU16LengthPrefixed(&names) || len(body) != 0 {
937				return false
938			}
939			for len(names) > 0 {
940				var nameType byte
941				var name []byte
942				if !names.readU8(&nameType) ||
943					!names.readU16LengthPrefixedBytes(&name) {
944					return false
945				}
946				if nameType == 0 {
947					m.serverName = string(name)
948				}
949			}
950		case extensionEncryptedClientHello:
951			var typ byte
952			if !body.readU8(&typ) {
953				return false
954			}
955			switch typ {
956			case echClientTypeOuter:
957				var echOuter echClientOuter
958				if !body.readU16(&echOuter.kdfID) ||
959					!body.readU16(&echOuter.aeadID) ||
960					!body.readU8(&echOuter.configID) ||
961					!body.readU16LengthPrefixedBytes(&echOuter.enc) ||
962					!body.readU16LengthPrefixedBytes(&echOuter.payload) ||
963					len(echOuter.payload) == 0 ||
964					len(body) > 0 {
965					return false
966				}
967				m.echOuter = &echOuter
968				m.echPayloadEnd = len(data) - len(extensions)
969				m.echPayloadStart = m.echPayloadEnd - len(echOuter.payload)
970			case echClientTypeInner:
971				if len(body) > 0 {
972					return false
973				}
974				m.echInner = true
975			default:
976				return false
977			}
978		case extensionNextProtoNeg:
979			if len(body) != 0 {
980				return false
981			}
982			m.nextProtoNeg = true
983		case extensionStatusRequest:
984			// This parse is stricter than a production implementation would
985			// use. The status_request extension has many layers of interior
986			// extensibility, but we expect our client to only send empty
987			// requests of type OCSP.
988			var statusType uint8
989			var responderIDList, innerExtensions byteReader
990			if !body.readU8(&statusType) ||
991				statusType != statusTypeOCSP ||
992				!body.readU16LengthPrefixed(&responderIDList) ||
993				!body.readU16LengthPrefixed(&innerExtensions) ||
994				len(responderIDList) != 0 ||
995				len(innerExtensions) != 0 ||
996				len(body) != 0 {
997				return false
998			}
999			m.ocspStapling = true
1000		case extensionSupportedCurves:
1001			// http://tools.ietf.org/html/rfc4492#section-5.5.1
1002			var curves byteReader
1003			if !body.readU16LengthPrefixed(&curves) || len(body) != 0 {
1004				return false
1005			}
1006			m.supportedCurves = make([]CurveID, 0, len(curves)/2)
1007			for len(curves) > 0 {
1008				var v uint16
1009				if !curves.readU16(&v) {
1010					return false
1011				}
1012				m.supportedCurves = append(m.supportedCurves, CurveID(v))
1013			}
1014		case extensionSupportedPoints:
1015			// http://tools.ietf.org/html/rfc4492#section-5.1.2
1016			if !body.readU8LengthPrefixedBytes(&m.supportedPoints) || len(m.supportedPoints) == 0 || len(body) != 0 {
1017				return false
1018			}
1019		case extensionSessionTicket:
1020			// http://tools.ietf.org/html/rfc5077#section-3.2
1021			m.ticketSupported = true
1022			m.sessionTicket = []byte(body)
1023		case extensionKeyShare:
1024			// https://tools.ietf.org/html/rfc8446#section-4.2.8
1025			m.hasKeyShares = true
1026			m.keySharesRaw = body
1027			var keyShares byteReader
1028			if !body.readU16LengthPrefixed(&keyShares) || len(body) != 0 {
1029				return false
1030			}
1031			for len(keyShares) > 0 {
1032				var entry keyShareEntry
1033				var group uint16
1034				if !keyShares.readU16(&group) ||
1035					!keyShares.readU16LengthPrefixedBytes(&entry.keyExchange) {
1036					return false
1037				}
1038				entry.group = CurveID(group)
1039				m.keyShares = append(m.keyShares, entry)
1040			}
1041		case extensionPreSharedKey:
1042			// https://tools.ietf.org/html/rfc8446#section-4.2.11
1043			var psks, binders byteReader
1044			if !body.readU16LengthPrefixed(&psks) ||
1045				!body.readU16LengthPrefixed(&binders) ||
1046				len(body) != 0 {
1047				return false
1048			}
1049			for len(psks) > 0 {
1050				var psk pskIdentity
1051				if !psks.readU16LengthPrefixedBytes(&psk.ticket) ||
1052					!psks.readU32(&psk.obfuscatedTicketAge) {
1053					return false
1054				}
1055				m.pskIdentities = append(m.pskIdentities, psk)
1056			}
1057			for len(binders) > 0 {
1058				var binder []byte
1059				if !binders.readU8LengthPrefixedBytes(&binder) {
1060					return false
1061				}
1062				m.pskBinders = append(m.pskBinders, binder)
1063			}
1064
1065			// There must be the same number of identities as binders.
1066			if len(m.pskIdentities) != len(m.pskBinders) {
1067				return false
1068			}
1069		case extensionPSKKeyExchangeModes:
1070			// https://tools.ietf.org/html/rfc8446#section-4.2.9
1071			if !body.readU8LengthPrefixedBytes(&m.pskKEModes) || len(body) != 0 {
1072				return false
1073			}
1074		case extensionEarlyData:
1075			// https://tools.ietf.org/html/rfc8446#section-4.2.10
1076			if len(body) != 0 {
1077				return false
1078			}
1079			m.hasEarlyData = true
1080		case extensionCookie:
1081			if !body.readU16LengthPrefixedBytes(&m.tls13Cookie) || len(body) != 0 {
1082				return false
1083			}
1084		case extensionSignatureAlgorithms:
1085			// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
1086			if !parseSignatureAlgorithms(&body, &m.signatureAlgorithms, false) || len(body) != 0 {
1087				return false
1088			}
1089		case extensionSignatureAlgorithmsCert:
1090			if !parseSignatureAlgorithms(&body, &m.signatureAlgorithmsCert, false) || len(body) != 0 {
1091				return false
1092			}
1093		case extensionSupportedVersions:
1094			var versions byteReader
1095			if !body.readU8LengthPrefixed(&versions) || len(body) != 0 {
1096				return false
1097			}
1098			m.supportedVersions = make([]uint16, 0, len(versions)/2)
1099			for len(versions) > 0 {
1100				var v uint16
1101				if !versions.readU16(&v) {
1102					return false
1103				}
1104				m.supportedVersions = append(m.supportedVersions, v)
1105			}
1106		case extensionRenegotiationInfo:
1107			if !body.readU8LengthPrefixedBytes(&m.secureRenegotiation) || len(body) != 0 {
1108				return false
1109			}
1110		case extensionALPN:
1111			var protocols byteReader
1112			if !body.readU16LengthPrefixed(&protocols) || len(body) != 0 {
1113				return false
1114			}
1115			for len(protocols) > 0 {
1116				var protocol []byte
1117				if !protocols.readU8LengthPrefixedBytes(&protocol) || len(protocol) == 0 {
1118					return false
1119				}
1120				m.alpnProtocols = append(m.alpnProtocols, string(protocol))
1121			}
1122		case extensionQUICTransportParams:
1123			m.quicTransportParams = body
1124		case extensionQUICTransportParamsLegacy:
1125			m.quicTransportParamsLegacy = body
1126		case extensionChannelID:
1127			if len(body) != 0 {
1128				return false
1129			}
1130			m.channelIDSupported = true
1131		case extensionExtendedMasterSecret:
1132			if len(body) != 0 {
1133				return false
1134			}
1135			m.extendedMasterSecret = true
1136		case extensionUseSRTP:
1137			var profiles byteReader
1138			var mki []byte
1139			if !body.readU16LengthPrefixed(&profiles) ||
1140				!body.readU8LengthPrefixedBytes(&mki) ||
1141				len(body) != 0 {
1142				return false
1143			}
1144			m.srtpProtectionProfiles = make([]uint16, 0, len(profiles)/2)
1145			for len(profiles) > 0 {
1146				var v uint16
1147				if !profiles.readU16(&v) {
1148					return false
1149				}
1150				m.srtpProtectionProfiles = append(m.srtpProtectionProfiles, v)
1151			}
1152			m.srtpMasterKeyIdentifier = string(mki)
1153		case extensionSignedCertificateTimestamp:
1154			if len(body) != 0 {
1155				return false
1156			}
1157			m.sctListSupported = true
1158		case extensionCustom:
1159			m.customExtension = string(body)
1160		case extensionCompressedCertAlgs:
1161			var algIDs byteReader
1162			if !body.readU8LengthPrefixed(&algIDs) {
1163				return false
1164			}
1165
1166			seen := make(map[uint16]struct{})
1167			for len(algIDs) > 0 {
1168				var algID uint16
1169				if !algIDs.readU16(&algID) {
1170					return false
1171				}
1172				if _, ok := seen[algID]; ok {
1173					return false
1174				}
1175				seen[algID] = struct{}{}
1176				m.compressedCertAlgs = append(m.compressedCertAlgs, algID)
1177			}
1178		case extensionPadding:
1179			// Padding bytes must be all zero.
1180			for _, b := range body {
1181				if b != 0 {
1182					return false
1183				}
1184			}
1185		case extensionDelegatedCredentials:
1186			if len(body) != 0 {
1187				return false
1188			}
1189			m.delegatedCredentials = true
1190		case extensionApplicationSettings:
1191			var protocols byteReader
1192			if !body.readU16LengthPrefixed(&protocols) || len(body) != 0 {
1193				return false
1194			}
1195			for len(protocols) > 0 {
1196				var protocol []byte
1197				if !protocols.readU8LengthPrefixedBytes(&protocol) || len(protocol) == 0 {
1198					return false
1199				}
1200				m.alpsProtocols = append(m.alpsProtocols, string(protocol))
1201			}
1202		}
1203
1204		if isGREASEValue(extension) {
1205			m.hasGREASEExtension = true
1206		}
1207	}
1208
1209	return true
1210}
1211
1212func decodeClientHelloInner(config *Config, encoded []byte, helloOuter *clientHelloMsg) (*clientHelloMsg, error) {
1213	reader := byteReader(encoded)
1214	var versAndRandom, sessionID, cipherSuites, compressionMethods []byte
1215	var extensions byteReader
1216	if !reader.readBytes(&versAndRandom, 2+32) ||
1217		!reader.readU8LengthPrefixedBytes(&sessionID) ||
1218		len(sessionID) != 0 || // Copied from |helloOuter|
1219		!reader.readU16LengthPrefixedBytes(&cipherSuites) ||
1220		!reader.readU8LengthPrefixedBytes(&compressionMethods) ||
1221		!reader.readU16LengthPrefixed(&extensions) {
1222		return nil, errors.New("tls: error parsing EncodedClientHelloInner")
1223	}
1224
1225	// The remainder of the structure is padding.
1226	for _, padding := range reader {
1227		if padding != 0 {
1228			return nil, errors.New("tls: non-zero padding in EncodedClientHelloInner")
1229		}
1230	}
1231
1232	builder := newByteBuilder()
1233	builder.addU8(typeClientHello)
1234	body := builder.addU24LengthPrefixed()
1235	body.addBytes(versAndRandom)
1236	body.addU8LengthPrefixed().addBytes(helloOuter.sessionID)
1237	body.addU16LengthPrefixed().addBytes(cipherSuites)
1238	body.addU8LengthPrefixed().addBytes(compressionMethods)
1239	newExtensions := body.addU16LengthPrefixed()
1240
1241	var seenOuterExtensions bool
1242	outerExtensions := byteReader(helloOuter.rawExtensions)
1243	copied := make(map[uint16]struct{})
1244	for len(extensions) > 0 {
1245		var extType uint16
1246		var extBody byteReader
1247		if !extensions.readU16(&extType) ||
1248			!extensions.readU16LengthPrefixed(&extBody) {
1249			return nil, errors.New("tls: error parsing EncodedClientHelloInner")
1250		}
1251		if extType != extensionECHOuterExtensions {
1252			newExtensions.addU16(extType)
1253			newExtensions.addU16LengthPrefixed().addBytes(extBody)
1254			continue
1255		}
1256		if seenOuterExtensions {
1257			return nil, errors.New("tls: duplicate ech_outer_extensions extension")
1258		}
1259		seenOuterExtensions = true
1260		var extList byteReader
1261		if !extBody.readU8LengthPrefixed(&extList) || len(extList) == 0 || len(extBody) != 0 {
1262			return nil, errors.New("tls: error parsing ech_outer_extensions")
1263		}
1264		for len(extList) != 0 {
1265			var newExtType uint16
1266			if !extList.readU16(&newExtType) {
1267				return nil, errors.New("tls: error parsing ech_outer_extensions")
1268			}
1269			if newExtType == extensionEncryptedClientHello {
1270				return nil, errors.New("tls: error parsing ech_outer_extensions")
1271			}
1272			for {
1273				if len(outerExtensions) == 0 {
1274					return nil, fmt.Errorf("tls: extension %d not found in ClientHelloOuter", newExtType)
1275				}
1276				var foundExt uint16
1277				var newExtBody []byte
1278				if !outerExtensions.readU16(&foundExt) ||
1279					!outerExtensions.readU16LengthPrefixedBytes(&newExtBody) {
1280					return nil, errors.New("tls: error parsing ClientHelloOuter")
1281				}
1282				if foundExt == newExtType {
1283					newExtensions.addU16(newExtType)
1284					newExtensions.addU16LengthPrefixed().addBytes(newExtBody)
1285					copied[newExtType] = struct{}{}
1286					break
1287				}
1288			}
1289		}
1290	}
1291
1292	for _, expected := range config.Bugs.ExpectECHOuterExtensions {
1293		if _, ok := copied[expected]; !ok {
1294			return nil, fmt.Errorf("tls: extension %d not found in ech_outer_extensions", expected)
1295		}
1296	}
1297	for _, expected := range config.Bugs.ExpectECHUncompressedExtensions {
1298		if _, ok := copied[expected]; ok {
1299			return nil, fmt.Errorf("tls: extension %d unexpectedly found in ech_outer_extensions", expected)
1300		}
1301	}
1302
1303	ret := new(clientHelloMsg)
1304	if !ret.unmarshal(builder.finish()) {
1305		return nil, errors.New("tls: error parsing reconstructed ClientHello")
1306	}
1307	return ret, nil
1308}
1309
1310type serverHelloMsg struct {
1311	raw                   []byte
1312	isDTLS                bool
1313	vers                  uint16
1314	versOverride          uint16
1315	supportedVersOverride uint16
1316	omitSupportedVers     bool
1317	random                []byte
1318	sessionID             []byte
1319	cipherSuite           uint16
1320	hasKeyShare           bool
1321	keyShare              keyShareEntry
1322	hasPSKIdentity        bool
1323	pskIdentity           uint16
1324	compressionMethod     uint8
1325	customExtension       string
1326	unencryptedALPN       string
1327	omitExtensions        bool
1328	emptyExtensions       bool
1329	extensions            serverExtensions
1330}
1331
1332func (m *serverHelloMsg) marshal() []byte {
1333	if m.raw != nil {
1334		return m.raw
1335	}
1336
1337	handshakeMsg := newByteBuilder()
1338	handshakeMsg.addU8(typeServerHello)
1339	hello := handshakeMsg.addU24LengthPrefixed()
1340
1341	// m.vers is used both to determine the format of the rest of the
1342	// ServerHello and to override the value, so include a second version
1343	// field.
1344	vers, ok := wireToVersion(m.vers, m.isDTLS)
1345	if !ok {
1346		panic("unknown version")
1347	}
1348	if m.versOverride != 0 {
1349		hello.addU16(m.versOverride)
1350	} else if vers >= VersionTLS13 {
1351		hello.addU16(VersionTLS12)
1352	} else {
1353		hello.addU16(m.vers)
1354	}
1355
1356	hello.addBytes(m.random)
1357	sessionID := hello.addU8LengthPrefixed()
1358	sessionID.addBytes(m.sessionID)
1359	hello.addU16(m.cipherSuite)
1360	hello.addU8(m.compressionMethod)
1361
1362	extensions := hello.addU16LengthPrefixed()
1363
1364	if vers >= VersionTLS13 {
1365		if m.hasKeyShare {
1366			extensions.addU16(extensionKeyShare)
1367			keyShare := extensions.addU16LengthPrefixed()
1368			keyShare.addU16(uint16(m.keyShare.group))
1369			keyExchange := keyShare.addU16LengthPrefixed()
1370			keyExchange.addBytes(m.keyShare.keyExchange)
1371		}
1372		if m.hasPSKIdentity {
1373			extensions.addU16(extensionPreSharedKey)
1374			extensions.addU16(2) // Length
1375			extensions.addU16(m.pskIdentity)
1376		}
1377		if !m.omitSupportedVers {
1378			extensions.addU16(extensionSupportedVersions)
1379			extensions.addU16(2) // Length
1380			if m.supportedVersOverride != 0 {
1381				extensions.addU16(m.supportedVersOverride)
1382			} else {
1383				extensions.addU16(m.vers)
1384			}
1385		}
1386		if len(m.customExtension) > 0 {
1387			extensions.addU16(extensionCustom)
1388			customExt := extensions.addU16LengthPrefixed()
1389			customExt.addBytes([]byte(m.customExtension))
1390		}
1391		if len(m.unencryptedALPN) > 0 {
1392			extensions.addU16(extensionALPN)
1393			extension := extensions.addU16LengthPrefixed()
1394
1395			protocolNameList := extension.addU16LengthPrefixed()
1396			protocolName := protocolNameList.addU8LengthPrefixed()
1397			protocolName.addBytes([]byte(m.unencryptedALPN))
1398		}
1399	} else {
1400		m.extensions.marshal(extensions)
1401		if m.omitExtensions || m.emptyExtensions {
1402			// Silently erasing server extensions will break the handshake. Instead,
1403			// assert that tests which use this field also disable all features which
1404			// would write an extension.
1405			if extensions.len() != 0 {
1406				panic(fmt.Sprintf("ServerHello unexpectedly contained extensions: %x, %+v", extensions.data(), m))
1407			}
1408			hello.discardChild()
1409			if m.emptyExtensions {
1410				hello.addU16(0)
1411			}
1412		}
1413	}
1414
1415	m.raw = handshakeMsg.finish()
1416	return m.raw
1417}
1418
1419func (m *serverHelloMsg) unmarshal(data []byte) bool {
1420	m.raw = data
1421	reader := byteReader(data[4:])
1422	if !reader.readU16(&m.vers) ||
1423		!reader.readBytes(&m.random, 32) {
1424		return false
1425	}
1426	vers, ok := wireToVersion(m.vers, m.isDTLS)
1427	if !ok {
1428		return false
1429	}
1430	if !reader.readU8LengthPrefixedBytes(&m.sessionID) ||
1431		!reader.readU16(&m.cipherSuite) ||
1432		!reader.readU8(&m.compressionMethod) {
1433		return false
1434	}
1435
1436	if len(reader) == 0 && m.vers < VersionTLS13 {
1437		// Extension data is optional before TLS 1.3.
1438		m.extensions = serverExtensions{}
1439		m.omitExtensions = true
1440		return true
1441	}
1442
1443	var extensions byteReader
1444	if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 || !checkDuplicateExtensions(extensions) {
1445		return false
1446	}
1447
1448	// Parse out the version from supported_versions if available.
1449	if m.vers == VersionTLS12 {
1450		extensionsCopy := extensions
1451		for len(extensionsCopy) > 0 {
1452			var extension uint16
1453			var body byteReader
1454			if !extensionsCopy.readU16(&extension) ||
1455				!extensionsCopy.readU16LengthPrefixed(&body) {
1456				return false
1457			}
1458			if extension == extensionSupportedVersions {
1459				if !body.readU16(&m.vers) || len(body) != 0 {
1460					return false
1461				}
1462				vers, ok = wireToVersion(m.vers, m.isDTLS)
1463				if !ok {
1464					return false
1465				}
1466			}
1467		}
1468	}
1469
1470	if vers >= VersionTLS13 {
1471		for len(extensions) > 0 {
1472			var extension uint16
1473			var body byteReader
1474			if !extensions.readU16(&extension) ||
1475				!extensions.readU16LengthPrefixed(&body) {
1476				return false
1477			}
1478			switch extension {
1479			case extensionKeyShare:
1480				m.hasKeyShare = true
1481				var group uint16
1482				if !body.readU16(&group) ||
1483					!body.readU16LengthPrefixedBytes(&m.keyShare.keyExchange) ||
1484					len(body) != 0 {
1485					return false
1486				}
1487				m.keyShare.group = CurveID(group)
1488			case extensionPreSharedKey:
1489				if !body.readU16(&m.pskIdentity) || len(body) != 0 {
1490					return false
1491				}
1492				m.hasPSKIdentity = true
1493			case extensionSupportedVersions:
1494				// Parsed above.
1495			default:
1496				// Only allow the 3 extensions that are sent in
1497				// the clear in TLS 1.3.
1498				return false
1499			}
1500		}
1501	} else if !m.extensions.unmarshal(extensions, vers) {
1502		return false
1503	}
1504
1505	return true
1506}
1507
1508type encryptedExtensionsMsg struct {
1509	raw        []byte
1510	extensions serverExtensions
1511	empty      bool
1512}
1513
1514func (m *encryptedExtensionsMsg) marshal() []byte {
1515	if m.raw != nil {
1516		return m.raw
1517	}
1518
1519	encryptedExtensionsMsg := newByteBuilder()
1520	encryptedExtensionsMsg.addU8(typeEncryptedExtensions)
1521	encryptedExtensions := encryptedExtensionsMsg.addU24LengthPrefixed()
1522	if !m.empty {
1523		extensions := encryptedExtensions.addU16LengthPrefixed()
1524		m.extensions.marshal(extensions)
1525	}
1526
1527	m.raw = encryptedExtensionsMsg.finish()
1528	return m.raw
1529}
1530
1531func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool {
1532	m.raw = data
1533	reader := byteReader(data[4:])
1534	var extensions byteReader
1535	if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 {
1536		return false
1537	}
1538	return m.extensions.unmarshal(extensions, VersionTLS13)
1539}
1540
1541type serverExtensions struct {
1542	nextProtoNeg              bool
1543	nextProtos                []string
1544	ocspStapling              bool
1545	ticketSupported           bool
1546	secureRenegotiation       []byte
1547	alpnProtocol              string
1548	alpnProtocolEmpty         bool
1549	duplicateExtension        bool
1550	channelIDRequested        bool
1551	extendedMasterSecret      bool
1552	srtpProtectionProfile     uint16
1553	srtpMasterKeyIdentifier   string
1554	sctList                   []byte
1555	customExtension           string
1556	npnAfterAlpn              bool
1557	hasKeyShare               bool
1558	hasEarlyData              bool
1559	keyShare                  keyShareEntry
1560	supportedVersion          uint16
1561	supportedPoints           []uint8
1562	supportedCurves           []CurveID
1563	quicTransportParams       []byte
1564	quicTransportParamsLegacy []byte
1565	serverNameAck             bool
1566	applicationSettings       []byte
1567	hasApplicationSettings    bool
1568	echRetryConfigs           []byte
1569}
1570
1571func (m *serverExtensions) marshal(extensions *byteBuilder) {
1572	if m.duplicateExtension {
1573		// Add a duplicate bogus extension at the beginning and end.
1574		extensions.addU16(extensionDuplicate)
1575		extensions.addU16(0) // length = 0 for empty extension
1576	}
1577	if m.nextProtoNeg && !m.npnAfterAlpn {
1578		extensions.addU16(extensionNextProtoNeg)
1579		extension := extensions.addU16LengthPrefixed()
1580
1581		for _, v := range m.nextProtos {
1582			if len(v) > 255 {
1583				v = v[:255]
1584			}
1585			npn := extension.addU8LengthPrefixed()
1586			npn.addBytes([]byte(v))
1587		}
1588	}
1589	if m.ocspStapling {
1590		extensions.addU16(extensionStatusRequest)
1591		extensions.addU16(0)
1592	}
1593	if m.ticketSupported {
1594		extensions.addU16(extensionSessionTicket)
1595		extensions.addU16(0)
1596	}
1597	if m.secureRenegotiation != nil {
1598		extensions.addU16(extensionRenegotiationInfo)
1599		extension := extensions.addU16LengthPrefixed()
1600		secureRenego := extension.addU8LengthPrefixed()
1601		secureRenego.addBytes(m.secureRenegotiation)
1602	}
1603	if len(m.alpnProtocol) > 0 || m.alpnProtocolEmpty {
1604		extensions.addU16(extensionALPN)
1605		extension := extensions.addU16LengthPrefixed()
1606
1607		protocolNameList := extension.addU16LengthPrefixed()
1608		protocolName := protocolNameList.addU8LengthPrefixed()
1609		protocolName.addBytes([]byte(m.alpnProtocol))
1610	}
1611	if m.channelIDRequested {
1612		extensions.addU16(extensionChannelID)
1613		extensions.addU16(0)
1614	}
1615	if m.duplicateExtension {
1616		// Add a duplicate bogus extension at the beginning and end.
1617		extensions.addU16(extensionDuplicate)
1618		extensions.addU16(0)
1619	}
1620	if m.extendedMasterSecret {
1621		extensions.addU16(extensionExtendedMasterSecret)
1622		extensions.addU16(0)
1623	}
1624	if m.srtpProtectionProfile != 0 {
1625		extensions.addU16(extensionUseSRTP)
1626		extension := extensions.addU16LengthPrefixed()
1627
1628		srtpProtectionProfiles := extension.addU16LengthPrefixed()
1629		srtpProtectionProfiles.addU16(m.srtpProtectionProfile)
1630		srtpMki := extension.addU8LengthPrefixed()
1631		srtpMki.addBytes([]byte(m.srtpMasterKeyIdentifier))
1632	}
1633	if m.sctList != nil {
1634		extensions.addU16(extensionSignedCertificateTimestamp)
1635		extension := extensions.addU16LengthPrefixed()
1636		extension.addBytes(m.sctList)
1637	}
1638	if l := len(m.customExtension); l > 0 {
1639		extensions.addU16(extensionCustom)
1640		customExt := extensions.addU16LengthPrefixed()
1641		customExt.addBytes([]byte(m.customExtension))
1642	}
1643	if m.nextProtoNeg && m.npnAfterAlpn {
1644		extensions.addU16(extensionNextProtoNeg)
1645		extension := extensions.addU16LengthPrefixed()
1646
1647		for _, v := range m.nextProtos {
1648			if len(v) > 255 {
1649				v = v[0:255]
1650			}
1651			npn := extension.addU8LengthPrefixed()
1652			npn.addBytes([]byte(v))
1653		}
1654	}
1655	if m.hasKeyShare {
1656		extensions.addU16(extensionKeyShare)
1657		keyShare := extensions.addU16LengthPrefixed()
1658		keyShare.addU16(uint16(m.keyShare.group))
1659		keyExchange := keyShare.addU16LengthPrefixed()
1660		keyExchange.addBytes(m.keyShare.keyExchange)
1661	}
1662	if m.supportedVersion != 0 {
1663		extensions.addU16(extensionSupportedVersions)
1664		extensions.addU16(2) // Length
1665		extensions.addU16(m.supportedVersion)
1666	}
1667	if len(m.supportedPoints) > 0 {
1668		// http://tools.ietf.org/html/rfc4492#section-5.1.2
1669		extensions.addU16(extensionSupportedPoints)
1670		supportedPointsList := extensions.addU16LengthPrefixed()
1671		supportedPoints := supportedPointsList.addU8LengthPrefixed()
1672		supportedPoints.addBytes(m.supportedPoints)
1673	}
1674	if len(m.supportedCurves) > 0 {
1675		// https://tools.ietf.org/html/rfc8446#section-4.2.7
1676		extensions.addU16(extensionSupportedCurves)
1677		supportedCurvesList := extensions.addU16LengthPrefixed()
1678		supportedCurves := supportedCurvesList.addU16LengthPrefixed()
1679		for _, curve := range m.supportedCurves {
1680			supportedCurves.addU16(uint16(curve))
1681		}
1682	}
1683	if len(m.quicTransportParams) > 0 {
1684		extensions.addU16(extensionQUICTransportParams)
1685		params := extensions.addU16LengthPrefixed()
1686		params.addBytes(m.quicTransportParams)
1687	}
1688	if len(m.quicTransportParamsLegacy) > 0 {
1689		extensions.addU16(extensionQUICTransportParamsLegacy)
1690		params := extensions.addU16LengthPrefixed()
1691		params.addBytes(m.quicTransportParamsLegacy)
1692	}
1693	if m.hasEarlyData {
1694		extensions.addU16(extensionEarlyData)
1695		extensions.addBytes([]byte{0, 0})
1696	}
1697	if m.serverNameAck {
1698		extensions.addU16(extensionServerName)
1699		extensions.addU16(0) // zero length
1700	}
1701	if m.hasApplicationSettings {
1702		extensions.addU16(extensionApplicationSettings)
1703		extensions.addU16LengthPrefixed().addBytes(m.applicationSettings)
1704	}
1705	if len(m.echRetryConfigs) > 0 {
1706		extensions.addU16(extensionEncryptedClientHello)
1707		extensions.addU16LengthPrefixed().addBytes(m.echRetryConfigs)
1708	}
1709}
1710
1711func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1712	// Reset all fields.
1713	*m = serverExtensions{}
1714
1715	if !checkDuplicateExtensions(data) {
1716		return false
1717	}
1718
1719	for len(data) > 0 {
1720		var extension uint16
1721		var body byteReader
1722		if !data.readU16(&extension) ||
1723			!data.readU16LengthPrefixed(&body) {
1724			return false
1725		}
1726		switch extension {
1727		case extensionNextProtoNeg:
1728			m.nextProtoNeg = true
1729			for len(body) > 0 {
1730				var protocol []byte
1731				if !body.readU8LengthPrefixedBytes(&protocol) {
1732					return false
1733				}
1734				m.nextProtos = append(m.nextProtos, string(protocol))
1735			}
1736		case extensionStatusRequest:
1737			if len(body) != 0 {
1738				return false
1739			}
1740			m.ocspStapling = true
1741		case extensionSessionTicket:
1742			if len(body) != 0 {
1743				return false
1744			}
1745			m.ticketSupported = true
1746		case extensionRenegotiationInfo:
1747			if !body.readU8LengthPrefixedBytes(&m.secureRenegotiation) || len(body) != 0 {
1748				return false
1749			}
1750		case extensionALPN:
1751			var protocols, protocol byteReader
1752			if !body.readU16LengthPrefixed(&protocols) ||
1753				len(body) != 0 ||
1754				!protocols.readU8LengthPrefixed(&protocol) ||
1755				len(protocols) != 0 {
1756				return false
1757			}
1758			m.alpnProtocol = string(protocol)
1759			m.alpnProtocolEmpty = len(protocol) == 0
1760		case extensionChannelID:
1761			if len(body) != 0 {
1762				return false
1763			}
1764			m.channelIDRequested = true
1765		case extensionExtendedMasterSecret:
1766			if len(body) != 0 {
1767				return false
1768			}
1769			m.extendedMasterSecret = true
1770		case extensionUseSRTP:
1771			var profiles, mki byteReader
1772			if !body.readU16LengthPrefixed(&profiles) ||
1773				!profiles.readU16(&m.srtpProtectionProfile) ||
1774				len(profiles) != 0 ||
1775				!body.readU8LengthPrefixed(&mki) ||
1776				len(body) != 0 {
1777				return false
1778			}
1779			m.srtpMasterKeyIdentifier = string(mki)
1780		case extensionSignedCertificateTimestamp:
1781			m.sctList = []byte(body)
1782		case extensionCustom:
1783			m.customExtension = string(body)
1784		case extensionServerName:
1785			if len(body) != 0 {
1786				return false
1787			}
1788			m.serverNameAck = true
1789		case extensionSupportedPoints:
1790			// supported_points is illegal in TLS 1.3.
1791			if version >= VersionTLS13 {
1792				return false
1793			}
1794			// http://tools.ietf.org/html/rfc4492#section-5.5.2
1795			if !body.readU8LengthPrefixedBytes(&m.supportedPoints) || len(body) != 0 {
1796				return false
1797			}
1798		case extensionSupportedCurves:
1799			// The server can only send supported_curves in TLS 1.3.
1800			if version < VersionTLS13 {
1801				return false
1802			}
1803		case extensionQUICTransportParams:
1804			m.quicTransportParams = body
1805		case extensionQUICTransportParamsLegacy:
1806			m.quicTransportParamsLegacy = body
1807		case extensionEarlyData:
1808			if version < VersionTLS13 || len(body) != 0 {
1809				return false
1810			}
1811			m.hasEarlyData = true
1812		case extensionApplicationSettings:
1813			m.hasApplicationSettings = true
1814			m.applicationSettings = body
1815		case extensionEncryptedClientHello:
1816			if version < VersionTLS13 {
1817				return false
1818			}
1819			m.echRetryConfigs = body
1820
1821			// Validate the ECHConfig with a top-level parse.
1822			var echConfigs byteReader
1823			if !body.readU16LengthPrefixed(&echConfigs) {
1824				return false
1825			}
1826			for len(echConfigs) > 0 {
1827				var version uint16
1828				var contents byteReader
1829				if !echConfigs.readU16(&version) ||
1830					!echConfigs.readU16LengthPrefixed(&contents) {
1831					return false
1832				}
1833			}
1834			if len(body) > 0 {
1835				return false
1836			}
1837		default:
1838			// Unknown extensions are illegal from the server.
1839			return false
1840		}
1841	}
1842
1843	return true
1844}
1845
1846type clientEncryptedExtensionsMsg struct {
1847	raw                    []byte
1848	applicationSettings    []byte
1849	hasApplicationSettings bool
1850	customExtension        []byte
1851}
1852
1853func (m *clientEncryptedExtensionsMsg) marshal() (x []byte) {
1854	if m.raw != nil {
1855		return m.raw
1856	}
1857
1858	builder := newByteBuilder()
1859	builder.addU8(typeEncryptedExtensions)
1860	body := builder.addU24LengthPrefixed()
1861	extensions := body.addU16LengthPrefixed()
1862	if m.hasApplicationSettings {
1863		extensions.addU16(extensionApplicationSettings)
1864		extensions.addU16LengthPrefixed().addBytes(m.applicationSettings)
1865	}
1866	if len(m.customExtension) > 0 {
1867		extensions.addU16(extensionCustom)
1868		extensions.addU16LengthPrefixed().addBytes(m.customExtension)
1869	}
1870
1871	m.raw = builder.finish()
1872	return m.raw
1873}
1874
1875func (m *clientEncryptedExtensionsMsg) unmarshal(data []byte) bool {
1876	m.raw = data
1877	reader := byteReader(data[4:])
1878
1879	var extensions byteReader
1880	if !reader.readU16LengthPrefixed(&extensions) ||
1881		len(reader) != 0 {
1882		return false
1883	}
1884
1885	if !checkDuplicateExtensions(extensions) {
1886		return false
1887	}
1888
1889	for len(extensions) > 0 {
1890		var extension uint16
1891		var body byteReader
1892		if !extensions.readU16(&extension) ||
1893			!extensions.readU16LengthPrefixed(&body) {
1894			return false
1895		}
1896		switch extension {
1897		case extensionApplicationSettings:
1898			m.hasApplicationSettings = true
1899			m.applicationSettings = body
1900		default:
1901			// Unknown extensions are illegal in EncryptedExtensions.
1902			return false
1903		}
1904	}
1905	return true
1906}
1907
1908type helloRetryRequestMsg struct {
1909	raw                   []byte
1910	vers                  uint16
1911	sessionID             []byte
1912	cipherSuite           uint16
1913	compressionMethod     uint8
1914	hasSelectedGroup      bool
1915	selectedGroup         CurveID
1916	cookie                []byte
1917	customExtension       string
1918	echConfirmation       []byte
1919	echConfirmationOffset int
1920	duplicateExtensions   bool
1921}
1922
1923func (m *helloRetryRequestMsg) marshal() []byte {
1924	if m.raw != nil {
1925		return m.raw
1926	}
1927
1928	retryRequestMsg := newByteBuilder()
1929	retryRequestMsg.addU8(typeServerHello)
1930	retryRequest := retryRequestMsg.addU24LengthPrefixed()
1931	retryRequest.addU16(VersionTLS12)
1932	retryRequest.addBytes(tls13HelloRetryRequest)
1933	sessionID := retryRequest.addU8LengthPrefixed()
1934	sessionID.addBytes(m.sessionID)
1935	retryRequest.addU16(m.cipherSuite)
1936	retryRequest.addU8(m.compressionMethod)
1937
1938	extensions := retryRequest.addU16LengthPrefixed()
1939
1940	count := 1
1941	if m.duplicateExtensions {
1942		count = 2
1943	}
1944
1945	for i := 0; i < count; i++ {
1946		extensions.addU16(extensionSupportedVersions)
1947		extensions.addU16(2) // Length
1948		extensions.addU16(m.vers)
1949		if m.hasSelectedGroup {
1950			extensions.addU16(extensionKeyShare)
1951			extensions.addU16(2) // length
1952			extensions.addU16(uint16(m.selectedGroup))
1953		}
1954		// m.cookie may be a non-nil empty slice for empty cookie tests.
1955		if m.cookie != nil {
1956			extensions.addU16(extensionCookie)
1957			body := extensions.addU16LengthPrefixed()
1958			body.addU16LengthPrefixed().addBytes(m.cookie)
1959		}
1960		if len(m.customExtension) > 0 {
1961			extensions.addU16(extensionCustom)
1962			extensions.addU16LengthPrefixed().addBytes([]byte(m.customExtension))
1963		}
1964		if len(m.echConfirmation) > 0 {
1965			extensions.addU16(extensionEncryptedClientHello)
1966			extensions.addU16LengthPrefixed().addBytes(m.echConfirmation)
1967		}
1968	}
1969
1970	m.raw = retryRequestMsg.finish()
1971	return m.raw
1972}
1973
1974func (m *helloRetryRequestMsg) unmarshal(data []byte) bool {
1975	m.raw = data
1976	reader := byteReader(data[4:])
1977	var legacyVers uint16
1978	var random []byte
1979	var compressionMethod byte
1980	var extensions byteReader
1981	if !reader.readU16(&legacyVers) ||
1982		legacyVers != VersionTLS12 ||
1983		!reader.readBytes(&random, 32) ||
1984		!reader.readU8LengthPrefixedBytes(&m.sessionID) ||
1985		!reader.readU16(&m.cipherSuite) ||
1986		!reader.readU8(&compressionMethod) ||
1987		compressionMethod != 0 ||
1988		!reader.readU16LengthPrefixed(&extensions) ||
1989		len(reader) != 0 {
1990		return false
1991	}
1992	for len(extensions) > 0 {
1993		var extension uint16
1994		var body byteReader
1995		if !extensions.readU16(&extension) ||
1996			!extensions.readU16LengthPrefixed(&body) {
1997			return false
1998		}
1999		switch extension {
2000		case extensionSupportedVersions:
2001			if !body.readU16(&m.vers) ||
2002				len(body) != 0 {
2003				return false
2004			}
2005		case extensionKeyShare:
2006			var v uint16
2007			if !body.readU16(&v) || len(body) != 0 {
2008				return false
2009			}
2010			m.hasSelectedGroup = true
2011			m.selectedGroup = CurveID(v)
2012		case extensionCookie:
2013			if !body.readU16LengthPrefixedBytes(&m.cookie) ||
2014				len(m.cookie) == 0 ||
2015				len(body) != 0 {
2016				return false
2017			}
2018		case extensionEncryptedClientHello:
2019			if len(body) != echAcceptConfirmationLength {
2020				return false
2021			}
2022			m.echConfirmation = body
2023			m.echConfirmationOffset = len(m.raw) - len(extensions) - len(body)
2024		default:
2025			// Unknown extensions are illegal from the server.
2026			return false
2027		}
2028	}
2029	return true
2030}
2031
2032type certificateEntry struct {
2033	data                []byte
2034	ocspResponse        []byte
2035	sctList             []byte
2036	duplicateExtensions bool
2037	extraExtension      []byte
2038	delegatedCredential *delegatedCredential
2039}
2040
2041type delegatedCredential struct {
2042	// https://tools.ietf.org/html/draft-ietf-tls-subcerts-03#section-3
2043	signedBytes            []byte
2044	lifetimeSecs           uint32
2045	expectedCertVerifyAlgo signatureAlgorithm
2046	pkixPublicKey          []byte
2047	algorithm              signatureAlgorithm
2048	signature              []byte
2049}
2050
2051type certificateMsg struct {
2052	raw               []byte
2053	hasRequestContext bool
2054	requestContext    []byte
2055	certificates      []certificateEntry
2056}
2057
2058func (m *certificateMsg) marshal() (x []byte) {
2059	if m.raw != nil {
2060		return m.raw
2061	}
2062
2063	certMsg := newByteBuilder()
2064	certMsg.addU8(typeCertificate)
2065	certificate := certMsg.addU24LengthPrefixed()
2066	if m.hasRequestContext {
2067		context := certificate.addU8LengthPrefixed()
2068		context.addBytes(m.requestContext)
2069	}
2070	certificateList := certificate.addU24LengthPrefixed()
2071	for _, cert := range m.certificates {
2072		certEntry := certificateList.addU24LengthPrefixed()
2073		certEntry.addBytes(cert.data)
2074		if m.hasRequestContext {
2075			extensions := certificateList.addU16LengthPrefixed()
2076			count := 1
2077			if cert.duplicateExtensions {
2078				count = 2
2079			}
2080
2081			for i := 0; i < count; i++ {
2082				if cert.ocspResponse != nil {
2083					extensions.addU16(extensionStatusRequest)
2084					body := extensions.addU16LengthPrefixed()
2085					body.addU8(statusTypeOCSP)
2086					response := body.addU24LengthPrefixed()
2087					response.addBytes(cert.ocspResponse)
2088				}
2089
2090				if cert.sctList != nil {
2091					extensions.addU16(extensionSignedCertificateTimestamp)
2092					extension := extensions.addU16LengthPrefixed()
2093					extension.addBytes(cert.sctList)
2094				}
2095			}
2096			if cert.extraExtension != nil {
2097				extensions.addBytes(cert.extraExtension)
2098			}
2099		}
2100	}
2101
2102	m.raw = certMsg.finish()
2103	return m.raw
2104}
2105
2106func (m *certificateMsg) unmarshal(data []byte) bool {
2107	m.raw = data
2108	reader := byteReader(data[4:])
2109
2110	if m.hasRequestContext && !reader.readU8LengthPrefixedBytes(&m.requestContext) {
2111		return false
2112	}
2113
2114	var certs byteReader
2115	if !reader.readU24LengthPrefixed(&certs) || len(reader) != 0 {
2116		return false
2117	}
2118	m.certificates = nil
2119	for len(certs) > 0 {
2120		var cert certificateEntry
2121		if !certs.readU24LengthPrefixedBytes(&cert.data) {
2122			return false
2123		}
2124		if m.hasRequestContext {
2125			var extensions byteReader
2126			if !certs.readU16LengthPrefixed(&extensions) || !checkDuplicateExtensions(extensions) {
2127				return false
2128			}
2129			for len(extensions) > 0 {
2130				var extension uint16
2131				var body byteReader
2132				if !extensions.readU16(&extension) ||
2133					!extensions.readU16LengthPrefixed(&body) {
2134					return false
2135				}
2136				switch extension {
2137				case extensionStatusRequest:
2138					var statusType byte
2139					if !body.readU8(&statusType) ||
2140						statusType != statusTypeOCSP ||
2141						!body.readU24LengthPrefixedBytes(&cert.ocspResponse) ||
2142						len(body) != 0 {
2143						return false
2144					}
2145				case extensionSignedCertificateTimestamp:
2146					cert.sctList = []byte(body)
2147				case extensionDelegatedCredentials:
2148					// https://tools.ietf.org/html/draft-ietf-tls-subcerts-03#section-3
2149					if cert.delegatedCredential != nil {
2150						return false
2151					}
2152
2153					dc := new(delegatedCredential)
2154					origBody := body
2155					var expectedCertVerifyAlgo, algorithm uint16
2156
2157					if !body.readU32(&dc.lifetimeSecs) ||
2158						!body.readU16(&expectedCertVerifyAlgo) ||
2159						!body.readU24LengthPrefixedBytes(&dc.pkixPublicKey) ||
2160						!body.readU16(&algorithm) ||
2161						!body.readU16LengthPrefixedBytes(&dc.signature) ||
2162						len(body) != 0 {
2163						return false
2164					}
2165
2166					dc.expectedCertVerifyAlgo = signatureAlgorithm(expectedCertVerifyAlgo)
2167					dc.algorithm = signatureAlgorithm(algorithm)
2168					dc.signedBytes = []byte(origBody)[:4+2+3+len(dc.pkixPublicKey)]
2169					cert.delegatedCredential = dc
2170				default:
2171					return false
2172				}
2173			}
2174		}
2175		m.certificates = append(m.certificates, cert)
2176	}
2177
2178	return true
2179}
2180
2181type compressedCertificateMsg struct {
2182	raw                []byte
2183	algID              uint16
2184	uncompressedLength uint32
2185	compressed         []byte
2186}
2187
2188func (m *compressedCertificateMsg) marshal() (x []byte) {
2189	if m.raw != nil {
2190		return m.raw
2191	}
2192
2193	certMsg := newByteBuilder()
2194	certMsg.addU8(typeCompressedCertificate)
2195	certificate := certMsg.addU24LengthPrefixed()
2196	certificate.addU16(m.algID)
2197	certificate.addU24(int(m.uncompressedLength))
2198	compressed := certificate.addU24LengthPrefixed()
2199	compressed.addBytes(m.compressed)
2200
2201	m.raw = certMsg.finish()
2202	return m.raw
2203}
2204
2205func (m *compressedCertificateMsg) unmarshal(data []byte) bool {
2206	m.raw = data
2207	reader := byteReader(data[4:])
2208
2209	if !reader.readU16(&m.algID) ||
2210		!reader.readU24(&m.uncompressedLength) ||
2211		!reader.readU24LengthPrefixedBytes(&m.compressed) ||
2212		len(reader) != 0 {
2213		return false
2214	}
2215
2216	if m.uncompressedLength >= 1<<17 {
2217		return false
2218	}
2219
2220	return true
2221}
2222
2223type serverKeyExchangeMsg struct {
2224	raw []byte
2225	key []byte
2226}
2227
2228func (m *serverKeyExchangeMsg) marshal() []byte {
2229	if m.raw != nil {
2230		return m.raw
2231	}
2232	msg := newByteBuilder()
2233	msg.addU8(typeServerKeyExchange)
2234	msg.addU24LengthPrefixed().addBytes(m.key)
2235	m.raw = msg.finish()
2236	return m.raw
2237}
2238
2239func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
2240	m.raw = data
2241	if len(data) < 4 {
2242		return false
2243	}
2244	m.key = data[4:]
2245	return true
2246}
2247
2248type certificateStatusMsg struct {
2249	raw        []byte
2250	statusType uint8
2251	response   []byte
2252}
2253
2254func (m *certificateStatusMsg) marshal() []byte {
2255	if m.raw != nil {
2256		return m.raw
2257	}
2258
2259	var x []byte
2260	if m.statusType == statusTypeOCSP {
2261		msg := newByteBuilder()
2262		msg.addU8(typeCertificateStatus)
2263		body := msg.addU24LengthPrefixed()
2264		body.addU8(statusTypeOCSP)
2265		body.addU24LengthPrefixed().addBytes(m.response)
2266		x = msg.finish()
2267	} else {
2268		x = []byte{typeCertificateStatus, 0, 0, 1, m.statusType}
2269	}
2270
2271	m.raw = x
2272	return x
2273}
2274
2275func (m *certificateStatusMsg) unmarshal(data []byte) bool {
2276	m.raw = data
2277	reader := byteReader(data[4:])
2278	if !reader.readU8(&m.statusType) ||
2279		m.statusType != statusTypeOCSP ||
2280		!reader.readU24LengthPrefixedBytes(&m.response) ||
2281		len(reader) != 0 {
2282		return false
2283	}
2284	return true
2285}
2286
2287type serverHelloDoneMsg struct{}
2288
2289func (m *serverHelloDoneMsg) marshal() []byte {
2290	x := make([]byte, 4)
2291	x[0] = typeServerHelloDone
2292	return x
2293}
2294
2295func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
2296	return len(data) == 4
2297}
2298
2299type clientKeyExchangeMsg struct {
2300	raw        []byte
2301	ciphertext []byte
2302}
2303
2304func (m *clientKeyExchangeMsg) marshal() []byte {
2305	if m.raw != nil {
2306		return m.raw
2307	}
2308	msg := newByteBuilder()
2309	msg.addU8(typeClientKeyExchange)
2310	msg.addU24LengthPrefixed().addBytes(m.ciphertext)
2311	m.raw = msg.finish()
2312	return m.raw
2313}
2314
2315func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
2316	m.raw = data
2317	if len(data) < 4 {
2318		return false
2319	}
2320	l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
2321	if l != len(data)-4 {
2322		return false
2323	}
2324	m.ciphertext = data[4:]
2325	return true
2326}
2327
2328type finishedMsg struct {
2329	raw        []byte
2330	verifyData []byte
2331}
2332
2333func (m *finishedMsg) marshal() []byte {
2334	if m.raw != nil {
2335		return m.raw
2336	}
2337
2338	msg := newByteBuilder()
2339	msg.addU8(typeFinished)
2340	msg.addU24LengthPrefixed().addBytes(m.verifyData)
2341	m.raw = msg.finish()
2342	return m.raw
2343}
2344
2345func (m *finishedMsg) unmarshal(data []byte) bool {
2346	m.raw = data
2347	if len(data) < 4 {
2348		return false
2349	}
2350	m.verifyData = data[4:]
2351	return true
2352}
2353
2354type nextProtoMsg struct {
2355	raw   []byte
2356	proto string
2357}
2358
2359func (m *nextProtoMsg) marshal() []byte {
2360	if m.raw != nil {
2361		return m.raw
2362	}
2363
2364	padding := 32 - (len(m.proto)+2)%32
2365
2366	msg := newByteBuilder()
2367	msg.addU8(typeNextProtocol)
2368	body := msg.addU24LengthPrefixed()
2369	body.addU8LengthPrefixed().addBytes([]byte(m.proto))
2370	body.addU8LengthPrefixed().addBytes(make([]byte, padding))
2371	m.raw = msg.finish()
2372	return m.raw
2373}
2374
2375func (m *nextProtoMsg) unmarshal(data []byte) bool {
2376	m.raw = data
2377	reader := byteReader(data[4:])
2378	var proto, padding []byte
2379	if !reader.readU8LengthPrefixedBytes(&proto) ||
2380		!reader.readU8LengthPrefixedBytes(&padding) ||
2381		len(reader) != 0 {
2382		return false
2383	}
2384	m.proto = string(proto)
2385
2386	// Padding is not meant to be checked normally, but as this is a testing
2387	// implementation, we check the padding is as expected.
2388	if len(padding) != 32-(len(m.proto)+2)%32 {
2389		return false
2390	}
2391	for _, v := range padding {
2392		if v != 0 {
2393			return false
2394		}
2395	}
2396
2397	return true
2398}
2399
2400type certificateRequestMsg struct {
2401	raw  []byte
2402	vers uint16
2403	// hasSignatureAlgorithm indicates whether this message includes a list
2404	// of signature and hash functions. This change was introduced with TLS
2405	// 1.2.
2406	hasSignatureAlgorithm bool
2407	// hasRequestContext indicates whether this message includes a context
2408	// field instead of certificateTypes. This change was introduced with
2409	// TLS 1.3.
2410	hasRequestContext bool
2411
2412	certificateTypes        []byte
2413	requestContext          []byte
2414	signatureAlgorithms     []signatureAlgorithm
2415	signatureAlgorithmsCert []signatureAlgorithm
2416	certificateAuthorities  [][]byte
2417	hasCAExtension          bool
2418	customExtension         uint16
2419}
2420
2421func (m *certificateRequestMsg) marshal() []byte {
2422	if m.raw != nil {
2423		return m.raw
2424	}
2425
2426	// See http://tools.ietf.org/html/rfc4346#section-7.4.4
2427	builder := newByteBuilder()
2428	builder.addU8(typeCertificateRequest)
2429	body := builder.addU24LengthPrefixed()
2430
2431	if m.hasRequestContext {
2432		requestContext := body.addU8LengthPrefixed()
2433		requestContext.addBytes(m.requestContext)
2434		extensions := newByteBuilder()
2435		extensions = body.addU16LengthPrefixed()
2436		if m.hasSignatureAlgorithm {
2437			extensions.addU16(extensionSignatureAlgorithms)
2438			signatureAlgorithms := extensions.addU16LengthPrefixed().addU16LengthPrefixed()
2439			for _, sigAlg := range m.signatureAlgorithms {
2440				signatureAlgorithms.addU16(uint16(sigAlg))
2441			}
2442		}
2443		if len(m.signatureAlgorithmsCert) > 0 {
2444			extensions.addU16(extensionSignatureAlgorithmsCert)
2445			signatureAlgorithmsCert := extensions.addU16LengthPrefixed().addU16LengthPrefixed()
2446			for _, sigAlg := range m.signatureAlgorithmsCert {
2447				signatureAlgorithmsCert.addU16(uint16(sigAlg))
2448			}
2449		}
2450		if len(m.certificateAuthorities) > 0 {
2451			extensions.addU16(extensionCertificateAuthorities)
2452			certificateAuthorities := extensions.addU16LengthPrefixed().addU16LengthPrefixed()
2453			for _, ca := range m.certificateAuthorities {
2454				caEntry := certificateAuthorities.addU16LengthPrefixed()
2455				caEntry.addBytes(ca)
2456			}
2457		}
2458
2459		if m.customExtension > 0 {
2460			extensions.addU16(m.customExtension)
2461			extensions.addU16LengthPrefixed()
2462		}
2463	} else {
2464		certificateTypes := body.addU8LengthPrefixed()
2465		certificateTypes.addBytes(m.certificateTypes)
2466
2467		if m.hasSignatureAlgorithm {
2468			signatureAlgorithms := body.addU16LengthPrefixed()
2469			for _, sigAlg := range m.signatureAlgorithms {
2470				signatureAlgorithms.addU16(uint16(sigAlg))
2471			}
2472		}
2473
2474		certificateAuthorities := body.addU16LengthPrefixed()
2475		for _, ca := range m.certificateAuthorities {
2476			caEntry := certificateAuthorities.addU16LengthPrefixed()
2477			caEntry.addBytes(ca)
2478		}
2479	}
2480
2481	m.raw = builder.finish()
2482	return m.raw
2483}
2484
2485func parseCAs(reader *byteReader, out *[][]byte) bool {
2486	var cas byteReader
2487	if !reader.readU16LengthPrefixed(&cas) {
2488		return false
2489	}
2490	for len(cas) > 0 {
2491		var ca []byte
2492		if !cas.readU16LengthPrefixedBytes(&ca) {
2493			return false
2494		}
2495		*out = append(*out, ca)
2496	}
2497	return true
2498}
2499
2500func (m *certificateRequestMsg) unmarshal(data []byte) bool {
2501	m.raw = data
2502	reader := byteReader(data[4:])
2503
2504	if m.hasRequestContext {
2505		var extensions byteReader
2506		if !reader.readU8LengthPrefixedBytes(&m.requestContext) ||
2507			!reader.readU16LengthPrefixed(&extensions) ||
2508			len(reader) != 0 ||
2509			!checkDuplicateExtensions(extensions) {
2510			return false
2511		}
2512		for len(extensions) > 0 {
2513			var extension uint16
2514			var body byteReader
2515			if !extensions.readU16(&extension) ||
2516				!extensions.readU16LengthPrefixed(&body) {
2517				return false
2518			}
2519			switch extension {
2520			case extensionSignatureAlgorithms:
2521				if !parseSignatureAlgorithms(&body, &m.signatureAlgorithms, false) || len(body) != 0 {
2522					return false
2523				}
2524			case extensionSignatureAlgorithmsCert:
2525				if !parseSignatureAlgorithms(&body, &m.signatureAlgorithmsCert, false) || len(body) != 0 {
2526					return false
2527				}
2528			case extensionCertificateAuthorities:
2529				if !parseCAs(&body, &m.certificateAuthorities) || len(body) != 0 {
2530					return false
2531				}
2532				m.hasCAExtension = true
2533			}
2534		}
2535	} else {
2536		if !reader.readU8LengthPrefixedBytes(&m.certificateTypes) {
2537			return false
2538		}
2539		// In TLS 1.2, the supported_signature_algorithms field in
2540		// CertificateRequest may be empty.
2541		if m.hasSignatureAlgorithm && !parseSignatureAlgorithms(&reader, &m.signatureAlgorithms, true) {
2542			return false
2543		}
2544		if !parseCAs(&reader, &m.certificateAuthorities) ||
2545			len(reader) != 0 {
2546			return false
2547		}
2548	}
2549
2550	return true
2551}
2552
2553type certificateVerifyMsg struct {
2554	raw                   []byte
2555	hasSignatureAlgorithm bool
2556	signatureAlgorithm    signatureAlgorithm
2557	signature             []byte
2558}
2559
2560func (m *certificateVerifyMsg) marshal() (x []byte) {
2561	if m.raw != nil {
2562		return m.raw
2563	}
2564
2565	// See http://tools.ietf.org/html/rfc4346#section-7.4.8
2566	siglength := len(m.signature)
2567	length := 2 + siglength
2568	if m.hasSignatureAlgorithm {
2569		length += 2
2570	}
2571	x = make([]byte, 4+length)
2572	x[0] = typeCertificateVerify
2573	x[1] = uint8(length >> 16)
2574	x[2] = uint8(length >> 8)
2575	x[3] = uint8(length)
2576	y := x[4:]
2577	if m.hasSignatureAlgorithm {
2578		y[0] = byte(m.signatureAlgorithm >> 8)
2579		y[1] = byte(m.signatureAlgorithm)
2580		y = y[2:]
2581	}
2582	y[0] = uint8(siglength >> 8)
2583	y[1] = uint8(siglength)
2584	copy(y[2:], m.signature)
2585
2586	m.raw = x
2587
2588	return
2589}
2590
2591func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
2592	m.raw = data
2593
2594	if len(data) < 6 {
2595		return false
2596	}
2597
2598	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
2599	if uint32(len(data))-4 != length {
2600		return false
2601	}
2602
2603	data = data[4:]
2604	if m.hasSignatureAlgorithm {
2605		m.signatureAlgorithm = signatureAlgorithm(data[0])<<8 | signatureAlgorithm(data[1])
2606		data = data[2:]
2607	}
2608
2609	if len(data) < 2 {
2610		return false
2611	}
2612	siglength := int(data[0])<<8 + int(data[1])
2613	data = data[2:]
2614	if len(data) != siglength {
2615		return false
2616	}
2617
2618	m.signature = data
2619
2620	return true
2621}
2622
2623type newSessionTicketMsg struct {
2624	raw                         []byte
2625	vers                        uint16
2626	isDTLS                      bool
2627	ticketLifetime              uint32
2628	ticketAgeAdd                uint32
2629	ticketNonce                 []byte
2630	ticket                      []byte
2631	maxEarlyDataSize            uint32
2632	customExtension             string
2633	duplicateEarlyDataExtension bool
2634	hasGREASEExtension          bool
2635}
2636
2637func (m *newSessionTicketMsg) marshal() []byte {
2638	if m.raw != nil {
2639		return m.raw
2640	}
2641
2642	version, ok := wireToVersion(m.vers, m.isDTLS)
2643	if !ok {
2644		panic("unknown version")
2645	}
2646
2647	// See http://tools.ietf.org/html/rfc5077#section-3.3
2648	ticketMsg := newByteBuilder()
2649	ticketMsg.addU8(typeNewSessionTicket)
2650	body := ticketMsg.addU24LengthPrefixed()
2651	body.addU32(m.ticketLifetime)
2652	if version >= VersionTLS13 {
2653		body.addU32(m.ticketAgeAdd)
2654		body.addU8LengthPrefixed().addBytes(m.ticketNonce)
2655	}
2656
2657	ticket := body.addU16LengthPrefixed()
2658	ticket.addBytes(m.ticket)
2659
2660	if version >= VersionTLS13 {
2661		extensions := body.addU16LengthPrefixed()
2662		if m.maxEarlyDataSize > 0 {
2663			extensions.addU16(extensionEarlyData)
2664			extensions.addU16LengthPrefixed().addU32(m.maxEarlyDataSize)
2665			if m.duplicateEarlyDataExtension {
2666				extensions.addU16(extensionEarlyData)
2667				extensions.addU16LengthPrefixed().addU32(m.maxEarlyDataSize)
2668			}
2669		}
2670		if len(m.customExtension) > 0 {
2671			extensions.addU16(extensionCustom)
2672			extensions.addU16LengthPrefixed().addBytes([]byte(m.customExtension))
2673		}
2674	}
2675
2676	m.raw = ticketMsg.finish()
2677	return m.raw
2678}
2679
2680func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
2681	m.raw = data
2682
2683	version, ok := wireToVersion(m.vers, m.isDTLS)
2684	if !ok {
2685		panic("unknown version")
2686	}
2687
2688	if len(data) < 8 {
2689		return false
2690	}
2691	m.ticketLifetime = uint32(data[4])<<24 | uint32(data[5])<<16 | uint32(data[6])<<8 | uint32(data[7])
2692	data = data[8:]
2693
2694	if version >= VersionTLS13 {
2695		if len(data) < 4 {
2696			return false
2697		}
2698		m.ticketAgeAdd = uint32(data[0])<<24 | uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
2699		data = data[4:]
2700		nonceLen := int(data[0])
2701		data = data[1:]
2702		if len(data) < nonceLen {
2703			return false
2704		}
2705		m.ticketNonce = data[:nonceLen]
2706		data = data[nonceLen:]
2707	}
2708
2709	if len(data) < 2 {
2710		return false
2711	}
2712	ticketLen := int(data[0])<<8 + int(data[1])
2713	data = data[2:]
2714	if len(data) < ticketLen {
2715		return false
2716	}
2717
2718	if version >= VersionTLS13 && ticketLen == 0 {
2719		return false
2720	}
2721
2722	m.ticket = data[:ticketLen]
2723	data = data[ticketLen:]
2724
2725	if version >= VersionTLS13 {
2726		if len(data) < 2 {
2727			return false
2728		}
2729
2730		extensionsLength := int(data[0])<<8 | int(data[1])
2731		data = data[2:]
2732		if extensionsLength != len(data) {
2733			return false
2734		}
2735
2736		for len(data) != 0 {
2737			if len(data) < 4 {
2738				return false
2739			}
2740			extension := uint16(data[0])<<8 | uint16(data[1])
2741			length := int(data[2])<<8 | int(data[3])
2742			data = data[4:]
2743			if len(data) < length {
2744				return false
2745			}
2746
2747			switch extension {
2748			case extensionEarlyData:
2749				if length != 4 {
2750					return false
2751				}
2752				m.maxEarlyDataSize = uint32(data[0])<<24 | uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
2753			default:
2754				if isGREASEValue(extension) {
2755					m.hasGREASEExtension = true
2756				}
2757			}
2758
2759			data = data[length:]
2760		}
2761	}
2762
2763	if len(data) > 0 {
2764		return false
2765	}
2766
2767	return true
2768}
2769
2770type helloVerifyRequestMsg struct {
2771	raw    []byte
2772	vers   uint16
2773	cookie []byte
2774}
2775
2776func (m *helloVerifyRequestMsg) marshal() []byte {
2777	if m.raw != nil {
2778		return m.raw
2779	}
2780
2781	length := 2 + 1 + len(m.cookie)
2782
2783	x := make([]byte, 4+length)
2784	x[0] = typeHelloVerifyRequest
2785	x[1] = uint8(length >> 16)
2786	x[2] = uint8(length >> 8)
2787	x[3] = uint8(length)
2788	vers := m.vers
2789	x[4] = uint8(vers >> 8)
2790	x[5] = uint8(vers)
2791	x[6] = uint8(len(m.cookie))
2792	copy(x[7:7+len(m.cookie)], m.cookie)
2793
2794	return x
2795}
2796
2797func (m *helloVerifyRequestMsg) unmarshal(data []byte) bool {
2798	if len(data) < 4+2+1 {
2799		return false
2800	}
2801	m.raw = data
2802	m.vers = uint16(data[4])<<8 | uint16(data[5])
2803	cookieLen := int(data[6])
2804	if cookieLen > 32 || len(data) != 7+cookieLen {
2805		return false
2806	}
2807	m.cookie = data[7 : 7+cookieLen]
2808
2809	return true
2810}
2811
2812type channelIDMsg struct {
2813	raw       []byte
2814	channelID []byte
2815}
2816
2817func (m *channelIDMsg) marshal() []byte {
2818	if m.raw != nil {
2819		return m.raw
2820	}
2821
2822	length := 2 + 2 + len(m.channelID)
2823
2824	x := make([]byte, 4+length)
2825	x[0] = typeChannelID
2826	x[1] = uint8(length >> 16)
2827	x[2] = uint8(length >> 8)
2828	x[3] = uint8(length)
2829	x[4] = uint8(extensionChannelID >> 8)
2830	x[5] = uint8(extensionChannelID & 0xff)
2831	x[6] = uint8(len(m.channelID) >> 8)
2832	x[7] = uint8(len(m.channelID) & 0xff)
2833	copy(x[8:], m.channelID)
2834
2835	return x
2836}
2837
2838func (m *channelIDMsg) unmarshal(data []byte) bool {
2839	if len(data) != 4+2+2+128 {
2840		return false
2841	}
2842	m.raw = data
2843	if (uint16(data[4])<<8)|uint16(data[5]) != extensionChannelID {
2844		return false
2845	}
2846	if int(data[6])<<8|int(data[7]) != 128 {
2847		return false
2848	}
2849	m.channelID = data[4+2+2:]
2850
2851	return true
2852}
2853
2854type helloRequestMsg struct {
2855}
2856
2857func (*helloRequestMsg) marshal() []byte {
2858	return []byte{typeHelloRequest, 0, 0, 0}
2859}
2860
2861func (*helloRequestMsg) unmarshal(data []byte) bool {
2862	return len(data) == 4
2863}
2864
2865type keyUpdateMsg struct {
2866	raw              []byte
2867	keyUpdateRequest byte
2868}
2869
2870func (m *keyUpdateMsg) marshal() []byte {
2871	if m.raw != nil {
2872		return m.raw
2873	}
2874
2875	return []byte{typeKeyUpdate, 0, 0, 1, m.keyUpdateRequest}
2876}
2877
2878func (m *keyUpdateMsg) unmarshal(data []byte) bool {
2879	m.raw = data
2880
2881	if len(data) != 5 {
2882		return false
2883	}
2884
2885	length := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
2886	if len(data)-4 != length {
2887		return false
2888	}
2889
2890	m.keyUpdateRequest = data[4]
2891	return m.keyUpdateRequest == keyUpdateNotRequested || m.keyUpdateRequest == keyUpdateRequested
2892}
2893
2894type endOfEarlyDataMsg struct {
2895	nonEmpty bool
2896}
2897
2898func (m *endOfEarlyDataMsg) marshal() []byte {
2899	if m.nonEmpty {
2900		return []byte{typeEndOfEarlyData, 0, 0, 1, 42}
2901	}
2902	return []byte{typeEndOfEarlyData, 0, 0, 0}
2903}
2904
2905func (*endOfEarlyDataMsg) unmarshal(data []byte) bool {
2906	return len(data) == 4
2907}
2908