smb3 encryption hacks
authorStefan Metzmacher <metze@samba.org>
Tue, 14 Aug 2012 08:38:46 +0000 (10:38 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 18 Sep 2012 03:10:23 +0000 (05:10 +0200)
libcli/smb/smbXcli_base.c
libcli/smb/smbXcli_base.h
source4/libcli/smb2/smb2.h
source4/libcli/smb2/transport.c
source4/torture/smb2/compound.c

index d93cd96b5c62623c483dc1b24ca1f850a75ee426..13ec8e7b8057dd06a9d3cbe05ff473456b64482b 100644 (file)
@@ -2644,6 +2644,14 @@ void smb2cli_req_set_notify_async(struct tevent_req *req)
        state->smb2.notify_async = true;
 }
 
+void smb2cli_req_set_session(struct tevent_req *req, struct smbXcli_session *session)
+{
+       struct smbXcli_req_state *state =
+               tevent_req_data(req,
+               struct smbXcli_req_state);
+
+       state->session = session;
+}
 static void smb2cli_req_writev_done(struct tevent_req *subreq);
 static NTSTATUS smb2cli_conn_dispatch_incoming(struct smbXcli_conn *conn,
                                               TALLOC_CTX *tmp_mem,
index 5ef201e3a9833e5e9ce27c84130e4f8b62e73e62..9d97bbf4ec84999c0600cd1131d72caeeb71a09b 100644 (file)
@@ -209,6 +209,7 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
                                      const uint8_t *dyn,
                                      uint32_t dyn_len);
 void smb2cli_req_set_notify_async(struct tevent_req *req);
+void smb2cli_req_set_session(struct tevent_req *req, struct smbXcli_session *session);
 NTSTATUS smb2cli_req_compound_submit(struct tevent_req **reqs,
                                     int num_reqs);
 void smb2cli_req_set_credit_charge(struct tevent_req *req, uint16_t charge);
index 101ef7380760146e2662e75059bd628deac04441..afcc0bbf08fd4b59082cf5b46a6851f392a5163f 100644 (file)
@@ -66,6 +66,7 @@ struct smb2_transport {
        struct {
                bool related;
                struct tevent_req **reqs;
+               struct smbXcli_session *session;
        } compound;
 
        /* an idle function - if this is defined then it will be
index bdab523f4fbe031f547ff5af51cdc4037ef88c8e..c51df23031c0392d4bc8ee72b484313ec352de2c 100644 (file)
@@ -167,6 +167,7 @@ void smb2_transport_send(struct smb2_request *req)
 
        if (req->tree) {
                tcon = req->tree->smbXcli;
+
        }
 
        if (transport->compound.related) {
@@ -231,6 +232,10 @@ void smb2_transport_send(struct smb2_request *req)
                reqs = &req->subreq;
                num_reqs = 1;
        }
+
+       if (transport->compound.session) {
+               smb2cli_req_set_session(reqs[0], transport->compound.session);
+       }
        status = smb2cli_req_compound_submit(reqs, num_reqs);
 
        TALLOC_FREE(transport->compound.reqs);
index 0eef3695bdbb12d8380641d24bb400e553157c73..eb2c545d3f5f9b4ae97b13de9d2c8766acb92f20 100644 (file)
@@ -50,6 +50,24 @@ static bool test_compound_related1(struct torture_context *tctx,
        struct smbXcli_tcon *saved_tcon = tree->smbXcli;
        struct smbXcli_session *saved_session = tree->session->smbXcli;
 
+       struct smb2_session *session2;
+       struct smb2_tree *tree2;
+
+       if (!torture_smb2_session_setup(tctx, tree->session->transport,
+                                       0, /* previous_session_id */
+                                       tctx, &session2))
+       {
+               torture_warning(tctx, "session setup failed.\n");
+               ret = false;
+               goto done;
+       }
+
+       if (!torture_smb2_tree_connect(tctx, session2, tctx, &tree2)) {
+               torture_warning(tctx, "tree connect failed.\n");
+               ret = false;
+               goto done;
+       }
+
        smb2_transport_credits_ask_num(tree->session->transport, 2);
 
        smb2_util_unlink(tree, fname);
@@ -128,7 +146,27 @@ static bool test_compound_related2(struct torture_context *tctx,
        struct smb2_request *req[5];
        struct smbXcli_tcon *saved_tcon = tree->smbXcli;
        struct smbXcli_session *saved_session = tree->session->smbXcli;
-
+       struct smbXcli_session *saved_session2;
+       struct smbXcli_session *saved_session3;
+
+       struct smb2_session *session2;
+       struct smb2_tree *tree2;
+
+       if (!torture_smb2_session_setup(tctx, tree->session->transport,
+                                       0, /* previous_session_id */
+                                       tctx, &session2))
+       {
+               torture_warning(tctx, "session setup failed.\n");
+               ret = false;
+               goto done;
+       }
+       saved_session2 = session2->smbXcli;
+
+       if (!torture_smb2_tree_connect(tctx, session2, tctx, &tree2)) {
+               torture_warning(tctx, "tree connect failed.\n");
+               ret = false;
+               goto done;
+       }
        smb2_transport_credits_ask_num(tree->session->transport, 5);
 
        smb2_util_unlink(tree, fname);
@@ -177,12 +215,17 @@ static bool test_compound_related2(struct torture_context *tctx,
        tree->session->smbXcli = smbXcli_session_create(tree->session,
                                                        tree->session->transport->conn);
        smb2cli_session_set_id_and_flags(tree->session->smbXcli, UINT64_MAX, 0);
+       saved_session3 = tree->session->smbXcli;
 
+       tree->session->smbXcli = saved_session2;
        req[1] = smb2_close_send(tree, &cl);
+       tree->session->smbXcli = saved_session3;
        req[2] = smb2_close_send(tree, &cl);
        req[3] = smb2_close_send(tree, &cl);
        req[4] = smb2_close_send(tree, &cl);
 
+       tree->session->smbXcli = saved_session3;
+
        status = smb2_create_recv(req[0], tree, &cr);
        CHECK_STATUS(status, NT_STATUS_OK);
        status = smb2_close_recv(req[1], &cl);
@@ -284,6 +327,28 @@ static bool test_compound_unrelated1(struct torture_context *tctx,
        struct smb2_close cl;
        bool ret = true;
        struct smb2_request *req[5];
+       struct smbXcli_session *saved_session = tree->session->smbXcli;
+       struct smbXcli_session *saved_session2;
+       struct smbXcli_session *saved_session3;
+
+       struct smb2_session *session2;
+       struct smb2_tree *tree2;
+
+       if (!torture_smb2_session_setup(tctx, tree->session->transport,
+                                       0, /* previous_session_id */
+                                       tctx, &session2))
+       {
+               torture_warning(tctx, "session setup failed.\n");
+               ret = false;
+               goto done;
+       }
+       saved_session2 = session2->smbXcli;
+
+       if (!torture_smb2_tree_connect(tctx, session2, tctx, &tree2)) {
+               torture_warning(tctx, "tree connect failed.\n");
+               ret = false;
+               goto done;
+       }
 
        smb2_transport_credits_ask_num(tree->session->transport, 5);
 
@@ -310,6 +375,7 @@ static bool test_compound_unrelated1(struct torture_context *tctx,
        cr.in.fname                     = fname;
 
        smb2_transport_compound_start(tree->session->transport, 5);
+       tree->session->transport->compound.session = session2->smbXcli;
 
        req[0] = smb2_create_send(tree, &cr);
 
@@ -318,6 +384,12 @@ static bool test_compound_unrelated1(struct torture_context *tctx,
 
        ZERO_STRUCT(cl);
        cl.in.file.handle = hd;
+
+       //tree->session->smbXcli = smbXcli_session_create(tree->session,
+                                                       //tree->session->transport->conn);
+       //smb2cli_session_set_id_and_flags(tree->session->smbXcli, 12345678, 0);
+       //saved_session3 = tree->session->smbXcli;
+
        req[1] = smb2_close_send(tree, &cl);
        req[2] = smb2_close_send(tree, &cl);
        req[3] = smb2_close_send(tree, &cl);