MCPcopy Create free account
hub / github.com/XTLS/Go / handshake

Method handshake

handshake_client.go:381–456  ·  view source on GitHub ↗

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.

()

Source from the content-addressed store, hash-verified

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.
381func (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

Callers 1

clientHandshakeMethod · 0.95

Calls 14

processServerHelloMethod · 0.95
establishKeysMethod · 0.95
readSessionTicketMethod · 0.95
readFinishedMethod · 0.95
sendFinishedMethod · 0.95
doFullHandshakeMethod · 0.95
newFinishedHashFunction · 0.85
ekmFromMasterSecretFunction · 0.85
connectionStateLockedMethod · 0.80
sendAlertMethod · 0.80
flushMethod · 0.80

Tested by

no test coverage detected