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