Does the handshake, either a full one or resumes old session. Requires hs.c, hs.hello, hs.serverHello, and, optionally, hs.session to be set.
()
| 379 | // Does the handshake, either a full one or resumes old session. Requires hs.c, |
| 380 | // hs.hello, hs.serverHello, and, optionally, hs.session to be set. |
| 381 | func (hs *clientHandshakeState) handshake() error { |
| 382 | c := hs.c |
| 383 | |
| 384 | isResume, err := hs.processServerHello() |
| 385 | if err != nil { |
| 386 | return err |
| 387 | } |
| 388 | |
| 389 | hs.finishedHash = newFinishedHash(c.vers, hs.suite) |
| 390 | |
| 391 | // No signatures of the handshake are needed in a resumption. |
| 392 | // Otherwise, in a full handshake, if we don't have any certificates |
| 393 | // configured then we will never send a CertificateVerify message and |
| 394 | // thus no signatures are needed in that case either. |
| 395 | if isResume || (len(c.config.Certificates) == 0 && c.config.GetClientCertificate == nil) { |
| 396 | hs.finishedHash.discardHandshakeBuffer() |
| 397 | } |
| 398 | |
| 399 | hs.finishedHash.Write(hs.hello.marshal()) |
| 400 | hs.finishedHash.Write(hs.serverHello.marshal()) |
| 401 | |
| 402 | c.buffering = true |
| 403 | c.didResume = isResume |
| 404 | if isResume { |
| 405 | if err := hs.establishKeys(); err != nil { |
| 406 | return err |
| 407 | } |
| 408 | if err := hs.readSessionTicket(); err != nil { |
| 409 | return err |
| 410 | } |
| 411 | if err := hs.readFinished(c.serverFinished[:]); err != nil { |
| 412 | return err |
| 413 | } |
| 414 | c.clientFinishedIsFirst = false |
| 415 | // Make sure the connection is still being verified whether or not this |
| 416 | // is a resumption. Resumptions currently don't reverify certificates so |
| 417 | // they don't call verifyServerCertificate. See Issue 31641. |
| 418 | if c.config.VerifyConnection != nil { |
| 419 | if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil { |
| 420 | c.sendAlert(alertBadCertificate) |
| 421 | return err |
| 422 | } |
| 423 | } |
| 424 | if err := hs.sendFinished(c.clientFinished[:]); err != nil { |
| 425 | return err |
| 426 | } |
| 427 | if _, err := c.flush(); err != nil { |
| 428 | return err |
| 429 | } |
| 430 | } else { |
| 431 | if err := hs.doFullHandshake(); err != nil { |
| 432 | return err |
| 433 | } |
| 434 | if err := hs.establishKeys(); err != nil { |
| 435 | return err |
| 436 | } |
| 437 | if err := hs.sendFinished(c.clientFinished[:]); err != nil { |
| 438 | return err |
no test coverage detected