credentials: Rename library to samba-credentials to avoid name clashes.
[idra/samba.git] / source4 / auth / ntlmssp / ntlmssp.c
index 1866eb56b9c8f76f9f5386e78d81b8e85ad68105..d90c908d8d63ba893f76f838daa1da7b080eefc1 100644 (file)
@@ -47,7 +47,7 @@ static const struct ntlmssp_callbacks {
        },{
                .role           = NTLMSSP_SERVER,
                .command        = NTLMSSP_NEGOTIATE,
-               .sync_fn        = ntlmssp_server_negotiate,
+               .sync_fn        = gensec_ntlmssp_server_negotiate,
        },{
                .role           = NTLMSSP_CLIENT,
                .command        = NTLMSSP_CHALLENGE,
@@ -55,64 +55,15 @@ static const struct ntlmssp_callbacks {
        },{
                .role           = NTLMSSP_SERVER,
                .command        = NTLMSSP_AUTH,
-               .sync_fn        = ntlmssp_server_auth,
+               .sync_fn        = gensec_ntlmssp_server_auth,
        }
 };
 
 
-/**
- * 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_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"));
-}
-
 static NTSTATUS gensec_ntlmssp_magic(struct gensec_security *gensec_security, 
                                     const DATA_BLOB *first_packet) 
 {
-       if (first_packet->length > 8 && memcmp("NTLMSSP\0", first_packet->data, 8) == 0) {
+       if (ntlmssp_blob_matches_magic(first_packet)) {
                return NT_STATUS_OK;
        } else {
                return NT_STATUS_INVALID_PARAMETER;
@@ -230,6 +181,7 @@ static NTSTATUS gensec_ntlmssp_update(struct gensec_security *gensec_security,
  */
 
 NTSTATUS gensec_ntlmssp_session_key(struct gensec_security *gensec_security, 
+                                   TALLOC_CTX *mem_ctx,
                                    DATA_BLOB *session_key)
 {
        struct gensec_ntlmssp_context *gensec_ntlmssp =
@@ -244,111 +196,12 @@ NTSTATUS gensec_ntlmssp_session_key(struct gensec_security *gensec_security,
        if (!ntlmssp_state->session_key.data) {
                return NT_STATUS_NO_USER_SESSION_KEY;
        }
-       *session_key = ntlmssp_state->session_key;
-
-       return NT_STATUS_OK;
-}
-
-void ntlmssp_handle_neg_flags(struct ntlmssp_state *ntlmssp_state,
-                             uint32_t neg_flags, bool allow_lm)
-{
-       if (neg_flags & NTLMSSP_NEGOTIATE_UNICODE) {
-               ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_UNICODE;
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_OEM;
-               ntlmssp_state->unicode = true;
-       } else {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_UNICODE;
-               ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_OEM;
-               ntlmssp_state->unicode = false;
-       }
-
-       if ((neg_flags & NTLMSSP_NEGOTIATE_LM_KEY) && allow_lm && !ntlmssp_state->use_ntlmv2) {
-               /* other end forcing us to use LM */
-               ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_LM_KEY;
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_NTLM2;
-       } else {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_LM_KEY;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_ALWAYS_SIGN)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_SIGN)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_SIGN;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_SEAL)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_SEAL;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_NTLM2)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_NTLM2;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_128)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_128;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_56)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_56;
-       }
-
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_KEY_EXCH)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_KEY_EXCH;
-       }
-
-       /* Woop Woop - unknown flag for Windows compatibility...
-          What does this really do ? JRA. */
-       if (!(neg_flags & NTLMSSP_NEGOTIATE_VERSION)) {
-               ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_VERSION;
-       }
-
-       if ((neg_flags & NTLMSSP_REQUEST_TARGET)) {
-               ntlmssp_state->neg_flags |= NTLMSSP_REQUEST_TARGET;
-       }
-       
-}
-
-/**
-   Weaken NTLMSSP keys to cope with down-level clients and servers.
-
-   We probably should have some parameters to control this, but as
-   it only occours for LM_KEY connections, and this is controlled
-   by the client lanman auth/lanman auth parameters, it isn't too bad.
-*/
-
-DATA_BLOB ntlmssp_weakend_key(struct ntlmssp_state *ntlmssp_state,
-                             TALLOC_CTX *mem_ctx) 
-{
-       DATA_BLOB weakened_key = data_blob_talloc(mem_ctx, 
-                                                 ntlmssp_state->session_key.data,
-                                                 ntlmssp_state->session_key.length);
-       /* Nothing to weaken.  We certainly don't want to 'extend' the length... */
-       if (weakened_key.length < 16) {
-               /* perhaps there was no key? */
-               return weakened_key;
+       *session_key = data_blob_talloc(mem_ctx, ntlmssp_state->session_key.data, ntlmssp_state->session_key.length);
+       if (!session_key->data) {
+               return NT_STATUS_NO_MEMORY;
        }
 
-       /* Key weakening not performed on the master key for NTLM2
-          and does not occour for NTLM1.  Therefore we only need
-          to do this for the LM_KEY.  
-       */
-       if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_LM_KEY) {
-               /* LM key doesn't support 128 bit crypto, so this is
-                * the best we can do.  If you negotiate 128 bit, but
-                * not 56, you end up with 40 bit... */
-               if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_56) {
-                       weakened_key.data[7] = 0xa0;
-                       weakened_key.length = 8;
-               } else { /* forty bits */
-                       weakened_key.data[5] = 0xe5;
-                       weakened_key.data[6] = 0x38;
-                       weakened_key.data[7] = 0xb0;
-                       weakened_key.length = 8;
-               }
-       }
-       return weakened_key;
+       return NT_STATUS_OK;
 }
 
 static bool gensec_ntlmssp_have_feature(struct gensec_security *gensec_security,
@@ -425,7 +278,7 @@ static const char *gensec_ntlmssp_oids[] = {
 
 static const struct gensec_security_ops gensec_ntlmssp_security_ops = {
        .name           = "ntlmssp",
-       .sasl_name      = "NTLM",
+       .sasl_name      = GENSEC_SASL_NAME_NTLMSSP, /* "NTLM" */
        .auth_type      = DCERPC_AUTH_TYPE_NTLMSSP,
        .oid            = gensec_ntlmssp_oids,
        .client_start   = gensec_ntlmssp_client_start,