svn commit: samba r11666 - in branches/SAMBA_4_0/source: include libcli/smb2 torture/smb2

tridge at samba.org tridge at samba.org
Fri Nov 11 06:26:43 GMT 2005


Author: tridge
Date: 2005-11-11 06:26:42 +0000 (Fri, 11 Nov 2005)
New Revision: 11666

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=11666

Log:

filled in the basic session setup. Vista happily accepts the first
stage of the session setup, and waits for more.

Modified:
   branches/SAMBA_4_0/source/include/structs.h
   branches/SAMBA_4_0/source/libcli/smb2/session.c
   branches/SAMBA_4_0/source/libcli/smb2/smb2.h
   branches/SAMBA_4_0/source/torture/smb2/connect.c


Changeset:
Modified: branches/SAMBA_4_0/source/include/structs.h
===================================================================
--- branches/SAMBA_4_0/source/include/structs.h	2005-11-11 05:53:54 UTC (rev 11665)
+++ branches/SAMBA_4_0/source/include/structs.h	2005-11-11 06:26:42 UTC (rev 11666)
@@ -337,3 +337,4 @@
 struct smb2_request;
 struct smb2_transport;
 struct smb2_negprot;
+struct smb2_session_setup;

Modified: branches/SAMBA_4_0/source/libcli/smb2/session.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/smb2/session.c	2005-11-11 05:53:54 UTC (rev 11665)
+++ branches/SAMBA_4_0/source/libcli/smb2/session.c	2005-11-11 06:26:42 UTC (rev 11666)
@@ -23,6 +23,7 @@
 #include "includes.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/smb2/smb2.h"
+#include "libcli/smb2/smb2_calls.h"
 
 /*
   initialise a smb2_session structure
@@ -31,6 +32,7 @@
 				       TALLOC_CTX *parent_ctx, BOOL primary)
 {
 	struct smb2_session *session;
+	NTSTATUS status;
 
 	session = talloc_zero(parent_ctx, struct smb2_session);
 	if (!session) {
@@ -42,6 +44,74 @@
 		session->transport = talloc_reference(session, transport);
 	}
 
+	/* prepare a gensec context for later use */
+	status = gensec_client_start(session, &session->gensec, 
+				     session->transport->socket->event.ctx);
+	if (!NT_STATUS_IS_OK(status)) {
+		talloc_free(session);
+		return NULL;
+	}
+
 	return session;
 }
 
+/*
+  send a session setup request
+*/
+struct smb2_request *smb2_session_setup_send(struct smb2_session *session, 
+					     struct smb2_session_setup *io)
+{
+	struct smb2_request *req;
+	
+	req = smb2_request_init(session->transport, SMB2_OP_SESSSETUP, 
+				0x10 + io->in.secblob.length);
+	if (req == NULL) return NULL;
+
+	SIVAL(req->out.body, 0x00, io->in.unknown1);
+	SIVAL(req->out.body, 0x04, io->in.unknown2);
+	SIVAL(req->out.body, 0x08, io->in.unknown3);
+	SSVAL(req->out.body, 0x0C, io->in.unknown4);
+	SSVAL(req->out.body, 0x0E, io->in.secblob.length);
+	memcpy(req->out.body+0x10, io->in.secblob.data, io->in.secblob.length);
+
+	smb2_transport_send(req);
+
+	return req;
+}
+
+
+/*
+  recv a session setup reply
+*/
+NTSTATUS smb2_session_setup_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, 
+				 struct smb2_session_setup *io)
+{
+	uint16_t blobsize;
+
+	if (!smb2_request_receive(req) || 
+	    smb2_request_is_error(req)) {
+		return smb2_request_destroy(req);
+	}
+
+	if (req->in.body_size < 0x08) {
+		return NT_STATUS_BUFFER_TOO_SMALL;
+	}
+
+	io->out.unknown1     = IVAL(req->in.body, 0x00);
+	io->out.unknown2     = SVAL(req->in.body, 0x04);
+	blobsize             = SVAL(req->in.body, 0x06);
+	io->out.secblob      = smb2_pull_blob(req, req->in.body+0x08, blobsize);
+	talloc_steal(mem_ctx, io->out.secblob.data);
+
+	return smb2_request_destroy(req);
+}
+
+/*
+  sync session setup request
+*/
+NTSTATUS smb2_session_setup(struct smb2_session *session, 
+			    TALLOC_CTX *mem_ctx, struct smb2_session_setup *io)
+{
+	struct smb2_request *req = smb2_session_setup_send(session, io);
+	return smb2_session_setup_recv(req, mem_ctx, io);
+}

Modified: branches/SAMBA_4_0/source/libcli/smb2/smb2.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/smb2/smb2.h	2005-11-11 05:53:54 UTC (rev 11665)
+++ branches/SAMBA_4_0/source/libcli/smb2/smb2.h	2005-11-11 06:26:42 UTC (rev 11666)
@@ -56,6 +56,7 @@
 */
 struct smb2_session {
 	struct smb2_transport *transport;
+	struct gensec_security *gensec;
 };
 
 struct smb2_request_buffer {

Modified: branches/SAMBA_4_0/source/torture/smb2/connect.c
===================================================================
--- branches/SAMBA_4_0/source/torture/smb2/connect.c	2005-11-11 05:53:54 UTC (rev 11665)
+++ branches/SAMBA_4_0/source/torture/smb2/connect.c	2005-11-11 06:26:42 UTC (rev 11666)
@@ -27,6 +27,7 @@
 #include "librpc/gen_ndr/ndr_security.h"
 #include "lib/cmdline/popt_common.h"
 #include "lib/events/events.h"
+#include "auth/gensec/gensec.h"
 
 #define BASEDIR "\\testsmb2"
 
@@ -78,7 +79,6 @@
 	return transport;
 }
 
-#if 0
 /*
   send a session setup
 */
@@ -86,19 +86,63 @@
 						 struct cli_credentials *credentials)
 {
 	struct smb2_session *session;
+	struct smb2_session_setup io;
 	NTSTATUS status;
+	TALLOC_CTX *tmp_ctx = talloc_new(transport);
 
-	session = smb2_session_init(transport);
+	ZERO_STRUCT(io);
+	io.in.unknown1 = 0x11;
+	io.in.unknown2 = 0xF;
+	io.in.unknown3 = 0x00;
+	io.in.unknown4 = 0x50;
 
-	status = smb2_session_setup(session, credentials)
+	session = smb2_session_init(transport, transport, True);
+
+	status = gensec_set_credentials(session->gensec, credentials);
 	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("Failed to start set GENSEC client credentails: %s\n", 
+			  nt_errstr(status)));
+		return NULL;
+	}
+
+	status = gensec_set_target_hostname(session->gensec, transport->socket->hostname);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("Failed to start set GENSEC target hostname: %s\n", 
+			  nt_errstr(status)));
+		return NULL;
+	}
+
+	status = gensec_set_target_service(session->gensec, "cifs");
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("Failed to start set GENSEC target service: %s\n", 
+			  nt_errstr(status)));
+		return NULL;
+	}
+
+	status = gensec_start_mech_by_oid(session->gensec, GENSEC_OID_SPNEGO);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("Failed to start set GENSEC client - %s\n",
+			  nt_errstr(status)));
+		return NULL;
+	}
+
+	status = gensec_update(session->gensec, tmp_ctx,
+			       session->transport->negotiate.secblob,
+			       &io.in.secblob);
+	if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED) && 
+	    !NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("Failed initial gensec_update : %s\n", nt_errstr(status)));
+		return NULL;
+	}
+
+	status = smb2_session_setup(session, tmp_ctx, &io);
+	if (!NT_STATUS_IS_OK(status)) {
 		printf("session setup failed - %s\n", nt_errstr(status));
 		return NULL;
 	}
 
 	return session;
 }
-#endif
 
 /* 
    basic testing of SMB2 connection calls
@@ -112,9 +156,7 @@
 	struct cli_credentials *credentials = cmdline_credentials;
 
 	transport = torture_smb2_negprot(mem_ctx, host);
-#if 0
 	session = torture_smb2_session(transport, credentials);
-#endif
 
 	talloc_free(mem_ctx);
 



More information about the samba-cvs mailing list