diff --git a/packets/ntlm_test.go b/packets/ntlm_test.go new file mode 100644 index 00000000..5fa7dad0 --- /dev/null +++ b/packets/ntlm_test.go @@ -0,0 +1,164 @@ +package packets + +import ( + "reflect" + "testing" +) + +func TestNTLMConstants(t *testing.T) { + var units = []struct { + got interface{} + exp interface{} + }{ + {NTLM_SIG_OFFSET, 0}, + {NTLM_TYPE_OFFSET, 8}, + {NTLM_TYPE1_FLAGS_OFFSET, 12}, + {NTLM_TYPE1_DOMAIN_OFFSET, 16}, + {NTLM_TYPE1_WORKSTN_OFFSET, 24}, + {NTLM_TYPE1_DATA_OFFSET, 32}, + {NTLM_TYPE1_MINSIZE, 16}, + {NTLM_TYPE2_TARGET_OFFSET, 12}, + {NTLM_TYPE2_FLAGS_OFFSET, 20}, + {NTLM_TYPE2_CHALLENGE_OFFSET, 24}, + {NTLM_TYPE2_CONTEXT_OFFSET, 32}, + {NTLM_TYPE2_TARGETINFO_OFFSET, 40}, + {NTLM_TYPE2_DATA_OFFSET, 48}, + {NTLM_TYPE2_MINSIZE, 32}, + {NTLM_TYPE3_LMRESP_OFFSET, 12}, + {NTLM_TYPE3_NTRESP_OFFSET, 20}, + {NTLM_TYPE3_DOMAIN_OFFSET, 28}, + {NTLM_TYPE3_USER_OFFSET, 36}, + {NTLM_TYPE3_WORKSTN_OFFSET, 44}, + {NTLM_TYPE3_SESSIONKEY_OFFSET, 52}, + {NTLM_TYPE3_FLAGS_OFFSET, 60}, + {NTLM_TYPE3_DATA_OFFSET, 64}, + {NTLM_TYPE3_MINSIZE, 52}, + {NTLM_BUFFER_LEN_OFFSET, 0}, + {NTLM_BUFFER_MAXLEN_OFFSET, 2}, + {NTLM_BUFFER_OFFSET_OFFSET, 4}, + {NTLM_BUFFER_SIZE, 8}, + {NtlmV1, 1}, + {NtlmV2, 2}, + } + for _, u := range units { + if !reflect.DeepEqual(u.exp, u.got) { + t.Fatalf("expected '%v', got '%v'", u.exp, u.got) + } + } +} + +func TestNTLMChallengeResponse(t *testing.T) { + r := NTLMChallengeResponse{} + var units = []struct { + got interface{} + exp interface{} + }{ + {r.Challenge, ""}, + {r.Response, ""}, + } + for _, u := range units { + if !reflect.DeepEqual(u.exp, u.got) { + t.Fatalf("expected '%v', got '%v'", u.exp, u.got) + } + } +} + +func TestNTLMChallengeResponseParsed(t *testing.T) { + r := NTLMChallengeResponseParsed{} + var units = []struct { + got interface{} + exp interface{} + }{ + {r.Type, 0}, + {r.ServerChallenge, ""}, + {r.User, ""}, + {r.Domain, ""}, + {r.LmHash, ""}, + {r.NtHashOne, ""}, + {r.NtHashTwo, ""}, + } + for _, u := range units { + if !reflect.DeepEqual(u.exp, u.got) { + t.Fatalf("expected '%v', got '%v'", u.exp, u.got) + } + } +} + +func TestNTLMResponseHeader(t *testing.T) { + r := NTLMResponseHeader{} + var units = []struct { + got interface{} + exp interface{} + }{ + {r.Sig, ""}, + {r.Type, uint32(0)}, + {r.LmLen, uint16(0)}, + {r.LmMax, uint16(0)}, + {r.LmOffset, uint16(0)}, + {r.NtLen, uint16(0)}, + {r.NtMax, uint16(0)}, + {r.NtOffset, uint16(0)}, + {r.DomainLen, uint16(0)}, + {r.DomainMax, uint16(0)}, + {r.DomainOffset, uint16(0)}, + {r.UserLen, uint16(0)}, + {r.UserMax, uint16(0)}, + {r.UserOffset, uint16(0)}, + {r.HostLen, uint16(0)}, + {r.HostMax, uint16(0)}, + {r.HostOffset, uint16(0)}, + } + for _, u := range units { + if !reflect.DeepEqual(u.exp, u.got) { + t.Fatalf("expected '%v', got '%v'", u.exp, u.got) + } + } +} + +func TestNTLMState(t *testing.T) { + r := map[uint32]string{} + p := []NTLMChallengeResponse{} + s := NTLMState{ + Responses: r, + Pairs: p, + } + var units = []struct { + got interface{} + exp interface{} + }{ + {s.Responses, r}, + {s.Pairs, p}, + } + for _, u := range units { + if !reflect.DeepEqual(u.exp, u.got) { + t.Fatalf("expected '%v', got '%v'", u.exp, u.got) + } + } +} + +func BuildExampleNTLMState() NTLMState { + return NTLMState{ + Responses: map[uint32]string{}, + Pairs: []NTLMChallengeResponse{}, + } +} + +func TestNTLMStateAddServerResponse(t *testing.T) { + s := BuildExampleNTLMState() + + s.AddServerResponse(uint32(0), "picat") + + var units = []struct { + got interface{} + exp interface{} + }{ + {s.Responses[uint32(0)], "picat"}, + } + for _, u := range units { + if !reflect.DeepEqual(u.exp, u.got) { + t.Fatalf("expected '%v', got '%v'", u.exp, u.got) + } + } +} + +// TODO: add tests for the rest of NTLM :P