package tls

import 

type ISessionTicketExtension interface {
	TLSExtension

	// If false is returned, utls will invoke `InitializeByUtls()` for the necessary initialization.
	Initializable

	// InitializeByUtls is invoked when IsInitialized() returns false.
	// It initializes the extension using a real and valid TLS 1.2 session.
	InitializeByUtls(session *SessionState, ticket []byte)

	GetSession() *SessionState

	GetTicket() []byte
}

// SessionTicketExtension implements session_ticket (35)
type SessionTicketExtension struct {
	Session     *SessionState
	Ticket      []byte
	Initialized bool
}

func ( *SessionTicketExtension) ( *UConn) error {
	// session states are handled later. At this point tickets aren't
	// being loaded by utls, so don't write anything to the UConn.
	.HandshakeState.Hello.TicketSupported = true // This doesn't really matter, this field is only used to add session ticket ext in go tls.
	return nil
}

func ( *SessionTicketExtension) () int {
	return 4 + len(.Ticket)
}

func ( *SessionTicketExtension) ( []byte) (int, error) {
	if len() < .Len() {
		return 0, io.ErrShortBuffer
	}

	 := .Len() - 4

	[0] = byte(extensionSessionTicket >> 8)
	[1] = byte(extensionSessionTicket)
	[2] = byte( >> 8)
	[3] = byte()
	if  > 0 {
		copy([4:], .Ticket)
	}
	return .Len(), io.EOF
}

func ( *SessionTicketExtension) () bool {
	return .Initialized
}

func ( *SessionTicketExtension) ( *SessionState,  []byte) {
	uAssert(!.Initialized, "tls: InitializeByUtls failed: the SessionTicketExtension is initialized")
	uAssert(.version == VersionTLS12 &&  != nil &&  != nil, "tls: InitializeByUtls failed: the session is not a tls 1.2 session")
	.Session = 
	.Ticket = 
	.Initialized = true
}

func ( *SessionTicketExtension) ( []byte) error {
	return nil // no-op
}

func ( *SessionTicketExtension) ( []byte) (int, error) {
	// RFC 5077, Section 3.2
	return 0, nil
}

func ( *SessionTicketExtension) () *SessionState {
	return .Session
}

func ( *SessionTicketExtension) () []byte {
	return .Ticket
}