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/>.
21 #include "torture/proto.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;
36 uint64_t fid_persistent, fid_volatile;
37 const char *hello = "Hello, world\n";
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)) {
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));
59 status = cli_session_setup(cli, username,
60 password, strlen(password),
61 password, strlen(password),
63 if (!NT_STATUS_IS_OK(status)) {
64 printf("cli_session_setup returned %s\n", nt_errstr(status));
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));
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 */
85 if (!NT_STATUS_IS_OK(status)) {
86 printf("smb2cli_create returned %s\n", nt_errstr(status));
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));
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));
103 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
105 talloc_tos(), &result, &nread);
106 if (!NT_STATUS_IS_OK(status)) {
107 printf("smb2cli_read returned %s\n", nt_errstr(status));
111 if (nread != strlen(hello)) {
112 printf("smb2cli_read returned %d bytes, expected %d\n",
113 (int)nread, (int)strlen(hello));
117 if (memcmp(hello, result, nread) != 0) {
118 printf("smb2cli_read returned '%s', expected '%s'\n",
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));
129 status = smb2cli_create(cli, "",
130 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
131 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
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 */
142 if (!NT_STATUS_IS_OK(status)) {
143 printf("smb2cli_create returned %s\n", nt_errstr(status));
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));
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));
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));
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));
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));
183 cli->smb2.session = smbXcli_session_create(cli, cli->conn);
184 if (cli->smb2.session == NULL) {
185 printf("smbXcli_session_create() returned NULL\n");
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));
200 bool run_smb2_negprot(int dummy)
202 struct cli_state *cli;
204 enum protocol_types protocol;
205 const char *name = NULL;
207 printf("Starting SMB2-NEGPROT\n");
209 if (!torture_init_connection(&cli)) {
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));
221 protocol = smbXcli_conn_protocol(cli->conn);
224 case PROTOCOL_SMB2_02:
227 case PROTOCOL_SMB2_10:
230 case PROTOCOL_SMB2_22:
233 case PROTOCOL_SMB2_24:
241 printf("Server supports %s\n", name);
243 printf("Server DOES NOT support SMB2\n");
247 status = smbXcli_negprot(cli->conn, cli->timeout,
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",
257 if (smbXcli_conn_is_connected(cli->conn)) {
258 printf("2nd smbXcli_negprot should disconnect "
259 "- still connected\n");
266 bool run_smb2_session_reconnect(int dummy)
268 struct cli_state *cli1;
269 struct cli_state *cli2;
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;
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";
284 printf("Starting SMB2-SESSION-RECONNECT\n");
286 if (!torture_init_connection(&cli1)) {
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));
298 status = cli_session_setup(cli1, username,
299 password, strlen(password),
300 password, strlen(password),
302 if (!NT_STATUS_IS_OK(status)) {
303 printf("cli_session_setup returned %s\n", nt_errstr(status));
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));
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 */
324 if (!NT_STATUS_IS_OK(status)) {
325 printf("smb2cli_create on cli1 %s\n", nt_errstr(status));
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));
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));
342 status = smb2cli_read(cli1, 0x10000, 0, fid_persistent,
344 talloc_tos(), &result, &nread);
345 if (!NT_STATUS_IS_OK(status)) {
346 printf("smb2cli_read returned %s\n", nt_errstr(status));
350 if (nread != strlen(hello)) {
351 printf("smb2cli_read returned %d bytes, expected %d\n",
352 (int)nread, (int)strlen(hello));
356 if (memcmp(hello, result, nread) != 0) {
357 printf("smb2cli_read returned '%s', expected '%s'\n",
362 /* prepare second session */
364 if (!torture_init_connection(&cli2)) {
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));
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));
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));
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));
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));
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));
408 ev = event_context_init(talloc_tos());
410 printf("event_context_init() returned NULL\n");
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));
420 cli2->smb2.session = smbXcli_session_create(cli2, cli2->conn);
422 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
427 SMB2_CAP_DFS, /* in_capabilities */
429 cli1->smb2.session, /* in_previous_session */
430 &in_blob); /* in_security_buffer */
431 if (subreq == NULL) {
432 printf("smb2cli_session_setup_send() returned NULL\n");
436 ok = tevent_req_poll(subreq, ev);
438 printf("tevent_req_poll() returned false\n");
442 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
444 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
445 printf("smb2cli_session_setup_recv returned %s\n",
450 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
451 if (!NT_STATUS_IS_OK(status)) {
452 printf("auth_generic_update returned %s\n", nt_errstr(status));
456 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
461 SMB2_CAP_DFS, /* in_capabilities */
463 cli1->smb2.session, /* in_previous_session */
464 &in_blob); /* in_security_buffer */
465 if (subreq == NULL) {
466 printf("smb2cli_session_setup_send() returned NULL\n");
470 ok = tevent_req_poll(subreq, ev);
472 printf("tevent_req_poll() returned false\n");
476 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
477 &recv_iov, &out_blob);
478 if (!NT_STATUS_IS_OK(status)) {
479 printf("smb2cli_session_setup_recv returned %s\n",
484 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
486 if (!NT_STATUS_IS_OK(status)) {
487 printf("gensec_session_key returned %s\n",
492 /* check file operation on the old client */
494 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
495 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
496 printf("smb2cli_flush returned %s\n", nt_errstr(status));
500 status = cli_tree_connect(cli1, share, "?????", "", 0);
501 if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
502 printf("cli_tree_connect returned %s\n", nt_errstr(status));
507 * checking file operations without signing.
508 * on w2k8r2 at least, flush, read and write also work the same way,
509 * while create gives ACCESS_DENIED without signing
511 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
512 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
513 printf("smb2cli_flush returned %s\n", nt_errstr(status));
517 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
518 fid_volatile, 0, 0, (const uint8_t *)hello);
519 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
520 printf("smb2cli_write returned %s\n", nt_errstr(status));
524 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
526 talloc_tos(), &result, &nread);
527 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
528 printf("smb2cli_read returned %s\n", nt_errstr(status));
532 status = smb2cli_create(cli2, "session-reconnect.txt",
533 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
534 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
535 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
536 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
537 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
538 FILE_CREATE, /* create_disposition, */
539 FILE_DELETE_ON_CLOSE, /* create_options, */
540 NULL, /* smb2_create_blobs *blobs */
543 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) &&
544 !NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
545 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
549 /* now grab the session key and try with signing */
551 status = smb2cli_session_set_session_key(cli2->smb2.session,
554 if (!NT_STATUS_IS_OK(status)) {
555 printf("smb2cli_session_set_session_key %s\n", nt_errstr(status));
559 /* the tid seems to be irrelevant at this stage */
561 cli2->smb2.tid = cli1->smb2.tid;
563 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
564 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
565 printf("smb2cli_flush returned %s\n", nt_errstr(status));
569 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
570 fid_volatile, 0, 0, (const uint8_t *)hello);
571 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
572 printf("smb2cli_write returned %s\n", nt_errstr(status));
576 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
578 talloc_tos(), &result, &nread);
579 if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
580 printf("smb2cli_read returned %s\n", nt_errstr(status));
584 status = smb2cli_create(cli2, "session-reconnect.txt",
585 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
586 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
587 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
588 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
589 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
590 FILE_CREATE, /* create_disposition, */
591 FILE_DELETE_ON_CLOSE, /* create_options, */
592 NULL, /* smb2_create_blobs *blobs */
595 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
596 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
600 /* now do a new tcon and test file calls again */
602 status = cli_tree_connect(cli2, share, "?????", "", 0);
603 if (!NT_STATUS_IS_OK(status)) {
604 printf("cli_tree_connect returned %s\n", nt_errstr(status));
608 status = smb2cli_create(cli2, "session-reconnect.txt",
609 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
610 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
611 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
612 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
613 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
614 FILE_CREATE, /* create_disposition, */
615 FILE_DELETE_ON_CLOSE, /* create_options, */
616 NULL, /* smb2_create_blobs *blobs */
619 if (!NT_STATUS_IS_OK(status)) {
620 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
624 status = smb2cli_write(cli2, strlen(hello), 0, fid_persistent,
625 fid_volatile, 0, 0, (const uint8_t *)hello);
626 if (!NT_STATUS_IS_OK(status)) {
627 printf("smb2cli_write returned %s\n", nt_errstr(status));
631 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
632 if (!NT_STATUS_IS_OK(status)) {
633 printf("smb2cli_flush returned %s\n", nt_errstr(status));
637 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
639 talloc_tos(), &result, &nread);
640 if (!NT_STATUS_IS_OK(status)) {
641 printf("smb2cli_read returned %s\n", nt_errstr(status));
645 if (nread != strlen(hello)) {
646 printf("smb2cli_read returned %d bytes, expected %d\n",
647 (int)nread, (int)strlen(hello));
651 if (memcmp(hello, result, nread) != 0) {
652 printf("smb2cli_read returned '%s', expected '%s'\n",
660 bool run_smb2_tcon_dependence(int dummy)
662 struct cli_state *cli;
664 uint64_t fid_persistent, fid_volatile;
665 const char *hello = "Hello, world\n";
669 printf("Starting SMB2-TCON-DEPENDENCE\n");
671 if (!torture_init_connection(&cli)) {
674 cli->smb2.pid = 0xFEFF;
676 status = smbXcli_negprot(cli->conn, cli->timeout,
677 PROTOCOL_SMB2_02, PROTOCOL_SMB2_24);
678 if (!NT_STATUS_IS_OK(status)) {
679 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
683 status = cli_session_setup(cli, username,
684 password, strlen(password),
685 password, strlen(password),
687 if (!NT_STATUS_IS_OK(status)) {
688 printf("cli_session_setup returned %s\n", nt_errstr(status));
692 status = cli_tree_connect(cli, share, "?????", "", 0);
693 if (!NT_STATUS_IS_OK(status)) {
694 printf("cli_tree_connect returned %s\n", nt_errstr(status));
698 status = smb2cli_create(cli, "tcon_depedence.txt",
699 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
700 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
701 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
702 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
703 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
704 FILE_CREATE, /* create_disposition, */
705 FILE_DELETE_ON_CLOSE, /* create_options, */
706 NULL, /* smb2_create_blobs *blobs */
709 if (!NT_STATUS_IS_OK(status)) {
710 printf("smb2cli_create on cli %s\n", nt_errstr(status));
714 status = smb2cli_write(cli, strlen(hello), 0, fid_persistent,
715 fid_volatile, 0, 0, (const uint8_t *)hello);
716 if (!NT_STATUS_IS_OK(status)) {
717 printf("smb2cli_write returned %s\n", nt_errstr(status));
721 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
722 if (!NT_STATUS_IS_OK(status)) {
723 printf("smb2cli_flush returned %s\n", nt_errstr(status));
727 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
729 talloc_tos(), &result, &nread);
730 if (!NT_STATUS_IS_OK(status)) {
731 printf("smb2cli_read returned %s\n", nt_errstr(status));
735 if (nread != strlen(hello)) {
736 printf("smb2cli_read returned %d bytes, expected %d\n",
737 (int)nread, (int)strlen(hello));
741 if (memcmp(hello, result, nread) != 0) {
742 printf("smb2cli_read returned '%s', expected '%s'\n",
747 /* check behaviour with wrong tid... */
751 status = smb2cli_read(cli, 0x10000, 0, fid_persistent,
753 talloc_tos(), &result, &nread);
754 if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
755 printf("smb2cli_read returned %s\n", nt_errstr(status));
764 bool run_smb2_multi_channel(int dummy)
766 struct cli_state *cli1;
767 struct cli_state *cli2;
770 uint64_t fid_persistent, fid_volatile;
771 struct tevent_context *ev;
772 struct tevent_req *subreq;
773 DATA_BLOB in_blob = data_blob_null;
775 DATA_BLOB channel_session_key;
776 struct auth_generic_state *auth_generic_state;
777 struct iovec *recv_iov;
778 const char *hello = "Hello, world\n";
782 printf("Starting SMB2-MULTI-CHANNEL\n");
784 if (!torture_init_connection(&cli1)) {
787 cli1->smb2.pid = 0xFEFF;
789 if (!torture_init_connection(&cli2)) {
792 cli2->smb2.pid = 0xFEFF;
794 status = smbXcli_negprot(cli1->conn, cli1->timeout,
795 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
796 if (!NT_STATUS_IS_OK(status)) {
797 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
801 status = smbXcli_negprot(cli2->conn, cli2->timeout,
802 PROTOCOL_SMB2_22, PROTOCOL_SMB2_24);
803 if (!NT_STATUS_IS_OK(status)) {
804 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
808 status = cli_session_setup(cli1, username,
809 password, strlen(password),
810 password, strlen(password),
812 if (!NT_STATUS_IS_OK(status)) {
813 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
817 status = cli_tree_connect(cli1, share, "?????", "", 0);
818 if (!NT_STATUS_IS_OK(status)) {
819 printf("cli_tree_connect returned %s\n", nt_errstr(status));
823 status = smb2cli_session_create_channel(cli2,
826 &cli2->smb2.session);
827 if (!NT_STATUS_IS_OK(status)) {
828 printf("smb2cli_session_create_channel returned %s\n",
833 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
834 if (!NT_STATUS_IS_OK(status)) {
835 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
839 gensec_want_feature(auth_generic_state->gensec_security,
840 GENSEC_FEATURE_SESSION_KEY);
841 status = auth_generic_set_username(auth_generic_state, username);
842 if (!NT_STATUS_IS_OK(status)) {
843 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
847 status = auth_generic_set_domain(auth_generic_state, workgroup);
848 if (!NT_STATUS_IS_OK(status)) {
849 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
853 status = auth_generic_set_password(auth_generic_state, password);
854 if (!NT_STATUS_IS_OK(status)) {
855 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
859 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
860 if (!NT_STATUS_IS_OK(status)) {
861 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
865 ev = event_context_init(talloc_tos());
867 printf("event_context_init() returned NULL\n");
871 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
872 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
873 printf("gensec_update returned %s\n", nt_errstr(status));
877 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
882 SMB2_CAP_DFS, /* in_capabilities */
884 NULL, /* in_previous_session */
885 &in_blob); /* in_security_buffer */
886 if (subreq == NULL) {
887 printf("smb2cli_session_setup_send() returned NULL\n");
891 ok = tevent_req_poll(subreq, ev);
893 printf("tevent_req_poll() returned false\n");
897 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
899 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
900 printf("smb2cli_session_setup_recv returned %s\n",
905 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
906 if (!NT_STATUS_IS_OK(status)) {
907 printf("auth_generic_update returned %s\n", nt_errstr(status));
911 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
916 SMB2_CAP_DFS, /* in_capabilities */
918 NULL, /* in_previous_session */
919 &in_blob); /* in_security_buffer */
920 if (subreq == NULL) {
921 printf("smb2cli_session_setup_send() returned NULL\n");
925 ok = tevent_req_poll(subreq, ev);
927 printf("tevent_req_poll() returned false\n");
931 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
932 &recv_iov, &out_blob);
933 if (!NT_STATUS_IS_OK(status)) {
934 printf("smb2cli_session_setup_recv returned %s\n",
939 status = gensec_session_key(auth_generic_state->gensec_security, talloc_tos(),
940 &channel_session_key);
941 if (!NT_STATUS_IS_OK(status)) {
942 printf("gensec_session_key returned %s\n",
947 status = smb2cli_session_set_channel_key(cli2->smb2.session,
950 if (!NT_STATUS_IS_OK(status)) {
951 printf("smb2cli_session_set_channel_key %s\n", nt_errstr(status));
955 cli2->smb2.tid = cli1->smb2.tid;
957 status = smb2cli_create(cli2, "multi-channel.txt",
958 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
959 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
960 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
961 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
962 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
963 FILE_CREATE, /* create_disposition, */
964 FILE_DELETE_ON_CLOSE, /* create_options, */
965 NULL, /* smb2_create_blobs *blobs */
968 if (!NT_STATUS_IS_OK(status)) {
969 printf("smb2cli_create on cli2 %s\n", nt_errstr(status));
973 status = smb2cli_write(cli1, strlen(hello), 0, fid_persistent,
974 fid_volatile, 0, 0, (const uint8_t *)hello);
975 if (!NT_STATUS_IS_OK(status)) {
976 printf("smb2cli_write returned %s\n", nt_errstr(status));
980 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
981 if (!NT_STATUS_IS_OK(status)) {
982 printf("smb2cli_flush returned %s\n", nt_errstr(status));
986 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
987 if (!NT_STATUS_IS_OK(status)) {
988 printf("smb2cli_flush returned %s\n", nt_errstr(status));
992 status = smb2cli_read(cli2, 0x10000, 0, fid_persistent,
994 talloc_tos(), &result, &nread);
995 if (!NT_STATUS_IS_OK(status)) {
996 printf("smb2cli_read returned %s\n", nt_errstr(status));
1000 if (nread != strlen(hello)) {
1001 printf("smb2cli_read returned %d bytes, expected %d\n",
1002 (int)nread, (int)strlen(hello));
1006 if (memcmp(hello, result, nread) != 0) {
1007 printf("smb2cli_read returned '%s', expected '%s'\n",
1012 status = smb2cli_close(cli1, 0, fid_persistent, fid_volatile);
1013 if (!NT_STATUS_IS_OK(status)) {
1014 printf("smb2cli_close returned %s\n", nt_errstr(status));
1018 status = smb2cli_flush(cli2, fid_persistent, fid_volatile);
1019 if (!NT_STATUS_IS_OK(status)) {
1020 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1023 status = smb2cli_flush(cli1, fid_persistent, fid_volatile);
1024 if (!NT_STATUS_IS_OK(status)) {
1025 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1031 bool run_smb2_session_reauth(int dummy)
1033 struct cli_state *cli;
1036 uint64_t fid_persistent, fid_volatile;
1037 struct tevent_context *ev;
1038 struct tevent_req *subreq;
1039 DATA_BLOB in_blob = data_blob_null;
1041 struct auth_generic_state *auth_generic_state;
1042 struct iovec *recv_iov;
1044 printf("Starting SMB2-SESSION_REAUTH\n");
1046 if (!torture_init_connection(&cli)) {
1049 cli->smb2.pid = 0xFEFF;
1052 * PROTOCOL_SMB2_22 has a bug in win8pre0
1053 * it behaves like PROTOCOL_SMB2_02
1054 * and returns NT_STATUS_REQUEST_NOT_ACCEPTED,
1055 * while it allows it on PROTOCOL_SMB2_02.
1057 status = smbXcli_negprot(cli->conn, cli->timeout,
1058 PROTOCOL_SMB2_10, PROTOCOL_SMB2_10);
1059 if (!NT_STATUS_IS_OK(status)) {
1060 printf("smbXcli_negprot returned %s\n", nt_errstr(status));
1064 status = cli_session_setup(cli, username,
1065 password, strlen(password),
1066 password, strlen(password),
1068 if (!NT_STATUS_IS_OK(status)) {
1069 printf("smb2cli_sesssetup returned %s\n", nt_errstr(status));
1073 status = cli_tree_connect(cli, share, "?????", "", 0);
1074 if (!NT_STATUS_IS_OK(status)) {
1075 printf("cli_tree_connect returned %s\n", nt_errstr(status));
1079 status = smb2cli_create(cli, "session-reauth.txt",
1080 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1081 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1082 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1083 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1084 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1085 FILE_CREATE, /* create_disposition, */
1086 FILE_DELETE_ON_CLOSE, /* create_options, */
1087 NULL, /* smb2_create_blobs *blobs */
1090 if (!NT_STATUS_IS_OK(status)) {
1091 printf("smb2cli_create %s\n", nt_errstr(status));
1095 status = auth_generic_client_prepare(talloc_tos(), &auth_generic_state);
1096 if (!NT_STATUS_IS_OK(status)) {
1097 printf("auth_generic_client_prepare returned %s\n", nt_errstr(status));
1101 gensec_want_feature(auth_generic_state->gensec_security,
1102 GENSEC_FEATURE_SESSION_KEY);
1103 status = auth_generic_set_username(auth_generic_state, username);
1104 if (!NT_STATUS_IS_OK(status)) {
1105 printf("auth_generic_set_username returned %s\n", nt_errstr(status));
1109 status = auth_generic_set_domain(auth_generic_state, workgroup);
1110 if (!NT_STATUS_IS_OK(status)) {
1111 printf("auth_generic_set_domain returned %s\n", nt_errstr(status));
1115 status = auth_generic_set_password(auth_generic_state, password);
1116 if (!NT_STATUS_IS_OK(status)) {
1117 printf("auth_generic_set_password returned %s\n", nt_errstr(status));
1121 status = auth_generic_client_start(auth_generic_state, GENSEC_OID_NTLMSSP);
1122 if (!NT_STATUS_IS_OK(status)) {
1123 printf("auth_generic_client_start returned %s\n", nt_errstr(status));
1127 ev = event_context_init(talloc_tos());
1129 printf("event_context_init() returned NULL\n");
1133 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, data_blob_null, &in_blob);
1134 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1135 printf("gensec_update returned %s\n", nt_errstr(status));
1139 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1144 SMB2_CAP_DFS, /* in_capabilities */
1146 NULL, /* in_previous_session */
1147 &in_blob); /* in_security_buffer */
1148 if (subreq == NULL) {
1149 printf("smb2cli_session_setup_send() returned NULL\n");
1153 ok = tevent_req_poll(subreq, ev);
1155 printf("tevent_req_poll() returned false\n");
1159 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1161 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1162 printf("smb2cli_session_setup_recv returned %s\n",
1167 status = gensec_update(auth_generic_state->gensec_security, talloc_tos(), ev, out_blob, &in_blob);
1168 if (!NT_STATUS_IS_OK(status)) {
1169 printf("auth_generic_update returned %s\n", nt_errstr(status));
1173 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1174 if (!NT_STATUS_IS_OK(status)) {
1175 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1179 status = smb2cli_create(cli, "session-reauth-invalid.txt",
1180 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1181 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1182 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1183 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1184 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1185 FILE_CREATE, /* create_disposition, */
1186 FILE_DELETE_ON_CLOSE, /* create_options, */
1187 NULL, /* smb2_create_blobs *blobs */
1190 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
1191 printf("smb2cli_create %s\n", nt_errstr(status));
1195 subreq = smb2cli_session_setup_send(talloc_tos(), ev,
1200 SMB2_CAP_DFS, /* in_capabilities */
1202 NULL, /* in_previous_session */
1203 &in_blob); /* in_security_buffer */
1204 if (subreq == NULL) {
1205 printf("smb2cli_session_setup_send() returned NULL\n");
1209 ok = tevent_req_poll(subreq, ev);
1211 printf("tevent_req_poll() returned false\n");
1215 status = smb2cli_session_setup_recv(subreq, talloc_tos(),
1216 &recv_iov, &out_blob);
1217 if (!NT_STATUS_IS_OK(status)) {
1218 printf("smb2cli_session_setup_recv returned %s\n",
1223 status = smb2cli_flush(cli, fid_persistent, fid_volatile);
1224 if (!NT_STATUS_IS_OK(status)) {
1225 printf("smb2cli_flush returned %s\n", nt_errstr(status));
1229 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1230 if (!NT_STATUS_IS_OK(status)) {
1231 printf("smb2cli_close returned %s\n", nt_errstr(status));
1235 status = smb2cli_create(cli, "session-reauth.txt",
1236 SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
1237 SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
1238 SEC_STD_ALL | SEC_FILE_ALL, /* desired_access, */
1239 FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
1240 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
1241 FILE_CREATE, /* create_disposition, */
1242 FILE_DELETE_ON_CLOSE, /* create_options, */
1243 NULL, /* smb2_create_blobs *blobs */
1246 if (!NT_STATUS_IS_OK(status)) {
1247 printf("smb2cli_create %s\n", nt_errstr(status));
1251 status = smb2cli_close(cli, 0, fid_persistent, fid_volatile);
1252 if (!NT_STATUS_IS_OK(status)) {
1253 printf("smb2cli_close returned %s\n", nt_errstr(status));