add some basic ntlm challenge validation (#2)
* add some basic ntlm challenge validation * add some unit tests
This commit is contained in:
parent
ec337d51d2
commit
ad847b4c56
@ -1,4 +1,4 @@
|
|||||||
//Copyright 2013 Thomson Reuters Global Resources. BSD License please see License file for more information
|
// Copyright 2013 Thomson Reuters Global Resources. BSD License please see License file for more information
|
||||||
|
|
||||||
package ntlm
|
package ntlm
|
||||||
|
|
||||||
@ -54,6 +54,10 @@ type ChallengeMessage struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ParseChallengeMessage(body []byte) (*ChallengeMessage, error) {
|
func ParseChallengeMessage(body []byte) (*ChallengeMessage, error) {
|
||||||
|
if len(body) < 32 {
|
||||||
|
return nil, errors.New("invalid NTLM challenge")
|
||||||
|
}
|
||||||
|
|
||||||
challenge := new(ChallengeMessage)
|
challenge := new(ChallengeMessage)
|
||||||
|
|
||||||
challenge.Signature = body[0:8]
|
challenge.Signature = body[0:8]
|
||||||
@ -79,6 +83,10 @@ func ParseChallengeMessage(body []byte) (*ChallengeMessage, error) {
|
|||||||
offset := 32
|
offset := 32
|
||||||
|
|
||||||
if NTLMSSP_NEGOTIATE_TARGET_INFO.IsSet(challenge.NegotiateFlags) {
|
if NTLMSSP_NEGOTIATE_TARGET_INFO.IsSet(challenge.NegotiateFlags) {
|
||||||
|
if len(body) < 48 {
|
||||||
|
return nil, errors.New("invalid NTLMSSP_NEGOTIATE_TARGET_INFO")
|
||||||
|
}
|
||||||
|
|
||||||
challenge.Reserved = body[32:40]
|
challenge.Reserved = body[32:40]
|
||||||
|
|
||||||
challenge.TargetInfoPayloadStruct, err = ReadBytePayload(40, body)
|
challenge.TargetInfoPayloadStruct, err = ReadBytePayload(40, body)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//Copyright 2013 Thomson Reuters Global Resources. BSD License please see License file for more information
|
// Copyright 2013 Thomson Reuters Global Resources. BSD License please see License file for more information
|
||||||
|
|
||||||
package ntlm
|
package ntlm
|
||||||
|
|
||||||
@ -13,7 +13,6 @@ import (
|
|||||||
func TestDecodeChallenge(t *testing.T) {
|
func TestDecodeChallenge(t *testing.T) {
|
||||||
challengeMessage := "TlRMTVNTUAACAAAAAAAAADgAAADzgpjiuaopAbx9ejQAAAAAAAAAAKIAogA4AAAABQLODgAAAA8CAA4AUgBFAFUAVABFAFIAUwABABwAVQBLAEIAUAAtAEMAQgBUAFIATQBGAEUAMAA2AAQAFgBSAGUAdQB0AGUAcgBzAC4AbgBlAHQAAwA0AHUAawBiAHAALQBjAGIAdAByAG0AZgBlADAANgAuAFIAZQB1AHQAZQByAHMALgBuAGUAdAAFABYAUgBlAHUAdABlAHIAcwAuAG4AZQB0AAAAAAA="
|
challengeMessage := "TlRMTVNTUAACAAAAAAAAADgAAADzgpjiuaopAbx9ejQAAAAAAAAAAKIAogA4AAAABQLODgAAAA8CAA4AUgBFAFUAVABFAFIAUwABABwAVQBLAEIAUAAtAEMAQgBUAFIATQBGAEUAMAA2AAQAFgBSAGUAdQB0AGUAcgBzAC4AbgBlAHQAAwA0AHUAawBiAHAALQBjAGIAdAByAG0AZgBlADAANgAuAFIAZQB1AHQAZQByAHMALgBuAGUAdAAFABYAUgBlAHUAdABlAHIAcwAuAG4AZQB0AAAAAAA="
|
||||||
challengeData, err := base64.StdEncoding.DecodeString(challengeMessage)
|
challengeData, err := base64.StdEncoding.DecodeString(challengeMessage)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("Could not base64 decode message data")
|
t.Error("Could not base64 decode message data")
|
||||||
}
|
}
|
||||||
@ -63,3 +62,24 @@ func TestDecodeChallenge(t *testing.T) {
|
|||||||
t.Error("Invalid challenge messsage bytes")
|
t.Error("Invalid challenge messsage bytes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseChallengeEmptyMessage(t *testing.T) {
|
||||||
|
_, err := ParseChallengeMessage(nil)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("expected error, got nil")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseChallengeInvalidNegotiateTargetInfo(t *testing.T) {
|
||||||
|
challengeMessage := "TlRMTVNTUAACAAAAAAAAADgAAADzgpjiuaopAbx9ejQA"
|
||||||
|
|
||||||
|
challengeData, err := base64.StdEncoding.DecodeString(challengeMessage)
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Could not base64 decode message data")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = ParseChallengeMessage(challengeData)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("expected error, got nil")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user