Home | History | Annotate | Download | only in tls
      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 
      5 package tls
      6 
      7 import (
      8 	"bytes"
      9 	"strings"
     10 )
     11 
     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
     31 }
     32 
     33 func (m *clientHelloMsg) equal(i interface{}) bool {
     34 	m1, ok := i.(*clientHelloMsg)
     35 	if !ok {
     36 		return false
     37 	}
     38 
     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)
     57 }
     58 
     59 func (m *clientHelloMsg) marshal() []byte {
     60 	if m.raw != nil {
     61 		return m.raw
     62 	}
     63 
     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++
     69 	}
     70 	if m.ocspStapling {
     71 		extensionsLength += 1 + 2 + 2
     72 		numExtensions++
     73 	}
     74 	if len(m.serverName) > 0 {
     75 		extensionsLength += 5 + len(m.serverName)
     76 		numExtensions++
     77 	}
     78 	if len(m.supportedCurves) > 0 {
     79 		extensionsLength += 2 + 2*len(m.supportedCurves)
     80 		numExtensions++
     81 	}
     82 	if len(m.supportedPoints) > 0 {
     83 		extensionsLength += 1 + len(m.supportedPoints)
     84 		numExtensions++
     85 	}
     86 	if m.ticketSupported {
     87 		extensionsLength += len(m.sessionTicket)
     88 		numExtensions++
     89 	}
     90 	if len(m.supportedSignatureAlgorithms) > 0 {
     91 		extensionsLength += 2 + 2*len(m.supportedSignatureAlgorithms)
     92 		numExtensions++
     93 	}
     94 	if m.secureRenegotiationSupported {
     95 		extensionsLength += 1 + len(m.secureRenegotiation)
     96 		numExtensions++
     97 	}
     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")
    103 			}
    104 			extensionsLength++
    105 			extensionsLength += len(s)
    106 		}
    107 		numExtensions++
    108 	}
    109 	if m.scts {
    110 		numExtensions++
    111 	}
    112 	if numExtensions > 0 {
    113 		extensionsLength += 4 * numExtensions
    114 		length += 2 + extensionsLength
    115 	}
    116 
    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)
    133 	}
    134 	z := y[2+len(m.cipherSuites)*2:]
    135 	z[0] = uint8(len(m.compressionMethods))
    136 	copy(z[1:], m.compressionMethods)
    137 
    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:]
    143 	}
    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:]
    149 	}
    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:]
    157 
    158 		// RFC 3546, section 3.1
    159 		//
    160 		// struct {
    161 		//     NameType name_type;
    162 		//     select (name_type) {
    163 		//         case host_name: HostName;
    164 		//     } name;
    165 		// } ServerName;
    166 		//
    167 		// enum {
    168 		//     host_name(0), (255)
    169 		// } NameType;
    170 		//
    171 		// opaque HostName<1..2^16-1>;
    172 		//
    173 		// struct {
    174 		//     ServerName server_name_list<1..2^16-1>
    175 		// } ServerNameList;
    176 
    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:]
    183 	}
    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:]
    193 	}
    194 	if len(m.supportedCurves) > 0 {
    195 		// http://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:]
    209 		}
    210 	}
    211 	if len(m.supportedPoints) > 0 {
    212 		// http://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)
    218 		l--
    219 		z[4] = byte(l)
    220 		z = z[5:]
    221 		for _, pointFormat := range m.supportedPoints {
    222 			z[0] = pointFormat
    223 			z = z[1:]
    224 		}
    225 	}
    226 	if m.ticketSupported {
    227 		// http://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):]
    236 	}
    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:]
    245 
    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:]
    254 		}
    255 	}
    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):]
    265 	}
    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:]
    271 
    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
    279 		}
    280 
    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)
    286 	}
    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:]
    293 	}
    294 
    295 	m.raw = x
    296 
    297 	return x
    298 }
    299 
    300 func (m *clientHelloMsg) unmarshal(data []byte) bool {
    301 	if len(data) < 42 {
    302 		return false
    303 	}
    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
    310 	}
    311 	m.sessionId = data[39 : 39+sessionIdLen]
    312 	data = data[39+sessionIdLen:]
    313 	if len(data) < 2 {
    314 		return false
    315 	}
    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
    321 	}
    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
    328 		}
    329 	}
    330 	data = data[2+cipherSuiteLen:]
    331 	if len(data) < 1 {
    332 		return false
    333 	}
    334 	compressionMethodsLen := int(data[0])
    335 	if len(data) < 1+compressionMethodsLen {
    336 		return false
    337 	}
    338 	m.compressionMethods = data[1 : 1+compressionMethodsLen]
    339 
    340 	data = data[1+compressionMethodsLen:]
    341 
    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
    350 
    351 	if len(data) == 0 {
    352 		// ClientHello is optionally followed by extension data
    353 		return true
    354 	}
    355 	if len(data) < 2 {
    356 		return false
    357 	}
    358 
    359 	extensionsLength := int(data[0])<<8 | int(data[1])
    360 	data = data[2:]
    361 	if extensionsLength != len(data) {
    362 		return false
    363 	}
    364 
    365 	for len(data) != 0 {
    366 		if len(data) < 4 {
    367 			return false
    368 		}
    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
    374 		}
    375 
    376 		switch extension {
    377 		case extensionServerName:
    378 			d := data[:length]
    379 			if len(d) < 2 {
    380 				return false
    381 			}
    382 			namesLen := int(d[0])<<8 | int(d[1])
    383 			d = d[2:]
    384 			if len(d) != namesLen {
    385 				return false
    386 			}
    387 			for len(d) > 0 {
    388 				if len(d) < 3 {
    389 					return false
    390 				}
    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
    396 				}
    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
    404 					}
    405 					break
    406 				}
    407 				d = d[nameLen:]
    408 			}
    409 		case extensionNextProtoNeg:
    410 			if length > 0 {
    411 				return false
    412 			}
    413 			m.nextProtoNeg = true
    414 		case extensionStatusRequest:
    415 			m.ocspStapling = length > 0 && data[0] == statusTypeOCSP
    416 		case extensionSupportedCurves:
    417 			// http://tools.ietf.org/html/rfc4492#section-5.5.1
    418 			if length < 2 {
    419 				return false
    420 			}
    421 			l := int(data[0])<<8 | int(data[1])
    422 			if l%2 == 1 || length != l+2 {
    423 				return false
    424 			}
    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:]
    431 			}
    432 		case extensionSupportedPoints:
    433 			// http://tools.ietf.org/html/rfc4492#section-5.5.2
    434 			if length < 1 {
    435 				return false
    436 			}
    437 			l := int(data[0])
    438 			if length != l+1 {
    439 				return false
    440 			}
    441 			m.supportedPoints = make([]uint8, l)
    442 			copy(m.supportedPoints, data[1:])
    443 		case extensionSessionTicket:
    444 			// http://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
    451 			}
    452 			l := int(data[0])<<8 | int(data[1])
    453 			if l != length-2 {
    454 				return false
    455 			}
    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:]
    462 			}
    463 		case extensionRenegotiationInfo:
    464 			if length == 0 {
    465 				return false
    466 			}
    467 			d := data[:length]
    468 			l := int(d[0])
    469 			d = d[1:]
    470 			if l != len(d) {
    471 				return false
    472 			}
    473 
    474 			m.secureRenegotiation = d
    475 			m.secureRenegotiationSupported = true
    476 		case extensionALPN:
    477 			if length < 2 {
    478 				return false
    479 			}
    480 			l := int(data[0])<<8 | int(data[1])
    481 			if l != length-2 {
    482 				return false
    483 			}
    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
    490 				}
    491 				m.alpnProtocols = append(m.alpnProtocols, string(d[:stringLen]))
    492 				d = d[stringLen:]
    493 			}
    494 		case extensionSCT:
    495 			m.scts = true
    496 			if length != 0 {
    497 				return false
    498 			}
    499 		}
    500 		data = data[length:]
    501 	}
    502 
    503 	return true
    504 }
    505 
    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
    521 }
    522 
    523 func (m *serverHelloMsg) equal(i interface{}) bool {
    524 	m1, ok := i.(*serverHelloMsg)
    525 	if !ok {
    526 		return false
    527 	}
    528 
    529 	if len(m.scts) != len(m1.scts) {
    530 		return false
    531 	}
    532 	for i, sct := range m.scts {
    533 		if !bytes.Equal(sct, m1.scts[i]) {
    534 			return false
    535 		}
    536 	}
    537 
    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
    551 }
    552 
    553 func (m *serverHelloMsg) marshal() []byte {
    554 	if m.raw != nil {
    555 		return m.raw
    556 	}
    557 
    558 	length := 38 + len(m.sessionId)
    559 	numExtensions := 0
    560 	extensionsLength := 0
    561 
    562 	nextProtoLen := 0
    563 	if m.nextProtoNeg {
    564 		numExtensions++
    565 		for _, v := range m.nextProtos {
    566 			nextProtoLen += len(v)
    567 		}
    568 		nextProtoLen += len(m.nextProtos)
    569 		extensionsLength += nextProtoLen
    570 	}
    571 	if m.ocspStapling {
    572 		numExtensions++
    573 	}
    574 	if m.ticketSupported {
    575 		numExtensions++
    576 	}
    577 	if m.secureRenegotiationSupported {
    578 		extensionsLength += 1 + len(m.secureRenegotiation)
    579 		numExtensions++
    580 	}
    581 	if alpnLen := len(m.alpnProtocol); alpnLen > 0 {
    582 		if alpnLen >= 256 {
    583 			panic("invalid ALPN protocol")
    584 		}
    585 		extensionsLength += 2 + 1 + alpnLen
    586 		numExtensions++
    587 	}
    588 	sctLen := 0
    589 	if len(m.scts) > 0 {
    590 		for _, sct := range m.scts {
    591 			sctLen += len(sct) + 2
    592 		}
    593 		extensionsLength += 2 + sctLen
    594 		numExtensions++
    595 	}
    596 
    597 	if numExtensions > 0 {
    598 		extensionsLength += 4 * numExtensions
    599 		length += 2 + extensionsLength
    600 	}
    601 
    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
    616 
    617 	z = z[3:]
    618 	if numExtensions > 0 {
    619 		z[0] = byte(extensionsLength >> 8)
    620 		z[1] = byte(extensionsLength)
    621 		z = z[2:]
    622 	}
    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:]
    629 
    630 		for _, v := range m.nextProtos {
    631 			l := len(v)
    632 			if l > 255 {
    633 				l = 255
    634 			}
    635 			z[0] = byte(l)
    636 			copy(z[1:], []byte(v[0:l]))
    637 			z = z[1+l:]
    638 		}
    639 	}
    640 	if m.ocspStapling {
    641 		z[0] = byte(extensionStatusRequest >> 8)
    642 		z[1] = byte(extensionStatusRequest)
    643 		z = z[4:]
    644 	}
    645 	if m.ticketSupported {
    646 		z[0] = byte(extensionSessionTicket >> 8)
    647 		z[1] = byte(extensionSessionTicket)
    648 		z = z[4:]
    649 	}
    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):]
    659 	}
    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:]
    673 	}
    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)
    682 
    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:]
    689 		}
    690 	}
    691 
    692 	m.raw = x
    693 
    694 	return x
    695 }
    696 
    697 func (m *serverHelloMsg) unmarshal(data []byte) bool {
    698 	if len(data) < 42 {
    699 		return false
    700 	}
    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
    707 	}
    708 	m.sessionId = data[39 : 39+sessionIdLen]
    709 	data = data[39+sessionIdLen:]
    710 	if len(data) < 3 {
    711 		return false
    712 	}
    713 	m.cipherSuite = uint16(data[0])<<8 | uint16(data[1])
    714 	m.compressionMethod = data[2]
    715 	data = data[3:]
    716 
    717 	m.nextProtoNeg = false
    718 	m.nextProtos = nil
    719 	m.ocspStapling = false
    720 	m.scts = nil
    721 	m.ticketSupported = false
    722 	m.alpnProtocol = ""
    723 
    724 	if len(data) == 0 {
    725 		// ServerHello is optionally followed by extension data
    726 		return true
    727 	}
    728 	if len(data) < 2 {
    729 		return false
    730 	}
    731 
    732 	extensionsLength := int(data[0])<<8 | int(data[1])
    733 	data = data[2:]
    734 	if len(data) != extensionsLength {
    735 		return false
    736 	}
    737 
    738 	for len(data) != 0 {
    739 		if len(data) < 4 {
    740 			return false
    741 		}
    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
    747 		}
    748 
    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
    758 				}
    759 				m.nextProtos = append(m.nextProtos, string(d[:l]))
    760 				d = d[l:]
    761 			}
    762 		case extensionStatusRequest:
    763 			if length > 0 {
    764 				return false
    765 			}
    766 			m.ocspStapling = true
    767 		case extensionSessionTicket:
    768 			if length > 0 {
    769 				return false
    770 			}
    771 			m.ticketSupported = true
    772 		case extensionRenegotiationInfo:
    773 			if length == 0 {
    774 				return false
    775 			}
    776 			d := data[:length]
    777 			l := int(d[0])
    778 			d = d[1:]
    779 			if l != len(d) {
    780 				return false
    781 			}
    782 
    783 			m.secureRenegotiation = d
    784 			m.secureRenegotiationSupported = true
    785 		case extensionALPN:
    786 			d := data[:length]
    787 			if len(d) < 3 {
    788 				return false
    789 			}
    790 			l := int(d[0])<<8 | int(d[1])
    791 			if l != len(d)-2 {
    792 				return false
    793 			}
    794 			d = d[2:]
    795 			l = int(d[0])
    796 			if l != len(d)-1 {
    797 				return false
    798 			}
    799 			d = d[1:]
    800 			if len(d) == 0 {
    801 				// ALPN protocols must not be empty.
    802 				return false
    803 			}
    804 			m.alpnProtocol = string(d)
    805 		case extensionSCT:
    806 			d := data[:length]
    807 
    808 			if len(d) < 2 {
    809 				return false
    810 			}
    811 			l := int(d[0])<<8 | int(d[1])
    812 			d = d[2:]
    813 			if len(d) != l || l == 0 {
    814 				return false
    815 			}
    816 
    817 			m.scts = make([][]byte, 0, 3)
    818 			for len(d) != 0 {
    819 				if len(d) < 2 {
    820 					return false
    821 				}
    822 				sctLen := int(d[0])<<8 | int(d[1])
    823 				d = d[2:]
    824 				if sctLen == 0 || len(d) < sctLen {
    825 					return false
    826 				}
    827 				m.scts = append(m.scts, d[:sctLen])
    828 				d = d[sctLen:]
    829 			}
    830 		}
    831 		data = data[length:]
    832 	}
    833 
    834 	return true
    835 }
    836 
    837 type certificateMsg struct {
    838 	raw          []byte
    839 	certificates [][]byte
    840 }
    841 
    842 func (m *certificateMsg) equal(i interface{}) bool {
    843 	m1, ok := i.(*certificateMsg)
    844 	if !ok {
    845 		return false
    846 	}
    847 
    848 	return bytes.Equal(m.raw, m1.raw) &&
    849 		eqByteSlices(m.certificates, m1.certificates)
    850 }
    851 
    852 func (m *certificateMsg) marshal() (x []byte) {
    853 	if m.raw != nil {
    854 		return m.raw
    855 	}
    856 
    857 	var i int
    858 	for _, slice := range m.certificates {
    859 		i += len(slice)
    860 	}
    861 
    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)
    868 
    869 	certificateOctets := length - 3
    870 	x[4] = uint8(certificateOctets >> 16)
    871 	x[5] = uint8(certificateOctets >> 8)
    872 	x[6] = uint8(certificateOctets)
    873 
    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):]
    881 	}
    882 
    883 	m.raw = x
    884 	return
    885 }
    886 
    887 func (m *certificateMsg) unmarshal(data []byte) bool {
    888 	if len(data) < 7 {
    889 		return false
    890 	}
    891 
    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
    896 	}
    897 
    898 	numCerts := 0
    899 	d := data[7:]
    900 	for certsLen > 0 {
    901 		if len(d) < 4 {
    902 			return false
    903 		}
    904 		certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
    905 		if uint32(len(d)) < 3+certLen {
    906 			return false
    907 		}
    908 		d = d[3+certLen:]
    909 		certsLen -= 3 + certLen
    910 		numCerts++
    911 	}
    912 
    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:]
    919 	}
    920 
    921 	return true
    922 }
    923 
    924 type serverKeyExchangeMsg struct {
    925 	raw []byte
    926 	key []byte
    927 }
    928 
    929 func (m *serverKeyExchangeMsg) equal(i interface{}) bool {
    930 	m1, ok := i.(*serverKeyExchangeMsg)
    931 	if !ok {
    932 		return false
    933 	}
    934 
    935 	return bytes.Equal(m.raw, m1.raw) &&
    936 		bytes.Equal(m.key, m1.key)
    937 }
    938 
    939 func (m *serverKeyExchangeMsg) marshal() []byte {
    940 	if m.raw != nil {
    941 		return m.raw
    942 	}
    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)
    950 
    951 	m.raw = x
    952 	return x
    953 }
    954 
    955 func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
    956 	m.raw = data
    957 	if len(data) < 4 {
    958 		return false
    959 	}
    960 	m.key = data[4:]
    961 	return true
    962 }
    963 
    964 type certificateStatusMsg struct {
    965 	raw        []byte
    966 	statusType uint8
    967 	response   []byte
    968 }
    969 
    970 func (m *certificateStatusMsg) equal(i interface{}) bool {
    971 	m1, ok := i.(*certificateStatusMsg)
    972 	if !ok {
    973 		return false
    974 	}
    975 
    976 	return bytes.Equal(m.raw, m1.raw) &&
    977 		m.statusType == m1.statusType &&
    978 		bytes.Equal(m.response, m1.response)
    979 }
    980 
    981 func (m *certificateStatusMsg) marshal() []byte {
    982 	if m.raw != nil {
    983 		return m.raw
    984 	}
    985 
    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
    995 
    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}
   1003 	}
   1004 
   1005 	m.raw = x
   1006 	return x
   1007 }
   1008 
   1009 func (m *certificateStatusMsg) unmarshal(data []byte) bool {
   1010 	m.raw = data
   1011 	if len(data) < 5 {
   1012 		return false
   1013 	}
   1014 	m.statusType = data[4]
   1015 
   1016 	m.response = nil
   1017 	if m.statusType == statusTypeOCSP {
   1018 		if len(data) < 8 {
   1019 			return false
   1020 		}
   1021 		respLen := uint32(data[5])<<16 | uint32(data[6])<<8 | uint32(data[7])
   1022 		if uint32(len(data)) != 4+4+respLen {
   1023 			return false
   1024 		}
   1025 		m.response = data[8:]
   1026 	}
   1027 	return true
   1028 }
   1029 
   1030 type serverHelloDoneMsg struct{}
   1031 
   1032 func (m *serverHelloDoneMsg) equal(i interface{}) bool {
   1033 	_, ok := i.(*serverHelloDoneMsg)
   1034 	return ok
   1035 }
   1036 
   1037 func (m *serverHelloDoneMsg) marshal() []byte {
   1038 	x := make([]byte, 4)
   1039 	x[0] = typeServerHelloDone
   1040 	return x
   1041 }
   1042 
   1043 func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
   1044 	return len(data) == 4
   1045 }
   1046 
   1047 type clientKeyExchangeMsg struct {
   1048 	raw        []byte
   1049 	ciphertext []byte
   1050 }
   1051 
   1052 func (m *clientKeyExchangeMsg) equal(i interface{}) bool {
   1053 	m1, ok := i.(*clientKeyExchangeMsg)
   1054 	if !ok {
   1055 		return false
   1056 	}
   1057 
   1058 	return bytes.Equal(m.raw, m1.raw) &&
   1059 		bytes.Equal(m.ciphertext, m1.ciphertext)
   1060 }
   1061 
   1062 func (m *clientKeyExchangeMsg) marshal() []byte {
   1063 	if m.raw != nil {
   1064 		return m.raw
   1065 	}
   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)
   1073 
   1074 	m.raw = x
   1075 	return x
   1076 }
   1077 
   1078 func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
   1079 	m.raw = data
   1080 	if len(data) < 4 {
   1081 		return false
   1082 	}
   1083 	l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
   1084 	if l != len(data)-4 {
   1085 		return false
   1086 	}
   1087 	m.ciphertext = data[4:]
   1088 	return true
   1089 }
   1090 
   1091 type finishedMsg struct {
   1092 	raw        []byte
   1093 	verifyData []byte
   1094 }
   1095 
   1096 func (m *finishedMsg) equal(i interface{}) bool {
   1097 	m1, ok := i.(*finishedMsg)
   1098 	if !ok {
   1099 		return false
   1100 	}
   1101 
   1102 	return bytes.Equal(m.raw, m1.raw) &&
   1103 		bytes.Equal(m.verifyData, m1.verifyData)
   1104 }
   1105 
   1106 func (m *finishedMsg) marshal() (x []byte) {
   1107 	if m.raw != nil {
   1108 		return m.raw
   1109 	}
   1110 
   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
   1117 }
   1118 
   1119 func (m *finishedMsg) unmarshal(data []byte) bool {
   1120 	m.raw = data
   1121 	if len(data) < 4 {
   1122 		return false
   1123 	}
   1124 	m.verifyData = data[4:]
   1125 	return true
   1126 }
   1127 
   1128 type nextProtoMsg struct {
   1129 	raw   []byte
   1130 	proto string
   1131 }
   1132 
   1133 func (m *nextProtoMsg) equal(i interface{}) bool {
   1134 	m1, ok := i.(*nextProtoMsg)
   1135 	if !ok {
   1136 		return false
   1137 	}
   1138 
   1139 	return bytes.Equal(m.raw, m1.raw) &&
   1140 		m.proto == m1.proto
   1141 }
   1142 
   1143 func (m *nextProtoMsg) marshal() []byte {
   1144 	if m.raw != nil {
   1145 		return m.raw
   1146 	}
   1147 	l := len(m.proto)
   1148 	if l > 255 {
   1149 		l = 255
   1150 	}
   1151 
   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)
   1159 
   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)
   1165 
   1166 	m.raw = x
   1167 
   1168 	return x
   1169 }
   1170 
   1171 func (m *nextProtoMsg) unmarshal(data []byte) bool {
   1172 	m.raw = data
   1173 
   1174 	if len(data) < 5 {
   1175 		return false
   1176 	}
   1177 	data = data[4:]
   1178 	protoLen := int(data[0])
   1179 	data = data[1:]
   1180 	if len(data) < protoLen {
   1181 		return false
   1182 	}
   1183 	m.proto = string(data[0:protoLen])
   1184 	data = data[protoLen:]
   1185 
   1186 	if len(data) < 1 {
   1187 		return false
   1188 	}
   1189 	paddingLen := int(data[0])
   1190 	data = data[1:]
   1191 	if len(data) != paddingLen {
   1192 		return false
   1193 	}
   1194 
   1195 	return true
   1196 }
   1197 
   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
   1204 
   1205 	certificateTypes             []byte
   1206 	supportedSignatureAlgorithms []SignatureScheme
   1207 	certificateAuthorities       [][]byte
   1208 }
   1209 
   1210 func (m *certificateRequestMsg) equal(i interface{}) bool {
   1211 	m1, ok := i.(*certificateRequestMsg)
   1212 	if !ok {
   1213 		return false
   1214 	}
   1215 
   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)
   1220 }
   1221 
   1222 func (m *certificateRequestMsg) marshal() (x []byte) {
   1223 	if m.raw != nil {
   1224 		return m.raw
   1225 	}
   1226 
   1227 	// See http://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)
   1232 	}
   1233 	length += casLength
   1234 
   1235 	if m.hasSignatureAndHash {
   1236 		length += 2 + 2*len(m.supportedSignatureAlgorithms)
   1237 	}
   1238 
   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)
   1244 
   1245 	x[4] = uint8(len(m.certificateTypes))
   1246 
   1247 	copy(x[5:], m.certificateTypes)
   1248 	y := x[5+len(m.certificateTypes):]
   1249 
   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:]
   1259 		}
   1260 	}
   1261 
   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):]
   1271 	}
   1272 
   1273 	m.raw = x
   1274 	return
   1275 }
   1276 
   1277 func (m *certificateRequestMsg) unmarshal(data []byte) bool {
   1278 	m.raw = data
   1279 
   1280 	if len(data) < 5 {
   1281 		return false
   1282 	}
   1283 
   1284 	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
   1285 	if uint32(len(data))-4 != length {
   1286 		return false
   1287 	}
   1288 
   1289 	numCertTypes := int(data[4])
   1290 	data = data[5:]
   1291 	if numCertTypes == 0 || len(data) <= numCertTypes {
   1292 		return false
   1293 	}
   1294 
   1295 	m.certificateTypes = make([]byte, numCertTypes)
   1296 	if copy(m.certificateTypes, data) != numCertTypes {
   1297 		return false
   1298 	}
   1299 
   1300 	data = data[numCertTypes:]
   1301 
   1302 	if m.hasSignatureAndHash {
   1303 		if len(data) < 2 {
   1304 			return false
   1305 		}
   1306 		sigAndHashLen := uint16(data[0])<<8 | uint16(data[1])
   1307 		data = data[2:]
   1308 		if sigAndHashLen&1 != 0 {
   1309 			return false
   1310 		}
   1311 		if len(data) < int(sigAndHashLen) {
   1312 			return false
   1313 		}
   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:]
   1319 		}
   1320 	}
   1321 
   1322 	if len(data) < 2 {
   1323 		return false
   1324 	}
   1325 	casLength := uint16(data[0])<<8 | uint16(data[1])
   1326 	data = data[2:]
   1327 	if len(data) < int(casLength) {
   1328 		return false
   1329 	}
   1330 	cas := make([]byte, casLength)
   1331 	copy(cas, data)
   1332 	data = data[casLength:]
   1333 
   1334 	m.certificateAuthorities = nil
   1335 	for len(cas) > 0 {
   1336 		if len(cas) < 2 {
   1337 			return false
   1338 		}
   1339 		caLen := uint16(cas[0])<<8 | uint16(cas[1])
   1340 		cas = cas[2:]
   1341 
   1342 		if len(cas) < int(caLen) {
   1343 			return false
   1344 		}
   1345 
   1346 		m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen])
   1347 		cas = cas[caLen:]
   1348 	}
   1349 
   1350 	return len(data) == 0
   1351 }
   1352 
   1353 type certificateVerifyMsg struct {
   1354 	raw                 []byte
   1355 	hasSignatureAndHash bool
   1356 	signatureAlgorithm  SignatureScheme
   1357 	signature           []byte
   1358 }
   1359 
   1360 func (m *certificateVerifyMsg) equal(i interface{}) bool {
   1361 	m1, ok := i.(*certificateVerifyMsg)
   1362 	if !ok {
   1363 		return false
   1364 	}
   1365 
   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)
   1370 }
   1371 
   1372 func (m *certificateVerifyMsg) marshal() (x []byte) {
   1373 	if m.raw != nil {
   1374 		return m.raw
   1375 	}
   1376 
   1377 	// See http://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
   1382 	}
   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:]
   1393 	}
   1394 	y[0] = uint8(siglength >> 8)
   1395 	y[1] = uint8(siglength)
   1396 	copy(y[2:], m.signature)
   1397 
   1398 	m.raw = x
   1399 
   1400 	return
   1401 }
   1402 
   1403 func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
   1404 	m.raw = data
   1405 
   1406 	if len(data) < 6 {
   1407 		return false
   1408 	}
   1409 
   1410 	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
   1411 	if uint32(len(data))-4 != length {
   1412 		return false
   1413 	}
   1414 
   1415 	data = data[4:]
   1416 	if m.hasSignatureAndHash {
   1417 		m.signatureAlgorithm = SignatureScheme(data[0])<<8 | SignatureScheme(data[1])
   1418 		data = data[2:]
   1419 	}
   1420 
   1421 	if len(data) < 2 {
   1422 		return false
   1423 	}
   1424 	siglength := int(data[0])<<8 + int(data[1])
   1425 	data = data[2:]
   1426 	if len(data) != siglength {
   1427 		return false
   1428 	}
   1429 
   1430 	m.signature = data
   1431 
   1432 	return true
   1433 }
   1434 
   1435 type newSessionTicketMsg struct {
   1436 	raw    []byte
   1437 	ticket []byte
   1438 }
   1439 
   1440 func (m *newSessionTicketMsg) equal(i interface{}) bool {
   1441 	m1, ok := i.(*newSessionTicketMsg)
   1442 	if !ok {
   1443 		return false
   1444 	}
   1445 
   1446 	return bytes.Equal(m.raw, m1.raw) &&
   1447 		bytes.Equal(m.ticket, m1.ticket)
   1448 }
   1449 
   1450 func (m *newSessionTicketMsg) marshal() (x []byte) {
   1451 	if m.raw != nil {
   1452 		return m.raw
   1453 	}
   1454 
   1455 	// See http://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)
   1466 
   1467 	m.raw = x
   1468 
   1469 	return
   1470 }
   1471 
   1472 func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
   1473 	m.raw = data
   1474 
   1475 	if len(data) < 10 {
   1476 		return false
   1477 	}
   1478 
   1479 	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
   1480 	if uint32(len(data))-4 != length {
   1481 		return false
   1482 	}
   1483 
   1484 	ticketLen := int(data[8])<<8 + int(data[9])
   1485 	if len(data)-10 != ticketLen {
   1486 		return false
   1487 	}
   1488 
   1489 	m.ticket = data[10:]
   1490 
   1491 	return true
   1492 }
   1493 
   1494 type helloRequestMsg struct {
   1495 }
   1496 
   1497 func (*helloRequestMsg) marshal() []byte {
   1498 	return []byte{typeHelloRequest, 0, 0, 0}
   1499 }
   1500 
   1501 func (*helloRequestMsg) unmarshal(data []byte) bool {
   1502 	return len(data) == 4
   1503 }
   1504 
   1505 func eqUint16s(x, y []uint16) bool {
   1506 	if len(x) != len(y) {
   1507 		return false
   1508 	}
   1509 	for i, v := range x {
   1510 		if y[i] != v {
   1511 			return false
   1512 		}
   1513 	}
   1514 	return true
   1515 }
   1516 
   1517 func eqCurveIDs(x, y []CurveID) bool {
   1518 	if len(x) != len(y) {
   1519 		return false
   1520 	}
   1521 	for i, v := range x {
   1522 		if y[i] != v {
   1523 			return false
   1524 		}
   1525 	}
   1526 	return true
   1527 }
   1528 
   1529 func eqStrings(x, y []string) bool {
   1530 	if len(x) != len(y) {
   1531 		return false
   1532 	}
   1533 	for i, v := range x {
   1534 		if y[i] != v {
   1535 			return false
   1536 		}
   1537 	}
   1538 	return true
   1539 }
   1540 
   1541 func eqByteSlices(x, y [][]byte) bool {
   1542 	if len(x) != len(y) {
   1543 		return false
   1544 	}
   1545 	for i, v := range x {
   1546 		if !bytes.Equal(v, y[i]) {
   1547 			return false
   1548 		}
   1549 	}
   1550 	return true
   1551 }
   1552 
   1553 func eqSignatureAlgorithms(x, y []SignatureScheme) bool {
   1554 	if len(x) != len(y) {
   1555 		return false
   1556 	}
   1557 	for i, v := range x {
   1558 		if v != y[i] {
   1559 			return false
   1560 		}
   1561 	}
   1562 	return true
   1563 }
   1564