Source file src/pkg/crypto/tls/handshake_messages.go
1
2
3
4
5 package tls
6
7 import (
8 "fmt"
9 "golang.org/x/crypto/cryptobyte"
10 "strings"
11 )
12
13
14
15 type marshalingFunction func(b *cryptobyte.Builder) error
16
17 func (f marshalingFunction) Marshal(b *cryptobyte.Builder) error {
18 return f(b)
19 }
20
21
22
23 func addBytesWithLength(b *cryptobyte.Builder, v []byte, n int) {
24 b.AddValue(marshalingFunction(func(b *cryptobyte.Builder) error {
25 if len(v) != n {
26 return fmt.Errorf("invalid value length: expected %d, got %d", n, len(v))
27 }
28 b.AddBytes(v)
29 return nil
30 }))
31 }
32
33
34 func addUint64(b *cryptobyte.Builder, v uint64) {
35 b.AddUint32(uint32(v >> 32))
36 b.AddUint32(uint32(v))
37 }
38
39
40
41 func readUint64(s *cryptobyte.String, out *uint64) bool {
42 var hi, lo uint32
43 if !s.ReadUint32(&hi) || !s.ReadUint32(&lo) {
44 return false
45 }
46 *out = uint64(hi)<<32 | uint64(lo)
47 return true
48 }
49
50
51
52 func readUint8LengthPrefixed(s *cryptobyte.String, out *[]byte) bool {
53 return s.ReadUint8LengthPrefixed((*cryptobyte.String)(out))
54 }
55
56
57
58 func readUint16LengthPrefixed(s *cryptobyte.String, out *[]byte) bool {
59 return s.ReadUint16LengthPrefixed((*cryptobyte.String)(out))
60 }
61
62
63
64 func readUint24LengthPrefixed(s *cryptobyte.String, out *[]byte) bool {
65 return s.ReadUint24LengthPrefixed((*cryptobyte.String)(out))
66 }
67
68 type clientHelloMsg struct {
69 raw []byte
70 vers uint16
71 random []byte
72 sessionId []byte
73 cipherSuites []uint16
74 compressionMethods []uint8
75 nextProtoNeg bool
76 serverName string
77 ocspStapling bool
78 supportedCurves []CurveID
79 supportedPoints []uint8
80 ticketSupported bool
81 sessionTicket []uint8
82 supportedSignatureAlgorithms []SignatureScheme
83 supportedSignatureAlgorithmsCert []SignatureScheme
84 secureRenegotiationSupported bool
85 secureRenegotiation []byte
86 alpnProtocols []string
87 scts bool
88 supportedVersions []uint16
89 cookie []byte
90 keyShares []keyShare
91 earlyData bool
92 pskModes []uint8
93 pskIdentities []pskIdentity
94 pskBinders [][]byte
95 }
96
97 func (m *clientHelloMsg) marshal() []byte {
98 if m.raw != nil {
99 return m.raw
100 }
101
102 var b cryptobyte.Builder
103 b.AddUint8(typeClientHello)
104 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
105 b.AddUint16(m.vers)
106 addBytesWithLength(b, m.random, 32)
107 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
108 b.AddBytes(m.sessionId)
109 })
110 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
111 for _, suite := range m.cipherSuites {
112 b.AddUint16(suite)
113 }
114 })
115 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
116 b.AddBytes(m.compressionMethods)
117 })
118
119
120 var extensionsPresent bool
121 bWithoutExtensions := *b
122
123 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
124 if m.nextProtoNeg {
125
126 b.AddUint16(extensionNextProtoNeg)
127 b.AddUint16(0)
128 }
129 if len(m.serverName) > 0 {
130
131 b.AddUint16(extensionServerName)
132 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
133 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
134 b.AddUint8(0)
135 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
136 b.AddBytes([]byte(m.serverName))
137 })
138 })
139 })
140 }
141 if m.ocspStapling {
142
143 b.AddUint16(extensionStatusRequest)
144 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
145 b.AddUint8(1)
146 b.AddUint16(0)
147 b.AddUint16(0)
148 })
149 }
150 if len(m.supportedCurves) > 0 {
151
152 b.AddUint16(extensionSupportedCurves)
153 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
154 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
155 for _, curve := range m.supportedCurves {
156 b.AddUint16(uint16(curve))
157 }
158 })
159 })
160 }
161 if len(m.supportedPoints) > 0 {
162
163 b.AddUint16(extensionSupportedPoints)
164 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
165 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
166 b.AddBytes(m.supportedPoints)
167 })
168 })
169 }
170 if m.ticketSupported {
171
172 b.AddUint16(extensionSessionTicket)
173 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
174 b.AddBytes(m.sessionTicket)
175 })
176 }
177 if len(m.supportedSignatureAlgorithms) > 0 {
178
179 b.AddUint16(extensionSignatureAlgorithms)
180 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
181 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
182 for _, sigAlgo := range m.supportedSignatureAlgorithms {
183 b.AddUint16(uint16(sigAlgo))
184 }
185 })
186 })
187 }
188 if len(m.supportedSignatureAlgorithmsCert) > 0 {
189
190 b.AddUint16(extensionSignatureAlgorithmsCert)
191 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
192 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
193 for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
194 b.AddUint16(uint16(sigAlgo))
195 }
196 })
197 })
198 }
199 if m.secureRenegotiationSupported {
200
201 b.AddUint16(extensionRenegotiationInfo)
202 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
203 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
204 b.AddBytes(m.secureRenegotiation)
205 })
206 })
207 }
208 if len(m.alpnProtocols) > 0 {
209
210 b.AddUint16(extensionALPN)
211 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
212 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
213 for _, proto := range m.alpnProtocols {
214 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
215 b.AddBytes([]byte(proto))
216 })
217 }
218 })
219 })
220 }
221 if m.scts {
222
223 b.AddUint16(extensionSCT)
224 b.AddUint16(0)
225 }
226 if len(m.supportedVersions) > 0 {
227
228 b.AddUint16(extensionSupportedVersions)
229 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
230 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
231 for _, vers := range m.supportedVersions {
232 b.AddUint16(vers)
233 }
234 })
235 })
236 }
237 if len(m.cookie) > 0 {
238
239 b.AddUint16(extensionCookie)
240 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
241 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
242 b.AddBytes(m.cookie)
243 })
244 })
245 }
246 if len(m.keyShares) > 0 {
247
248 b.AddUint16(extensionKeyShare)
249 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
250 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
251 for _, ks := range m.keyShares {
252 b.AddUint16(uint16(ks.group))
253 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
254 b.AddBytes(ks.data)
255 })
256 }
257 })
258 })
259 }
260 if m.earlyData {
261
262 b.AddUint16(extensionEarlyData)
263 b.AddUint16(0)
264 }
265 if len(m.pskModes) > 0 {
266
267 b.AddUint16(extensionPSKModes)
268 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
269 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
270 b.AddBytes(m.pskModes)
271 })
272 })
273 }
274 if len(m.pskIdentities) > 0 {
275
276 b.AddUint16(extensionPreSharedKey)
277 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
278 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
279 for _, psk := range m.pskIdentities {
280 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
281 b.AddBytes(psk.label)
282 })
283 b.AddUint32(psk.obfuscatedTicketAge)
284 }
285 })
286 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
287 for _, binder := range m.pskBinders {
288 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
289 b.AddBytes(binder)
290 })
291 }
292 })
293 })
294 }
295
296 extensionsPresent = len(b.BytesOrPanic()) > 2
297 })
298
299 if !extensionsPresent {
300 *b = bWithoutExtensions
301 }
302 })
303
304 m.raw = b.BytesOrPanic()
305 return m.raw
306 }
307
308
309
310
311 func (m *clientHelloMsg) marshalWithoutBinders() []byte {
312 bindersLen := 2
313 for _, binder := range m.pskBinders {
314 bindersLen += 1
315 bindersLen += len(binder)
316 }
317
318 fullMessage := m.marshal()
319 return fullMessage[:len(fullMessage)-bindersLen]
320 }
321
322
323
324
325 func (m *clientHelloMsg) updateBinders(pskBinders [][]byte) {
326 if len(pskBinders) != len(m.pskBinders) {
327 panic("tls: internal error: pskBinders length mismatch")
328 }
329 for i := range m.pskBinders {
330 if len(pskBinders[i]) != len(m.pskBinders[i]) {
331 panic("tls: internal error: pskBinders length mismatch")
332 }
333 }
334 m.pskBinders = pskBinders
335 if m.raw != nil {
336 lenWithoutBinders := len(m.marshalWithoutBinders())
337
338 b := cryptobyte.NewBuilder(m.raw[:lenWithoutBinders])
339 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
340 for _, binder := range m.pskBinders {
341 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
342 b.AddBytes(binder)
343 })
344 }
345 })
346 if len(b.BytesOrPanic()) != len(m.raw) {
347 panic("tls: internal error: failed to update binders")
348 }
349 }
350 }
351
352 func (m *clientHelloMsg) unmarshal(data []byte) bool {
353 *m = clientHelloMsg{raw: data}
354 s := cryptobyte.String(data)
355
356 if !s.Skip(4) ||
357 !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) ||
358 !readUint8LengthPrefixed(&s, &m.sessionId) {
359 return false
360 }
361
362 var cipherSuites cryptobyte.String
363 if !s.ReadUint16LengthPrefixed(&cipherSuites) {
364 return false
365 }
366 m.cipherSuites = []uint16{}
367 m.secureRenegotiationSupported = false
368 for !cipherSuites.Empty() {
369 var suite uint16
370 if !cipherSuites.ReadUint16(&suite) {
371 return false
372 }
373 if suite == scsvRenegotiation {
374 m.secureRenegotiationSupported = true
375 }
376 m.cipherSuites = append(m.cipherSuites, suite)
377 }
378
379 if !readUint8LengthPrefixed(&s, &m.compressionMethods) {
380 return false
381 }
382
383 if s.Empty() {
384
385 return true
386 }
387
388 var extensions cryptobyte.String
389 if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
390 return false
391 }
392
393 for !extensions.Empty() {
394 var extension uint16
395 var extData cryptobyte.String
396 if !extensions.ReadUint16(&extension) ||
397 !extensions.ReadUint16LengthPrefixed(&extData) {
398 return false
399 }
400
401 switch extension {
402 case extensionServerName:
403
404 var nameList cryptobyte.String
405 if !extData.ReadUint16LengthPrefixed(&nameList) || nameList.Empty() {
406 return false
407 }
408 for !nameList.Empty() {
409 var nameType uint8
410 var serverName cryptobyte.String
411 if !nameList.ReadUint8(&nameType) ||
412 !nameList.ReadUint16LengthPrefixed(&serverName) ||
413 serverName.Empty() {
414 return false
415 }
416 if nameType != 0 {
417 continue
418 }
419 if len(m.serverName) != 0 {
420
421 return false
422 }
423 m.serverName = string(serverName)
424
425 if strings.HasSuffix(m.serverName, ".") {
426 return false
427 }
428 }
429 case extensionNextProtoNeg:
430
431 m.nextProtoNeg = true
432 case extensionStatusRequest:
433
434 var statusType uint8
435 var ignored cryptobyte.String
436 if !extData.ReadUint8(&statusType) ||
437 !extData.ReadUint16LengthPrefixed(&ignored) ||
438 !extData.ReadUint16LengthPrefixed(&ignored) {
439 return false
440 }
441 m.ocspStapling = statusType == statusTypeOCSP
442 case extensionSupportedCurves:
443
444 var curves cryptobyte.String
445 if !extData.ReadUint16LengthPrefixed(&curves) || curves.Empty() {
446 return false
447 }
448 for !curves.Empty() {
449 var curve uint16
450 if !curves.ReadUint16(&curve) {
451 return false
452 }
453 m.supportedCurves = append(m.supportedCurves, CurveID(curve))
454 }
455 case extensionSupportedPoints:
456
457 if !readUint8LengthPrefixed(&extData, &m.supportedPoints) ||
458 len(m.supportedPoints) == 0 {
459 return false
460 }
461 case extensionSessionTicket:
462
463 m.ticketSupported = true
464 extData.ReadBytes(&m.sessionTicket, len(extData))
465 case extensionSignatureAlgorithms:
466
467 var sigAndAlgs cryptobyte.String
468 if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
469 return false
470 }
471 for !sigAndAlgs.Empty() {
472 var sigAndAlg uint16
473 if !sigAndAlgs.ReadUint16(&sigAndAlg) {
474 return false
475 }
476 m.supportedSignatureAlgorithms = append(
477 m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg))
478 }
479 case extensionSignatureAlgorithmsCert:
480
481 var sigAndAlgs cryptobyte.String
482 if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
483 return false
484 }
485 for !sigAndAlgs.Empty() {
486 var sigAndAlg uint16
487 if !sigAndAlgs.ReadUint16(&sigAndAlg) {
488 return false
489 }
490 m.supportedSignatureAlgorithmsCert = append(
491 m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg))
492 }
493 case extensionRenegotiationInfo:
494
495 if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) {
496 return false
497 }
498 m.secureRenegotiationSupported = true
499 case extensionALPN:
500
501 var protoList cryptobyte.String
502 if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
503 return false
504 }
505 for !protoList.Empty() {
506 var proto cryptobyte.String
507 if !protoList.ReadUint8LengthPrefixed(&proto) || proto.Empty() {
508 return false
509 }
510 m.alpnProtocols = append(m.alpnProtocols, string(proto))
511 }
512 case extensionSCT:
513
514 m.scts = true
515 case extensionSupportedVersions:
516
517 var versList cryptobyte.String
518 if !extData.ReadUint8LengthPrefixed(&versList) || versList.Empty() {
519 return false
520 }
521 for !versList.Empty() {
522 var vers uint16
523 if !versList.ReadUint16(&vers) {
524 return false
525 }
526 m.supportedVersions = append(m.supportedVersions, vers)
527 }
528 case extensionCookie:
529
530 if !readUint16LengthPrefixed(&extData, &m.cookie) ||
531 len(m.cookie) == 0 {
532 return false
533 }
534 case extensionKeyShare:
535
536 var clientShares cryptobyte.String
537 if !extData.ReadUint16LengthPrefixed(&clientShares) {
538 return false
539 }
540 for !clientShares.Empty() {
541 var ks keyShare
542 if !clientShares.ReadUint16((*uint16)(&ks.group)) ||
543 !readUint16LengthPrefixed(&clientShares, &ks.data) ||
544 len(ks.data) == 0 {
545 return false
546 }
547 m.keyShares = append(m.keyShares, ks)
548 }
549 case extensionEarlyData:
550
551 m.earlyData = true
552 case extensionPSKModes:
553
554 if !readUint8LengthPrefixed(&extData, &m.pskModes) {
555 return false
556 }
557 case extensionPreSharedKey:
558
559 if !extensions.Empty() {
560 return false
561 }
562 var identities cryptobyte.String
563 if !extData.ReadUint16LengthPrefixed(&identities) || identities.Empty() {
564 return false
565 }
566 for !identities.Empty() {
567 var psk pskIdentity
568 if !readUint16LengthPrefixed(&identities, &psk.label) ||
569 !identities.ReadUint32(&psk.obfuscatedTicketAge) ||
570 len(psk.label) == 0 {
571 return false
572 }
573 m.pskIdentities = append(m.pskIdentities, psk)
574 }
575 var binders cryptobyte.String
576 if !extData.ReadUint16LengthPrefixed(&binders) || binders.Empty() {
577 return false
578 }
579 for !binders.Empty() {
580 var binder []byte
581 if !readUint8LengthPrefixed(&binders, &binder) ||
582 len(binder) == 0 {
583 return false
584 }
585 m.pskBinders = append(m.pskBinders, binder)
586 }
587 default:
588
589 continue
590 }
591
592 if !extData.Empty() {
593 return false
594 }
595 }
596
597 return true
598 }
599
600 type serverHelloMsg struct {
601 raw []byte
602 vers uint16
603 random []byte
604 sessionId []byte
605 cipherSuite uint16
606 compressionMethod uint8
607 nextProtoNeg bool
608 nextProtos []string
609 ocspStapling bool
610 ticketSupported bool
611 secureRenegotiationSupported bool
612 secureRenegotiation []byte
613 alpnProtocol string
614 scts [][]byte
615 supportedVersion uint16
616 serverShare keyShare
617 selectedIdentityPresent bool
618 selectedIdentity uint16
619
620
621 cookie []byte
622 selectedGroup CurveID
623 }
624
625 func (m *serverHelloMsg) marshal() []byte {
626 if m.raw != nil {
627 return m.raw
628 }
629
630 var b cryptobyte.Builder
631 b.AddUint8(typeServerHello)
632 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
633 b.AddUint16(m.vers)
634 addBytesWithLength(b, m.random, 32)
635 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
636 b.AddBytes(m.sessionId)
637 })
638 b.AddUint16(m.cipherSuite)
639 b.AddUint8(m.compressionMethod)
640
641
642 var extensionsPresent bool
643 bWithoutExtensions := *b
644
645 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
646 if m.nextProtoNeg {
647 b.AddUint16(extensionNextProtoNeg)
648 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
649 for _, proto := range m.nextProtos {
650 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
651 b.AddBytes([]byte(proto))
652 })
653 }
654 })
655 }
656 if m.ocspStapling {
657 b.AddUint16(extensionStatusRequest)
658 b.AddUint16(0)
659 }
660 if m.ticketSupported {
661 b.AddUint16(extensionSessionTicket)
662 b.AddUint16(0)
663 }
664 if m.secureRenegotiationSupported {
665 b.AddUint16(extensionRenegotiationInfo)
666 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
667 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
668 b.AddBytes(m.secureRenegotiation)
669 })
670 })
671 }
672 if len(m.alpnProtocol) > 0 {
673 b.AddUint16(extensionALPN)
674 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
675 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
676 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
677 b.AddBytes([]byte(m.alpnProtocol))
678 })
679 })
680 })
681 }
682 if len(m.scts) > 0 {
683 b.AddUint16(extensionSCT)
684 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
685 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
686 for _, sct := range m.scts {
687 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
688 b.AddBytes(sct)
689 })
690 }
691 })
692 })
693 }
694 if m.supportedVersion != 0 {
695 b.AddUint16(extensionSupportedVersions)
696 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
697 b.AddUint16(m.supportedVersion)
698 })
699 }
700 if m.serverShare.group != 0 {
701 b.AddUint16(extensionKeyShare)
702 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
703 b.AddUint16(uint16(m.serverShare.group))
704 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
705 b.AddBytes(m.serverShare.data)
706 })
707 })
708 }
709 if m.selectedIdentityPresent {
710 b.AddUint16(extensionPreSharedKey)
711 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
712 b.AddUint16(m.selectedIdentity)
713 })
714 }
715
716 if len(m.cookie) > 0 {
717 b.AddUint16(extensionCookie)
718 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
719 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
720 b.AddBytes(m.cookie)
721 })
722 })
723 }
724 if m.selectedGroup != 0 {
725 b.AddUint16(extensionKeyShare)
726 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
727 b.AddUint16(uint16(m.selectedGroup))
728 })
729 }
730
731 extensionsPresent = len(b.BytesOrPanic()) > 2
732 })
733
734 if !extensionsPresent {
735 *b = bWithoutExtensions
736 }
737 })
738
739 m.raw = b.BytesOrPanic()
740 return m.raw
741 }
742
743 func (m *serverHelloMsg) unmarshal(data []byte) bool {
744 *m = serverHelloMsg{raw: data}
745 s := cryptobyte.String(data)
746
747 if !s.Skip(4) ||
748 !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) ||
749 !readUint8LengthPrefixed(&s, &m.sessionId) ||
750 !s.ReadUint16(&m.cipherSuite) ||
751 !s.ReadUint8(&m.compressionMethod) {
752 return false
753 }
754
755 if s.Empty() {
756
757 return true
758 }
759
760 var extensions cryptobyte.String
761 if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
762 return false
763 }
764
765 for !extensions.Empty() {
766 var extension uint16
767 var extData cryptobyte.String
768 if !extensions.ReadUint16(&extension) ||
769 !extensions.ReadUint16LengthPrefixed(&extData) {
770 return false
771 }
772
773 switch extension {
774 case extensionNextProtoNeg:
775 m.nextProtoNeg = true
776 for !extData.Empty() {
777 var proto cryptobyte.String
778 if !extData.ReadUint8LengthPrefixed(&proto) ||
779 proto.Empty() {
780 return false
781 }
782 m.nextProtos = append(m.nextProtos, string(proto))
783 }
784 case extensionStatusRequest:
785 m.ocspStapling = true
786 case extensionSessionTicket:
787 m.ticketSupported = true
788 case extensionRenegotiationInfo:
789 if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) {
790 return false
791 }
792 m.secureRenegotiationSupported = true
793 case extensionALPN:
794 var protoList cryptobyte.String
795 if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
796 return false
797 }
798 var proto cryptobyte.String
799 if !protoList.ReadUint8LengthPrefixed(&proto) ||
800 proto.Empty() || !protoList.Empty() {
801 return false
802 }
803 m.alpnProtocol = string(proto)
804 case extensionSCT:
805 var sctList cryptobyte.String
806 if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() {
807 return false
808 }
809 for !sctList.Empty() {
810 var sct []byte
811 if !readUint16LengthPrefixed(&sctList, &sct) ||
812 len(sct) == 0 {
813 return false
814 }
815 m.scts = append(m.scts, sct)
816 }
817 case extensionSupportedVersions:
818 if !extData.ReadUint16(&m.supportedVersion) {
819 return false
820 }
821 case extensionCookie:
822 if !readUint16LengthPrefixed(&extData, &m.cookie) ||
823 len(m.cookie) == 0 {
824 return false
825 }
826 case extensionKeyShare:
827
828
829 if len(extData) == 2 {
830 if !extData.ReadUint16((*uint16)(&m.selectedGroup)) {
831 return false
832 }
833 } else {
834 if !extData.ReadUint16((*uint16)(&m.serverShare.group)) ||
835 !readUint16LengthPrefixed(&extData, &m.serverShare.data) {
836 return false
837 }
838 }
839 case extensionPreSharedKey:
840 m.selectedIdentityPresent = true
841 if !extData.ReadUint16(&m.selectedIdentity) {
842 return false
843 }
844 default:
845
846 continue
847 }
848
849 if !extData.Empty() {
850 return false
851 }
852 }
853
854 return true
855 }
856
857 type encryptedExtensionsMsg struct {
858 raw []byte
859 alpnProtocol string
860 }
861
862 func (m *encryptedExtensionsMsg) marshal() []byte {
863 if m.raw != nil {
864 return m.raw
865 }
866
867 var b cryptobyte.Builder
868 b.AddUint8(typeEncryptedExtensions)
869 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
870 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
871 if len(m.alpnProtocol) > 0 {
872 b.AddUint16(extensionALPN)
873 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
874 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
875 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
876 b.AddBytes([]byte(m.alpnProtocol))
877 })
878 })
879 })
880 }
881 })
882 })
883
884 m.raw = b.BytesOrPanic()
885 return m.raw
886 }
887
888 func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool {
889 *m = encryptedExtensionsMsg{raw: data}
890 s := cryptobyte.String(data)
891
892 var extensions cryptobyte.String
893 if !s.Skip(4) ||
894 !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
895 return false
896 }
897
898 for !extensions.Empty() {
899 var extension uint16
900 var extData cryptobyte.String
901 if !extensions.ReadUint16(&extension) ||
902 !extensions.ReadUint16LengthPrefixed(&extData) {
903 return false
904 }
905
906 switch extension {
907 case extensionALPN:
908 var protoList cryptobyte.String
909 if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
910 return false
911 }
912 var proto cryptobyte.String
913 if !protoList.ReadUint8LengthPrefixed(&proto) ||
914 proto.Empty() || !protoList.Empty() {
915 return false
916 }
917 m.alpnProtocol = string(proto)
918 default:
919
920 continue
921 }
922
923 if !extData.Empty() {
924 return false
925 }
926 }
927
928 return true
929 }
930
931 type endOfEarlyDataMsg struct{}
932
933 func (m *endOfEarlyDataMsg) marshal() []byte {
934 x := make([]byte, 4)
935 x[0] = typeEndOfEarlyData
936 return x
937 }
938
939 func (m *endOfEarlyDataMsg) unmarshal(data []byte) bool {
940 return len(data) == 4
941 }
942
943 type keyUpdateMsg struct {
944 raw []byte
945 updateRequested bool
946 }
947
948 func (m *keyUpdateMsg) marshal() []byte {
949 if m.raw != nil {
950 return m.raw
951 }
952
953 var b cryptobyte.Builder
954 b.AddUint8(typeKeyUpdate)
955 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
956 if m.updateRequested {
957 b.AddUint8(1)
958 } else {
959 b.AddUint8(0)
960 }
961 })
962
963 m.raw = b.BytesOrPanic()
964 return m.raw
965 }
966
967 func (m *keyUpdateMsg) unmarshal(data []byte) bool {
968 m.raw = data
969 s := cryptobyte.String(data)
970
971 var updateRequested uint8
972 if !s.Skip(4) ||
973 !s.ReadUint8(&updateRequested) || !s.Empty() {
974 return false
975 }
976 switch updateRequested {
977 case 0:
978 m.updateRequested = false
979 case 1:
980 m.updateRequested = true
981 default:
982 return false
983 }
984 return true
985 }
986
987 type newSessionTicketMsgTLS13 struct {
988 raw []byte
989 lifetime uint32
990 ageAdd uint32
991 nonce []byte
992 label []byte
993 maxEarlyData uint32
994 }
995
996 func (m *newSessionTicketMsgTLS13) marshal() []byte {
997 if m.raw != nil {
998 return m.raw
999 }
1000
1001 var b cryptobyte.Builder
1002 b.AddUint8(typeNewSessionTicket)
1003 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1004 b.AddUint32(m.lifetime)
1005 b.AddUint32(m.ageAdd)
1006 b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
1007 b.AddBytes(m.nonce)
1008 })
1009 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1010 b.AddBytes(m.label)
1011 })
1012
1013 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1014 if m.maxEarlyData > 0 {
1015 b.AddUint16(extensionEarlyData)
1016 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1017 b.AddUint32(m.maxEarlyData)
1018 })
1019 }
1020 })
1021 })
1022
1023 m.raw = b.BytesOrPanic()
1024 return m.raw
1025 }
1026
1027 func (m *newSessionTicketMsgTLS13) unmarshal(data []byte) bool {
1028 *m = newSessionTicketMsgTLS13{raw: data}
1029 s := cryptobyte.String(data)
1030
1031 var extensions cryptobyte.String
1032 if !s.Skip(4) ||
1033 !s.ReadUint32(&m.lifetime) ||
1034 !s.ReadUint32(&m.ageAdd) ||
1035 !readUint8LengthPrefixed(&s, &m.nonce) ||
1036 !readUint16LengthPrefixed(&s, &m.label) ||
1037 !s.ReadUint16LengthPrefixed(&extensions) ||
1038 !s.Empty() {
1039 return false
1040 }
1041
1042 for !extensions.Empty() {
1043 var extension uint16
1044 var extData cryptobyte.String
1045 if !extensions.ReadUint16(&extension) ||
1046 !extensions.ReadUint16LengthPrefixed(&extData) {
1047 return false
1048 }
1049
1050 switch extension {
1051 case extensionEarlyData:
1052 if !extData.ReadUint32(&m.maxEarlyData) {
1053 return false
1054 }
1055 default:
1056
1057 continue
1058 }
1059
1060 if !extData.Empty() {
1061 return false
1062 }
1063 }
1064
1065 return true
1066 }
1067
1068 type certificateRequestMsgTLS13 struct {
1069 raw []byte
1070 ocspStapling bool
1071 scts bool
1072 supportedSignatureAlgorithms []SignatureScheme
1073 supportedSignatureAlgorithmsCert []SignatureScheme
1074 certificateAuthorities [][]byte
1075 }
1076
1077 func (m *certificateRequestMsgTLS13) marshal() []byte {
1078 if m.raw != nil {
1079 return m.raw
1080 }
1081
1082 var b cryptobyte.Builder
1083 b.AddUint8(typeCertificateRequest)
1084 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1085
1086
1087 b.AddUint8(0)
1088
1089 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1090 if m.ocspStapling {
1091 b.AddUint16(extensionStatusRequest)
1092 b.AddUint16(0)
1093 }
1094 if m.scts {
1095
1096
1097
1098
1099
1100 b.AddUint16(extensionSCT)
1101 b.AddUint16(0)
1102 }
1103 if len(m.supportedSignatureAlgorithms) > 0 {
1104 b.AddUint16(extensionSignatureAlgorithms)
1105 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1106 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1107 for _, sigAlgo := range m.supportedSignatureAlgorithms {
1108 b.AddUint16(uint16(sigAlgo))
1109 }
1110 })
1111 })
1112 }
1113 if len(m.supportedSignatureAlgorithmsCert) > 0 {
1114 b.AddUint16(extensionSignatureAlgorithmsCert)
1115 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1116 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1117 for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
1118 b.AddUint16(uint16(sigAlgo))
1119 }
1120 })
1121 })
1122 }
1123 if len(m.certificateAuthorities) > 0 {
1124 b.AddUint16(extensionCertificateAuthorities)
1125 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1126 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1127 for _, ca := range m.certificateAuthorities {
1128 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1129 b.AddBytes(ca)
1130 })
1131 }
1132 })
1133 })
1134 }
1135 })
1136 })
1137
1138 m.raw = b.BytesOrPanic()
1139 return m.raw
1140 }
1141
1142 func (m *certificateRequestMsgTLS13) unmarshal(data []byte) bool {
1143 *m = certificateRequestMsgTLS13{raw: data}
1144 s := cryptobyte.String(data)
1145
1146 var context, extensions cryptobyte.String
1147 if !s.Skip(4) ||
1148 !s.ReadUint8LengthPrefixed(&context) || !context.Empty() ||
1149 !s.ReadUint16LengthPrefixed(&extensions) ||
1150 !s.Empty() {
1151 return false
1152 }
1153
1154 for !extensions.Empty() {
1155 var extension uint16
1156 var extData cryptobyte.String
1157 if !extensions.ReadUint16(&extension) ||
1158 !extensions.ReadUint16LengthPrefixed(&extData) {
1159 return false
1160 }
1161
1162 switch extension {
1163 case extensionStatusRequest:
1164 m.ocspStapling = true
1165 case extensionSCT:
1166 m.scts = true
1167 case extensionSignatureAlgorithms:
1168 var sigAndAlgs cryptobyte.String
1169 if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
1170 return false
1171 }
1172 for !sigAndAlgs.Empty() {
1173 var sigAndAlg uint16
1174 if !sigAndAlgs.ReadUint16(&sigAndAlg) {
1175 return false
1176 }
1177 m.supportedSignatureAlgorithms = append(
1178 m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg))
1179 }
1180 case extensionSignatureAlgorithmsCert:
1181 var sigAndAlgs cryptobyte.String
1182 if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
1183 return false
1184 }
1185 for !sigAndAlgs.Empty() {
1186 var sigAndAlg uint16
1187 if !sigAndAlgs.ReadUint16(&sigAndAlg) {
1188 return false
1189 }
1190 m.supportedSignatureAlgorithmsCert = append(
1191 m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg))
1192 }
1193 case extensionCertificateAuthorities:
1194 var auths cryptobyte.String
1195 if !extData.ReadUint16LengthPrefixed(&auths) || auths.Empty() {
1196 return false
1197 }
1198 for !auths.Empty() {
1199 var ca []byte
1200 if !readUint16LengthPrefixed(&auths, &ca) || len(ca) == 0 {
1201 return false
1202 }
1203 m.certificateAuthorities = append(m.certificateAuthorities, ca)
1204 }
1205 default:
1206
1207 continue
1208 }
1209
1210 if !extData.Empty() {
1211 return false
1212 }
1213 }
1214
1215 return true
1216 }
1217
1218 type certificateMsg struct {
1219 raw []byte
1220 certificates [][]byte
1221 }
1222
1223 func (m *certificateMsg) marshal() (x []byte) {
1224 if m.raw != nil {
1225 return m.raw
1226 }
1227
1228 var i int
1229 for _, slice := range m.certificates {
1230 i += len(slice)
1231 }
1232
1233 length := 3 + 3*len(m.certificates) + i
1234 x = make([]byte, 4+length)
1235 x[0] = typeCertificate
1236 x[1] = uint8(length >> 16)
1237 x[2] = uint8(length >> 8)
1238 x[3] = uint8(length)
1239
1240 certificateOctets := length - 3
1241 x[4] = uint8(certificateOctets >> 16)
1242 x[5] = uint8(certificateOctets >> 8)
1243 x[6] = uint8(certificateOctets)
1244
1245 y := x[7:]
1246 for _, slice := range m.certificates {
1247 y[0] = uint8(len(slice) >> 16)
1248 y[1] = uint8(len(slice) >> 8)
1249 y[2] = uint8(len(slice))
1250 copy(y[3:], slice)
1251 y = y[3+len(slice):]
1252 }
1253
1254 m.raw = x
1255 return
1256 }
1257
1258 func (m *certificateMsg) unmarshal(data []byte) bool {
1259 if len(data) < 7 {
1260 return false
1261 }
1262
1263 m.raw = data
1264 certsLen := uint32(data[4])<<16 | uint32(data[5])<<8 | uint32(data[6])
1265 if uint32(len(data)) != certsLen+7 {
1266 return false
1267 }
1268
1269 numCerts := 0
1270 d := data[7:]
1271 for certsLen > 0 {
1272 if len(d) < 4 {
1273 return false
1274 }
1275 certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
1276 if uint32(len(d)) < 3+certLen {
1277 return false
1278 }
1279 d = d[3+certLen:]
1280 certsLen -= 3 + certLen
1281 numCerts++
1282 }
1283
1284 m.certificates = make([][]byte, numCerts)
1285 d = data[7:]
1286 for i := 0; i < numCerts; i++ {
1287 certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
1288 m.certificates[i] = d[3 : 3+certLen]
1289 d = d[3+certLen:]
1290 }
1291
1292 return true
1293 }
1294
1295 type certificateMsgTLS13 struct {
1296 raw []byte
1297 certificate Certificate
1298 ocspStapling bool
1299 scts bool
1300 }
1301
1302 func (m *certificateMsgTLS13) marshal() []byte {
1303 if m.raw != nil {
1304 return m.raw
1305 }
1306
1307 var b cryptobyte.Builder
1308 b.AddUint8(typeCertificate)
1309 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1310 b.AddUint8(0)
1311
1312 certificate := m.certificate
1313 if !m.ocspStapling {
1314 certificate.OCSPStaple = nil
1315 }
1316 if !m.scts {
1317 certificate.SignedCertificateTimestamps = nil
1318 }
1319 marshalCertificate(b, certificate)
1320 })
1321
1322 m.raw = b.BytesOrPanic()
1323 return m.raw
1324 }
1325
1326 func marshalCertificate(b *cryptobyte.Builder, certificate Certificate) {
1327 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1328 for i, cert := range certificate.Certificate {
1329 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1330 b.AddBytes(cert)
1331 })
1332 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1333 if i > 0 {
1334
1335 return
1336 }
1337 if certificate.OCSPStaple != nil {
1338 b.AddUint16(extensionStatusRequest)
1339 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1340 b.AddUint8(statusTypeOCSP)
1341 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1342 b.AddBytes(certificate.OCSPStaple)
1343 })
1344 })
1345 }
1346 if certificate.SignedCertificateTimestamps != nil {
1347 b.AddUint16(extensionSCT)
1348 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1349 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1350 for _, sct := range certificate.SignedCertificateTimestamps {
1351 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1352 b.AddBytes(sct)
1353 })
1354 }
1355 })
1356 })
1357 }
1358 })
1359 }
1360 })
1361 }
1362
1363 func (m *certificateMsgTLS13) unmarshal(data []byte) bool {
1364 *m = certificateMsgTLS13{raw: data}
1365 s := cryptobyte.String(data)
1366
1367 var context cryptobyte.String
1368 if !s.Skip(4) ||
1369 !s.ReadUint8LengthPrefixed(&context) || !context.Empty() ||
1370 !unmarshalCertificate(&s, &m.certificate) ||
1371 !s.Empty() {
1372 return false
1373 }
1374
1375 m.scts = m.certificate.SignedCertificateTimestamps != nil
1376 m.ocspStapling = m.certificate.OCSPStaple != nil
1377
1378 return true
1379 }
1380
1381 func unmarshalCertificate(s *cryptobyte.String, certificate *Certificate) bool {
1382 var certList cryptobyte.String
1383 if !s.ReadUint24LengthPrefixed(&certList) {
1384 return false
1385 }
1386 for !certList.Empty() {
1387 var cert []byte
1388 var extensions cryptobyte.String
1389 if !readUint24LengthPrefixed(&certList, &cert) ||
1390 !certList.ReadUint16LengthPrefixed(&extensions) {
1391 return false
1392 }
1393 certificate.Certificate = append(certificate.Certificate, cert)
1394 for !extensions.Empty() {
1395 var extension uint16
1396 var extData cryptobyte.String
1397 if !extensions.ReadUint16(&extension) ||
1398 !extensions.ReadUint16LengthPrefixed(&extData) {
1399 return false
1400 }
1401 if len(certificate.Certificate) > 1 {
1402
1403 continue
1404 }
1405
1406 switch extension {
1407 case extensionStatusRequest:
1408 var statusType uint8
1409 if !extData.ReadUint8(&statusType) || statusType != statusTypeOCSP ||
1410 !readUint24LengthPrefixed(&extData, &certificate.OCSPStaple) ||
1411 len(certificate.OCSPStaple) == 0 {
1412 return false
1413 }
1414 case extensionSCT:
1415 var sctList cryptobyte.String
1416 if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() {
1417 return false
1418 }
1419 for !sctList.Empty() {
1420 var sct []byte
1421 if !readUint16LengthPrefixed(&sctList, &sct) ||
1422 len(sct) == 0 {
1423 return false
1424 }
1425 certificate.SignedCertificateTimestamps = append(
1426 certificate.SignedCertificateTimestamps, sct)
1427 }
1428 default:
1429
1430 continue
1431 }
1432
1433 if !extData.Empty() {
1434 return false
1435 }
1436 }
1437 }
1438 return true
1439 }
1440
1441 type serverKeyExchangeMsg struct {
1442 raw []byte
1443 key []byte
1444 }
1445
1446 func (m *serverKeyExchangeMsg) marshal() []byte {
1447 if m.raw != nil {
1448 return m.raw
1449 }
1450 length := len(m.key)
1451 x := make([]byte, length+4)
1452 x[0] = typeServerKeyExchange
1453 x[1] = uint8(length >> 16)
1454 x[2] = uint8(length >> 8)
1455 x[3] = uint8(length)
1456 copy(x[4:], m.key)
1457
1458 m.raw = x
1459 return x
1460 }
1461
1462 func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
1463 m.raw = data
1464 if len(data) < 4 {
1465 return false
1466 }
1467 m.key = data[4:]
1468 return true
1469 }
1470
1471 type certificateStatusMsg struct {
1472 raw []byte
1473 response []byte
1474 }
1475
1476 func (m *certificateStatusMsg) marshal() []byte {
1477 if m.raw != nil {
1478 return m.raw
1479 }
1480
1481 var b cryptobyte.Builder
1482 b.AddUint8(typeCertificateStatus)
1483 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1484 b.AddUint8(statusTypeOCSP)
1485 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1486 b.AddBytes(m.response)
1487 })
1488 })
1489
1490 m.raw = b.BytesOrPanic()
1491 return m.raw
1492 }
1493
1494 func (m *certificateStatusMsg) unmarshal(data []byte) bool {
1495 m.raw = data
1496 s := cryptobyte.String(data)
1497
1498 var statusType uint8
1499 if !s.Skip(4) ||
1500 !s.ReadUint8(&statusType) || statusType != statusTypeOCSP ||
1501 !readUint24LengthPrefixed(&s, &m.response) ||
1502 len(m.response) == 0 || !s.Empty() {
1503 return false
1504 }
1505 return true
1506 }
1507
1508 type serverHelloDoneMsg struct{}
1509
1510 func (m *serverHelloDoneMsg) marshal() []byte {
1511 x := make([]byte, 4)
1512 x[0] = typeServerHelloDone
1513 return x
1514 }
1515
1516 func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
1517 return len(data) == 4
1518 }
1519
1520 type clientKeyExchangeMsg struct {
1521 raw []byte
1522 ciphertext []byte
1523 }
1524
1525 func (m *clientKeyExchangeMsg) marshal() []byte {
1526 if m.raw != nil {
1527 return m.raw
1528 }
1529 length := len(m.ciphertext)
1530 x := make([]byte, length+4)
1531 x[0] = typeClientKeyExchange
1532 x[1] = uint8(length >> 16)
1533 x[2] = uint8(length >> 8)
1534 x[3] = uint8(length)
1535 copy(x[4:], m.ciphertext)
1536
1537 m.raw = x
1538 return x
1539 }
1540
1541 func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
1542 m.raw = data
1543 if len(data) < 4 {
1544 return false
1545 }
1546 l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
1547 if l != len(data)-4 {
1548 return false
1549 }
1550 m.ciphertext = data[4:]
1551 return true
1552 }
1553
1554 type finishedMsg struct {
1555 raw []byte
1556 verifyData []byte
1557 }
1558
1559 func (m *finishedMsg) marshal() []byte {
1560 if m.raw != nil {
1561 return m.raw
1562 }
1563
1564 var b cryptobyte.Builder
1565 b.AddUint8(typeFinished)
1566 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1567 b.AddBytes(m.verifyData)
1568 })
1569
1570 m.raw = b.BytesOrPanic()
1571 return m.raw
1572 }
1573
1574 func (m *finishedMsg) unmarshal(data []byte) bool {
1575 m.raw = data
1576 s := cryptobyte.String(data)
1577 return s.Skip(1) &&
1578 readUint24LengthPrefixed(&s, &m.verifyData) &&
1579 s.Empty()
1580 }
1581
1582 type nextProtoMsg struct {
1583 raw []byte
1584 proto string
1585 }
1586
1587 func (m *nextProtoMsg) marshal() []byte {
1588 if m.raw != nil {
1589 return m.raw
1590 }
1591 l := len(m.proto)
1592 if l > 255 {
1593 l = 255
1594 }
1595
1596 padding := 32 - (l+2)%32
1597 length := l + padding + 2
1598 x := make([]byte, length+4)
1599 x[0] = typeNextProtocol
1600 x[1] = uint8(length >> 16)
1601 x[2] = uint8(length >> 8)
1602 x[3] = uint8(length)
1603
1604 y := x[4:]
1605 y[0] = byte(l)
1606 copy(y[1:], []byte(m.proto[0:l]))
1607 y = y[1+l:]
1608 y[0] = byte(padding)
1609
1610 m.raw = x
1611
1612 return x
1613 }
1614
1615 func (m *nextProtoMsg) unmarshal(data []byte) bool {
1616 m.raw = data
1617
1618 if len(data) < 5 {
1619 return false
1620 }
1621 data = data[4:]
1622 protoLen := int(data[0])
1623 data = data[1:]
1624 if len(data) < protoLen {
1625 return false
1626 }
1627 m.proto = string(data[0:protoLen])
1628 data = data[protoLen:]
1629
1630 if len(data) < 1 {
1631 return false
1632 }
1633 paddingLen := int(data[0])
1634 data = data[1:]
1635 if len(data) != paddingLen {
1636 return false
1637 }
1638
1639 return true
1640 }
1641
1642 type certificateRequestMsg struct {
1643 raw []byte
1644
1645
1646 hasSignatureAlgorithm bool
1647
1648 certificateTypes []byte
1649 supportedSignatureAlgorithms []SignatureScheme
1650 certificateAuthorities [][]byte
1651 }
1652
1653 func (m *certificateRequestMsg) marshal() (x []byte) {
1654 if m.raw != nil {
1655 return m.raw
1656 }
1657
1658
1659 length := 1 + len(m.certificateTypes) + 2
1660 casLength := 0
1661 for _, ca := range m.certificateAuthorities {
1662 casLength += 2 + len(ca)
1663 }
1664 length += casLength
1665
1666 if m.hasSignatureAlgorithm {
1667 length += 2 + 2*len(m.supportedSignatureAlgorithms)
1668 }
1669
1670 x = make([]byte, 4+length)
1671 x[0] = typeCertificateRequest
1672 x[1] = uint8(length >> 16)
1673 x[2] = uint8(length >> 8)
1674 x[3] = uint8(length)
1675
1676 x[4] = uint8(len(m.certificateTypes))
1677
1678 copy(x[5:], m.certificateTypes)
1679 y := x[5+len(m.certificateTypes):]
1680
1681 if m.hasSignatureAlgorithm {
1682 n := len(m.supportedSignatureAlgorithms) * 2
1683 y[0] = uint8(n >> 8)
1684 y[1] = uint8(n)
1685 y = y[2:]
1686 for _, sigAlgo := range m.supportedSignatureAlgorithms {
1687 y[0] = uint8(sigAlgo >> 8)
1688 y[1] = uint8(sigAlgo)
1689 y = y[2:]
1690 }
1691 }
1692
1693 y[0] = uint8(casLength >> 8)
1694 y[1] = uint8(casLength)
1695 y = y[2:]
1696 for _, ca := range m.certificateAuthorities {
1697 y[0] = uint8(len(ca) >> 8)
1698 y[1] = uint8(len(ca))
1699 y = y[2:]
1700 copy(y, ca)
1701 y = y[len(ca):]
1702 }
1703
1704 m.raw = x
1705 return
1706 }
1707
1708 func (m *certificateRequestMsg) unmarshal(data []byte) bool {
1709 m.raw = data
1710
1711 if len(data) < 5 {
1712 return false
1713 }
1714
1715 length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
1716 if uint32(len(data))-4 != length {
1717 return false
1718 }
1719
1720 numCertTypes := int(data[4])
1721 data = data[5:]
1722 if numCertTypes == 0 || len(data) <= numCertTypes {
1723 return false
1724 }
1725
1726 m.certificateTypes = make([]byte, numCertTypes)
1727 if copy(m.certificateTypes, data) != numCertTypes {
1728 return false
1729 }
1730
1731 data = data[numCertTypes:]
1732
1733 if m.hasSignatureAlgorithm {
1734 if len(data) < 2 {
1735 return false
1736 }
1737 sigAndHashLen := uint16(data[0])<<8 | uint16(data[1])
1738 data = data[2:]
1739 if sigAndHashLen&1 != 0 {
1740 return false
1741 }
1742 if len(data) < int(sigAndHashLen) {
1743 return false
1744 }
1745 numSigAlgos := sigAndHashLen / 2
1746 m.supportedSignatureAlgorithms = make([]SignatureScheme, numSigAlgos)
1747 for i := range m.supportedSignatureAlgorithms {
1748 m.supportedSignatureAlgorithms[i] = SignatureScheme(data[0])<<8 | SignatureScheme(data[1])
1749 data = data[2:]
1750 }
1751 }
1752
1753 if len(data) < 2 {
1754 return false
1755 }
1756 casLength := uint16(data[0])<<8 | uint16(data[1])
1757 data = data[2:]
1758 if len(data) < int(casLength) {
1759 return false
1760 }
1761 cas := make([]byte, casLength)
1762 copy(cas, data)
1763 data = data[casLength:]
1764
1765 m.certificateAuthorities = nil
1766 for len(cas) > 0 {
1767 if len(cas) < 2 {
1768 return false
1769 }
1770 caLen := uint16(cas[0])<<8 | uint16(cas[1])
1771 cas = cas[2:]
1772
1773 if len(cas) < int(caLen) {
1774 return false
1775 }
1776
1777 m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen])
1778 cas = cas[caLen:]
1779 }
1780
1781 return len(data) == 0
1782 }
1783
1784 type certificateVerifyMsg struct {
1785 raw []byte
1786 hasSignatureAlgorithm bool
1787 signatureAlgorithm SignatureScheme
1788 signature []byte
1789 }
1790
1791 func (m *certificateVerifyMsg) marshal() (x []byte) {
1792 if m.raw != nil {
1793 return m.raw
1794 }
1795
1796 var b cryptobyte.Builder
1797 b.AddUint8(typeCertificateVerify)
1798 b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
1799 if m.hasSignatureAlgorithm {
1800 b.AddUint16(uint16(m.signatureAlgorithm))
1801 }
1802 b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
1803 b.AddBytes(m.signature)
1804 })
1805 })
1806
1807 m.raw = b.BytesOrPanic()
1808 return m.raw
1809 }
1810
1811 func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
1812 m.raw = data
1813 s := cryptobyte.String(data)
1814
1815 if !s.Skip(4) {
1816 return false
1817 }
1818 if m.hasSignatureAlgorithm {
1819 if !s.ReadUint16((*uint16)(&m.signatureAlgorithm)) {
1820 return false
1821 }
1822 }
1823 return readUint16LengthPrefixed(&s, &m.signature) && s.Empty()
1824 }
1825
1826 type newSessionTicketMsg struct {
1827 raw []byte
1828 ticket []byte
1829 }
1830
1831 func (m *newSessionTicketMsg) marshal() (x []byte) {
1832 if m.raw != nil {
1833 return m.raw
1834 }
1835
1836
1837 ticketLen := len(m.ticket)
1838 length := 2 + 4 + ticketLen
1839 x = make([]byte, 4+length)
1840 x[0] = typeNewSessionTicket
1841 x[1] = uint8(length >> 16)
1842 x[2] = uint8(length >> 8)
1843 x[3] = uint8(length)
1844 x[8] = uint8(ticketLen >> 8)
1845 x[9] = uint8(ticketLen)
1846 copy(x[10:], m.ticket)
1847
1848 m.raw = x
1849
1850 return
1851 }
1852
1853 func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
1854 m.raw = data
1855
1856 if len(data) < 10 {
1857 return false
1858 }
1859
1860 length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
1861 if uint32(len(data))-4 != length {
1862 return false
1863 }
1864
1865 ticketLen := int(data[8])<<8 + int(data[9])
1866 if len(data)-10 != ticketLen {
1867 return false
1868 }
1869
1870 m.ticket = data[10:]
1871
1872 return true
1873 }
1874
1875 type helloRequestMsg struct {
1876 }
1877
1878 func (*helloRequestMsg) marshal() []byte {
1879 return []byte{typeHelloRequest, 0, 0, 0}
1880 }
1881
1882 func (*helloRequestMsg) unmarshal(data []byte) bool {
1883 return len(data) == 4
1884 }
1885
View as plain text