...
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
29
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