challenge message to bytes

This commit is contained in:
Conor Hunt 2012-11-09 22:27:30 -05:00
parent d30d257f40
commit a9e17c39f6

View File

@ -9,9 +9,6 @@ import (
)
type Challenge struct {
// All bytes of the message
Bytes []byte
// sig - 8 bytes
Signature []byte
// message type - 4 bytes
@ -52,7 +49,6 @@ type Challenge struct {
Version *VersionStruct
// payload - variable
Payload []byte
PayloadOffset int
}
func ParseChallengeMessage(body []byte) (*Challenge, error) {
@ -71,9 +67,7 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) {
var err error
challenge.TargetName, err = ReadStringPayload(12, body)
if err != nil {
return challenge, err
}
if err != nil { return nil, err }
challenge.NegotiateFlags = binary.LittleEndian.Uint32(body[20:24])
@ -82,9 +76,7 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) {
challenge.Reserved = body[32:40]
challenge.TargetInfoPayloadStruct, err = ReadBytePayload(40, body)
if err != nil {
return challenge, err
}
if err != nil { return nil, err }
challenge.TargetInfo = ReadAvPairs(challenge.TargetInfoPayloadStruct.Payload)
@ -92,18 +84,48 @@ func ParseChallengeMessage(body []byte) (*Challenge, error) {
if NTLMSSP_NEGOTIATE_VERSION.IsSet(challenge.NegotiateFlags) {
challenge.Version, err = ReadVersionStruct(body[offset : offset+8])
if err != nil {
return challenge, err
}
if err != nil { return nil, err }
offset = offset + 8
}
challenge.Payload = body[offset:]
challenge.PayloadOffset = offset
return challenge, nil
}
func (c *Challenge) Bytes() []byte {
payloadLen := int(c.TargetName.Len + c.TargetInfoPayloadStruct.Len)
messageLen := 8 + 4 + 12 + 4 + 8 + 8 + 12 + 8
payloadOffset := uint32(messageLen)
messageBytes := make([]byte, 0, messageLen+payloadLen)
buffer := bytes.NewBuffer(messageBytes)
buffer.Write(c.Signature)
binary.Write(buffer, binary.LittleEndian, c.MessageType)
c.TargetName.Offset = payloadOffset
payloadOffset += uint32(c.TargetName.Len)
buffer.Write(c.TargetName.Bytes())
binary.Write(buffer, binary.LittleEndian, c.NegotiateFlags)
buffer.Write(c.ServerChallenge)
buffer.Write(make([]byte, 8))
c.TargetInfoPayloadStruct.Offset = payloadOffset
payloadOffset += uint32(c.TargetInfoPayloadStruct.Len)
buffer.Write(c.TargetInfoPayloadStruct.Bytes())
if(c.Version != nil) {
buffer.Write(c.Version.Bytes())
}
// Write out the payloads
buffer.Write(c.TargetName.Payload)
buffer.Write(c.TargetInfoPayloadStruct.Payload)
return buffer.Bytes()
}
func (c *Challenge) getLowestPayloadOffset() int {
payloadStructs := [...]*PayloadStruct{c.TargetName, c.TargetInfoPayloadStruct}
@ -123,7 +145,7 @@ func (c *Challenge) String() string {
var buffer bytes.Buffer
buffer.WriteString("Challenge NTLM Message")
buffer.WriteString(fmt.Sprintf("\nPayload Offset: %d Lowest: %d Length: %d", c.PayloadOffset, c.getLowestPayloadOffset(), len(c.Payload)))
buffer.WriteString(fmt.Sprintf("\nPayload Offset: %d Length: %d", c.getLowestPayloadOffset(), len(c.Payload)))
buffer.WriteString(fmt.Sprintf("\nTargetName: %s", c.TargetName.String()))
buffer.WriteString(fmt.Sprintf("\nServerChallenge: %s", hex.EncodeToString(c.ServerChallenge)))
if c.Version != nil {