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