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