()
| 704 | } |
| 705 | |
| 706 | func (hs *serverHandshakeStateTLS13) sendSessionTickets() error { |
| 707 | c := hs.c |
| 708 | |
| 709 | hs.clientFinished = hs.suite.finishedHash(c.in.trafficSecret, hs.transcript) |
| 710 | finishedMsg := &finishedMsg{ |
| 711 | verifyData: hs.clientFinished, |
| 712 | } |
| 713 | hs.transcript.Write(finishedMsg.marshal()) |
| 714 | |
| 715 | if !hs.shouldSendSessionTickets() { |
| 716 | return nil |
| 717 | } |
| 718 | |
| 719 | resumptionSecret := hs.suite.deriveSecret(hs.masterSecret, |
| 720 | resumptionLabel, hs.transcript) |
| 721 | |
| 722 | m := new(newSessionTicketMsgTLS13) |
| 723 | |
| 724 | var certsFromClient [][]byte |
| 725 | for _, cert := range c.peerCertificates { |
| 726 | certsFromClient = append(certsFromClient, cert.Raw) |
| 727 | } |
| 728 | state := sessionStateTLS13{ |
| 729 | cipherSuite: hs.suite.id, |
| 730 | createdAt: uint64(c.config.time().Unix()), |
| 731 | resumptionSecret: resumptionSecret, |
| 732 | certificate: Certificate{ |
| 733 | Certificate: certsFromClient, |
| 734 | OCSPStaple: c.ocspResponse, |
| 735 | SignedCertificateTimestamps: c.scts, |
| 736 | }, |
| 737 | } |
| 738 | var err error |
| 739 | m.label, err = c.encryptTicket(state.marshal()) |
| 740 | if err != nil { |
| 741 | return err |
| 742 | } |
| 743 | m.lifetime = uint32(maxSessionTicketLifetime / time.Second) |
| 744 | |
| 745 | // ticket_age_add is a random 32-bit value. See RFC 8446, section 4.6.1 |
| 746 | // The value is not stored anywhere; we never need to check the ticket age |
| 747 | // because 0-RTT is not supported. |
| 748 | ageAdd := make([]byte, 4) |
| 749 | _, err = hs.c.config.rand().Read(ageAdd) |
| 750 | if err != nil { |
| 751 | return err |
| 752 | } |
| 753 | m.ageAdd = binary.LittleEndian.Uint32(ageAdd) |
| 754 | |
| 755 | // ticket_nonce, which must be unique per connection, is always left at |
| 756 | // zero because we only ever send one ticket per connection. |
| 757 | |
| 758 | if _, err := c.writeRecord(recordTypeHandshake, m.marshal()); err != nil { |
| 759 | return err |
| 760 | } |
| 761 | |
| 762 | return nil |
| 763 | } |
no test coverage detected