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