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  }