95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
//Copyright 2013 Thomson Reuters Global Resources. All Rights Reserved. Proprietary and confidential information of TRGR. Disclosure, use, or reproduction without written authorization of TRGR is prohibited.
|
|
|
|
package ntlm
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"encoding/hex"
|
|
)
|
|
|
|
const (
|
|
UnicodeStringPayload = iota
|
|
OemStringPayload
|
|
BytesPayload
|
|
)
|
|
|
|
type PayloadStruct struct {
|
|
Type int
|
|
Len uint16
|
|
MaxLen uint16
|
|
Offset uint32
|
|
Payload []byte
|
|
}
|
|
|
|
func (p *PayloadStruct) Bytes() []byte {
|
|
dest := make([]byte, 0, 8)
|
|
buffer := bytes.NewBuffer(dest)
|
|
|
|
binary.Write(buffer, binary.LittleEndian, p.Len)
|
|
binary.Write(buffer, binary.LittleEndian, p.MaxLen)
|
|
binary.Write(buffer, binary.LittleEndian, p.Offset)
|
|
|
|
return buffer.Bytes()
|
|
}
|
|
|
|
func (p *PayloadStruct) String() string {
|
|
var returnString string
|
|
|
|
switch p.Type {
|
|
case UnicodeStringPayload:
|
|
returnString = utf16ToString(p.Payload)
|
|
case OemStringPayload:
|
|
returnString = string(p.Payload)
|
|
case BytesPayload:
|
|
returnString = hex.EncodeToString(p.Payload)
|
|
default:
|
|
returnString = "unknown type"
|
|
}
|
|
return returnString
|
|
}
|
|
|
|
func CreateBytePayload(bytes []byte) (*PayloadStruct, error) {
|
|
p := new(PayloadStruct)
|
|
p.Type = BytesPayload
|
|
p.Len = uint16(len(bytes))
|
|
p.MaxLen = uint16(len(bytes))
|
|
p.Payload = bytes // TODO: Copy these bytes instead of keeping a reference
|
|
return p, nil
|
|
}
|
|
|
|
func CreateStringPayload(value string) (*PayloadStruct, error) {
|
|
// Create UTF16 unicode bytes from string
|
|
bytes := utf16FromString(value)
|
|
p := new(PayloadStruct)
|
|
p.Type = UnicodeStringPayload
|
|
p.Len = uint16(len(bytes))
|
|
p.MaxLen = uint16(len(bytes))
|
|
p.Payload = bytes // TODO: Copy these bytes instead of keeping a reference
|
|
return p, nil
|
|
}
|
|
|
|
func ReadStringPayload(startByte int, bytes []byte) (*PayloadStruct, error) {
|
|
return ReadPayloadStruct(startByte, bytes, UnicodeStringPayload)
|
|
}
|
|
|
|
func ReadBytePayload(startByte int, bytes []byte) (*PayloadStruct, error) {
|
|
return ReadPayloadStruct(startByte, bytes, BytesPayload)
|
|
}
|
|
|
|
func ReadPayloadStruct(startByte int, bytes []byte, PayloadType int) (*PayloadStruct, error) {
|
|
p := new(PayloadStruct)
|
|
|
|
p.Type = PayloadType
|
|
p.Len = binary.LittleEndian.Uint16(bytes[startByte : startByte+2])
|
|
p.MaxLen = binary.LittleEndian.Uint16(bytes[startByte+2 : startByte+4])
|
|
p.Offset = binary.LittleEndian.Uint32(bytes[startByte+4 : startByte+8])
|
|
|
|
if p.Len > 0 {
|
|
endOffset := p.Offset + uint32(p.Len)
|
|
p.Payload = bytes[p.Offset:endOffset]
|
|
}
|
|
|
|
return p, nil
|
|
}
|