move messages out of unecessary messages package and in to ntlm package
This commit is contained in:
94
ntlm/payload.go
Normal file
94
ntlm/payload.go
Normal file
@@ -0,0 +1,94 @@
|
||||
//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
|
||||
}
|
||||
Reference in New Issue
Block a user