github.com/ooni/psiphon/tunnel-core@v0.0.0-20230105123940-fe12a24c96ee/oovendor/quic-go/internal/handshake/session_ticket.go (about) 1 package handshake 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "time" 8 9 "github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/internal/wire" 10 "github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/quicvarint" 11 ) 12 13 const sessionTicketRevision = 2 14 15 type sessionTicket struct { 16 Parameters *wire.TransportParameters 17 RTT time.Duration // to be encoded in mus 18 } 19 20 func (t *sessionTicket) Marshal() []byte { 21 b := &bytes.Buffer{} 22 quicvarint.Write(b, sessionTicketRevision) 23 quicvarint.Write(b, uint64(t.RTT.Microseconds())) 24 t.Parameters.MarshalForSessionTicket(b) 25 return b.Bytes() 26 } 27 28 func (t *sessionTicket) Unmarshal(b []byte) error { 29 r := bytes.NewReader(b) 30 rev, err := quicvarint.Read(r) 31 if err != nil { 32 return errors.New("failed to read session ticket revision") 33 } 34 if rev != sessionTicketRevision { 35 return fmt.Errorf("unknown session ticket revision: %d", rev) 36 } 37 rtt, err := quicvarint.Read(r) 38 if err != nil { 39 return errors.New("failed to read RTT") 40 } 41 var tp wire.TransportParameters 42 if err := tp.UnmarshalFromSessionTicket(r); err != nil { 43 return fmt.Errorf("unmarshaling transport parameters from session ticket failed: %s", err.Error()) 44 } 45 t.Parameters = &tp 46 t.RTT = time.Duration(rtt) * time.Microsecond 47 return nil 48 }