[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Tue Dec 29 09:06:48 MST 2009
The branch, master has been updated
via d5cbfbb... s4:ntlmssp: remove mem_ctx from check_password() callback to match s3
via f31d144... s4:ntlmssp_server: always call ntlmssp_server_postauth() and decide there if it's a noop
via 994d34b... s4:ntlmssp_server: don't use a mem_ctx for ntlmssp_server_auth()
via 3f04b60... s4:ntlmssp_server: don't use mem_ctx in auth_ntlmssp_check_password()
via 7d4692f... s4:ntlmssp_server: clear session key in ntlmssp_server_preauth()
via dea4560... s4:ntlmssp: use data_blob_null in ntlmssp_server_auth()
via 60b9434... s4:ntlmssp_server: remove unused variable
via a8e61ac... s4:auth/ntlmssp: let get_challenge() return a NTSTATUS and fill a stack buffer
via c9b6ad2... s3:ntlmssp: change get_challange() to return NTSTATUS
from fbb59b2... dsdb: Fix dependencies when building against system ldb.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit d5cbfbb93a1718b3031f37a62e350a2cd7ab0bdc
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 16:14:05 2009 +0100
s4:ntlmssp: remove mem_ctx from check_password() callback to match s3
metze
commit f31d144e70c632892ffc7d5177789947e821ad7e
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 16:10:57 2009 +0100
s4:ntlmssp_server: always call ntlmssp_server_postauth() and decide there if it's a noop
metze
commit 994d34b949cd68b692ca688f162652c924732e84
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 16:07:16 2009 +0100
s4:ntlmssp_server: don't use a mem_ctx for ntlmssp_server_auth()
metze
commit 3f04b60fb9051f65074316b7704793759f4cbdf7
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 16:02:00 2009 +0100
s4:ntlmssp_server: don't use mem_ctx in auth_ntlmssp_check_password()
metze
commit 7d4692fa43fd84a8251231781fba7f3f9e46c30b
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 15:54:59 2009 +0100
s4:ntlmssp_server: clear session key in ntlmssp_server_preauth()
metze
commit dea456089a7838219e7819bfb04a98e03f3d0002
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 12:58:44 2009 +0100
s4:ntlmssp: use data_blob_null in ntlmssp_server_auth()
metze
commit 60b9434492423d463bd1a43d84b5084dce980ecb
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 13:53:44 2009 +0100
s4:ntlmssp_server: remove unused variable
metze
commit a8e61ac084fc84fe9b1246ab97f0ca34cd9a0e8a
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 10:44:19 2009 +0100
s4:auth/ntlmssp: let get_challenge() return a NTSTATUS and fill a stack buffer
metze
commit c9b6ad25004caab854cf6301faa472bb5c890a71
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Dec 29 11:57:28 2009 +0100
s3:ntlmssp: change get_challange() to return NTSTATUS
metze
-----------------------------------------------------------------------
Summary of changes:
source3/auth/auth_ntlmssp.c | 5 +-
source3/include/ntlmssp.h | 4 +-
source3/libsmb/ntlmssp.c | 11 +++-
source4/auth/ntlmssp/ntlmssp.h | 4 +-
source4/auth/ntlmssp/ntlmssp_server.c | 104 ++++++++++++++-------------------
5 files changed, 58 insertions(+), 70 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c
index f95a235..4243a24 100644
--- a/source3/auth/auth_ntlmssp.c
+++ b/source3/auth/auth_ntlmssp.c
@@ -28,13 +28,14 @@
* @return an 8 byte random challenge
*/
-static void auth_ntlmssp_get_challenge(const struct ntlmssp_state *ntlmssp_state,
- uint8_t chal[8])
+static NTSTATUS auth_ntlmssp_get_challenge(const struct ntlmssp_state *ntlmssp_state,
+ uint8_t chal[8])
{
AUTH_NTLMSSP_STATE *auth_ntlmssp_state =
(AUTH_NTLMSSP_STATE *)ntlmssp_state->auth_context;
auth_ntlmssp_state->auth_context->get_ntlm_challenge(
auth_ntlmssp_state->auth_context, chal);
+ return NT_STATUS_OK;
}
/**
diff --git a/source3/include/ntlmssp.h b/source3/include/ntlmssp.h
index f30b53f..d3de598 100644
--- a/source3/include/ntlmssp.h
+++ b/source3/include/ntlmssp.h
@@ -74,8 +74,8 @@ struct ntlmssp_state
* @return 8 bytes of challenge data, determined by the server to be the challenge for NTLM authentication
*
*/
- void (*get_challenge)(const struct ntlmssp_state *ntlmssp_state,
- uint8_t challenge[8]);
+ NTSTATUS (*get_challenge)(const struct ntlmssp_state *ntlmssp_state,
+ uint8_t challenge[8]);
/**
* Callback to find if the challenge used by NTLM authentication may be modified
diff --git a/source3/libsmb/ntlmssp.c b/source3/libsmb/ntlmssp.c
index aaa5031..7fffe7c 100644
--- a/source3/libsmb/ntlmssp.c
+++ b/source3/libsmb/ntlmssp.c
@@ -112,10 +112,11 @@ void debug_ntlmssp_flags(uint32 neg_flags)
*
*/
-static void get_challenge(const struct ntlmssp_state *ntlmssp_state,
- uint8_t chal[8])
+static NTSTATUS get_challenge(const struct ntlmssp_state *ntlmssp_state,
+ uint8_t chal[8])
{
generate_random_buffer(chal, 8);
+ return NT_STATUS_OK;
}
/**
@@ -493,6 +494,7 @@ static NTSTATUS ntlmssp_server_negotiate(struct ntlmssp_state *ntlmssp_state,
const char *target_name;
struct NEGOTIATE_MESSAGE negotiate;
struct CHALLENGE_MESSAGE challenge;
+ NTSTATUS status;
/* parse the NTLMSSP packet */
#if 0
@@ -525,7 +527,10 @@ static NTSTATUS ntlmssp_server_negotiate(struct ntlmssp_state *ntlmssp_state,
ntlmssp_handle_neg_flags(ntlmssp_state, neg_flags, lp_lanman_auth());
/* Ask our caller what challenge they would like in the packet */
- ntlmssp_state->get_challenge(ntlmssp_state, cryptkey);
+ status = ntlmssp_state->get_challenge(ntlmssp_state, cryptkey);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
/* Check if we may set the challenge */
if (!ntlmssp_state->may_set_challenge(ntlmssp_state)) {
diff --git a/source4/auth/ntlmssp/ntlmssp.h b/source4/auth/ntlmssp/ntlmssp.h
index f596cb8..7bed54d 100644
--- a/source4/auth/ntlmssp/ntlmssp.h
+++ b/source4/auth/ntlmssp/ntlmssp.h
@@ -81,7 +81,8 @@ struct gensec_ntlmssp_state
* @return 8 bytes of challenge data, determined by the server to be the challenge for NTLM authentication
*
*/
- const uint8_t *(*get_challenge)(const struct gensec_ntlmssp_state *);
+ NTSTATUS (*get_challenge)(const struct gensec_ntlmssp_state *,
+ uint8_t challenge[8]);
/**
* Callback to find if the challenge used by NTLM authentication may be modified
@@ -117,7 +118,6 @@ struct gensec_ntlmssp_state
*
*/
NTSTATUS (*check_password)(struct gensec_ntlmssp_state *,
- TALLOC_CTX *mem_ctx,
DATA_BLOB *nt_session_key, DATA_BLOB *lm_session_key);
const char *server_name;
diff --git a/source4/auth/ntlmssp/ntlmssp_server.c b/source4/auth/ntlmssp/ntlmssp_server.c
index 281ffbf..c49bf2f 100644
--- a/source4/auth/ntlmssp/ntlmssp_server.c
+++ b/source4/auth/ntlmssp/ntlmssp_server.c
@@ -124,8 +124,9 @@ NTSTATUS ntlmssp_server_negotiate(struct gensec_security *gensec_security,
DATA_BLOB struct_blob;
uint32_t neg_flags = 0;
uint32_t ntlmssp_command, chal_flags;
- const uint8_t *cryptkey;
+ uint8_t cryptkey[8];
const char *target_name;
+ NTSTATUS status;
/* parse the NTLMSSP packet */
#if 0
@@ -150,10 +151,11 @@ NTSTATUS ntlmssp_server_negotiate(struct gensec_security *gensec_security,
ntlmssp_handle_neg_flags(gensec_ntlmssp_state, neg_flags, gensec_ntlmssp_state->allow_lm_key);
/* Ask our caller what challenge they would like in the packet */
- cryptkey = gensec_ntlmssp_state->get_challenge(gensec_ntlmssp_state);
- if (!cryptkey) {
- DEBUG(1, ("ntlmssp_server_negotiate: backend doesn't give a challenge\n"));
- return NT_STATUS_INTERNAL_ERROR;
+ status = gensec_ntlmssp_state->get_challenge(gensec_ntlmssp_state, cryptkey);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(1, ("ntlmssp_server_negotiate: backend doesn't give a challenge: %s\n",
+ nt_errstr(status)));
+ return status;
}
/* Check if we may set the challenge */
@@ -180,7 +182,6 @@ NTSTATUS ntlmssp_server_negotiate(struct gensec_security *gensec_security,
/* This creates the 'blob' of names that appears at the end of the packet */
if (chal_flags & NTLMSSP_NEGOTIATE_TARGET_INFO) {
char dnsdomname[MAXHOSTNAMELEN], dnsname[MAXHOSTNAMELEN];
- const char *target_name_dns = "";
/* Find out the DNS domain name */
dnsdomname[0] = '\0';
@@ -194,12 +195,6 @@ NTSTATUS ntlmssp_server_negotiate(struct gensec_security *gensec_security,
}
strlower_m(dnsname);
- if (chal_flags |= NTLMSSP_TARGET_TYPE_DOMAIN) {
- target_name_dns = dnsdomname;
- } else if (chal_flags |= NTLMSSP_TARGET_TYPE_SERVER) {
- target_name_dns = dnsname;
- }
-
msrpc_gen(out_mem_ctx,
&struct_blob, "aaaaa",
MsvAvNbDomainName, target_name,
@@ -268,6 +263,7 @@ static NTSTATUS ntlmssp_server_preauth(struct gensec_ntlmssp_state *gensec_ntlms
}
/* zero these out */
+ data_blob_free(&gensec_ntlmssp_state->session_key);
data_blob_free(&gensec_ntlmssp_state->lm_resp);
data_blob_free(&gensec_ntlmssp_state->nt_resp);
data_blob_free(&gensec_ntlmssp_state->encrypted_session_key);
@@ -406,6 +402,11 @@ static NTSTATUS ntlmssp_server_postauth(struct gensec_security *gensec_security,
NTSTATUS nt_status;
DATA_BLOB session_key = data_blob(NULL, 0);
+ if (!(gensec_security->want_features
+ & (GENSEC_FEATURE_SIGN|GENSEC_FEATURE_SEAL|GENSEC_FEATURE_SESSION_KEY))) {
+ return NT_STATUS_OK;
+ }
+
if (user_session_key)
dump_data_pw("USER session key:\n", user_session_key->data, user_session_key->length);
@@ -548,20 +549,15 @@ NTSTATUS ntlmssp_server_auth(struct gensec_security *gensec_security,
const DATA_BLOB in, DATA_BLOB *out)
{
struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data;
- DATA_BLOB user_session_key = data_blob(NULL, 0);
- DATA_BLOB lm_session_key = data_blob(NULL, 0);
+ DATA_BLOB user_session_key = data_blob_null;
+ DATA_BLOB lm_session_key = data_blob_null;
NTSTATUS nt_status;
- TALLOC_CTX *mem_ctx = talloc_new(out_mem_ctx);
- if (!mem_ctx) {
- return NT_STATUS_NO_MEMORY;
- }
-
/* zero the outbound NTLMSSP packet */
- *out = data_blob_talloc(out_mem_ctx, NULL, 0);
+ *out = data_blob_null;
- if (!NT_STATUS_IS_OK(nt_status = ntlmssp_server_preauth(gensec_ntlmssp_state, in))) {
- talloc_free(mem_ctx);
+ nt_status = ntlmssp_server_preauth(gensec_ntlmssp_state, in);
+ if (!NT_STATUS_IS_OK(nt_status)) {
return nt_status;
}
@@ -573,23 +569,21 @@ NTSTATUS ntlmssp_server_auth(struct gensec_security *gensec_security,
*/
/* Finally, actually ask if the password is OK */
-
- if (!NT_STATUS_IS_OK(nt_status = gensec_ntlmssp_state->check_password(gensec_ntlmssp_state, mem_ctx,
- &user_session_key, &lm_session_key))) {
- talloc_free(mem_ctx);
+ nt_status = gensec_ntlmssp_state->check_password(gensec_ntlmssp_state,
+ &user_session_key,
+ &lm_session_key);
+ if (!NT_STATUS_IS_OK(nt_status)) {
return nt_status;
}
-
- if (gensec_security->want_features
- & (GENSEC_FEATURE_SIGN|GENSEC_FEATURE_SEAL|GENSEC_FEATURE_SESSION_KEY)) {
- nt_status = ntlmssp_server_postauth(gensec_security, &user_session_key, &lm_session_key);
- talloc_free(mem_ctx);
+
+ nt_status = ntlmssp_server_postauth(gensec_security,
+ &user_session_key,
+ &lm_session_key);
+ if (!NT_STATUS_IS_OK(nt_status)) {
return nt_status;
- } else {
- gensec_ntlmssp_state->session_key = data_blob(NULL, 0);
- talloc_free(mem_ctx);
- return NT_STATUS_OK;
}
+
+ return NT_STATUS_OK;
}
/**
@@ -597,22 +591,19 @@ NTSTATUS ntlmssp_server_auth(struct gensec_security *gensec_security,
* @return an 8 byte random challenge
*/
-static const uint8_t *auth_ntlmssp_get_challenge(const struct gensec_ntlmssp_state *gensec_ntlmssp_state)
+static NTSTATUS auth_ntlmssp_get_challenge(const struct gensec_ntlmssp_state *gensec_ntlmssp_state,
+ uint8_t chal[8])
{
NTSTATUS status;
- uint8_t *chal = talloc_array(gensec_ntlmssp_state, uint8_t, 8);
- if (!chal) {
- return NULL;
- }
status = gensec_ntlmssp_state->auth_context->get_challenge(gensec_ntlmssp_state->auth_context, chal);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("auth_ntlmssp_get_challenge: failed to get challenge: %s\n",
nt_errstr(status)));
- return NULL;
+ return status;
}
- return chal;
+ return NT_STATUS_OK;
}
/**
@@ -654,12 +645,13 @@ static NTSTATUS auth_ntlmssp_set_challenge(struct gensec_ntlmssp_state *gensec_n
* Return the session keys used on the connection.
*/
-static NTSTATUS auth_ntlmssp_check_password(struct gensec_ntlmssp_state *gensec_ntlmssp_state,
- TALLOC_CTX *mem_ctx,
- DATA_BLOB *user_session_key, DATA_BLOB *lm_session_key)
+static NTSTATUS auth_ntlmssp_check_password(struct gensec_ntlmssp_state *gensec_ntlmssp_state,
+ DATA_BLOB *user_session_key, DATA_BLOB *lm_session_key)
{
NTSTATUS nt_status;
- struct auth_usersupplied_info *user_info = talloc(mem_ctx, struct auth_usersupplied_info);
+ struct auth_usersupplied_info *user_info;
+
+ user_info = talloc(gensec_ntlmssp_state, struct auth_usersupplied_info);
if (!user_info) {
return NT_STATUS_NO_MEMORY;
}
@@ -678,31 +670,21 @@ static NTSTATUS auth_ntlmssp_check_password(struct gensec_ntlmssp_state *gensec_
user_info->password.response.nt = gensec_ntlmssp_state->nt_resp;
user_info->password.response.nt.data = talloc_steal(user_info, gensec_ntlmssp_state->nt_resp.data);
- nt_status = gensec_ntlmssp_state->auth_context->check_password(gensec_ntlmssp_state->auth_context,
- mem_ctx,
- user_info,
+ nt_status = gensec_ntlmssp_state->auth_context->check_password(gensec_ntlmssp_state->auth_context,
+ gensec_ntlmssp_state,
+ user_info,
&gensec_ntlmssp_state->server_info);
talloc_free(user_info);
NT_STATUS_NOT_OK_RETURN(nt_status);
- talloc_steal(gensec_ntlmssp_state, gensec_ntlmssp_state->server_info);
-
if (gensec_ntlmssp_state->server_info->user_session_key.length) {
- DEBUG(10, ("Got NT session key of length %u\n",
+ DEBUG(10, ("Got NT session key of length %u\n",
(unsigned)gensec_ntlmssp_state->server_info->user_session_key.length));
- if (!talloc_reference(mem_ctx, gensec_ntlmssp_state->server_info->user_session_key.data)) {
- return NT_STATUS_NO_MEMORY;
- }
-
*user_session_key = gensec_ntlmssp_state->server_info->user_session_key;
}
if (gensec_ntlmssp_state->server_info->lm_session_key.length) {
- DEBUG(10, ("Got LM session key of length %u\n",
+ DEBUG(10, ("Got LM session key of length %u\n",
(unsigned)gensec_ntlmssp_state->server_info->lm_session_key.length));
- if (!talloc_reference(mem_ctx, gensec_ntlmssp_state->server_info->lm_session_key.data)) {
- return NT_STATUS_NO_MEMORY;
- }
-
*lm_session_key = gensec_ntlmssp_state->server_info->lm_session_key;
}
return nt_status;
--
Samba Shared Repository
More information about the samba-cvs
mailing list