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