s3:libsmb:smb2: pass previous session ID to session setup, not previous session
[Samba/id10ts.git] / source3 / torture / test_smb2.c
blob9334ab73bcc344940d63f0301f3bc3a6d90d18a6
1 /*
2 Unix SMB/CIFS implementation.
3 Initial test for the smb2 client lib
4 Copyright (C) Volker Lendecke 2011
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "includes.h"
21 #include "torture/proto.h"
22 #include "client.h"
23 #include "../libcli/smb/smbXcli_base.h"
24 #include "libsmb/smb2cli.h"
25 #include "libcli/security/security.h"
26 #include "libsmb/proto.h"
27 #include "auth/gensec/gensec.h"
28 #include "auth_generic.h"
30 extern fstring host, workgroup, share, password, username, myname;
32 bool run_smb2_basic(int dummy)
34 struct cli_state *cli;
35 NTSTATUS status;
36 uint64_t fid_persistent, fid_volatile;
37 const char *hello = "Hello, world\n";
38 uint8_t *result;
39 uint32_t nread;
40 uint8_t *dir_data;
41 uint32_t dir_data_length;
42 uint32_t saved_tid = 0;
43 uint64_t saved_uid = 0;
45 printf("Starting SMB2-BASIC\n");
47 if (!torture_init_connection(&cli)) {
48 return false;
50 cli->smb2.pid = 0xFEFF;
52 status = smbXcli_negprot(cli->conn, cli->timeout,
53 PROTOCOL_SMB2_02, PROTOCOL_SMB2_02);
54 if (!NT_STATUS_IS_OK(status)) {
55 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
56 return false;
59 status = cli_session_setup(cli, username,
60 password, strlen(password),
61 password, strlen(password),
62 workgroup);
63 if (!NT_STATUS_IS_OK(status)) {
64 printf("cli_session_setup returned %s\n", nt_errstr(status));
65 return false;
68 status = cli_tree_connect(cli, share, "?????", "", 0);
69 if (!NT_STATUS_IS_OK(status)) {
70 printf("cli_tree_connect returned %s\n", nt_errstr(status));
71 return false;
74 status = smb2cli_create(cli, "smb2-basic.txt",
75 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
76 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
77 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
78 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
79 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
80 FILE_CREATE, /* create_disposition, */
81 FILE_DELETE_ON_CLOSE, /* create_options, */
82 NULL, /* smb2_create_blobs *blobs */
83 &fid_persistent,
84 &fid_volatile);
85 if (!NT_STATUS_IS_OK(status)) {
86 printf("smb2cli_create returned %s\n", nt_errstr(status));
87 return false;
90 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
91 fid_volatile, 0, 0, (const uint8_t *)hello);
92 if (!NT_STATUS_IS_OK(status)) {
93 printf("smb2cli_write returned %s\n", nt_errstr(status));
94 return false;
97 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
98 if (!NT_STATUS_IS_OK(status)) {
99 printf("smb2cli_flush returned %s\n", nt_errstr(status));
100 return false;
103 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
104 fid_volatile, 2, 0,
105 talloc_tos(), &result, &nread);
106 if (!NT_STATUS_IS_OK(status)) {
107 printf("smb2cli_read returned %s\n", nt_errstr(status));
108 return false;
111 if (nread != strlen(hello)) {
112 printf("smb2cli_read returned %d bytes, expected %d\n",
113 (int)nread, (int)strlen(hello));
114 return false;
117 if (memcmp(hello, result, nread) != 0) {
118 printf("smb2cli_read returned '%s', expected '%s'\n",
119 result, hello);
120 return false;
123 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
124 if (!NT_STATUS_IS_OK(status)) {
125 printf("smb2cli_close returned %s\n", nt_errstr(status));
126 return false;
129 status = smb2cli_create(cli, "",
130 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
131 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
132 SEC_STD_SYNCHRONIZE|
133 SEC_DIR_LIST|
134 SEC_DIR_READ_ATTRIBUTE, /* desired_access, */
135 0, /* file_attributes, */
136 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
137 FILE_OPEN, /* create_disposition, */
138 FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, /* create_options, */
139 NULL, /* smb2_create_blobs *blobs */
140 &fid_persistent,
141 &fid_volatile);
142 if (!NT_STATUS_IS_OK(status)) {
143 printf("smb2cli_create returned %s\n", nt_errstr(status));
144 return false;
147 status = smb2cli_query_directory(
148 cli, 1, 0, 0, fid_persistent, fid_volatile, "*", 0xffff,
149 talloc_tos(), &dir_data, &dir_data_length);
151 if (!NT_STATUS_IS_OK(status)) {
152 printf("smb2cli_query_directory returned %s\n", nt_errstr(status));
153 return false;
156 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
157 if (!NT_STATUS_IS_OK(status)) {
158 printf("smb2cli_close returned %s\n", nt_errstr(status));
159 return false;
162 saved_tid = cli->smb2.tid;
163 status = smb2cli_tdis(cli);
164 if (!NT_STATUS_IS_OK(status)) {
165 printf("smb2cli_tdis returned %s\n", nt_errstr(status));
166 return false;
168 cli->smb2.tid = saved_tid;
170 status = smb2cli_tdis(cli);
171 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
172 printf("2nd smb2cli_tdis returned %s\n", nt_errstr(status));
173 return false;
176 saved_uid = smb2cli_session_current_id(cli->smb2.session);
177 status = smb2cli_logoff(cli);
178 if (!NT_STATUS_IS_OK(status)) {
179 printf("smb2cli_logoff returned %s\n", nt_errstr(status));
180 return false;
183 cli->smb2.session = smbXcli_session_create(cli, cli->conn);
184 if (cli->smb2.session == NULL) {
185 printf("smbXcli_session_create() returned NULL\n");
186 return false;
189 smb2cli_session_set_id_and_flags(cli->smb2.session, saved_uid, 0);
191 status = smb2cli_logoff(cli);
192 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
193 printf("2nd smb2cli_logoff returned %s\n", nt_errstr(status));
194 return false;
197 return true;
200 bool run_smb2_negprot(int dummy)
202 struct cli_state *cli;
203 NTSTATUS status;
204 enum protocol_types protocol;
205 const char *name = NULL;
207 printf("Starting SMB2-NEGPROT\n");
209 if (!torture_init_connection(&cli)) {
210 return false;
212 cli->smb2.pid = 0xFEFF;
214 status = smbXcli_negprot(cli->conn, cli->timeout,
215 PROTOCOL_CORE, PROTOCOL_SMB2_24);
216 if (!NT_STATUS_IS_OK(status)) {
217 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
218 return false;
221 protocol = smbXcli_conn_protocol(cli->conn);
223 switch (protocol) {
224 case PROTOCOL_SMB2_02:
225 name = "SMB2_02";
226 break;
227 case PROTOCOL_SMB2_10:
228 name = "SMB2_10";
229 break;
230 case PROTOCOL_SMB2_22:
231 name = "SMB2_22";
232 break;
233 case PROTOCOL_SMB2_24:
234 name = "SMB2_24";
235 break;
236 default:
237 break;
240 if (name) {
241 printf("Server supports %s\n", name);
242 } else {
243 printf("Server DOES NOT support SMB2\n");
244 return false;
247 status = smbXcli_negprot(cli->conn, cli->timeout,
248 protocol, protocol);
249 if (!NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_RESET) &&
250 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_DISCONNECTED) &&
251 !NT_STATUS_EQUAL(status, NT_STATUS_CONNECTION_ABORTED)) {
252 printf("2nd smbXcli_negprot should disconnect - returned %s\n",
253 nt_errstr(status));
254 return false;
257 if (smbXcli_conn_is_connected(cli->conn)) {
258 printf("2nd smbXcli_negprot should disconnect "
259 "- still connected\n");
260 return false;
263 return true;
266 bool run_smb2_session_reconnect(int dummy)
268 struct cli_state *cli1;
269 struct cli_state *cli2;
270 NTSTATUS status;
271 bool ok;
272 uint64_t fid_persistent, fid_volatile;
273 struct tevent_context *ev;
274 struct tevent_req *subreq;
275 DATA_BLOB in_blob = data_blob_null;
276 DATA_BLOB out_blob;
277 DATA_BLOB session_key;
278 struct auth_generic_state *auth_generic_state;
279 struct iovec *recv_iov;
280 const char *hello = "Hello, world\n";
281 uint8_t *result;
282 uint32_t nread;
284 printf("Starting SMB2-SESSION-RECONNECT\n");
286 if (!torture_init_connection(&cli1)) {
287 return false;
289 cli1->smb2.pid = 0xFEFF;
291 status = smbXcli_negprot(cli1->conn, cli1->timeout,
292 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
293 if (!NT_STATUS_IS_OK(status)) {
294 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
295 return false;
298 status = cli_session_setup(cli1, username,
299 password, strlen(password),
300 password, strlen(password),
301 workgroup);
302 if (!NT_STATUS_IS_OK(status)) {
303 printf("cli_session_setup returned %s\n", nt_errstr(status));
304 return false;
307 status = cli_tree_connect(cli1, share, "?????", "", 0);
308 if (!NT_STATUS_IS_OK(status)) {
309 printf("cli_tree_connect returned %s\n", nt_errstr(status));
310 return false;
313 status = smb2cli_create(cli1, "session-reconnect.txt",
314 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
315 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
316 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
317 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
318 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
319 FILE_CREATE, /* create_disposition, */
320 FILE_DELETE_ON_CLOSE, /* create_options, */
321 NULL, /* smb2_create_blobs *blobs */
322 &fid_persistent,
323 &fid_volatile);
324 if (!NT_STATUS_IS_OK(status)) {
325 printf("smb2cli_create on cli1 %s\n", nt_errstr(status));
326 return false;
329 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
330 fid_volatile, 0, 0, (const uint8_t *)hello);
331 if (!NT_STATUS_IS_OK(status)) {
332 printf("smb2cli_write returned %s\n", nt_errstr(status));
333 return false;
336 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
337 if (!NT_STATUS_IS_OK(status)) {
338 printf("smb2cli_flush returned %s\n", nt_errstr(status));
339 return false;
342 status = smb2cli_read(cli1, 0x10000, 0, fid_persistent,
343 fid_volatile, 2, 0,
344 talloc_tos(), &result, &nread);
345 if (!NT_STATUS_IS_OK(status)) {
346 printf("smb2cli_read returned %s\n", nt_errstr(status));
347 return false;
350 if (nread != strlen(hello)) {
351 printf("smb2cli_read returned %d bytes, expected %d\n",
352 (int)nread, (int)strlen(hello));
353 return false;
356 if (memcmp(hello, result, nread) != 0) {
357 printf("smb2cli_read returned '%s', expected '%s'\n",
358 result, hello);
359 return false;
362 /* prepare second session */
364 if (!torture_init_connection(&cli2)) {
365 return false;
367 cli2->smb2.pid = 0xFEFF;
369 status = smbXcli_negprot(cli2->conn, cli2->timeout,
370 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
371 if (!NT_STATUS_IS_OK(status)) {
372 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
373 return false;
376 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
377 if (!NT_STATUS_IS_OK(status)) {
378 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
379 return false;
382 gensec_want_feature(auth_generic_state->gensec_security,
383 GENSEC_FEATURE_SESSION_KEY);
384 status = auth_generic_set_username(auth_generic_state, username);
385 if (!NT_STATUS_IS_OK(status)) {
386 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
387 return false;
390 status = auth_generic_set_domain(auth_generic_state, workgroup);
391 if (!NT_STATUS_IS_OK(status)) {
392 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
393 return false;
396 status = auth_generic_set_password(auth_generic_state, password);
397 if (!NT_STATUS_IS_OK(status)) {
398 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
399 return false;
402 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
403 if (!NT_STATUS_IS_OK(status)) {
404 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
405 return false;
408 ev = event_context_init(talloc_tos());
409 if (ev == NULL) {
410 printf("event_context_init() returned NULL\n");
411 return false;
414 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
415 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
416 printf("gensec_update returned %s\n", nt_errstr(status));
417 return false;
420 cli2->smb2.session = smbXcli_session_create(cli2, cli2->conn);
422 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
423 cli2->conn,
424 cli2->timeout,
425 cli2->smb2.session,
426 0x0, /* in_flags */
427 SMB2_CAP_DFS, /* in_capabilities */
428 0, /* in_channel */
429 /* in_previous_session_id: */
430 smb2cli_session_current_id(cli1->smb2.session),
431 &in_blob); /* in_security_buffer */
432 if (subreq == NULL) {
433 printf("smb2cli_session_setup_send() returned NULL\n");
434 return false;
437 ok = tevent_req_poll(subreq, ev);
438 if (!ok) {
439 printf("tevent_req_poll() returned false\n");
440 return false;
443 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
444 NULL, &out_blob);
445 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
446 printf("smb2cli_session_setup_recv returned %s\n",
447 nt_errstr(status));
448 return false;
451 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
452 if (!NT_STATUS_IS_OK(status)) {
453 printf("auth_generic_update returned %s\n", nt_errstr(status));
454 return false;
457 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
458 cli2->conn,
459 cli2->timeout,
460 cli2->smb2.session,
461 0x0, /* in_flags */
462 SMB2_CAP_DFS, /* in_capabilities */
463 0, /* in_channel */
464 /* in_previous_session_id: */
465 smb2cli_session_current_id(cli1->smb2.session),
466 &in_blob); /* in_security_buffer */
467 if (subreq == NULL) {
468 printf("smb2cli_session_setup_send() returned NULL\n");
469 return false;
472 ok = tevent_req_poll(subreq, ev);
473 if (!ok) {
474 printf("tevent_req_poll() returned false\n");
475 return false;
478 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
479 &recv_iov, &out_blob);
480 if (!NT_STATUS_IS_OK(status)) {
481 printf("smb2cli_session_setup_recv returned %s\n",
482 nt_errstr(status));
483 return false;
486 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
487 &session_key);
488 if (!NT_STATUS_IS_OK(status)) {
489 printf("gensec_session_key returned %s\n",
490 nt_errstr(status));
491 return false;
494 /* check file operation on the old client */
496 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
497 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
498 printf("smb2cli_flush returned %s\n", nt_errstr(status));
499 return false;
502 status = cli_tree_connect(cli1, share, "?????", "", 0);
503 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
504 printf("cli_tree_connect returned %s\n", nt_errstr(status));
505 return false;
509 * checking file operations without signing.
510 * on w2k8r2 at least, flush, read and write also work the same way,
511 * while create gives ACCESS_DENIED without signing
513 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
514 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
515 printf("smb2cli_flush returned %s\n", nt_errstr(status));
516 return false;
519 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
520 fid_volatile, 0, 0, (const uint8_t *)hello);
521 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
522 printf("smb2cli_write returned %s\n", nt_errstr(status));
523 return false;
526 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
527 fid_volatile, 2, 0,
528 talloc_tos(), &result, &nread);
529 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
530 printf("smb2cli_read returned %s\n", nt_errstr(status));
531 return false;
534 status = smb2cli_create(cli2, "session-reconnect.txt",
535 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
536 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
537 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
538 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
539 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
540 FILE_CREATE, /* create_disposition, */
541 FILE_DELETE_ON_CLOSE, /* create_options, */
542 NULL, /* smb2_create_blobs *blobs */
543 &fid_persistent,
544 &fid_volatile);
545 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
546 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
547 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
548 return false;
551 /* now grab the session key and try with signing */
553 status = smb2cli_session_set_session_key(cli2->smb2.session,
554 session_key,
555 recv_iov);
556 if (!NT_STATUS_IS_OK(status)) {
557 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status));
558 return false;
561 /* the tid seems to be irrelevant at this stage */
563 cli2->smb2.tid = cli1->smb2.tid;
565 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
566 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
567 printf("smb2cli_flush returned %s\n", nt_errstr(status));
568 return false;
571 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
572 fid_volatile, 0, 0, (const uint8_t *)hello);
573 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
574 printf("smb2cli_write returned %s\n", nt_errstr(status));
575 return false;
578 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
579 fid_volatile, 2, 0,
580 talloc_tos(), &result, &nread);
581 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
582 printf("smb2cli_read returned %s\n", nt_errstr(status));
583 return false;
586 status = smb2cli_create(cli2, "session-reconnect.txt",
587 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
588 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
589 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
590 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
591 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
592 FILE_CREATE, /* create_disposition, */
593 FILE_DELETE_ON_CLOSE, /* create_options, */
594 NULL, /* smb2_create_blobs *blobs */
595 &fid_persistent,
596 &fid_volatile);
597 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
598 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
599 return false;
602 /* now do a new tcon and test file calls again */
604 status = cli_tree_connect(cli2, share, "?????", "", 0);
605 if (!NT_STATUS_IS_OK(status)) {
606 printf("cli_tree_connect returned %s\n", nt_errstr(status));
607 return false;
610 status = smb2cli_create(cli2, "session-reconnect.txt",
611 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
612 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
613 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
614 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
615 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
616 FILE_CREATE, /* create_disposition, */
617 FILE_DELETE_ON_CLOSE, /* create_options, */
618 NULL, /* smb2_create_blobs *blobs */
619 &fid_persistent,
620 &fid_volatile);
621 if (!NT_STATUS_IS_OK(status)) {
622 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
623 return false;
626 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
627 fid_volatile, 0, 0, (const uint8_t *)hello);
628 if (!NT_STATUS_IS_OK(status)) {
629 printf("smb2cli_write returned %s\n", nt_errstr(status));
630 return false;
633 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
634 if (!NT_STATUS_IS_OK(status)) {
635 printf("smb2cli_flush returned %s\n", nt_errstr(status));
636 return false;
639 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
640 fid_volatile, 2, 0,
641 talloc_tos(), &result, &nread);
642 if (!NT_STATUS_IS_OK(status)) {
643 printf("smb2cli_read returned %s\n", nt_errstr(status));
644 return false;
647 if (nread != strlen(hello)) {
648 printf("smb2cli_read returned %d bytes, expected %d\n",
649 (int)nread, (int)strlen(hello));
650 return false;
653 if (memcmp(hello, result, nread) != 0) {
654 printf("smb2cli_read returned '%s', expected '%s'\n",
655 result, hello);
656 return false;
659 return true;
662 bool run_smb2_tcon_dependence(int dummy)
664 struct cli_state *cli;
665 NTSTATUS status;
666 uint64_t fid_persistent, fid_volatile;
667 const char *hello = "Hello, world\n";
668 uint8_t *result;
669 uint32_t nread;
671 printf("Starting SMB2-TCON-DEPENDENCE\n");
673 if (!torture_init_connection(&cli)) {
674 return false;
676 cli->smb2.pid = 0xFEFF;
678 status = smbXcli_negprot(cli->conn, cli->timeout,
679 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
680 if (!NT_STATUS_IS_OK(status)) {
681 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
682 return false;
685 status = cli_session_setup(cli, username,
686 password, strlen(password),
687 password, strlen(password),
688 workgroup);
689 if (!NT_STATUS_IS_OK(status)) {
690 printf("cli_session_setup returned %s\n", nt_errstr(status));
691 return false;
694 status = cli_tree_connect(cli, share, "?????", "", 0);
695 if (!NT_STATUS_IS_OK(status)) {
696 printf("cli_tree_connect returned %s\n", nt_errstr(status));
697 return false;
700 status = smb2cli_create(cli, "tcon_depedence.txt",
701 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
702 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
703 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
704 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
705 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
706 FILE_CREATE, /* create_disposition, */
707 FILE_DELETE_ON_CLOSE, /* create_options, */
708 NULL, /* smb2_create_blobs *blobs */
709 &fid_persistent,
710 &fid_volatile);
711 if (!NT_STATUS_IS_OK(status)) {
712 printf("smb2cli_create on cli %s\n", nt_errstr(status));
713 return false;
716 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
717 fid_volatile, 0, 0, (const uint8_t *)hello);
718 if (!NT_STATUS_IS_OK(status)) {
719 printf("smb2cli_write returned %s\n", nt_errstr(status));
720 return false;
723 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
724 if (!NT_STATUS_IS_OK(status)) {
725 printf("smb2cli_flush returned %s\n", nt_errstr(status));
726 return false;
729 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
730 fid_volatile, 2, 0,
731 talloc_tos(), &result, &nread);
732 if (!NT_STATUS_IS_OK(status)) {
733 printf("smb2cli_read returned %s\n", nt_errstr(status));
734 return false;
737 if (nread != strlen(hello)) {
738 printf("smb2cli_read returned %d bytes, expected %d\n",
739 (int)nread, (int)strlen(hello));
740 return false;
743 if (memcmp(hello, result, nread) != 0) {
744 printf("smb2cli_read returned '%s', expected '%s'\n",
745 result, hello);
746 return false;
749 /* check behaviour with wrong tid... */
751 cli->smb2.tid++;
753 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
754 fid_volatile, 2, 0,
755 talloc_tos(), &result, &nread);
756 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
757 printf("smb2cli_read returned %s\n", nt_errstr(status));
758 return false;
761 cli->smb2.tid--;
763 return true;
766 bool run_smb2_multi_channel(int dummy)
768 struct cli_state *cli1;
769 struct cli_state *cli2;
770 NTSTATUS status;
771 bool ok;
772 uint64_t fid_persistent, fid_volatile;
773 struct tevent_context *ev;
774 struct tevent_req *subreq;
775 DATA_BLOB in_blob = data_blob_null;
776 DATA_BLOB out_blob;
777 DATA_BLOB channel_session_key;
778 struct auth_generic_state *auth_generic_state;
779 struct iovec *recv_iov;
780 const char *hello = "Hello, world\n";
781 uint8_t *result;
782 uint32_t nread;
784 printf("Starting SMB2-MULTI-CHANNEL\n");
786 if (!torture_init_connection(&cli1)) {
787 return false;
789 cli1->smb2.pid = 0xFEFF;
791 if (!torture_init_connection(&cli2)) {
792 return false;
794 cli2->smb2.pid = 0xFEFF;
796 status = smbXcli_negprot(cli1->conn, cli1->timeout,
797 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
798 if (!NT_STATUS_IS_OK(status)) {
799 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
800 return false;
803 status = smbXcli_negprot(cli2->conn, cli2->timeout,
804 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
805 if (!NT_STATUS_IS_OK(status)) {
806 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
807 return false;
810 status = cli_session_setup(cli1, username,
811 password, strlen(password),
812 password, strlen(password),
813 workgroup);
814 if (!NT_STATUS_IS_OK(status)) {
815 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
816 return false;
819 status = cli_tree_connect(cli1, share, "?????", "", 0);
820 if (!NT_STATUS_IS_OK(status)) {
821 printf("cli_tree_connect returned %s\n", nt_errstr(status));
822 return false;
825 status = smb2cli_session_create_channel(cli2,
826 cli1->smb2.session,
827 cli2->conn,
828 &cli2->smb2.session);
829 if (!NT_STATUS_IS_OK(status)) {
830 printf("smb2cli_session_create_channel returned %s\n",
831 nt_errstr(status));
832 return false;
835 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
836 if (!NT_STATUS_IS_OK(status)) {
837 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
838 return false;
841 gensec_want_feature(auth_generic_state->gensec_security,
842 GENSEC_FEATURE_SESSION_KEY);
843 status = auth_generic_set_username(auth_generic_state, username);
844 if (!NT_STATUS_IS_OK(status)) {
845 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
846 return false;
849 status = auth_generic_set_domain(auth_generic_state, workgroup);
850 if (!NT_STATUS_IS_OK(status)) {
851 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
852 return false;
855 status = auth_generic_set_password(auth_generic_state, password);
856 if (!NT_STATUS_IS_OK(status)) {
857 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
858 return false;
861 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
862 if (!NT_STATUS_IS_OK(status)) {
863 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
864 return false;
867 ev = event_context_init(talloc_tos());
868 if (ev == NULL) {
869 printf("event_context_init() returned NULL\n");
870 return false;
873 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
874 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
875 printf("gensec_update returned %s\n", nt_errstr(status));
876 return false;
879 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
880 cli2->conn,
881 cli2->timeout,
882 cli2->smb2.session,
883 0x01, /* in_flags */
884 SMB2_CAP_DFS, /* in_capabilities */
885 0, /* in_channel */
886 0, /* in_previous_session_id */
887 &in_blob); /* in_security_buffer */
888 if (subreq == NULL) {
889 printf("smb2cli_session_setup_send() returned NULL\n");
890 return false;
893 ok = tevent_req_poll(subreq, ev);
894 if (!ok) {
895 printf("tevent_req_poll() returned false\n");
896 return false;
899 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
900 NULL, &out_blob);
901 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
902 printf("smb2cli_session_setup_recv returned %s\n",
903 nt_errstr(status));
904 return false;
907 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
908 if (!NT_STATUS_IS_OK(status)) {
909 printf("auth_generic_update returned %s\n", nt_errstr(status));
910 return false;
913 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
914 cli2->conn,
915 cli2->timeout,
916 cli2->smb2.session,
917 0x01, /* in_flags */
918 SMB2_CAP_DFS, /* in_capabilities */
919 0, /* in_channel */
920 0, /* in_previous_session_id */
921 &in_blob); /* in_security_buffer */
922 if (subreq == NULL) {
923 printf("smb2cli_session_setup_send() returned NULL\n");
924 return false;
927 ok = tevent_req_poll(subreq, ev);
928 if (!ok) {
929 printf("tevent_req_poll() returned false\n");
930 return false;
933 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
934 &recv_iov, &out_blob);
935 if (!NT_STATUS_IS_OK(status)) {
936 printf("smb2cli_session_setup_recv returned %s\n",
937 nt_errstr(status));
938 return false;
941 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
942 &channel_session_key);
943 if (!NT_STATUS_IS_OK(status)) {
944 printf("gensec_session_key returned %s\n",
945 nt_errstr(status));
946 return false;
949 status = smb2cli_session_set_channel_key(cli2->smb2.session,
950 channel_session_key,
951 recv_iov);
952 if (!NT_STATUS_IS_OK(status)) {
953 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
954 return false;
957 cli2->smb2.tid = cli1->smb2.tid;
959 status = smb2cli_create(cli2, "multi-channel.txt",
960 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
961 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
962 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
963 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
964 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
965 FILE_CREATE, /* create_disposition, */
966 FILE_DELETE_ON_CLOSE, /* create_options, */
967 NULL, /* smb2_create_blobs *blobs */
968 &fid_persistent,
969 &fid_volatile);
970 if (!NT_STATUS_IS_OK(status)) {
971 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
972 return false;
975 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
976 fid_volatile, 0, 0, (const uint8_t *)hello);
977 if (!NT_STATUS_IS_OK(status)) {
978 printf("smb2cli_write returned %s\n", nt_errstr(status));
979 return false;
982 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
983 if (!NT_STATUS_IS_OK(status)) {
984 printf("smb2cli_flush returned %s\n", nt_errstr(status));
985 return false;
988 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
989 if (!NT_STATUS_IS_OK(status)) {
990 printf("smb2cli_flush returned %s\n", nt_errstr(status));
991 return false;
994 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
995 fid_volatile, 2, 0,
996 talloc_tos(), &result, &nread);
997 if (!NT_STATUS_IS_OK(status)) {
998 printf("smb2cli_read returned %s\n", nt_errstr(status));
999 return false;
1002 if (nread != strlen(hello)) {
1003 printf("smb2cli_read returned %d bytes, expected %d\n",
1004 (int)nread, (int)strlen(hello));
1005 return false;
1008 if (memcmp(hello, result, nread) != 0) {
1009 printf("smb2cli_read returned '%s', expected '%s'\n",
1010 result, hello);
1011 return false;
1014 status = smb2cli_close(cli1, 0, fid_persistent, fid_volatile);
1015 if (!NT_STATUS_IS_OK(status)) {
1016 printf("smb2cli_close returned %s\n", nt_errstr(status));
1017 return false;
1020 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1021 if (!NT_STATUS_IS_OK(status)) {
1022 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1025 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1026 if (!NT_STATUS_IS_OK(status)) {
1027 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1030 return true;
1033 bool run_smb2_session_reauth(int dummy)
1035 struct cli_state *cli;
1036 NTSTATUS status;
1037 bool ok;
1038 uint64_t fid_persistent, fid_volatile;
1039 struct tevent_context *ev;
1040 struct tevent_req *subreq;
1041 DATA_BLOB in_blob = data_blob_null;
1042 DATA_BLOB out_blob;
1043 struct auth_generic_state *auth_generic_state;
1044 struct iovec *recv_iov;
1046 printf("Starting SMB2-SESSION_REAUTH\n");
1048 if (!torture_init_connection(&cli)) {
1049 return false;
1051 cli->smb2.pid = 0xFEFF;
1054 * PROTOCOL_SMB2_22 has a bug in win8pre0
1055 * it behaves like PROTOCOL_SMB2_02
1056 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1057 * while it allows it on PROTOCOL_SMB2_02.
1059 status = smbXcli_negprot(cli->conn, cli->timeout,
1060 PROTOCOL_SMB2_10, PROTOCOL_SMB2_10);
1061 if (!NT_STATUS_IS_OK(status)) {
1062 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
1063 return false;
1066 status = cli_session_setup(cli, username,
1067 password, strlen(password),
1068 password, strlen(password),
1069 workgroup);
1070 if (!NT_STATUS_IS_OK(status)) {
1071 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
1072 return false;
1075 status = cli_tree_connect(cli, share, "?????", "", 0);
1076 if (!NT_STATUS_IS_OK(status)) {
1077 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1078 return false;
1081 status = smb2cli_create(cli, "session-reauth.txt",
1082 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1083 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1084 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1085 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1086 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1087 FILE_CREATE, /* create_disposition, */
1088 FILE_DELETE_ON_CLOSE, /* create_options, */
1089 NULL, /* smb2_create_blobs *blobs */
1090 &fid_persistent,
1091 &fid_volatile);
1092 if (!NT_STATUS_IS_OK(status)) {
1093 printf("smb2cli_create %s\n", nt_errstr(status));
1094 return false;
1097 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1098 if (!NT_STATUS_IS_OK(status)) {
1099 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1100 return false;
1103 gensec_want_feature(auth_generic_state->gensec_security,
1104 GENSEC_FEATURE_SESSION_KEY);
1105 status = auth_generic_set_username(auth_generic_state, username);
1106 if (!NT_STATUS_IS_OK(status)) {
1107 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1108 return false;
1111 status = auth_generic_set_domain(auth_generic_state, workgroup);
1112 if (!NT_STATUS_IS_OK(status)) {
1113 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1114 return false;
1117 status = auth_generic_set_password(auth_generic_state, password);
1118 if (!NT_STATUS_IS_OK(status)) {
1119 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1120 return false;
1123 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1124 if (!NT_STATUS_IS_OK(status)) {
1125 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1126 return false;
1129 ev = event_context_init(talloc_tos());
1130 if (ev == NULL) {
1131 printf("event_context_init() returned NULL\n");
1132 return false;
1135 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1136 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1137 printf("gensec_update returned %s\n", nt_errstr(status));
1138 return false;
1141 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1142 cli->conn,
1143 cli->timeout,
1144 cli->smb2.session,
1145 0x0, /* in_flags */
1146 SMB2_CAP_DFS, /* in_capabilities */
1147 0, /* in_channel */
1148 0, /* in_previous_session_id */
1149 &in_blob); /* in_security_buffer */
1150 if (subreq == NULL) {
1151 printf("smb2cli_session_setup_send() returned NULL\n");
1152 return false;
1155 ok = tevent_req_poll(subreq, ev);
1156 if (!ok) {
1157 printf("tevent_req_poll() returned false\n");
1158 return false;
1161 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1162 NULL, &out_blob);
1163 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1164 printf("smb2cli_session_setup_recv returned %s\n",
1165 nt_errstr(status));
1166 return false;
1169 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1170 if (!NT_STATUS_IS_OK(status)) {
1171 printf("auth_generic_update returned %s\n", nt_errstr(status));
1172 return false;
1175 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1176 if (!NT_STATUS_IS_OK(status)) {
1177 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1178 return false;
1181 status = smb2cli_create(cli, "session-reauth-invalid.txt",
1182 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1183 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1184 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1185 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1186 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1187 FILE_CREATE, /* create_disposition, */
1188 FILE_DELETE_ON_CLOSE, /* create_options, */
1189 NULL, /* smb2_create_blobs *blobs */
1190 &fid_persistent,
1191 &fid_volatile);
1192 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1193 printf("smb2cli_create %s\n", nt_errstr(status));
1194 return false;
1197 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1198 cli->conn,
1199 cli->timeout,
1200 cli->smb2.session,
1201 0x0, /* in_flags */
1202 SMB2_CAP_DFS, /* in_capabilities */
1203 0, /* in_channel */
1204 0, /* in_previous_session_id */
1205 &in_blob); /* in_security_buffer */
1206 if (subreq == NULL) {
1207 printf("smb2cli_session_setup_send() returned NULL\n");
1208 return false;
1211 ok = tevent_req_poll(subreq, ev);
1212 if (!ok) {
1213 printf("tevent_req_poll() returned false\n");
1214 return false;
1217 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1218 &recv_iov, &out_blob);
1219 if (!NT_STATUS_IS_OK(status)) {
1220 printf("smb2cli_session_setup_recv returned %s\n",
1221 nt_errstr(status));
1222 return false;
1225 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1226 if (!NT_STATUS_IS_OK(status)) {
1227 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1228 return false;
1231 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1232 if (!NT_STATUS_IS_OK(status)) {
1233 printf("smb2cli_close returned %s\n", nt_errstr(status));
1234 return false;
1237 status = smb2cli_create(cli, "session-reauth.txt",
1238 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1239 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1240 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1241 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1242 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1243 FILE_CREATE, /* create_disposition, */
1244 FILE_DELETE_ON_CLOSE, /* create_options, */
1245 NULL, /* smb2_create_blobs *blobs */
1246 &fid_persistent,
1247 &fid_volatile);
1248 if (!NT_STATUS_IS_OK(status)) {
1249 printf("smb2cli_create %s\n", nt_errstr(status));
1250 return false;
1253 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1254 if (!NT_STATUS_IS_OK(status)) {
1255 printf("smb2cli_close returned %s\n", nt_errstr(status));
1256 return false;
1259 return true;