2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1998,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1998,
6 * Copyright (C) Paul Ashton 1998.
7 * Copyright (C) Jeremy Allison 1999.
8 * Copyright (C) Andrew Bartlett 2003.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_CLI
30 extern struct pipe_id_info pipe_names[];
32 static void get_auth_type_level(int pipe_auth_flags, int *auth_type, int *auth_level)
36 if (pipe_auth_flags & AUTH_PIPE_SEAL) {
37 *auth_level = RPC_PIPE_AUTH_SEAL_LEVEL;
38 } else if (pipe_auth_flags & AUTH_PIPE_SIGN) {
39 *auth_level = RPC_PIPE_AUTH_SIGN_LEVEL;
42 if (pipe_auth_flags & AUTH_PIPE_NETSEC) {
43 *auth_type = NETSEC_AUTH_TYPE;
44 } else if (pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
45 *auth_type = NTLMSSP_AUTH_TYPE;
49 /********************************************************************
51 ********************************************************************/
53 static uint32 get_rpc_call_id(void)
55 static uint32 call_id = 0;
59 /*******************************************************************
60 Use SMBreadX to get rest of one fragment's worth of rpc data.
61 ********************************************************************/
63 static BOOL rpc_read(struct cli_state *cli, prs_struct *rdata, uint32 data_to_read, uint32 *rdata_offset)
65 size_t size = (size_t)cli->max_recv_frag;
66 int stream_offset = 0;
69 int extra_data_size = ((int)*rdata_offset) + ((int)data_to_read) - (int)prs_data_size(rdata);
71 DEBUG(5,("rpc_read: data_to_read: %u rdata offset: %u extra_data_size: %d\n",
72 (int)data_to_read, (unsigned int)*rdata_offset, extra_data_size));
75 * Grow the buffer if needed to accommodate the data to be read.
78 if (extra_data_size > 0) {
79 if(!prs_force_grow(rdata, (uint32)extra_data_size)) {
80 DEBUG(0,("rpc_read: Failed to grow parse struct by %d bytes.\n", extra_data_size ));
83 DEBUG(5,("rpc_read: grew buffer by %d bytes to %u\n", extra_data_size, prs_data_size(rdata) ));
86 pdata = prs_data_p(rdata) + *rdata_offset;
88 do /* read data using SMBreadX */
93 if (size > (size_t)data_to_read)
94 size = (size_t)data_to_read;
96 num_read = (int)cli_read(cli, cli->nt_pipe_fnum, pdata, (off_t)stream_offset, size);
98 DEBUG(5,("rpc_read: num_read = %d, read offset: %d, to read: %d\n",
99 num_read, stream_offset, data_to_read));
101 if (cli_is_dos_error(cli)) {
102 cli_dos_error(cli, &eclass, &ecode);
103 if (eclass != ERRDOS && ecode != ERRmoredata) {
104 DEBUG(0,("rpc_read: Error %d/%u in cli_read\n",
105 eclass, (unsigned int)ecode));
110 data_to_read -= num_read;
111 stream_offset += num_read;
114 } while (num_read > 0 && data_to_read > 0);
115 /* && err == (0x80000000 | STATUS_BUFFER_OVERFLOW)); */
118 * Update the current offset into rdata by the amount read.
120 *rdata_offset += stream_offset;
125 /****************************************************************************
126 Checks the header. This will set the endian bit in the rdata prs_struct. JRA.
127 ****************************************************************************/
129 static BOOL rpc_check_hdr(prs_struct *rdata, RPC_HDR *rhdr,
130 BOOL *first, BOOL *last, uint32 *len)
132 DEBUG(5,("rpc_check_hdr: rdata->data_size = %u\n", (uint32)prs_data_size(rdata) ));
134 /* Next call sets endian bit. */
136 if(!smb_io_rpc_hdr("rpc_hdr ", rhdr, rdata, 0)) {
137 DEBUG(0,("rpc_check_hdr: Failed to unmarshall RPC_HDR.\n"));
141 if (prs_offset(rdata) != RPC_HEADER_LEN) {
142 DEBUG(0,("rpc_check_hdr: offset was %x, should be %x.\n", prs_offset(rdata), RPC_HEADER_LEN));
146 (*first) = ((rhdr->flags & RPC_FLG_FIRST) != 0);
147 (*last) = ((rhdr->flags & RPC_FLG_LAST ) != 0);
148 (*len) = (uint32)rhdr->frag_len - prs_data_size(rdata);
150 return (rhdr->pkt_type != RPC_FAULT);
153 /****************************************************************************
154 Verify data on an rpc pipe.
155 The VERIFY & SEAL code is only executed on packets that look like this :
157 Request/Response PDU's look like the following...
159 |<------------------PDU len----------------------------------------------->|
160 |<-HDR_LEN-->|<--REQ LEN------>|.............|<-AUTH_HDRLEN->|<-AUTH_LEN-->|
162 +------------+-----------------+-------------+---------------+-------------+
163 | RPC HEADER | REQ/RESP HEADER | DATA ...... | AUTH_HDR | AUTH DATA |
164 +------------+-----------------+-------------+---------------+-------------+
166 Never on bind requests/responses.
167 ****************************************************************************/
169 static BOOL rpc_auth_pipe(struct cli_state *cli, prs_struct *rdata,
170 uint32 fragment_start, int len, int auth_len, uint8 pkt_type,
171 int *pauth_padding_len)
175 * The following is that length of the data we must sign or seal.
176 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
177 * preceeding the auth_data.
180 int data_len = len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len;
183 * The start of the data to sign/seal is just after the RPC headers.
185 char *reply_data = prs_data_p(rdata) + fragment_start + RPC_HEADER_LEN + RPC_HDR_REQ_LEN;
187 RPC_HDR_AUTH rhdr_auth;
189 char *dp = prs_data_p(rdata) + fragment_start + len -
190 RPC_HDR_AUTH_LEN - auth_len;
191 prs_struct auth_verf;
193 *pauth_padding_len = 0;
196 if (cli->pipe_auth_flags == 0) {
197 /* move along, nothing to see here */
201 DEBUG(2, ("No authenticaton header recienved on reply, but this pipe is authenticated\n"));
205 DEBUG(5,("rpc_auth_pipe: pkt_type: %d len: %d auth_len: %d NTLMSSP %s schannel %s sign %s seal %s \n",
206 pkt_type, len, auth_len,
207 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP),
208 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_NETSEC),
209 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_SIGN),
210 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_SEAL)));
212 if (dp - prs_data_p(rdata) > prs_data_size(rdata)) {
213 DEBUG(0,("rpc_auth_pipe: schannel auth data > data size !\n"));
217 DEBUG(10,("rpc_auth_pipe: packet:\n"));
218 dump_data(100, dp, auth_len);
220 prs_init(&auth_verf, 0, cli->mem_ctx, UNMARSHALL);
222 /* The endinness must be preserved. JRA. */
223 prs_set_endian_data( &auth_verf, rdata->bigendian_data);
225 /* Point this new parse struct at the auth section of the main
226 parse struct - rather than copying it. Avoids needing to
227 free it on every error
229 prs_give_memory(&auth_verf, dp, RPC_HDR_AUTH_LEN + auth_len, False /* not dynamic */);
230 prs_set_offset(&auth_verf, 0);
235 if (!smb_io_rpc_hdr_auth("auth_hdr", &rhdr_auth, &auth_verf, 0)) {
236 DEBUG(0, ("rpc_auth_pipe: Could not parse auth header\n"));
240 /* Let the caller know how much padding at the end of the data */
241 *pauth_padding_len = rhdr_auth.padding;
243 /* Check it's the type of reply we were expecting to decode */
245 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level);
246 if (rhdr_auth.auth_type != auth_type) {
247 DEBUG(0, ("BAD auth type %d (should be %d)\n",
248 rhdr_auth.auth_type, auth_type));
252 if (rhdr_auth.auth_level != auth_level) {
253 DEBUG(0, ("BAD auth level %d (should be %d)\n",
254 rhdr_auth.auth_level, auth_level));
259 if (pkt_type == RPC_BINDACK) {
260 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
261 /* copy the next auth_len bytes into a buffer for
264 DATA_BLOB ntlmssp_verf = data_blob(NULL, auth_len);
266 /* save the reply away, for use a little later */
267 prs_copy_data_out(ntlmssp_verf.data, &auth_verf, auth_len);
270 return (NT_STATUS_IS_OK(ntlmssp_client_store_response(cli->ntlmssp_pipe_state,
273 else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
274 /* nothing to do here - we don't seem to be able to
275 validate the bindack based on VL's comments */
280 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
283 if ((cli->pipe_auth_flags & AUTH_PIPE_SIGN) ||
284 (cli->pipe_auth_flags & AUTH_PIPE_SEAL)) {
285 if (auth_len != RPC_AUTH_NTLMSSP_CHK_LEN) {
286 DEBUG(0,("rpc_auth_pipe: wrong ntlmssp auth len %d\n", auth_len));
289 sig = data_blob(NULL, auth_len);
290 prs_copy_data_out(sig.data, &auth_verf, auth_len);
294 * Unseal any sealed data in the PDU, not including the
295 * 8 byte auth_header or the auth_data.
299 * Now unseal and check the auth verifier in the auth_data at
300 * the end of the packet.
303 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) {
305 DEBUG(1, ("Can't unseal - data_len < 0!!\n"));
308 nt_status = ntlmssp_client_unseal_packet(cli->ntlmssp_pipe_state,
309 reply_data, data_len,
312 else if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
313 nt_status = ntlmssp_client_check_packet(cli->ntlmssp_pipe_state,
314 reply_data, data_len,
318 data_blob_free(&sig);
320 if (!NT_STATUS_IS_OK(nt_status)) {
321 DEBUG(0, ("rpc_auth_pipe: could not validate "
322 "incoming NTLMSSP packet!\n"));
327 if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
328 RPC_AUTH_NETSEC_CHK chk;
330 if (auth_len != RPC_AUTH_NETSEC_CHK_LEN) {
331 DEBUG(0,("rpc_auth_pipe: wrong schannel auth len %d\n", auth_len));
335 if (!smb_io_rpc_auth_netsec_chk("schannel_auth_sign",
336 &chk, &auth_verf, 0)) {
337 DEBUG(0, ("rpc_auth_pipe: schannel unmarshalling "
338 "RPC_AUTH_NETSECK_CHK failed\n"));
342 if (!netsec_decode(&cli->auth_info,
343 cli->pipe_auth_flags,
345 &chk, reply_data, data_len)) {
346 DEBUG(0, ("rpc_auth_pipe: Could not decode schannel\n"));
350 cli->auth_info.seq_num++;
357 /****************************************************************************
358 Send data on an rpc pipe via trans, which *must* be the last fragment.
359 receive response data from an rpc pipe, which may be large...
361 Read the first fragment: unfortunately have to use SMBtrans for the first
362 bit, then SMBreadX for subsequent bits.
364 If first fragment received also wasn't the last fragment, continue
365 getting fragments until we _do_ receive the last fragment.
367 Request/Response PDU's look like the following...
369 |<------------------PDU len----------------------------------------------->|
370 |<-HDR_LEN-->|<--REQ LEN------>|.............|<-AUTH_HDRLEN->|<-AUTH_LEN-->|
372 +------------+-----------------+-------------+---------------+-------------+
373 | RPC HEADER | REQ/RESP HEADER | DATA ...... | AUTH_HDR | AUTH DATA |
374 +------------+-----------------+-------------+---------------+-------------+
376 Where the presence of the AUTH_HDR and AUTH are dependent on the
377 signing & sealing being negotiated.
379 ****************************************************************************/
381 static BOOL rpc_api_pipe(struct cli_state *cli, prs_struct *data, prs_struct *rdata,
382 uint8 expected_pkt_type)
386 uint32 rparam_len = 0;
391 char *pdata = data ? prs_data_p(data) : NULL;
392 uint32 data_len = data ? prs_offset(data) : 0;
394 uint32 rdata_len = 0;
395 uint32 current_offset = 0;
396 uint32 fragment_start = 0;
397 uint32 max_data = cli->max_xmit_frag ? cli->max_xmit_frag : 1024;
398 int auth_padding_len = 0;
400 /* Create setup parameters - must be in native byte order. */
402 setup[0] = TRANSACT_DCERPCCMD;
403 setup[1] = cli->nt_pipe_fnum; /* Pipe file handle. */
405 DEBUG(5,("rpc_api_pipe: fnum:%x\n", (int)cli->nt_pipe_fnum));
407 /* Send the RPC request and receive a response. For short RPC
408 calls (about 1024 bytes or so) the RPC request and response
409 appears in a SMBtrans request and response. Larger RPC
410 responses are received further on. */
412 if (!cli_api_pipe(cli, "\\PIPE\\",
413 setup, 2, 0, /* Setup, length, max */
414 NULL, 0, 0, /* Params, length, max */
415 pdata, data_len, max_data, /* data, length, max */
416 &rparam, &rparam_len, /* return params, len */
417 &prdata, &rdata_len)) /* return data, len */
419 DEBUG(0, ("cli_pipe: return critical error. Error was %s\n", cli_errstr(cli)));
423 /* Throw away returned params - we know we won't use them. */
427 if (prdata == NULL) {
428 DEBUG(0,("rpc_api_pipe: pipe %x failed to return data.\n",
429 (int)cli->nt_pipe_fnum));
434 * Give this memory as dynamically allocated to the return parse
438 prs_give_memory(rdata, prdata, rdata_len, True);
439 current_offset = rdata_len;
441 /* This next call sets the endian bit correctly in rdata. */
443 if (!rpc_check_hdr(rdata, &rhdr, &first, &last, &len)) {
448 if (rhdr.pkt_type == RPC_BINDACK) {
449 if (!last && !first) {
450 DEBUG(5,("rpc_api_pipe: bug in server (AS/U?), setting fragment first/last ON.\n"));
456 if (rhdr.pkt_type == RPC_BINDNACK) {
457 DEBUG(3, ("Bind NACK received on pipe %x!\n", (int)cli->nt_pipe_fnum));
462 if (rhdr.pkt_type == RPC_RESPONSE) {
463 RPC_HDR_RESP rhdr_resp;
464 if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, rdata, 0)) {
465 DEBUG(5,("rpc_api_pipe: failed to unmarshal RPC_HDR_RESP.\n"));
471 if (rhdr.pkt_type != expected_pkt_type) {
472 DEBUG(3, ("Connection to pipe %x got an unexpected RPC packet type - %d, not %d\n", (int)cli->nt_pipe_fnum, rhdr.pkt_type, expected_pkt_type));
477 DEBUG(5,("rpc_api_pipe: len left: %u smbtrans read: %u\n",
478 (unsigned int)len, (unsigned int)rdata_len ));
480 /* check if data to be sent back was too large for one SMBtrans */
481 /* err status is only informational: the _real_ check is on the
485 /* || err == (0x80000000 | STATUS_BUFFER_OVERFLOW)) */
487 /* Read the remaining part of the first response fragment */
489 if (!rpc_read(cli, rdata, len, ¤t_offset)) {
496 * Now we have a complete PDU, check the auth struct if any was sent.
499 if(!rpc_auth_pipe(cli, rdata, fragment_start, rhdr.frag_len,
500 rhdr.auth_len, rhdr.pkt_type, &auth_padding_len)) {
505 if (rhdr.auth_len != 0) {
507 * Drop the auth footers from the current offset.
508 * We need this if there are more fragments.
509 * The auth footers consist of the auth_data and the
510 * preceeding 8 byte auth_header.
512 current_offset -= (auth_padding_len + RPC_HDR_AUTH_LEN + rhdr.auth_len);
516 * Only one rpc fragment, and it has been read.
520 DEBUG(6,("rpc_api_pipe: fragment first and last both set\n"));
525 * Read more fragments using SMBreadX until we get one with the
530 RPC_HDR_RESP rhdr_resp;
532 char hdr_data[RPC_HEADER_LEN+RPC_HDR_RESP_LEN];
538 * First read the header of the next PDU.
541 prs_init(&hps, 0, cli->mem_ctx, UNMARSHALL);
542 prs_give_memory(&hps, hdr_data, sizeof(hdr_data), False);
544 num_read = cli_read(cli, cli->nt_pipe_fnum, hdr_data, 0, RPC_HEADER_LEN+RPC_HDR_RESP_LEN);
545 if (cli_is_dos_error(cli)) {
546 cli_dos_error(cli, &eclass, &ecode);
547 if (eclass != ERRDOS && ecode != ERRmoredata) {
548 DEBUG(0,("rpc_api_pipe: cli_read error : %d/%d\n", eclass, ecode));
553 DEBUG(5,("rpc_api_pipe: read header (size:%d)\n", num_read));
555 if (num_read != RPC_HEADER_LEN+RPC_HDR_RESP_LEN) {
556 DEBUG(0,("rpc_api_pipe: Error : requested %d bytes, got %d.\n",
557 RPC_HEADER_LEN+RPC_HDR_RESP_LEN, num_read ));
561 /* This call sets the endianness in hps. */
563 if (!rpc_check_hdr(&hps, &rhdr, &first, &last, &len))
566 /* Ensure the endianness in rdata is set correctly - must be same as hps. */
568 if (hps.bigendian_data != rdata->bigendian_data) {
569 DEBUG(0,("rpc_api_pipe: Error : Endianness changed from %s to %s\n",
570 rdata->bigendian_data ? "big" : "little",
571 hps.bigendian_data ? "big" : "little" ));
575 if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, &hps, 0)) {
576 DEBUG(0,("rpc_api_pipe: Error in unmarshalling RPC_HDR_RESP.\n"));
581 DEBUG(0,("rpc_api_pipe: secondary PDU rpc header has 'first' set !\n"));
586 * Now read the rest of the PDU.
589 if (!rpc_read(cli, rdata, len, ¤t_offset)) {
594 fragment_start = current_offset - len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN;
597 * Verify any authentication footer.
601 if(!rpc_auth_pipe(cli, rdata, fragment_start, rhdr.frag_len,
602 rhdr.auth_len, rhdr.pkt_type, &auth_padding_len)) {
607 if (rhdr.auth_len != 0 ) {
610 * Drop the auth footers from the current offset.
611 * The auth footers consist of the auth_data and the
612 * preceeding 8 byte auth_header.
613 * We need this if there are more fragments.
615 current_offset -= (auth_padding_len + RPC_HDR_AUTH_LEN + rhdr.auth_len);
622 /*******************************************************************
623 creates a DCE/RPC bind request
625 - initialises the parse structure.
626 - dynamically allocates the header data structure
627 - caller is expected to free the header data structure once used.
629 ********************************************************************/
631 static NTSTATUS create_rpc_bind_req(struct cli_state *cli, prs_struct *rpc_out,
633 RPC_IFACE *abstract, RPC_IFACE *transfer,
634 const char *my_name, const char *domain)
638 RPC_HDR_AUTH hdr_auth;
640 int auth_type, auth_level;
641 size_t saved_hdr_offset = 0;
643 prs_struct auth_info;
644 prs_init(&auth_info, RPC_HDR_AUTH_LEN, /* we will need at least this much */
645 prs_get_mem_context(rpc_out), MARSHALL);
647 if (cli->pipe_auth_flags) {
648 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level);
651 * Create the auth structs we will marshall.
654 init_rpc_hdr_auth(&hdr_auth, auth_type, auth_level, 0x00, 1);
657 * Now marshall the data into the temporary parse_struct.
660 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, &auth_info, 0)) {
661 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR_AUTH.\n"));
662 prs_mem_free(&auth_info);
663 return NT_STATUS_NO_MEMORY;
665 saved_hdr_offset = prs_offset(&auth_info);
668 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
671 DATA_BLOB null_blob = data_blob(NULL, 0);
674 DEBUG(5, ("Processing NTLMSSP Negotiate\n"));
675 nt_status = ntlmssp_client_update(cli->ntlmssp_pipe_state,
679 if (!NT_STATUS_EQUAL(nt_status,
680 NT_STATUS_MORE_PROCESSING_REQUIRED)) {
681 prs_mem_free(&auth_info);
685 /* Auth len in the rpc header doesn't include auth_header. */
686 auth_len = request.length;
687 prs_copy_data_in(&auth_info, request.data, request.length);
689 DEBUG(5, ("NTLMSSP Negotiate:\n"));
690 dump_data(5, request.data, request.length);
692 data_blob_free(&request);
694 } else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
695 RPC_AUTH_NETSEC_NEG netsec_neg;
697 /* Use lp_workgroup() if domain not specified */
699 if (!domain || !domain[0]) {
700 DEBUG(10,("create_rpc_bind_req: no domain; assuming my own\n"));
701 domain = lp_workgroup();
704 init_rpc_auth_netsec_neg(&netsec_neg, domain, my_name);
707 * Now marshall the data into the temporary parse_struct.
710 if(!smb_io_rpc_auth_netsec_neg("netsec_neg",
711 &netsec_neg, &auth_info, 0)) {
712 DEBUG(0,("Failed to marshall RPC_AUTH_NETSEC_NEG.\n"));
713 prs_mem_free(&auth_info);
714 return NT_STATUS_NO_MEMORY;
717 /* Auth len in the rpc header doesn't include auth_header. */
718 auth_len = prs_offset(&auth_info) - saved_hdr_offset;
721 /* Create the request RPC_HDR */
722 init_rpc_hdr(&hdr, RPC_BIND, 0x3, rpc_call_id,
723 RPC_HEADER_LEN + RPC_HDR_RB_LEN + prs_offset(&auth_info),
726 if(!smb_io_rpc_hdr("hdr" , &hdr, rpc_out, 0)) {
727 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR.\n"));
728 prs_mem_free(&auth_info);
729 return NT_STATUS_NO_MEMORY;
732 /* create the bind request RPC_HDR_RB */
733 init_rpc_hdr_rb(&hdr_rb, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN, 0x0,
734 0x1, 0x0, 0x1, abstract, transfer);
736 /* Marshall the bind request data */
737 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_out, 0)) {
738 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR_RB.\n"));
739 prs_mem_free(&auth_info);
740 return NT_STATUS_NO_MEMORY;
744 * Grow the outgoing buffer to store any auth info.
748 if(!prs_append_prs_data( rpc_out, &auth_info)) {
749 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n"));
750 prs_mem_free(&auth_info);
751 return NT_STATUS_NO_MEMORY;
757 /*******************************************************************
758 Creates a DCE/RPC bind authentication response.
759 This is the packet that is sent back to the server once we
760 have received a BIND-ACK, to finish the third leg of
761 the authentication handshake.
762 ********************************************************************/
764 static NTSTATUS create_rpc_bind_resp(struct cli_state *cli,
770 RPC_HDR_AUTHA hdr_autha;
771 DATA_BLOB ntlmssp_null_response = data_blob(NULL, 0);
772 DATA_BLOB ntlmssp_reply;
773 int auth_type, auth_level;
775 /* The response is picked up from the internal cache,
776 where it was placed by the rpc_auth_pipe() code */
777 nt_status = ntlmssp_client_update(cli->ntlmssp_pipe_state,
778 ntlmssp_null_response,
781 if (!NT_STATUS_EQUAL(nt_status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
785 /* Create the request RPC_HDR */
786 init_rpc_hdr(&hdr, RPC_BINDRESP, 0x0, rpc_call_id,
787 RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN + ntlmssp_reply.length,
788 ntlmssp_reply.length );
791 if(!smb_io_rpc_hdr("hdr", &hdr, rpc_out, 0)) {
792 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR.\n"));
793 data_blob_free(&ntlmssp_reply);
794 return NT_STATUS_NO_MEMORY;
797 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level);
799 /* Create the request RPC_HDR_AUTHA */
800 init_rpc_hdr_autha(&hdr_autha, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN,
801 auth_type, auth_level, 0x00);
803 if(!smb_io_rpc_hdr_autha("hdr_autha", &hdr_autha, rpc_out, 0)) {
804 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR_AUTHA.\n"));
805 data_blob_free(&ntlmssp_reply);
806 return NT_STATUS_NO_MEMORY;
810 * Append the auth data to the outgoing buffer.
813 if(!prs_copy_data_in(rpc_out, ntlmssp_reply.data, ntlmssp_reply.length)) {
814 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n"));
815 data_blob_free(&ntlmssp_reply);
816 return NT_STATUS_NO_MEMORY;
819 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
820 nt_status = ntlmssp_client_sign_init(cli->ntlmssp_pipe_state);
822 if (!NT_STATUS_IS_OK(nt_status)) {
827 data_blob_free(&ntlmssp_reply);
832 /*******************************************************************
833 Creates a DCE/RPC request.
834 ********************************************************************/
836 static uint32 create_rpc_request(prs_struct *rpc_out, uint8 op_num, int data_len, int auth_len, uint8 flags, uint32 oldid, uint32 data_left)
841 uint32 callid = oldid ? oldid : get_rpc_call_id();
843 DEBUG(5,("create_rpc_request: opnum: 0x%x data_len: 0x%x\n", op_num, data_len));
845 /* create the rpc header RPC_HDR */
846 init_rpc_hdr(&hdr, RPC_REQUEST, flags,
847 callid, data_len, auth_len);
850 * The alloc hint should be the amount of data, not including
851 * RPC headers & footers.
855 alloc_hint = data_len - RPC_HEADER_LEN - RPC_HDR_AUTH_LEN - auth_len;
857 alloc_hint = data_len - RPC_HEADER_LEN;
859 DEBUG(10,("create_rpc_request: data_len: %x auth_len: %x alloc_hint: %x\n",
860 data_len, auth_len, alloc_hint));
862 /* Create the rpc request RPC_HDR_REQ */
863 init_rpc_hdr_req(&hdr_req, alloc_hint, op_num);
866 if(!smb_io_rpc_hdr("hdr ", &hdr, rpc_out, 0))
869 if(!smb_io_rpc_hdr_req("hdr_req", &hdr_req, rpc_out, 0))
872 if (prs_offset(rpc_out) != RPC_HEADER_LEN + RPC_HDR_REQ_LEN)
878 /*******************************************************************
879 Puts an auth header into an rpc request.
880 ********************************************************************/
882 static BOOL create_auth_hdr(prs_struct *outgoing_packet,
884 int auth_level, int padding)
886 RPC_HDR_AUTH hdr_auth;
888 init_rpc_hdr_auth(&hdr_auth, auth_type, auth_level,
890 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth,
891 outgoing_packet, 0)) {
892 DEBUG(0,("create_auth_hdr:Failed to marshal RPC_HDR_AUTH.\n"));
899 * Send a request on an RPC pipe and get a response.
901 * @param data NDR contents of the request to be sent.
902 * @param rdata Unparsed NDR response data.
905 BOOL rpc_api_pipe_req(struct cli_state *cli, uint8 op_num,
906 prs_struct *data, prs_struct *rdata)
908 uint32 auth_len, real_auth_len, auth_hdr_len, max_data, data_left, data_sent;
918 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
919 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
920 auth_len = RPC_AUTH_NTLMSSP_CHK_LEN;
922 if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
923 auth_len = RPC_AUTH_NETSEC_CHK_LEN;
925 auth_hdr_len = RPC_HDR_AUTH_LEN;
929 * calc how much actual data we can send in a PDU fragment
931 max_data = cli->max_xmit_frag - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
932 auth_hdr_len - auth_len - 8;
934 for (data_left = prs_offset(data), data_sent = 0; data_left > 0;) {
935 prs_struct outgoing_packet;
937 uint32 data_len, send_size;
939 uint32 auth_padding = 0;
940 RPC_AUTH_NETSEC_CHK verf;
944 * how much will we send this time
946 send_size = MIN(data_left, max_data);
948 if (!prs_init(&sec_blob, send_size, /* will need at least this much */
949 cli->mem_ctx, MARSHALL)) {
950 DEBUG(0,("Could not malloc %u bytes",
951 send_size+auth_padding));
955 if(!prs_append_some_prs_data(&sec_blob, data,
956 data_sent, send_size)) {
957 DEBUG(0,("Failed to append data to netsec blob\n"));
958 prs_mem_free(&sec_blob);
963 * NT expects the data that is sealed to be 8-byte
964 * aligned. The padding must be encrypted as well and
965 * taken into account when generating the
966 * authentication verifier. The amount of padding must
967 * be stored in the auth header.
970 if (cli->pipe_auth_flags) {
971 size_t data_and_padding_size;
974 prs_align_uint64(&sec_blob);
976 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level);
978 data_and_padding_size = prs_offset(&sec_blob);
979 auth_padding = data_and_padding_size - send_size;
981 /* insert the auth header */
983 if(!create_auth_hdr(&sec_blob, auth_type, auth_level, auth_padding)) {
984 prs_mem_free(&sec_blob);
988 /* create an NTLMSSP signature */
989 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
991 * Seal the outgoing data if requested.
993 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) {
995 nt_status = ntlmssp_client_seal_packet(cli->ntlmssp_pipe_state,
996 (unsigned char*)prs_data_p(&sec_blob),
997 data_and_padding_size,
999 if (!NT_STATUS_IS_OK(nt_status)) {
1000 prs_mem_free(&sec_blob);
1004 else if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
1006 nt_status = ntlmssp_client_sign_packet(cli->ntlmssp_pipe_state,
1007 (unsigned char*)prs_data_p(&sec_blob),
1008 data_and_padding_size, &sign_blob);
1009 if (!NT_STATUS_IS_OK(nt_status)) {
1010 prs_mem_free(&sec_blob);
1016 /* write auth footer onto the packet */
1017 real_auth_len = sign_blob.length;
1019 prs_copy_data_in(&sec_blob, sign_blob.data, sign_blob.length);
1020 data_blob_free(&sign_blob);
1023 else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
1024 static const uchar netsec_sig[8] = NETSEC_SIGNATURE;
1025 static const uchar nullbytes[8] = { 0,0,0,0,0,0,0,0 };
1026 size_t parse_offset_marker;
1027 DEBUG(10,("SCHANNEL seq_num=%d\n", cli->auth_info.seq_num));
1029 init_rpc_auth_netsec_chk(&verf, netsec_sig, nullbytes,
1030 nullbytes, nullbytes);
1032 netsec_encode(&cli->auth_info,
1033 cli->pipe_auth_flags,
1034 SENDER_IS_INITIATOR,
1036 prs_data_p(&sec_blob),
1037 data_and_padding_size);
1039 cli->auth_info.seq_num++;
1041 /* write auth footer onto the packet */
1043 parse_offset_marker = prs_offset(&sec_blob);
1044 if (!smb_io_rpc_auth_netsec_chk("", &verf,
1046 prs_mem_free(&sec_blob);
1049 real_auth_len = prs_offset(&sec_blob) - parse_offset_marker;
1053 data_len = RPC_HEADER_LEN + RPC_HDR_REQ_LEN + prs_offset(&sec_blob);
1056 * Malloc parse struct to hold it (and enough for alignments).
1058 if(!prs_init(&outgoing_packet, data_len + 8,
1059 cli->mem_ctx, MARSHALL)) {
1060 DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len ));
1064 if (data_left == prs_offset(data))
1065 flags |= RPC_FLG_FIRST;
1067 if (data_left <= max_data)
1068 flags |= RPC_FLG_LAST;
1070 * Write out the RPC header and the request header.
1072 if(!(callid = create_rpc_request(&outgoing_packet, op_num,
1073 data_len, real_auth_len, flags,
1074 callid, data_left))) {
1075 DEBUG(0,("rpc_api_pipe_req: Failed to create RPC request.\n"));
1076 prs_mem_free(&outgoing_packet);
1077 prs_mem_free(&sec_blob);
1081 prs_append_prs_data(&outgoing_packet, &sec_blob);
1082 prs_mem_free(&sec_blob);
1084 DEBUG(100,("data_len: %x data_calc_len: %x\n", data_len,
1085 prs_offset(&outgoing_packet)));
1087 if (flags & RPC_FLG_LAST)
1088 ret = rpc_api_pipe(cli, &outgoing_packet,
1089 rdata, RPC_RESPONSE);
1091 cli_write(cli, cli->nt_pipe_fnum, 0x0008,
1092 prs_data_p(&outgoing_packet),
1093 data_sent, data_len);
1095 prs_mem_free(&outgoing_packet);
1096 data_sent += send_size;
1097 data_left -= send_size;
1099 /* Also capture received data */
1100 slprintf(dump_name, sizeof(dump_name) - 1, "reply_%s",
1101 cli_pipe_get_name(cli));
1102 prs_dump(dump_name, op_num, rdata);
1107 /****************************************************************************
1108 Set the handle state.
1109 ****************************************************************************/
1111 static BOOL rpc_pipe_set_hnd_state(struct cli_state *cli, const char *pipe_name, uint16 device_state)
1113 BOOL state_set = False;
1115 uint16 setup[2]; /* only need 2 uint16 setup parameters */
1116 char *rparam = NULL;
1118 uint32 rparam_len, rdata_len;
1120 if (pipe_name == NULL)
1123 DEBUG(5,("Set Handle state Pipe[%x]: %s - device state:%x\n",
1124 cli->nt_pipe_fnum, pipe_name, device_state));
1126 /* create parameters: device state */
1127 SSVAL(param, 0, device_state);
1129 /* create setup parameters. */
1131 setup[1] = cli->nt_pipe_fnum; /* pipe file handle. got this from an SMBOpenX. */
1133 /* send the data on \PIPE\ */
1134 if (cli_api_pipe(cli, "\\PIPE\\",
1135 setup, 2, 0, /* setup, length, max */
1136 param, 2, 0, /* param, length, max */
1137 NULL, 0, 1024, /* data, length, max */
1138 &rparam, &rparam_len, /* return param, length */
1139 &rdata, &rdata_len)) /* return data, length */
1141 DEBUG(5, ("Set Handle state: return OK\n"));
1151 /****************************************************************************
1152 check the rpc bind acknowledge response
1153 ****************************************************************************/
1155 int get_pipe_index( const char *pipe_name )
1159 while (pipe_names[pipe_idx].client_pipe != NULL) {
1160 if (strequal(pipe_name, pipe_names[pipe_idx].client_pipe ))
1169 /****************************************************************************
1170 check the rpc bind acknowledge response
1171 ****************************************************************************/
1173 const char* get_pipe_name_from_index( const int pipe_index )
1176 if ( (pipe_index < 0) || (pipe_index >= PI_MAX_PIPES) )
1179 return pipe_names[pipe_index].client_pipe;
1182 /****************************************************************************
1183 Check to see if this pipe index points to one of
1184 the pipes only supported by Win2k
1185 ****************************************************************************/
1187 BOOL is_win2k_pipe( const int pipe_idx )
1198 /****************************************************************************
1199 check the rpc bind acknowledge response
1200 ****************************************************************************/
1202 static BOOL valid_pipe_name(const int pipe_idx, RPC_IFACE *abstract, RPC_IFACE *transfer)
1204 if ( pipe_idx >= PI_MAX_PIPES ) {
1205 DEBUG(0,("valid_pipe_name: Programmer error! Invalid pipe index [%d]\n",
1210 DEBUG(5,("Bind Abstract Syntax: "));
1211 dump_data(5, (char*)&(pipe_names[pipe_idx].abstr_syntax),
1212 sizeof(pipe_names[pipe_idx].abstr_syntax));
1213 DEBUG(5,("Bind Transfer Syntax: "));
1214 dump_data(5, (char*)&(pipe_names[pipe_idx].trans_syntax),
1215 sizeof(pipe_names[pipe_idx].trans_syntax));
1217 /* copy the required syntaxes out so we can do the right bind */
1219 *transfer = pipe_names[pipe_idx].trans_syntax;
1220 *abstract = pipe_names[pipe_idx].abstr_syntax;
1225 /****************************************************************************
1226 check the rpc bind acknowledge response
1227 ****************************************************************************/
1229 static BOOL check_bind_response(RPC_HDR_BA *hdr_ba, const int pipe_idx, RPC_IFACE *transfer)
1233 if ( hdr_ba->addr.len <= 0)
1236 if ( !strequal(hdr_ba->addr.str, pipe_names[pipe_idx].server_pipe ))
1238 DEBUG(4,("bind_rpc_pipe: pipe_name %s != expected pipe %s. oh well!\n",
1239 pipe_names[i].server_pipe ,hdr_ba->addr.str));
1243 DEBUG(5,("bind_rpc_pipe: server pipe_name found: %s\n", pipe_names[i].server_pipe ));
1245 if (pipe_names[pipe_idx].server_pipe == NULL) {
1246 DEBUG(2,("bind_rpc_pipe: pipe name %s unsupported\n", hdr_ba->addr.str));
1250 /* check the transfer syntax */
1251 if ((hdr_ba->transfer.version != transfer->version) ||
1252 (memcmp(&hdr_ba->transfer.uuid, &transfer->uuid, sizeof(transfer->uuid)) !=0)) {
1253 DEBUG(2,("bind_rpc_pipe: transfer syntax differs\n"));
1257 /* lkclXXXX only accept one result: check the result(s) */
1258 if (hdr_ba->res.num_results != 0x1 || hdr_ba->res.result != 0) {
1259 DEBUG(2,("bind_rpc_pipe: bind denied results: %d reason: %x\n",
1260 hdr_ba->res.num_results, hdr_ba->res.reason));
1263 DEBUG(5,("bind_rpc_pipe: accepted!\n"));
1267 /****************************************************************************
1268 Create and send the third packet in an RPC auth.
1269 ****************************************************************************/
1271 static BOOL rpc_send_auth_reply(struct cli_state *cli, prs_struct *rdata, uint32 rpc_call_id)
1276 prs_init(&rpc_out, RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN, /* need at least this much */
1277 cli->mem_ctx, MARSHALL);
1279 create_rpc_bind_resp(cli, rpc_call_id,
1282 if ((ret = cli_write(cli, cli->nt_pipe_fnum, 0x8, prs_data_p(&rpc_out),
1283 0, (size_t)prs_offset(&rpc_out))) != (ssize_t)prs_offset(&rpc_out)) {
1284 DEBUG(0,("rpc_send_auth_reply: cli_write failed. Return was %d\n", (int)ret));
1285 prs_mem_free(&rpc_out);
1289 prs_mem_free(&rpc_out);
1293 /****************************************************************************
1295 ****************************************************************************/
1297 static BOOL rpc_pipe_bind(struct cli_state *cli, int pipe_idx, const char *my_name)
1304 char buffer[MAX_PDU_FRAG_LEN];
1306 if ( (pipe_idx < 0) || (pipe_idx >= PI_MAX_PIPES) )
1309 DEBUG(5,("Bind RPC Pipe[%x]: %s\n", cli->nt_pipe_fnum, pipe_names[pipe_idx].client_pipe));
1311 if (!valid_pipe_name(pipe_idx, &abstract, &transfer))
1314 prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL);
1317 * Use the MAX_PDU_FRAG_LEN buffer to store the bind request.
1320 prs_give_memory( &rpc_out, buffer, sizeof(buffer), False);
1322 rpc_call_id = get_rpc_call_id();
1324 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
1328 DEBUG(5, ("NTLMSSP authenticated pipe selected\n"));
1330 nt_status = ntlmssp_client_start(&cli->ntlmssp_pipe_state);
1332 if (!NT_STATUS_IS_OK(nt_status))
1335 nt_status = ntlmssp_set_username(cli->ntlmssp_pipe_state,
1337 if (!NT_STATUS_IS_OK(nt_status))
1340 nt_status = ntlmssp_set_domain(cli->ntlmssp_pipe_state,
1342 if (!NT_STATUS_IS_OK(nt_status))
1345 pwd_get_cleartext(&cli->pwd, password);
1346 nt_status = ntlmssp_set_password(cli->ntlmssp_pipe_state,
1348 if (!NT_STATUS_IS_OK(nt_status))
1351 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
1352 cli->ntlmssp_pipe_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN;
1355 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) {
1356 cli->ntlmssp_pipe_state->neg_flags |= NTLMSSP_NEGOTIATE_SEAL;
1358 } else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
1359 cli->auth_info.seq_num = 0;
1362 /* Marshall the outgoing data. */
1363 create_rpc_bind_req(cli, &rpc_out, rpc_call_id,
1364 &abstract, &transfer,
1365 global_myname(), cli->domain);
1367 /* Initialize the incoming data struct. */
1368 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
1370 /* send data on \PIPE\. receive a response */
1371 if (rpc_api_pipe(cli, &rpc_out, &rdata, RPC_BINDACK)) {
1374 DEBUG(5, ("rpc_pipe_bind: rpc_api_pipe returned OK.\n"));
1376 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &rdata, 0)) {
1377 DEBUG(0,("rpc_pipe_bind: Failed to unmarshall RPC_HDR_BA.\n"));
1378 prs_mem_free(&rdata);
1382 if(!check_bind_response(&hdr_ba, pipe_idx, &transfer)) {
1383 DEBUG(2,("rpc_pipe_bind: check_bind_response failed.\n"));
1384 prs_mem_free(&rdata);
1388 cli->max_xmit_frag = hdr_ba.bba.max_tsize;
1389 cli->max_recv_frag = hdr_ba.bba.max_rsize;
1392 * If we're doing NTLMSSP auth we need to send a reply to
1393 * the bind-ack to complete the 3-way challenge response
1397 if ((cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP)
1398 && !rpc_send_auth_reply(cli, &rdata, rpc_call_id)) {
1399 DEBUG(0,("rpc_pipe_bind: rpc_send_auth_reply failed.\n"));
1400 prs_mem_free(&rdata);
1403 prs_mem_free(&rdata);
1410 /****************************************************************************
1412 ****************************************************************************/
1414 BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
1418 /* At the moment we can't have more than one pipe open over
1419 a cli connection. )-: */
1421 SMB_ASSERT(cli->nt_pipe_fnum == 0);
1423 /* The pipe index must fall within our array */
1425 SMB_ASSERT((pipe_idx >= 0) && (pipe_idx < PI_MAX_PIPES));
1427 if (cli->capabilities & CAP_NT_SMBS) {
1428 if ((fnum = cli_nt_create(cli, &pipe_names[pipe_idx].client_pipe[5], DESIRED_ACCESS_PIPE)) == -1) {
1429 DEBUG(0,("cli_nt_session_open: cli_nt_create failed on pipe %s to machine %s. Error was %s\n",
1430 &pipe_names[pipe_idx].client_pipe[5], cli->desthost, cli_errstr(cli)));
1434 cli->nt_pipe_fnum = (uint16)fnum;
1436 if ((fnum = cli_open(cli, pipe_names[pipe_idx].client_pipe, O_CREAT|O_RDWR, DENY_NONE)) == -1) {
1437 DEBUG(0,("cli_nt_session_open: cli_open failed on pipe %s to machine %s. Error was %s\n",
1438 pipe_names[pipe_idx].client_pipe, cli->desthost, cli_errstr(cli)));
1442 cli->nt_pipe_fnum = (uint16)fnum;
1444 /**************** Set Named Pipe State ***************/
1445 if (!rpc_pipe_set_hnd_state(cli, pipe_names[pipe_idx].client_pipe, 0x4300)) {
1446 DEBUG(0,("cli_nt_session_open: pipe hnd state failed. Error was %s\n",
1448 cli_close(cli, cli->nt_pipe_fnum);
1453 /******************* bind request on pipe *****************/
1455 if (!rpc_pipe_bind(cli, pipe_idx, global_myname())) {
1456 DEBUG(2,("cli_nt_session_open: rpc bind to %s failed\n",
1457 get_pipe_name_from_index(pipe_idx)));
1458 cli_close(cli, cli->nt_pipe_fnum);
1463 * Setup the remote server name prefixed by \ and the machine account name.
1466 fstrcpy(cli->srv_name_slash, "\\\\");
1467 fstrcat(cli->srv_name_slash, cli->desthost);
1468 strupper_m(cli->srv_name_slash);
1470 fstrcpy(cli->clnt_name_slash, "\\\\");
1471 fstrcat(cli->clnt_name_slash, global_myname());
1472 strupper_m(cli->clnt_name_slash);
1474 fstrcpy(cli->mach_acct, global_myname());
1475 fstrcat(cli->mach_acct, "$");
1476 strupper_m(cli->mach_acct);
1478 /* Remember which pipe we're talking to */
1479 fstrcpy(cli->pipe_name, pipe_names[pipe_idx].client_pipe);
1485 /****************************************************************************
1486 Open a session to the NETLOGON pipe using schannel.
1488 (Assumes that the netlogon pipe is already open)
1489 ****************************************************************************/
1491 NTSTATUS cli_nt_establish_netlogon(struct cli_state *cli, int sec_chan,
1492 const uchar trust_password[16])
1495 uint32 neg_flags = 0x000001ff;
1498 cli_nt_netlogon_netsec_session_close(cli);
1500 if (lp_client_schannel() != False)
1501 neg_flags |= NETLOGON_NEG_SCHANNEL;
1503 result = cli_nt_setup_creds(cli, sec_chan, trust_password,
1506 if (!NT_STATUS_IS_OK(result)) {
1507 cli_nt_session_close(cli);
1511 if ((lp_client_schannel() == True) &&
1512 ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
1514 DEBUG(3, ("Server did not offer schannel\n"));
1515 cli_nt_session_close(cli);
1516 return NT_STATUS_UNSUCCESSFUL;
1519 if ((lp_client_schannel() == False) ||
1520 ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
1521 return NT_STATUS_OK;
1523 /* keep the existing connection to NETLOGON open */
1527 /* Server offered schannel, so try it. */
1529 memcpy(cli->auth_info.sess_key, cli->sess_key,
1530 sizeof(cli->auth_info.sess_key));
1532 cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum;
1534 cli->pipe_auth_flags = AUTH_PIPE_NETSEC;
1535 cli->pipe_auth_flags |= AUTH_PIPE_SIGN;
1536 cli->pipe_auth_flags |= AUTH_PIPE_SEAL;
1538 if (cli->capabilities & CAP_NT_SMBS) {
1540 /* The secure channel connection must be opened on the same
1541 session (TCP connection) as the one the challenge was
1543 if ((fnum = cli_nt_create(cli, PIPE_NETLOGON_PLAIN,
1544 DESIRED_ACCESS_PIPE)) == -1) {
1545 DEBUG(0,("cli_nt_create failed to %s machine %s. "
1547 PIPE_NETLOGON, cli->desthost,
1549 return NT_STATUS_UNSUCCESSFUL;
1552 cli->nt_pipe_fnum = (uint16)fnum;
1554 if ((fnum = cli_open(cli, PIPE_NETLOGON,
1555 O_CREAT|O_RDWR, DENY_NONE)) == -1) {
1556 DEBUG(0,("cli_open failed on pipe %s to machine %s. "
1558 PIPE_NETLOGON, cli->desthost,
1560 return NT_STATUS_UNSUCCESSFUL;
1563 cli->nt_pipe_fnum = (uint16)fnum;
1565 /**************** Set Named Pipe State ***************/
1566 if (!rpc_pipe_set_hnd_state(cli, PIPE_NETLOGON, 0x4300)) {
1567 DEBUG(0,("Pipe hnd state failed. Error was %s\n",
1569 cli_close(cli, cli->nt_pipe_fnum);
1570 return NT_STATUS_UNSUCCESSFUL;
1574 if (!rpc_pipe_bind(cli, PI_NETLOGON, global_myname())) {
1575 DEBUG(2,("rpc bind to %s failed\n", PIPE_NETLOGON));
1576 cli_close(cli, cli->nt_pipe_fnum);
1577 return NT_STATUS_UNSUCCESSFUL;
1580 return NT_STATUS_OK;
1584 NTSTATUS cli_nt_setup_netsec(struct cli_state *cli, int sec_chan,
1585 const uchar trust_password[16])
1588 uint32 neg_flags = 0x000001ff;
1589 cli->pipe_auth_flags = 0;
1591 if (lp_client_schannel() == False) {
1592 return NT_STATUS_OK;
1595 if (!cli_nt_session_open(cli, PI_NETLOGON)) {
1596 DEBUG(0, ("Could not initialise %s\n",
1597 get_pipe_name_from_index(PI_NETLOGON)));
1598 return NT_STATUS_UNSUCCESSFUL;
1601 if (lp_client_schannel() != False)
1602 neg_flags |= NETLOGON_NEG_SCHANNEL;
1604 neg_flags |= NETLOGON_NEG_SCHANNEL;
1606 result = cli_nt_setup_creds(cli, sec_chan, trust_password,
1609 if (!(neg_flags & NETLOGON_NEG_SCHANNEL)
1610 && lp_client_schannel() == True) {
1611 DEBUG(1, ("Could not negotiate SCHANNEL with the DC!\n"));
1612 result = NT_STATUS_UNSUCCESSFUL;
1615 if (!NT_STATUS_IS_OK(result)) {
1616 ZERO_STRUCT(cli->auth_info.sess_key);
1617 ZERO_STRUCT(cli->sess_key);
1618 cli->pipe_auth_flags = 0;
1619 cli_nt_session_close(cli);
1623 memcpy(cli->auth_info.sess_key, cli->sess_key,
1624 sizeof(cli->auth_info.sess_key));
1626 cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum;
1627 cli->nt_pipe_fnum = 0;
1629 /* doing schannel, not per-user auth */
1630 cli->pipe_auth_flags = AUTH_PIPE_NETSEC | AUTH_PIPE_SIGN | AUTH_PIPE_SEAL;
1632 return NT_STATUS_OK;
1635 const char *cli_pipe_get_name(struct cli_state *cli)
1637 return cli->pipe_name;