Fix Samba4 build errors with common libcli/samsync
[ira/wip.git] / source4 / auth / ntlmssp / ntlmssp_sign.c
index 9eab0658ea49f3b66de22a891d165a8e1ea7f056..999f64c304691d64a1b52e161b6ce76cf8e457e1 100644 (file)
@@ -7,7 +7,7 @@
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation; either version 3 of the License, or
  *  (at your option) any later version.
  *  
  *  This program is distributed in the hope that it will be useful,
  *  GNU General Public License for more details.
  *  
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software Foundation,
- *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "includes.h"
 #include "auth/auth.h"
 #include "auth/ntlmssp/ntlmssp.h"
-#include "auth/ntlmssp/msrpc_parse.h"
-#include "lib/crypto/crypto.h"
+#include "../libcli/auth/libcli_auth.h"
+#include "../lib/crypto/crypto.h"
+#include "auth/credentials/credentials.h"
+#include "auth/gensec/gensec.h"
 
 #define CLI_SIGN "session key to client-to-server signing key magic constant"
 #define CLI_SEAL "session key to client-to-server sealing key magic constant"
@@ -32,7 +33,7 @@
 #define SRV_SEAL "session key to server-to-client sealing key magic constant"
 
 /**
- * Some notes on then NTLM2 code:
+ * Some notes on the NTLM2 code:
  *
  * NTLM2 is a AEAD system.  This means that the data encrypted is not
  * all the data that is signed.  In DCE-RPC case, the headers of the
@@ -64,7 +65,7 @@ static NTSTATUS ntlmssp_make_packet_signature(struct gensec_ntlmssp_state *gense
                                              const uint8_t *data, size_t length, 
                                              const uint8_t *whole_pdu, size_t pdu_length, 
                                              enum ntlmssp_direction direction,
-                                             DATA_BLOB *sig, BOOL encrypt_sig)
+                                             DATA_BLOB *sig, bool encrypt_sig)
 {
        if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) {
 
@@ -110,32 +111,39 @@ static NTSTATUS ntlmssp_make_packet_signature(struct gensec_ntlmssp_state *gense
                memcpy(sig->data + 4, digest, 8);
                memcpy(sig->data + 12, seq_num, 4);
 
+               DEBUG(10, ("NTLM2: created signature over %llu bytes of input:\n", (unsigned long long)pdu_length));
+               dump_data(11, sig->data, sig->length);
+                       
        } else {
                uint32_t crc;
                crc = crc32_calc_buffer(data, length);
-               if (!msrpc_gen(sig_mem_ctx, sig, "dddd", NTLMSSP_SIGN_VERSION, 0, crc, gensec_ntlmssp_state->crypt.ntlm.seq_num)) {
+               if (!msrpc_gen(sig_mem_ctx, 
+                              sig, "dddd", NTLMSSP_SIGN_VERSION, 0, crc, gensec_ntlmssp_state->crypt.ntlm.seq_num)) {
                        return NT_STATUS_NO_MEMORY;
                }
                gensec_ntlmssp_state->crypt.ntlm.seq_num++;
 
                arcfour_crypt_sbox(gensec_ntlmssp_state->crypt.ntlm.arcfour_state, sig->data+4, sig->length-4);
+
+               DEBUG(10, ("NTLM1: created signature over %llu bytes of input:\n", (unsigned long long)length));
+               dump_data(11, sig->data, sig->length);
        }
-       dump_data_pw("calculated ntlmssp signature\n", sig->data, sig->length);
        return NT_STATUS_OK;
 }
 
-_PUBLIC_/* TODO: make this non-public */NTSTATUS gensec_ntlmssp_sign_packet(struct gensec_security *gensec_security, 
+/* TODO: make this non-public */
+NTSTATUS gensec_ntlmssp_sign_packet(struct gensec_security *gensec_security, 
                                    TALLOC_CTX *sig_mem_ctx, 
                                    const uint8_t *data, size_t length, 
                                    const uint8_t *whole_pdu, size_t pdu_length, 
                                    DATA_BLOB *sig)
 {
-       struct gensec_ntlmssp_state *gensec_ntlmssp_state = gensec_security->private_data;
+       struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data;
 
        return ntlmssp_make_packet_signature(gensec_ntlmssp_state, sig_mem_ctx, 
                                             data, length, 
                                             whole_pdu, pdu_length, 
-                                            NTLMSSP_SEND, sig, True);
+                                            NTLMSSP_SEND, sig, true);
 }
 
 /**
@@ -149,7 +157,7 @@ NTSTATUS gensec_ntlmssp_check_packet(struct gensec_security *gensec_security,
                                     const uint8_t *whole_pdu, size_t pdu_length, 
                                     const DATA_BLOB *sig)
 {
-       struct gensec_ntlmssp_state *gensec_ntlmssp_state = gensec_security->private_data;
+       struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data;
 
        DATA_BLOB local_sig;
        NTSTATUS nt_status;
@@ -159,15 +167,10 @@ NTSTATUS gensec_ntlmssp_check_packet(struct gensec_security *gensec_security,
                return NT_STATUS_NO_USER_SESSION_KEY;
        }
 
-       if (sig->length < 8) {
-               DEBUG(0, ("NTLMSSP packet check failed due to short signature (%lu bytes)!\n", 
-                         (unsigned long)sig->length));
-       }
-
        nt_status = ntlmssp_make_packet_signature(gensec_ntlmssp_state, sig_mem_ctx, 
                                                  data, length, 
                                                  whole_pdu, pdu_length, 
-                                                 NTLMSSP_RECEIVE, &local_sig, True);
+                                                 NTLMSSP_RECEIVE, &local_sig, true);
        
        if (!NT_STATUS_IS_OK(nt_status)) {
                DEBUG(0, ("NTLMSSP packet check failed with %s\n", nt_errstr(nt_status)));
@@ -178,26 +181,26 @@ NTSTATUS gensec_ntlmssp_check_packet(struct gensec_security *gensec_security,
                if (local_sig.length != sig->length ||
                    memcmp(local_sig.data, 
                           sig->data, sig->length) != 0) {
-                       DEBUG(5, ("BAD SIG NTLM2: wanted signature of\n"));
+                       DEBUG(5, ("BAD SIG NTLM2: wanted signature over %llu bytes of input:\n", (unsigned long long)pdu_length));
                        dump_data(5, local_sig.data, local_sig.length);
                        
-                       DEBUG(5, ("BAD SIG: got signature of\n"));
+                       DEBUG(5, ("BAD SIG: got signature over %llu bytes of input:\n", (unsigned long long)pdu_length));
                        dump_data(5, sig->data, sig->length);
                        
-                       DEBUG(0, ("NTLMSSP NTLM2 packet check failed due to invalid signature!\n"));
+                       DEBUG(1, ("NTLMSSP NTLM2 packet check failed due to invalid signature on %llu bytes of input!\n", (unsigned long long)pdu_length));
                        return NT_STATUS_ACCESS_DENIED;
                }
        } else {
                if (local_sig.length != sig->length ||
                    memcmp(local_sig.data + 8, 
                           sig->data + 8, sig->length - 8) != 0) {
-                       DEBUG(5, ("BAD SIG NTLM1: wanted signature of\n"));
+                       DEBUG(5, ("BAD SIG NTLM1: wanted signature of %llu bytes of input:\n", (unsigned long long)length));
                        dump_data(5, local_sig.data, local_sig.length);
                        
-                       DEBUG(5, ("BAD SIG: got signature of\n"));
+                       DEBUG(5, ("BAD SIG: got signature of %llu bytes of input:\n", (unsigned long long)length));
                        dump_data(5, sig->data, sig->length);
                        
-                       DEBUG(0, ("NTLMSSP NTLM1 packet check failed due to invalid signature!\n"));
+                       DEBUG(1, ("NTLMSSP NTLM1 packet check failed due to invalid signature on %llu bytes of input:\n", (unsigned long long)length));
                        return NT_STATUS_ACCESS_DENIED;
                }
        }
@@ -218,7 +221,7 @@ NTSTATUS gensec_ntlmssp_seal_packet(struct gensec_security *gensec_security,
                                    const uint8_t *whole_pdu, size_t pdu_length, 
                                    DATA_BLOB *sig)
 {
-       struct gensec_ntlmssp_state *gensec_ntlmssp_state = gensec_security->private_data;
+       struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data;
        NTSTATUS nt_status;
        if (!gensec_ntlmssp_state->session_key.length) {
                DEBUG(3, ("NO session key, cannot seal packet\n"));
@@ -234,7 +237,7 @@ NTSTATUS gensec_ntlmssp_seal_packet(struct gensec_security *gensec_security,
                nt_status = ntlmssp_make_packet_signature(gensec_ntlmssp_state, sig_mem_ctx, 
                                                          data, length, 
                                                          whole_pdu, pdu_length, 
-                                                         NTLMSSP_SEND, sig, False);
+                                                         NTLMSSP_SEND, sig, false);
                arcfour_crypt_sbox(gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state, data, length);
                if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_KEY_EXCH) {
                        arcfour_crypt_sbox(gensec_ntlmssp_state->crypt.ntlm2.send_seal_arcfour_state, sig->data+4, 8);
@@ -242,7 +245,8 @@ NTSTATUS gensec_ntlmssp_seal_packet(struct gensec_security *gensec_security,
        } else {
                uint32_t crc;
                crc = crc32_calc_buffer(data, length);
-               if (!msrpc_gen(sig_mem_ctx, sig, "dddd", NTLMSSP_SIGN_VERSION, 0, crc, gensec_ntlmssp_state->crypt.ntlm.seq_num)) {
+               if (!msrpc_gen(sig_mem_ctx, 
+                              sig, "dddd", NTLMSSP_SIGN_VERSION, 0, crc, gensec_ntlmssp_state->crypt.ntlm.seq_num)) {
                        return NT_STATUS_NO_MEMORY;
                }
 
@@ -279,7 +283,7 @@ NTSTATUS gensec_ntlmssp_unseal_packet(struct gensec_security *gensec_security,
                                      const uint8_t *whole_pdu, size_t pdu_length, 
                                      const DATA_BLOB *sig)
 {
-       struct gensec_ntlmssp_state *gensec_ntlmssp_state = gensec_security->private_data;
+       struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data;
        if (!gensec_ntlmssp_state->session_key.length) {
                DEBUG(3, ("NO session key, cannot unseal packet\n"));
                return NT_STATUS_NO_USER_SESSION_KEY;
@@ -298,7 +302,8 @@ NTSTATUS gensec_ntlmssp_unseal_packet(struct gensec_security *gensec_security,
 /**
    Initialise the state for NTLMSSP signing.
 */
-_PUBLIC_/* TODO: make this non-public */NTSTATUS ntlmssp_sign_init(struct gensec_ntlmssp_state *gensec_ntlmssp_state)
+/* TODO: make this non-public */
+NTSTATUS ntlmssp_sign_init(struct gensec_ntlmssp_state *gensec_ntlmssp_state)
 {
        TALLOC_CTX *mem_ctx = talloc_new(gensec_ntlmssp_state);
 
@@ -454,6 +459,9 @@ NTSTATUS gensec_ntlmssp_wrap(struct gensec_security *gensec_security,
        if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) {
 
                *out = data_blob_talloc(sig_mem_ctx, NULL, in->length + NTLMSSP_SIG_SIZE);
+               if (!out->data) {
+                       return NT_STATUS_NO_MEMORY;
+               }
                memcpy(out->data + NTLMSSP_SIG_SIZE, in->data, in->length);
                
                nt_status = gensec_ntlmssp_seal_packet(gensec_security, sig_mem_ctx, 
@@ -471,6 +479,9 @@ NTSTATUS gensec_ntlmssp_wrap(struct gensec_security *gensec_security,
        } else if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
 
                *out = data_blob_talloc(sig_mem_ctx, NULL, in->length + NTLMSSP_SIG_SIZE);
+               if (!out->data) {
+                       return NT_STATUS_NO_MEMORY;
+               }
                memcpy(out->data + NTLMSSP_SIG_SIZE, in->data, in->length);
 
                nt_status = gensec_ntlmssp_sign_packet(gensec_security, sig_mem_ctx,