// NewServerContext creates new server context. It uses server // credentials created by AcquireServerCredentials and client // negotiate message and, if successful, outputs challenge message. // Challenge message needs to be sent to the client to continue // NTLM negotiation sequence. func NewServerContext(cred *sspi.Credentials, negotiate []byte) (*ServerContext, []byte, error) { challenge := make([]byte, PackageInfo.MaxToken) c := sspi.NewServerContext(cred, sspi.ASC_REQ_CONNECTION) authCompleted, n, err := updateContext(c, challenge, negotiate) if err != nil { return nil, nil, err } if authCompleted { c.Release() return nil, nil, errors.New("ntlm authentication should not be completed yet") } if n == 0 { c.Release() return nil, nil, errors.New("ntlm token should not be empty") } challenge = challenge[:n] return &ServerContext{sctxt: c}, challenge, nil }
// NewServerContext creates new server context. It uses server // credentials created by AcquireServerCredentials and token from // the client to start server Negotiate negotiation sequence. // It also returns new token to be sent to the client. func NewServerContext(cred *sspi.Credentials, token []byte) (sc *ServerContext, outputToken []byte, err error) { otoken := make([]byte, PackageInfo.MaxToken) c := sspi.NewServerContext(cred, sspi.ASC_REQ_CONNECTION) authDone, n, err2 := updateContext(c, otoken, token, nil) if err2 != nil { return nil, nil, err2 } if authDone { c.Release() return nil, nil, errors.New("negotiate authentication should not be completed yet") } if n == 0 { c.Release() return nil, nil, errors.New("negotiate token should not be empty") } otoken = otoken[:n] return &ServerContext{sctxt: c}, otoken, nil }