libgo: update to Go 1.11
[official-gcc.git] / libgo / go / crypto / tls / handshake_messages.go
bloba5bf10efb8c6c38411802c3c457b748950e623d1
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.
5 package tls
7 import (
8 "bytes"
9 "strings"
12 type clientHelloMsg struct {
13 raw []byte
14 vers uint16
15 random []byte
16 sessionId []byte
17 cipherSuites []uint16
18 compressionMethods []uint8
19 nextProtoNeg bool
20 serverName string
21 ocspStapling bool
22 scts bool
23 supportedCurves []CurveID
24 supportedPoints []uint8
25 ticketSupported bool
26 sessionTicket []uint8
27 supportedSignatureAlgorithms []SignatureScheme
28 secureRenegotiation []byte
29 secureRenegotiationSupported bool
30 alpnProtocols []string
33 func (m *clientHelloMsg) equal(i interface{}) bool {
34 m1, ok := i.(*clientHelloMsg)
35 if !ok {
36 return false
39 return bytes.Equal(m.raw, m1.raw) &&
40 m.vers == m1.vers &&
41 bytes.Equal(m.random, m1.random) &&
42 bytes.Equal(m.sessionId, m1.sessionId) &&
43 eqUint16s(m.cipherSuites, m1.cipherSuites) &&
44 bytes.Equal(m.compressionMethods, m1.compressionMethods) &&
45 m.nextProtoNeg == m1.nextProtoNeg &&
46 m.serverName == m1.serverName &&
47 m.ocspStapling == m1.ocspStapling &&
48 m.scts == m1.scts &&
49 eqCurveIDs(m.supportedCurves, m1.supportedCurves) &&
50 bytes.Equal(m.supportedPoints, m1.supportedPoints) &&
51 m.ticketSupported == m1.ticketSupported &&
52 bytes.Equal(m.sessionTicket, m1.sessionTicket) &&
53 eqSignatureAlgorithms(m.supportedSignatureAlgorithms, m1.supportedSignatureAlgorithms) &&
54 m.secureRenegotiationSupported == m1.secureRenegotiationSupported &&
55 bytes.Equal(m.secureRenegotiation, m1.secureRenegotiation) &&
56 eqStrings(m.alpnProtocols, m1.alpnProtocols)
59 func (m *clientHelloMsg) marshal() []byte {
60 if m.raw != nil {
61 return m.raw
64 length := 2 + 32 + 1 + len(m.sessionId) + 2 + len(m.cipherSuites)*2 + 1 + len(m.compressionMethods)
65 numExtensions := 0
66 extensionsLength := 0
67 if m.nextProtoNeg {
68 numExtensions++
70 if m.ocspStapling {
71 extensionsLength += 1 + 2 + 2
72 numExtensions++
74 if len(m.serverName) > 0 {
75 extensionsLength += 5 + len(m.serverName)
76 numExtensions++
78 if len(m.supportedCurves) > 0 {
79 extensionsLength += 2 + 2*len(m.supportedCurves)
80 numExtensions++
82 if len(m.supportedPoints) > 0 {
83 extensionsLength += 1 + len(m.supportedPoints)
84 numExtensions++
86 if m.ticketSupported {
87 extensionsLength += len(m.sessionTicket)
88 numExtensions++
90 if len(m.supportedSignatureAlgorithms) > 0 {
91 extensionsLength += 2 + 2*len(m.supportedSignatureAlgorithms)
92 numExtensions++
94 if m.secureRenegotiationSupported {
95 extensionsLength += 1 + len(m.secureRenegotiation)
96 numExtensions++
98 if len(m.alpnProtocols) > 0 {
99 extensionsLength += 2
100 for _, s := range m.alpnProtocols {
101 if l := len(s); l == 0 || l > 255 {
102 panic("invalid ALPN protocol")
104 extensionsLength++
105 extensionsLength += len(s)
107 numExtensions++
109 if m.scts {
110 numExtensions++
112 if numExtensions > 0 {
113 extensionsLength += 4 * numExtensions
114 length += 2 + extensionsLength
117 x := make([]byte, 4+length)
118 x[0] = typeClientHello
119 x[1] = uint8(length >> 16)
120 x[2] = uint8(length >> 8)
121 x[3] = uint8(length)
122 x[4] = uint8(m.vers >> 8)
123 x[5] = uint8(m.vers)
124 copy(x[6:38], m.random)
125 x[38] = uint8(len(m.sessionId))
126 copy(x[39:39+len(m.sessionId)], m.sessionId)
127 y := x[39+len(m.sessionId):]
128 y[0] = uint8(len(m.cipherSuites) >> 7)
129 y[1] = uint8(len(m.cipherSuites) << 1)
130 for i, suite := range m.cipherSuites {
131 y[2+i*2] = uint8(suite >> 8)
132 y[3+i*2] = uint8(suite)
134 z := y[2+len(m.cipherSuites)*2:]
135 z[0] = uint8(len(m.compressionMethods))
136 copy(z[1:], m.compressionMethods)
138 z = z[1+len(m.compressionMethods):]
139 if numExtensions > 0 {
140 z[0] = byte(extensionsLength >> 8)
141 z[1] = byte(extensionsLength)
142 z = z[2:]
144 if m.nextProtoNeg {
145 z[0] = byte(extensionNextProtoNeg >> 8)
146 z[1] = byte(extensionNextProtoNeg & 0xff)
147 // The length is always 0
148 z = z[4:]
150 if len(m.serverName) > 0 {
151 z[0] = byte(extensionServerName >> 8)
152 z[1] = byte(extensionServerName & 0xff)
153 l := len(m.serverName) + 5
154 z[2] = byte(l >> 8)
155 z[3] = byte(l)
156 z = z[4:]
158 // RFC 3546, section 3.1
160 // struct {
161 // NameType name_type;
162 // select (name_type) {
163 // case host_name: HostName;
164 // } name;
165 // } ServerName;
167 // enum {
168 // host_name(0), (255)
169 // } NameType;
171 // opaque HostName<1..2^16-1>;
173 // struct {
174 // ServerName server_name_list<1..2^16-1>
175 // } ServerNameList;
177 z[0] = byte((len(m.serverName) + 3) >> 8)
178 z[1] = byte(len(m.serverName) + 3)
179 z[3] = byte(len(m.serverName) >> 8)
180 z[4] = byte(len(m.serverName))
181 copy(z[5:], []byte(m.serverName))
182 z = z[l:]
184 if m.ocspStapling {
185 // RFC 4366, section 3.6
186 z[0] = byte(extensionStatusRequest >> 8)
187 z[1] = byte(extensionStatusRequest)
188 z[2] = 0
189 z[3] = 5
190 z[4] = 1 // OCSP type
191 // Two zero valued uint16s for the two lengths.
192 z = z[9:]
194 if len(m.supportedCurves) > 0 {
195 // https://tools.ietf.org/html/rfc4492#section-5.5.1
196 z[0] = byte(extensionSupportedCurves >> 8)
197 z[1] = byte(extensionSupportedCurves)
198 l := 2 + 2*len(m.supportedCurves)
199 z[2] = byte(l >> 8)
200 z[3] = byte(l)
201 l -= 2
202 z[4] = byte(l >> 8)
203 z[5] = byte(l)
204 z = z[6:]
205 for _, curve := range m.supportedCurves {
206 z[0] = byte(curve >> 8)
207 z[1] = byte(curve)
208 z = z[2:]
211 if len(m.supportedPoints) > 0 {
212 // https://tools.ietf.org/html/rfc4492#section-5.5.2
213 z[0] = byte(extensionSupportedPoints >> 8)
214 z[1] = byte(extensionSupportedPoints)
215 l := 1 + len(m.supportedPoints)
216 z[2] = byte(l >> 8)
217 z[3] = byte(l)
219 z[4] = byte(l)
220 z = z[5:]
221 for _, pointFormat := range m.supportedPoints {
222 z[0] = pointFormat
223 z = z[1:]
226 if m.ticketSupported {
227 // https://tools.ietf.org/html/rfc5077#section-3.2
228 z[0] = byte(extensionSessionTicket >> 8)
229 z[1] = byte(extensionSessionTicket)
230 l := len(m.sessionTicket)
231 z[2] = byte(l >> 8)
232 z[3] = byte(l)
233 z = z[4:]
234 copy(z, m.sessionTicket)
235 z = z[len(m.sessionTicket):]
237 if len(m.supportedSignatureAlgorithms) > 0 {
238 // https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
239 z[0] = byte(extensionSignatureAlgorithms >> 8)
240 z[1] = byte(extensionSignatureAlgorithms)
241 l := 2 + 2*len(m.supportedSignatureAlgorithms)
242 z[2] = byte(l >> 8)
243 z[3] = byte(l)
244 z = z[4:]
246 l -= 2
247 z[0] = byte(l >> 8)
248 z[1] = byte(l)
249 z = z[2:]
250 for _, sigAlgo := range m.supportedSignatureAlgorithms {
251 z[0] = byte(sigAlgo >> 8)
252 z[1] = byte(sigAlgo)
253 z = z[2:]
256 if m.secureRenegotiationSupported {
257 z[0] = byte(extensionRenegotiationInfo >> 8)
258 z[1] = byte(extensionRenegotiationInfo & 0xff)
259 z[2] = 0
260 z[3] = byte(len(m.secureRenegotiation) + 1)
261 z[4] = byte(len(m.secureRenegotiation))
262 z = z[5:]
263 copy(z, m.secureRenegotiation)
264 z = z[len(m.secureRenegotiation):]
266 if len(m.alpnProtocols) > 0 {
267 z[0] = byte(extensionALPN >> 8)
268 z[1] = byte(extensionALPN & 0xff)
269 lengths := z[2:]
270 z = z[6:]
272 stringsLength := 0
273 for _, s := range m.alpnProtocols {
274 l := len(s)
275 z[0] = byte(l)
276 copy(z[1:], s)
277 z = z[1+l:]
278 stringsLength += 1 + l
281 lengths[2] = byte(stringsLength >> 8)
282 lengths[3] = byte(stringsLength)
283 stringsLength += 2
284 lengths[0] = byte(stringsLength >> 8)
285 lengths[1] = byte(stringsLength)
287 if m.scts {
288 // https://tools.ietf.org/html/rfc6962#section-3.3.1
289 z[0] = byte(extensionSCT >> 8)
290 z[1] = byte(extensionSCT)
291 // zero uint16 for the zero-length extension_data
292 z = z[4:]
295 m.raw = x
297 return x
300 func (m *clientHelloMsg) unmarshal(data []byte) bool {
301 if len(data) < 42 {
302 return false
304 m.raw = data
305 m.vers = uint16(data[4])<<8 | uint16(data[5])
306 m.random = data[6:38]
307 sessionIdLen := int(data[38])
308 if sessionIdLen > 32 || len(data) < 39+sessionIdLen {
309 return false
311 m.sessionId = data[39 : 39+sessionIdLen]
312 data = data[39+sessionIdLen:]
313 if len(data) < 2 {
314 return false
316 // cipherSuiteLen is the number of bytes of cipher suite numbers. Since
317 // they are uint16s, the number must be even.
318 cipherSuiteLen := int(data[0])<<8 | int(data[1])
319 if cipherSuiteLen%2 == 1 || len(data) < 2+cipherSuiteLen {
320 return false
322 numCipherSuites := cipherSuiteLen / 2
323 m.cipherSuites = make([]uint16, numCipherSuites)
324 for i := 0; i < numCipherSuites; i++ {
325 m.cipherSuites[i] = uint16(data[2+2*i])<<8 | uint16(data[3+2*i])
326 if m.cipherSuites[i] == scsvRenegotiation {
327 m.secureRenegotiationSupported = true
330 data = data[2+cipherSuiteLen:]
331 if len(data) < 1 {
332 return false
334 compressionMethodsLen := int(data[0])
335 if len(data) < 1+compressionMethodsLen {
336 return false
338 m.compressionMethods = data[1 : 1+compressionMethodsLen]
340 data = data[1+compressionMethodsLen:]
342 m.nextProtoNeg = false
343 m.serverName = ""
344 m.ocspStapling = false
345 m.ticketSupported = false
346 m.sessionTicket = nil
347 m.supportedSignatureAlgorithms = nil
348 m.alpnProtocols = nil
349 m.scts = false
351 if len(data) == 0 {
352 // ClientHello is optionally followed by extension data
353 return true
355 if len(data) < 2 {
356 return false
359 extensionsLength := int(data[0])<<8 | int(data[1])
360 data = data[2:]
361 if extensionsLength != len(data) {
362 return false
365 for len(data) != 0 {
366 if len(data) < 4 {
367 return false
369 extension := uint16(data[0])<<8 | uint16(data[1])
370 length := int(data[2])<<8 | int(data[3])
371 data = data[4:]
372 if len(data) < length {
373 return false
376 switch extension {
377 case extensionServerName:
378 d := data[:length]
379 if len(d) < 2 {
380 return false
382 namesLen := int(d[0])<<8 | int(d[1])
383 d = d[2:]
384 if len(d) != namesLen {
385 return false
387 for len(d) > 0 {
388 if len(d) < 3 {
389 return false
391 nameType := d[0]
392 nameLen := int(d[1])<<8 | int(d[2])
393 d = d[3:]
394 if len(d) < nameLen {
395 return false
397 if nameType == 0 {
398 m.serverName = string(d[:nameLen])
399 // An SNI value may not include a
400 // trailing dot. See
401 // https://tools.ietf.org/html/rfc6066#section-3.
402 if strings.HasSuffix(m.serverName, ".") {
403 return false
405 break
407 d = d[nameLen:]
409 case extensionNextProtoNeg:
410 if length > 0 {
411 return false
413 m.nextProtoNeg = true
414 case extensionStatusRequest:
415 m.ocspStapling = length > 0 && data[0] == statusTypeOCSP
416 case extensionSupportedCurves:
417 // https://tools.ietf.org/html/rfc4492#section-5.5.1
418 if length < 2 {
419 return false
421 l := int(data[0])<<8 | int(data[1])
422 if l%2 == 1 || length != l+2 {
423 return false
425 numCurves := l / 2
426 m.supportedCurves = make([]CurveID, numCurves)
427 d := data[2:]
428 for i := 0; i < numCurves; i++ {
429 m.supportedCurves[i] = CurveID(d[0])<<8 | CurveID(d[1])
430 d = d[2:]
432 case extensionSupportedPoints:
433 // https://tools.ietf.org/html/rfc4492#section-5.5.2
434 if length < 1 {
435 return false
437 l := int(data[0])
438 if length != l+1 {
439 return false
441 m.supportedPoints = make([]uint8, l)
442 copy(m.supportedPoints, data[1:])
443 case extensionSessionTicket:
444 // https://tools.ietf.org/html/rfc5077#section-3.2
445 m.ticketSupported = true
446 m.sessionTicket = data[:length]
447 case extensionSignatureAlgorithms:
448 // https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
449 if length < 2 || length&1 != 0 {
450 return false
452 l := int(data[0])<<8 | int(data[1])
453 if l != length-2 {
454 return false
456 n := l / 2
457 d := data[2:]
458 m.supportedSignatureAlgorithms = make([]SignatureScheme, n)
459 for i := range m.supportedSignatureAlgorithms {
460 m.supportedSignatureAlgorithms[i] = SignatureScheme(d[0])<<8 | SignatureScheme(d[1])
461 d = d[2:]
463 case extensionRenegotiationInfo:
464 if length == 0 {
465 return false
467 d := data[:length]
468 l := int(d[0])
469 d = d[1:]
470 if l != len(d) {
471 return false
474 m.secureRenegotiation = d
475 m.secureRenegotiationSupported = true
476 case extensionALPN:
477 if length < 2 {
478 return false
480 l := int(data[0])<<8 | int(data[1])
481 if l != length-2 {
482 return false
484 d := data[2:length]
485 for len(d) != 0 {
486 stringLen := int(d[0])
487 d = d[1:]
488 if stringLen == 0 || stringLen > len(d) {
489 return false
491 m.alpnProtocols = append(m.alpnProtocols, string(d[:stringLen]))
492 d = d[stringLen:]
494 case extensionSCT:
495 m.scts = true
496 if length != 0 {
497 return false
500 data = data[length:]
503 return true
506 type serverHelloMsg struct {
507 raw []byte
508 vers uint16
509 random []byte
510 sessionId []byte
511 cipherSuite uint16
512 compressionMethod uint8
513 nextProtoNeg bool
514 nextProtos []string
515 ocspStapling bool
516 scts [][]byte
517 ticketSupported bool
518 secureRenegotiation []byte
519 secureRenegotiationSupported bool
520 alpnProtocol string
523 func (m *serverHelloMsg) equal(i interface{}) bool {
524 m1, ok := i.(*serverHelloMsg)
525 if !ok {
526 return false
529 if len(m.scts) != len(m1.scts) {
530 return false
532 for i, sct := range m.scts {
533 if !bytes.Equal(sct, m1.scts[i]) {
534 return false
538 return bytes.Equal(m.raw, m1.raw) &&
539 m.vers == m1.vers &&
540 bytes.Equal(m.random, m1.random) &&
541 bytes.Equal(m.sessionId, m1.sessionId) &&
542 m.cipherSuite == m1.cipherSuite &&
543 m.compressionMethod == m1.compressionMethod &&
544 m.nextProtoNeg == m1.nextProtoNeg &&
545 eqStrings(m.nextProtos, m1.nextProtos) &&
546 m.ocspStapling == m1.ocspStapling &&
547 m.ticketSupported == m1.ticketSupported &&
548 m.secureRenegotiationSupported == m1.secureRenegotiationSupported &&
549 bytes.Equal(m.secureRenegotiation, m1.secureRenegotiation) &&
550 m.alpnProtocol == m1.alpnProtocol
553 func (m *serverHelloMsg) marshal() []byte {
554 if m.raw != nil {
555 return m.raw
558 length := 38 + len(m.sessionId)
559 numExtensions := 0
560 extensionsLength := 0
562 nextProtoLen := 0
563 if m.nextProtoNeg {
564 numExtensions++
565 for _, v := range m.nextProtos {
566 nextProtoLen += len(v)
568 nextProtoLen += len(m.nextProtos)
569 extensionsLength += nextProtoLen
571 if m.ocspStapling {
572 numExtensions++
574 if m.ticketSupported {
575 numExtensions++
577 if m.secureRenegotiationSupported {
578 extensionsLength += 1 + len(m.secureRenegotiation)
579 numExtensions++
581 if alpnLen := len(m.alpnProtocol); alpnLen > 0 {
582 if alpnLen >= 256 {
583 panic("invalid ALPN protocol")
585 extensionsLength += 2 + 1 + alpnLen
586 numExtensions++
588 sctLen := 0
589 if len(m.scts) > 0 {
590 for _, sct := range m.scts {
591 sctLen += len(sct) + 2
593 extensionsLength += 2 + sctLen
594 numExtensions++
597 if numExtensions > 0 {
598 extensionsLength += 4 * numExtensions
599 length += 2 + extensionsLength
602 x := make([]byte, 4+length)
603 x[0] = typeServerHello
604 x[1] = uint8(length >> 16)
605 x[2] = uint8(length >> 8)
606 x[3] = uint8(length)
607 x[4] = uint8(m.vers >> 8)
608 x[5] = uint8(m.vers)
609 copy(x[6:38], m.random)
610 x[38] = uint8(len(m.sessionId))
611 copy(x[39:39+len(m.sessionId)], m.sessionId)
612 z := x[39+len(m.sessionId):]
613 z[0] = uint8(m.cipherSuite >> 8)
614 z[1] = uint8(m.cipherSuite)
615 z[2] = m.compressionMethod
617 z = z[3:]
618 if numExtensions > 0 {
619 z[0] = byte(extensionsLength >> 8)
620 z[1] = byte(extensionsLength)
621 z = z[2:]
623 if m.nextProtoNeg {
624 z[0] = byte(extensionNextProtoNeg >> 8)
625 z[1] = byte(extensionNextProtoNeg & 0xff)
626 z[2] = byte(nextProtoLen >> 8)
627 z[3] = byte(nextProtoLen)
628 z = z[4:]
630 for _, v := range m.nextProtos {
631 l := len(v)
632 if l > 255 {
633 l = 255
635 z[0] = byte(l)
636 copy(z[1:], []byte(v[0:l]))
637 z = z[1+l:]
640 if m.ocspStapling {
641 z[0] = byte(extensionStatusRequest >> 8)
642 z[1] = byte(extensionStatusRequest)
643 z = z[4:]
645 if m.ticketSupported {
646 z[0] = byte(extensionSessionTicket >> 8)
647 z[1] = byte(extensionSessionTicket)
648 z = z[4:]
650 if m.secureRenegotiationSupported {
651 z[0] = byte(extensionRenegotiationInfo >> 8)
652 z[1] = byte(extensionRenegotiationInfo & 0xff)
653 z[2] = 0
654 z[3] = byte(len(m.secureRenegotiation) + 1)
655 z[4] = byte(len(m.secureRenegotiation))
656 z = z[5:]
657 copy(z, m.secureRenegotiation)
658 z = z[len(m.secureRenegotiation):]
660 if alpnLen := len(m.alpnProtocol); alpnLen > 0 {
661 z[0] = byte(extensionALPN >> 8)
662 z[1] = byte(extensionALPN & 0xff)
663 l := 2 + 1 + alpnLen
664 z[2] = byte(l >> 8)
665 z[3] = byte(l)
666 l -= 2
667 z[4] = byte(l >> 8)
668 z[5] = byte(l)
669 l -= 1
670 z[6] = byte(l)
671 copy(z[7:], []byte(m.alpnProtocol))
672 z = z[7+alpnLen:]
674 if sctLen > 0 {
675 z[0] = byte(extensionSCT >> 8)
676 z[1] = byte(extensionSCT)
677 l := sctLen + 2
678 z[2] = byte(l >> 8)
679 z[3] = byte(l)
680 z[4] = byte(sctLen >> 8)
681 z[5] = byte(sctLen)
683 z = z[6:]
684 for _, sct := range m.scts {
685 z[0] = byte(len(sct) >> 8)
686 z[1] = byte(len(sct))
687 copy(z[2:], sct)
688 z = z[len(sct)+2:]
692 m.raw = x
694 return x
697 func (m *serverHelloMsg) unmarshal(data []byte) bool {
698 if len(data) < 42 {
699 return false
701 m.raw = data
702 m.vers = uint16(data[4])<<8 | uint16(data[5])
703 m.random = data[6:38]
704 sessionIdLen := int(data[38])
705 if sessionIdLen > 32 || len(data) < 39+sessionIdLen {
706 return false
708 m.sessionId = data[39 : 39+sessionIdLen]
709 data = data[39+sessionIdLen:]
710 if len(data) < 3 {
711 return false
713 m.cipherSuite = uint16(data[0])<<8 | uint16(data[1])
714 m.compressionMethod = data[2]
715 data = data[3:]
717 m.nextProtoNeg = false
718 m.nextProtos = nil
719 m.ocspStapling = false
720 m.scts = nil
721 m.ticketSupported = false
722 m.alpnProtocol = ""
724 if len(data) == 0 {
725 // ServerHello is optionally followed by extension data
726 return true
728 if len(data) < 2 {
729 return false
732 extensionsLength := int(data[0])<<8 | int(data[1])
733 data = data[2:]
734 if len(data) != extensionsLength {
735 return false
738 for len(data) != 0 {
739 if len(data) < 4 {
740 return false
742 extension := uint16(data[0])<<8 | uint16(data[1])
743 length := int(data[2])<<8 | int(data[3])
744 data = data[4:]
745 if len(data) < length {
746 return false
749 switch extension {
750 case extensionNextProtoNeg:
751 m.nextProtoNeg = true
752 d := data[:length]
753 for len(d) > 0 {
754 l := int(d[0])
755 d = d[1:]
756 if l == 0 || l > len(d) {
757 return false
759 m.nextProtos = append(m.nextProtos, string(d[:l]))
760 d = d[l:]
762 case extensionStatusRequest:
763 if length > 0 {
764 return false
766 m.ocspStapling = true
767 case extensionSessionTicket:
768 if length > 0 {
769 return false
771 m.ticketSupported = true
772 case extensionRenegotiationInfo:
773 if length == 0 {
774 return false
776 d := data[:length]
777 l := int(d[0])
778 d = d[1:]
779 if l != len(d) {
780 return false
783 m.secureRenegotiation = d
784 m.secureRenegotiationSupported = true
785 case extensionALPN:
786 d := data[:length]
787 if len(d) < 3 {
788 return false
790 l := int(d[0])<<8 | int(d[1])
791 if l != len(d)-2 {
792 return false
794 d = d[2:]
795 l = int(d[0])
796 if l != len(d)-1 {
797 return false
799 d = d[1:]
800 if len(d) == 0 {
801 // ALPN protocols must not be empty.
802 return false
804 m.alpnProtocol = string(d)
805 case extensionSCT:
806 d := data[:length]
808 if len(d) < 2 {
809 return false
811 l := int(d[0])<<8 | int(d[1])
812 d = d[2:]
813 if len(d) != l || l == 0 {
814 return false
817 m.scts = make([][]byte, 0, 3)
818 for len(d) != 0 {
819 if len(d) < 2 {
820 return false
822 sctLen := int(d[0])<<8 | int(d[1])
823 d = d[2:]
824 if sctLen == 0 || len(d) < sctLen {
825 return false
827 m.scts = append(m.scts, d[:sctLen])
828 d = d[sctLen:]
831 data = data[length:]
834 return true
837 type certificateMsg struct {
838 raw []byte
839 certificates [][]byte
842 func (m *certificateMsg) equal(i interface{}) bool {
843 m1, ok := i.(*certificateMsg)
844 if !ok {
845 return false
848 return bytes.Equal(m.raw, m1.raw) &&
849 eqByteSlices(m.certificates, m1.certificates)
852 func (m *certificateMsg) marshal() (x []byte) {
853 if m.raw != nil {
854 return m.raw
857 var i int
858 for _, slice := range m.certificates {
859 i += len(slice)
862 length := 3 + 3*len(m.certificates) + i
863 x = make([]byte, 4+length)
864 x[0] = typeCertificate
865 x[1] = uint8(length >> 16)
866 x[2] = uint8(length >> 8)
867 x[3] = uint8(length)
869 certificateOctets := length - 3
870 x[4] = uint8(certificateOctets >> 16)
871 x[5] = uint8(certificateOctets >> 8)
872 x[6] = uint8(certificateOctets)
874 y := x[7:]
875 for _, slice := range m.certificates {
876 y[0] = uint8(len(slice) >> 16)
877 y[1] = uint8(len(slice) >> 8)
878 y[2] = uint8(len(slice))
879 copy(y[3:], slice)
880 y = y[3+len(slice):]
883 m.raw = x
884 return
887 func (m *certificateMsg) unmarshal(data []byte) bool {
888 if len(data) < 7 {
889 return false
892 m.raw = data
893 certsLen := uint32(data[4])<<16 | uint32(data[5])<<8 | uint32(data[6])
894 if uint32(len(data)) != certsLen+7 {
895 return false
898 numCerts := 0
899 d := data[7:]
900 for certsLen > 0 {
901 if len(d) < 4 {
902 return false
904 certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
905 if uint32(len(d)) < 3+certLen {
906 return false
908 d = d[3+certLen:]
909 certsLen -= 3 + certLen
910 numCerts++
913 m.certificates = make([][]byte, numCerts)
914 d = data[7:]
915 for i := 0; i < numCerts; i++ {
916 certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
917 m.certificates[i] = d[3 : 3+certLen]
918 d = d[3+certLen:]
921 return true
924 type serverKeyExchangeMsg struct {
925 raw []byte
926 key []byte
929 func (m *serverKeyExchangeMsg) equal(i interface{}) bool {
930 m1, ok := i.(*serverKeyExchangeMsg)
931 if !ok {
932 return false
935 return bytes.Equal(m.raw, m1.raw) &&
936 bytes.Equal(m.key, m1.key)
939 func (m *serverKeyExchangeMsg) marshal() []byte {
940 if m.raw != nil {
941 return m.raw
943 length := len(m.key)
944 x := make([]byte, length+4)
945 x[0] = typeServerKeyExchange
946 x[1] = uint8(length >> 16)
947 x[2] = uint8(length >> 8)
948 x[3] = uint8(length)
949 copy(x[4:], m.key)
951 m.raw = x
952 return x
955 func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
956 m.raw = data
957 if len(data) < 4 {
958 return false
960 m.key = data[4:]
961 return true
964 type certificateStatusMsg struct {
965 raw []byte
966 statusType uint8
967 response []byte
970 func (m *certificateStatusMsg) equal(i interface{}) bool {
971 m1, ok := i.(*certificateStatusMsg)
972 if !ok {
973 return false
976 return bytes.Equal(m.raw, m1.raw) &&
977 m.statusType == m1.statusType &&
978 bytes.Equal(m.response, m1.response)
981 func (m *certificateStatusMsg) marshal() []byte {
982 if m.raw != nil {
983 return m.raw
986 var x []byte
987 if m.statusType == statusTypeOCSP {
988 x = make([]byte, 4+4+len(m.response))
989 x[0] = typeCertificateStatus
990 l := len(m.response) + 4
991 x[1] = byte(l >> 16)
992 x[2] = byte(l >> 8)
993 x[3] = byte(l)
994 x[4] = statusTypeOCSP
996 l -= 4
997 x[5] = byte(l >> 16)
998 x[6] = byte(l >> 8)
999 x[7] = byte(l)
1000 copy(x[8:], m.response)
1001 } else {
1002 x = []byte{typeCertificateStatus, 0, 0, 1, m.statusType}
1005 m.raw = x
1006 return x
1009 func (m *certificateStatusMsg) unmarshal(data []byte) bool {
1010 m.raw = data
1011 if len(data) < 5 {
1012 return false
1014 m.statusType = data[4]
1016 m.response = nil
1017 if m.statusType == statusTypeOCSP {
1018 if len(data) < 8 {
1019 return false
1021 respLen := uint32(data[5])<<16 | uint32(data[6])<<8 | uint32(data[7])
1022 if uint32(len(data)) != 4+4+respLen {
1023 return false
1025 m.response = data[8:]
1027 return true
1030 type serverHelloDoneMsg struct{}
1032 func (m *serverHelloDoneMsg) equal(i interface{}) bool {
1033 _, ok := i.(*serverHelloDoneMsg)
1034 return ok
1037 func (m *serverHelloDoneMsg) marshal() []byte {
1038 x := make([]byte, 4)
1039 x[0] = typeServerHelloDone
1040 return x
1043 func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
1044 return len(data) == 4
1047 type clientKeyExchangeMsg struct {
1048 raw []byte
1049 ciphertext []byte
1052 func (m *clientKeyExchangeMsg) equal(i interface{}) bool {
1053 m1, ok := i.(*clientKeyExchangeMsg)
1054 if !ok {
1055 return false
1058 return bytes.Equal(m.raw, m1.raw) &&
1059 bytes.Equal(m.ciphertext, m1.ciphertext)
1062 func (m *clientKeyExchangeMsg) marshal() []byte {
1063 if m.raw != nil {
1064 return m.raw
1066 length := len(m.ciphertext)
1067 x := make([]byte, length+4)
1068 x[0] = typeClientKeyExchange
1069 x[1] = uint8(length >> 16)
1070 x[2] = uint8(length >> 8)
1071 x[3] = uint8(length)
1072 copy(x[4:], m.ciphertext)
1074 m.raw = x
1075 return x
1078 func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
1079 m.raw = data
1080 if len(data) < 4 {
1081 return false
1083 l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
1084 if l != len(data)-4 {
1085 return false
1087 m.ciphertext = data[4:]
1088 return true
1091 type finishedMsg struct {
1092 raw []byte
1093 verifyData []byte
1096 func (m *finishedMsg) equal(i interface{}) bool {
1097 m1, ok := i.(*finishedMsg)
1098 if !ok {
1099 return false
1102 return bytes.Equal(m.raw, m1.raw) &&
1103 bytes.Equal(m.verifyData, m1.verifyData)
1106 func (m *finishedMsg) marshal() (x []byte) {
1107 if m.raw != nil {
1108 return m.raw
1111 x = make([]byte, 4+len(m.verifyData))
1112 x[0] = typeFinished
1113 x[3] = byte(len(m.verifyData))
1114 copy(x[4:], m.verifyData)
1115 m.raw = x
1116 return
1119 func (m *finishedMsg) unmarshal(data []byte) bool {
1120 m.raw = data
1121 if len(data) < 4 {
1122 return false
1124 m.verifyData = data[4:]
1125 return true
1128 type nextProtoMsg struct {
1129 raw []byte
1130 proto string
1133 func (m *nextProtoMsg) equal(i interface{}) bool {
1134 m1, ok := i.(*nextProtoMsg)
1135 if !ok {
1136 return false
1139 return bytes.Equal(m.raw, m1.raw) &&
1140 m.proto == m1.proto
1143 func (m *nextProtoMsg) marshal() []byte {
1144 if m.raw != nil {
1145 return m.raw
1147 l := len(m.proto)
1148 if l > 255 {
1149 l = 255
1152 padding := 32 - (l+2)%32
1153 length := l + padding + 2
1154 x := make([]byte, length+4)
1155 x[0] = typeNextProtocol
1156 x[1] = uint8(length >> 16)
1157 x[2] = uint8(length >> 8)
1158 x[3] = uint8(length)
1160 y := x[4:]
1161 y[0] = byte(l)
1162 copy(y[1:], []byte(m.proto[0:l]))
1163 y = y[1+l:]
1164 y[0] = byte(padding)
1166 m.raw = x
1168 return x
1171 func (m *nextProtoMsg) unmarshal(data []byte) bool {
1172 m.raw = data
1174 if len(data) < 5 {
1175 return false
1177 data = data[4:]
1178 protoLen := int(data[0])
1179 data = data[1:]
1180 if len(data) < protoLen {
1181 return false
1183 m.proto = string(data[0:protoLen])
1184 data = data[protoLen:]
1186 if len(data) < 1 {
1187 return false
1189 paddingLen := int(data[0])
1190 data = data[1:]
1191 if len(data) != paddingLen {
1192 return false
1195 return true
1198 type certificateRequestMsg struct {
1199 raw []byte
1200 // hasSignatureAndHash indicates whether this message includes a list
1201 // of signature and hash functions. This change was introduced with TLS
1202 // 1.2.
1203 hasSignatureAndHash bool
1205 certificateTypes []byte
1206 supportedSignatureAlgorithms []SignatureScheme
1207 certificateAuthorities [][]byte
1210 func (m *certificateRequestMsg) equal(i interface{}) bool {
1211 m1, ok := i.(*certificateRequestMsg)
1212 if !ok {
1213 return false
1216 return bytes.Equal(m.raw, m1.raw) &&
1217 bytes.Equal(m.certificateTypes, m1.certificateTypes) &&
1218 eqByteSlices(m.certificateAuthorities, m1.certificateAuthorities) &&
1219 eqSignatureAlgorithms(m.supportedSignatureAlgorithms, m1.supportedSignatureAlgorithms)
1222 func (m *certificateRequestMsg) marshal() (x []byte) {
1223 if m.raw != nil {
1224 return m.raw
1227 // See https://tools.ietf.org/html/rfc4346#section-7.4.4
1228 length := 1 + len(m.certificateTypes) + 2
1229 casLength := 0
1230 for _, ca := range m.certificateAuthorities {
1231 casLength += 2 + len(ca)
1233 length += casLength
1235 if m.hasSignatureAndHash {
1236 length += 2 + 2*len(m.supportedSignatureAlgorithms)
1239 x = make([]byte, 4+length)
1240 x[0] = typeCertificateRequest
1241 x[1] = uint8(length >> 16)
1242 x[2] = uint8(length >> 8)
1243 x[3] = uint8(length)
1245 x[4] = uint8(len(m.certificateTypes))
1247 copy(x[5:], m.certificateTypes)
1248 y := x[5+len(m.certificateTypes):]
1250 if m.hasSignatureAndHash {
1251 n := len(m.supportedSignatureAlgorithms) * 2
1252 y[0] = uint8(n >> 8)
1253 y[1] = uint8(n)
1254 y = y[2:]
1255 for _, sigAlgo := range m.supportedSignatureAlgorithms {
1256 y[0] = uint8(sigAlgo >> 8)
1257 y[1] = uint8(sigAlgo)
1258 y = y[2:]
1262 y[0] = uint8(casLength >> 8)
1263 y[1] = uint8(casLength)
1264 y = y[2:]
1265 for _, ca := range m.certificateAuthorities {
1266 y[0] = uint8(len(ca) >> 8)
1267 y[1] = uint8(len(ca))
1268 y = y[2:]
1269 copy(y, ca)
1270 y = y[len(ca):]
1273 m.raw = x
1274 return
1277 func (m *certificateRequestMsg) unmarshal(data []byte) bool {
1278 m.raw = data
1280 if len(data) < 5 {
1281 return false
1284 length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
1285 if uint32(len(data))-4 != length {
1286 return false
1289 numCertTypes := int(data[4])
1290 data = data[5:]
1291 if numCertTypes == 0 || len(data) <= numCertTypes {
1292 return false
1295 m.certificateTypes = make([]byte, numCertTypes)
1296 if copy(m.certificateTypes, data) != numCertTypes {
1297 return false
1300 data = data[numCertTypes:]
1302 if m.hasSignatureAndHash {
1303 if len(data) < 2 {
1304 return false
1306 sigAndHashLen := uint16(data[0])<<8 | uint16(data[1])
1307 data = data[2:]
1308 if sigAndHashLen&1 != 0 {
1309 return false
1311 if len(data) < int(sigAndHashLen) {
1312 return false
1314 numSigAlgos := sigAndHashLen / 2
1315 m.supportedSignatureAlgorithms = make([]SignatureScheme, numSigAlgos)
1316 for i := range m.supportedSignatureAlgorithms {
1317 m.supportedSignatureAlgorithms[i] = SignatureScheme(data[0])<<8 | SignatureScheme(data[1])
1318 data = data[2:]
1322 if len(data) < 2 {
1323 return false
1325 casLength := uint16(data[0])<<8 | uint16(data[1])
1326 data = data[2:]
1327 if len(data) < int(casLength) {
1328 return false
1330 cas := make([]byte, casLength)
1331 copy(cas, data)
1332 data = data[casLength:]
1334 m.certificateAuthorities = nil
1335 for len(cas) > 0 {
1336 if len(cas) < 2 {
1337 return false
1339 caLen := uint16(cas[0])<<8 | uint16(cas[1])
1340 cas = cas[2:]
1342 if len(cas) < int(caLen) {
1343 return false
1346 m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen])
1347 cas = cas[caLen:]
1350 return len(data) == 0
1353 type certificateVerifyMsg struct {
1354 raw []byte
1355 hasSignatureAndHash bool
1356 signatureAlgorithm SignatureScheme
1357 signature []byte
1360 func (m *certificateVerifyMsg) equal(i interface{}) bool {
1361 m1, ok := i.(*certificateVerifyMsg)
1362 if !ok {
1363 return false
1366 return bytes.Equal(m.raw, m1.raw) &&
1367 m.hasSignatureAndHash == m1.hasSignatureAndHash &&
1368 m.signatureAlgorithm == m1.signatureAlgorithm &&
1369 bytes.Equal(m.signature, m1.signature)
1372 func (m *certificateVerifyMsg) marshal() (x []byte) {
1373 if m.raw != nil {
1374 return m.raw
1377 // See https://tools.ietf.org/html/rfc4346#section-7.4.8
1378 siglength := len(m.signature)
1379 length := 2 + siglength
1380 if m.hasSignatureAndHash {
1381 length += 2
1383 x = make([]byte, 4+length)
1384 x[0] = typeCertificateVerify
1385 x[1] = uint8(length >> 16)
1386 x[2] = uint8(length >> 8)
1387 x[3] = uint8(length)
1388 y := x[4:]
1389 if m.hasSignatureAndHash {
1390 y[0] = uint8(m.signatureAlgorithm >> 8)
1391 y[1] = uint8(m.signatureAlgorithm)
1392 y = y[2:]
1394 y[0] = uint8(siglength >> 8)
1395 y[1] = uint8(siglength)
1396 copy(y[2:], m.signature)
1398 m.raw = x
1400 return
1403 func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
1404 m.raw = data
1406 if len(data) < 6 {
1407 return false
1410 length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
1411 if uint32(len(data))-4 != length {
1412 return false
1415 data = data[4:]
1416 if m.hasSignatureAndHash {
1417 m.signatureAlgorithm = SignatureScheme(data[0])<<8 | SignatureScheme(data[1])
1418 data = data[2:]
1421 if len(data) < 2 {
1422 return false
1424 siglength := int(data[0])<<8 + int(data[1])
1425 data = data[2:]
1426 if len(data) != siglength {
1427 return false
1430 m.signature = data
1432 return true
1435 type newSessionTicketMsg struct {
1436 raw []byte
1437 ticket []byte
1440 func (m *newSessionTicketMsg) equal(i interface{}) bool {
1441 m1, ok := i.(*newSessionTicketMsg)
1442 if !ok {
1443 return false
1446 return bytes.Equal(m.raw, m1.raw) &&
1447 bytes.Equal(m.ticket, m1.ticket)
1450 func (m *newSessionTicketMsg) marshal() (x []byte) {
1451 if m.raw != nil {
1452 return m.raw
1455 // See https://tools.ietf.org/html/rfc5077#section-3.3
1456 ticketLen := len(m.ticket)
1457 length := 2 + 4 + ticketLen
1458 x = make([]byte, 4+length)
1459 x[0] = typeNewSessionTicket
1460 x[1] = uint8(length >> 16)
1461 x[2] = uint8(length >> 8)
1462 x[3] = uint8(length)
1463 x[8] = uint8(ticketLen >> 8)
1464 x[9] = uint8(ticketLen)
1465 copy(x[10:], m.ticket)
1467 m.raw = x
1469 return
1472 func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
1473 m.raw = data
1475 if len(data) < 10 {
1476 return false
1479 length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
1480 if uint32(len(data))-4 != length {
1481 return false
1484 ticketLen := int(data[8])<<8 + int(data[9])
1485 if len(data)-10 != ticketLen {
1486 return false
1489 m.ticket = data[10:]
1491 return true
1494 type helloRequestMsg struct {
1497 func (*helloRequestMsg) marshal() []byte {
1498 return []byte{typeHelloRequest, 0, 0, 0}
1501 func (*helloRequestMsg) unmarshal(data []byte) bool {
1502 return len(data) == 4
1505 func eqUint16s(x, y []uint16) bool {
1506 if len(x) != len(y) {
1507 return false
1509 for i, v := range x {
1510 if y[i] != v {
1511 return false
1514 return true
1517 func eqCurveIDs(x, y []CurveID) bool {
1518 if len(x) != len(y) {
1519 return false
1521 for i, v := range x {
1522 if y[i] != v {
1523 return false
1526 return true
1529 func eqStrings(x, y []string) bool {
1530 if len(x) != len(y) {
1531 return false
1533 for i, v := range x {
1534 if y[i] != v {
1535 return false
1538 return true
1541 func eqByteSlices(x, y [][]byte) bool {
1542 if len(x) != len(y) {
1543 return false
1545 for i, v := range x {
1546 if !bytes.Equal(v, y[i]) {
1547 return false
1550 return true
1553 func eqSignatureAlgorithms(x, y []SignatureScheme) bool {
1554 if len(x) != len(y) {
1555 return false
1557 for i, v := range x {
1558 if v != y[i] {
1559 return false
1562 return true