package smb2

import (
	

	
)

type spnegoClient struct {
	mechs        []Initiator
	mechTypes    []asn1.ObjectIdentifier
	selectedMech Initiator
}

func newSpnegoClient( []Initiator) *spnegoClient {
	 := make([]asn1.ObjectIdentifier, len())
	for ,  := range  {
		[] = .oid()
	}
	return &spnegoClient{
		mechs:     ,
		mechTypes: ,
	}
}

func ( *spnegoClient) () asn1.ObjectIdentifier {
	return spnego.SpnegoOid
}

func ( *spnegoClient) () ( []byte,  error) {
	,  := .mechs[0].initSecContext()
	if  != nil {
		return nil, 
	}
	,  = spnego.EncodeNegTokenInit(.mechTypes, )
	if  != nil {
		return nil, 
	}
	return , nil
}

func ( *spnegoClient) ( []byte) ( []byte,  error) {
	,  := spnego.DecodeNegTokenResp()
	if  != nil {
		return nil, 
	}

	for ,  := range .mechTypes {
		if .Equal(.SupportedMech) {
			.selectedMech = .mechs[]
			break
		}
	}

	,  := .selectedMech.acceptSecContext(.ResponseToken)
	if  != nil {
		return nil, 
	}

	,  := asn1.Marshal(.mechTypes)
	if  != nil {
		return nil, 
	}

	 := .selectedMech.sum()

	,  = spnego.EncodeNegTokenResp(1, nil, , )
	if  != nil {
		return nil, 
	}

	return , nil
}

func ( *spnegoClient) ( []byte) []byte {
	return .selectedMech.sum()
}

func ( *spnegoClient) () []byte {
	return .selectedMech.sessionKey()
}