...

Source file src/github.com/Azure/go-ntlmssp/negotiate_message.go

Documentation: github.com/Azure/go-ntlmssp

     1  package ntlmssp
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"errors"
     7  	"strings"
     8  )
     9  
    10  const expMsgBodyLen = 40
    11  
    12  type negotiateMessageFields struct {
    13  	messageHeader
    14  	NegotiateFlags negotiateFlags
    15  
    16  	Domain      varField
    17  	Workstation varField
    18  
    19  	Version
    20  }
    21  
    22  var defaultFlags = negotiateFlagNTLMSSPNEGOTIATETARGETINFO |
    23  	negotiateFlagNTLMSSPNEGOTIATE56 |
    24  	negotiateFlagNTLMSSPNEGOTIATE128 |
    25  	negotiateFlagNTLMSSPNEGOTIATEUNICODE |
    26  	negotiateFlagNTLMSSPNEGOTIATEEXTENDEDSESSIONSECURITY
    27  
    28  //NewNegotiateMessage creates a new NEGOTIATE message with the
    29  //flags that this package supports.
    30  func NewNegotiateMessage(domainName, workstationName string) ([]byte, error) {
    31  	payloadOffset := expMsgBodyLen
    32  	flags := defaultFlags
    33  
    34  	if domainName != "" {
    35  		flags |= negotiateFlagNTLMSSPNEGOTIATEOEMDOMAINSUPPLIED
    36  	}
    37  
    38  	if workstationName != "" {
    39  		flags |= negotiateFlagNTLMSSPNEGOTIATEOEMWORKSTATIONSUPPLIED
    40  	}
    41  
    42  	msg := negotiateMessageFields{
    43  		messageHeader:  newMessageHeader(1),
    44  		NegotiateFlags: flags,
    45  		Domain:         newVarField(&payloadOffset, len(domainName)),
    46  		Workstation:    newVarField(&payloadOffset, len(workstationName)),
    47  		Version:        DefaultVersion(),
    48  	}
    49  
    50  	b := bytes.Buffer{}
    51  	if err := binary.Write(&b, binary.LittleEndian, &msg); err != nil {
    52  		return nil, err
    53  	}
    54  	if b.Len() != expMsgBodyLen {
    55  		return nil, errors.New("incorrect body length")
    56  	}
    57  
    58  	payload := strings.ToUpper(domainName + workstationName)
    59  	if _, err := b.WriteString(payload); err != nil {
    60  		return nil, err
    61  	}
    62  
    63  	return b.Bytes(), nil
    64  }
    65  

View as plain text