s3:ntlmssp Move ntlmssp_sign.c from source3 to common code.
[amitay/samba.git] / source3 / libsmb / ntlmssp.c
index 56dd6d9ab7996b24186491c73aa72f7a455f4a80..1d475172fe80c8a1d7e48e95745d8e50ebd0ccde 100644 (file)
 */
 
 #include "includes.h"
-#include "ntlmssp.h"
+#include "../libcli/auth/ntlmssp.h"
+#include "../libcli/auth/ntlmssp_private.h"
 #include "../libcli/auth/libcli_auth.h"
 #include "../librpc/gen_ndr/ndr_ntlmssp.h"
 #include "../libcli/auth/ntlmssp_ndr.h"
+#include "../lib/crypto/md5.h"
+#include "../lib/crypto/arcfour.h"
+#include "../lib/crypto/hmacmd5.h"
 
 static NTSTATUS ntlmssp_client_initial(struct ntlmssp_state *ntlmssp_state,
                                       DATA_BLOB reply, DATA_BLOB *next_request);
@@ -56,57 +60,6 @@ static const struct ntlmssp_callbacks {
 };
 
 
-/**
- * Print out the NTLMSSP flags for debugging
- * @param neg_flags The flags from the packet
- */
-
-void debug_ntlmssp_flags(uint32_t neg_flags)
-{
-       DEBUG(3,("Got NTLMSSP neg_flags=0x%08x\n", neg_flags));
-
-       if (neg_flags & NTLMSSP_NEGOTIATE_UNICODE)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_UNICODE\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_OEM)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_OEM\n"));
-       if (neg_flags & NTLMSSP_REQUEST_TARGET)
-               DEBUGADD(4, ("  NTLMSSP_REQUEST_TARGET\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_SIGN)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_SIGN\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_SEAL)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_SEAL\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_DATAGRAM)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_DATAGRAM\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_LM_KEY)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_LM_KEY\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_NETWARE)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_NETWARE\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_NTLM)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_NTLM\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_ALWAYS_SIGN)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_ALWAYS_SIGN\n"));
-       if (neg_flags & NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
-               DEBUGADD(4, ("  NTLMSSP_REQUEST_NON_NT_SESSION_KEY\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_NTLM2)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_NTLM2\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_TARGET_INFO)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_TARGET_INFO\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_VERSION)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_VERSION\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_128)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_128\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_KEY_EXCH)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_KEY_EXCH\n"));
-       if (neg_flags & NTLMSSP_NEGOTIATE_56)
-               DEBUGADD(4, ("  NTLMSSP_NEGOTIATE_56\n"));
-}
-
 /**
  * Default challenge generation code.
  *
@@ -466,7 +419,6 @@ static NTSTATUS ntlmssp_server_negotiate(struct ntlmssp_state *ntlmssp_state,
                if (DEBUGLEVEL >= 10) {
                        if (NT_STATUS_IS_OK(ntlmssp_pull_NEGOTIATE_MESSAGE(&request,
                                                       ntlmssp_state,
-                                                      NULL,
                                                       &negotiate)))
                        {
                                NDR_PRINT_DEBUG(NEGOTIATE_MESSAGE, &negotiate);
@@ -518,27 +470,52 @@ static NTSTATUS ntlmssp_server_negotiate(struct ntlmssp_state *ntlmssp_state,
        }
 
        {
-               /* Marshel the packet in the right format, be it unicode or ASCII */
+               /* Marshal the packet in the right format, be it unicode or ASCII */
                const char *gen_string;
+               DATA_BLOB version_blob = data_blob_null;
+
+               if (chal_flags & NTLMSSP_NEGOTIATE_VERSION) {
+                       enum ndr_err_code err;
+                       struct VERSION vers;
+
+                       /* "What Windows returns" as a version number. */
+                       ZERO_STRUCT(vers);
+                       vers.ProductMajorVersion = NTLMSSP_WINDOWS_MAJOR_VERSION_6;
+                       vers.ProductMinorVersion = NTLMSSP_WINDOWS_MINOR_VERSION_1;
+                       vers.ProductBuild = 0;
+                       vers.NTLMRevisionCurrent = NTLMSSP_REVISION_W2K3;
+
+                       err = ndr_push_struct_blob(&version_blob,
+                                               ntlmssp_state,
+                                               &vers,
+                                               (ndr_push_flags_fn_t)ndr_push_VERSION);
+
+                       if (!NDR_ERR_CODE_IS_SUCCESS(err)) {
+                               return NT_STATUS_NO_MEMORY;
+                       }
+               }
+
                if (ntlmssp_state->unicode) {
-                       gen_string = "CdUdbddB";
+                       gen_string = "CdUdbddBb";
                } else {
-                       gen_string = "CdAdbddB";
+                       gen_string = "CdAdbddBb";
                }
 
                msrpc_gen(ntlmssp_state, reply, gen_string,
-                         "NTLMSSP",
-                         NTLMSSP_CHALLENGE,
-                         target_name,
-                         chal_flags,
-                         cryptkey, 8,
-                         0, 0,
-                         struct_blob.data, struct_blob.length);
+                       "NTLMSSP",
+                       NTLMSSP_CHALLENGE,
+                       target_name,
+                       chal_flags,
+                       cryptkey, 8,
+                       0, 0,
+                       struct_blob.data, struct_blob.length,
+                       version_blob.data, version_blob.length);
+
+               data_blob_free(&version_blob);
 
                if (DEBUGLEVEL >= 10) {
                        if (NT_STATUS_IS_OK(ntlmssp_pull_CHALLENGE_MESSAGE(reply,
                                                       ntlmssp_state,
-                                                      NULL,
                                                       &challenge)))
                        {
                                NDR_PRINT_DEBUG(CHALLENGE_MESSAGE, &challenge);
@@ -642,7 +619,6 @@ static NTSTATUS ntlmssp_server_auth(struct ntlmssp_state *ntlmssp_state,
        if (DEBUGLEVEL >= 10) {
                if (NT_STATUS_IS_OK(ntlmssp_pull_AUTHENTICATE_MESSAGE(&request,
                                                  ntlmssp_state,
-                                                 NULL,
                                                  &authenticate)))
                {
                        NDR_PRINT_DEBUG(AUTHENTICATE_MESSAGE, &authenticate);
@@ -932,7 +908,6 @@ static NTSTATUS ntlmssp_client_initial(struct ntlmssp_state *ntlmssp_state,
        if (DEBUGLEVEL >= 10) {
                if (NT_STATUS_IS_OK(ntlmssp_pull_NEGOTIATE_MESSAGE(next_request,
                                               ntlmssp_state,
-                                              NULL,
                                               &negotiate)))
                {
                        NDR_PRINT_DEBUG(NEGOTIATE_MESSAGE, &negotiate);
@@ -1037,7 +1012,6 @@ noccache:
        if (DEBUGLEVEL >= 10) {
                if (NT_STATUS_IS_OK(ntlmssp_pull_CHALLENGE_MESSAGE(&reply,
                                               ntlmssp_state,
-                                              NULL,
                                               &challenge)))
                {
                        NDR_PRINT_DEBUG(CHALLENGE_MESSAGE, &challenge);
@@ -1226,7 +1200,6 @@ noccache:
        if (DEBUGLEVEL >= 10) {
                if (NT_STATUS_IS_OK(ntlmssp_pull_AUTHENTICATE_MESSAGE(next_request,
                                                  ntlmssp_state,
-                                                 NULL,
                                                  &authenticate)))
                {
                        NDR_PRINT_DEBUG(AUTHENTICATE_MESSAGE, &authenticate);