1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
package smb2
import (
"encoding/asn1"
"github.com/cloudsoda/go-smb2/internal/ntlm"
"github.com/cloudsoda/go-smb2/internal/spnego"
)
type Initiator interface {
OID() asn1.ObjectIdentifier
InitSecContext() ([]byte, error) // GSS_Init_sec_context
AcceptSecContext(sc []byte) ([]byte, error) // GSS_Accept_sec_context
Sum(bs []byte) []byte // GSS_getMIC
SessionKey() []byte // QueryContextAttributes(ctx, SECPKG_ATTR_SESSION_KEY, &out)
}
// NTLMInitiator implements session-setup through NTLMv2.
// It doesn't support NTLMv1. You can use Hash instead of Password.
type NTLMInitiator struct {
User string
Password string
Hash []byte
Domain string
Workstation string
TargetSPN string
ntlm *ntlm.Client
seqNum uint32
}
func (i *NTLMInitiator) OID() asn1.ObjectIdentifier {
return spnego.NlmpOid
}
func (i *NTLMInitiator) InitSecContext() ([]byte, error) {
i.ntlm = &ntlm.Client{
User: i.User,
Password: i.Password,
Hash: i.Hash,
Domain: i.Domain,
Workstation: i.Workstation,
TargetSPN: i.TargetSPN,
}
nmsg, err := i.ntlm.Negotiate()
if err != nil {
return nil, err
}
return nmsg, nil
}
func (i *NTLMInitiator) AcceptSecContext(sc []byte) ([]byte, error) {
amsg, err := i.ntlm.Authenticate(sc)
if err != nil {
return nil, err
}
return amsg, nil
}
func (i *NTLMInitiator) Sum(bs []byte) []byte {
mic, _ := i.ntlm.Session().Sum(bs, i.seqNum)
return mic
}
func (i *NTLMInitiator) SessionKey() []byte {
return i.ntlm.Session().SessionKey()
}
//nolint:unused // appears to be legacy, unsure, so leaving for now
func (i *NTLMInitiator) infoMap() *ntlm.InfoMap {
return i.ntlm.Session().InfoMap()
}
|