skel_ -> cap_
[Samba/gebeck_regimport.git] / source3 / rpc_client / cli_pipe.c
blobdedbf017a93a04caae8bc4f9055e36cea4fc5f5b
1 /*
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.
9 *
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.
25 #include "includes.h"
27 #undef DBGC_CLASS
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)
34 *auth_type = 0;
35 *auth_level = 0;
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 /********************************************************************
50 Rpc pipe call id.
51 ********************************************************************/
53 static uint32 get_rpc_call_id(void)
55 static uint32 call_id = 0;
56 return ++call_id;
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;
67 int num_read;
68 char *pdata;
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 ));
81 return False;
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 */
90 uint32 ecode;
91 uint8 eclass;
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));
106 return False;
110 data_to_read -= num_read;
111 stream_offset += num_read;
112 pdata += 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;
122 return True;
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"));
138 return False;
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));
143 return False;
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;
195 if (auth_len == 0) {
196 if (cli->pipe_auth_flags == 0) {
197 /* move along, nothing to see here */
198 return True;
201 DEBUG(2, ("No authenticaton header recienved on reply, but this pipe is authenticated\n"));
202 return False;
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"));
214 return False;
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);
233 int auth_type;
234 int auth_level;
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"));
237 return False;
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));
249 return False;
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));
255 return False;
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
262 later use */
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((char *)ntlmssp_verf.data, &auth_verf, auth_len);
270 return (NT_STATUS_IS_OK(ntlmssp_client_store_response(cli->ntlmssp_pipe_state,
271 ntlmssp_verf)));
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 */
276 return True;
280 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
281 NTSTATUS nt_status;
282 DATA_BLOB sig;
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));
287 return False;
289 sig = data_blob(NULL, auth_len);
290 prs_copy_data_out((char *)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) {
304 if (data_len < 0) {
305 DEBUG(1, ("Can't unseal - data_len < 0!!\n"));
306 return False;
308 nt_status = ntlmssp_client_unseal_packet(cli->ntlmssp_pipe_state,
309 (unsigned char *)reply_data, data_len,
310 &sig);
312 else if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
313 nt_status = ntlmssp_client_check_packet(cli->ntlmssp_pipe_state,
314 (const unsigned char *)reply_data, data_len,
315 &sig);
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"));
323 return False;
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));
332 return False;
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"));
339 return False;
342 if (!netsec_decode(&cli->auth_info,
343 cli->pipe_auth_flags,
344 SENDER_IS_ACCEPTOR,
345 &chk, reply_data, data_len)) {
346 DEBUG(0, ("rpc_auth_pipe: Could not decode schannel\n"));
347 return False;
350 cli->auth_info.seq_num++;
353 return True;
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)
384 uint32 len;
385 char *rparam = NULL;
386 uint32 rparam_len = 0;
387 uint16 setup[2];
388 BOOL first = True;
389 BOOL last = True;
390 RPC_HDR rhdr;
391 char *pdata = data ? prs_data_p(data) : NULL;
392 uint32 data_len = data ? prs_offset(data) : 0;
393 char *prdata = NULL;
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)));
420 return False;
423 /* Throw away returned params - we know we won't use them. */
425 SAFE_FREE(rparam);
427 if (prdata == NULL) {
428 DEBUG(0,("rpc_api_pipe: pipe %x failed to return data.\n",
429 (int)cli->nt_pipe_fnum));
430 return False;
434 * Give this memory as dynamically allocated to the return parse
435 * struct.
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)) {
444 prs_mem_free(rdata);
445 return False;
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"));
451 first = True;
452 last = True;
456 if (rhdr.pkt_type == RPC_BINDNACK) {
457 DEBUG(3, ("Bind NACK received on pipe %x!\n", (int)cli->nt_pipe_fnum));
458 prs_mem_free(rdata);
459 return False;
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"));
466 prs_mem_free(rdata);
467 return False;
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));
473 prs_mem_free(rdata);
474 return False;
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
482 length */
484 if (len > 0) {
485 /* || err == (0x80000000 | STATUS_BUFFER_OVERFLOW)) */
487 /* Read the remaining part of the first response fragment */
489 if (!rpc_read(cli, rdata, len, &current_offset)) {
490 prs_mem_free(rdata);
491 return False;
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)) {
501 prs_mem_free(rdata);
502 return False;
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.
519 if (first && last) {
520 DEBUG(6,("rpc_api_pipe: fragment first and last both set\n"));
521 return True;
525 * Read more fragments using SMBreadX until we get one with the
526 * last bit set.
529 while (!last) {
530 RPC_HDR_RESP rhdr_resp;
531 int num_read;
532 char hdr_data[RPC_HEADER_LEN+RPC_HDR_RESP_LEN];
533 prs_struct hps;
534 uint8 eclass;
535 uint32 ecode;
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));
549 return False;
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 ));
558 return False;
561 /* This call sets the endianness in hps. */
563 if (!rpc_check_hdr(&hps, &rhdr, &first, &last, &len))
564 return False;
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" ));
572 return False;
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"));
577 return False;
580 if (first) {
581 DEBUG(0,("rpc_api_pipe: secondary PDU rpc header has 'first' set !\n"));
582 return False;
586 * Now read the rest of the PDU.
589 if (!rpc_read(cli, rdata, len, &current_offset)) {
590 prs_mem_free(rdata);
591 return False;
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)) {
603 prs_mem_free(rdata);
604 return False;
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);
619 return True;
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,
632 uint32 rpc_call_id,
633 RPC_IFACE *abstract, RPC_IFACE *transfer,
634 const char *my_name, const char *domain)
636 RPC_HDR hdr;
637 RPC_HDR_RB hdr_rb;
638 RPC_HDR_AUTH hdr_auth;
639 int auth_len = 0;
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) {
670 NTSTATUS nt_status;
671 DATA_BLOB null_blob = data_blob(NULL, 0);
672 DATA_BLOB request;
674 DEBUG(5, ("Processing NTLMSSP Negotiate\n"));
675 nt_status = ntlmssp_client_update(cli->ntlmssp_pipe_state,
676 null_blob,
677 &request);
679 if (!NT_STATUS_EQUAL(nt_status,
680 NT_STATUS_MORE_PROCESSING_REQUIRED)) {
681 prs_mem_free(&auth_info);
682 return nt_status;
685 /* Auth len in the rpc header doesn't include auth_header. */
686 auth_len = request.length;
687 prs_copy_data_in(&auth_info, (char *)request.data, request.length);
689 DEBUG(5, ("NTLMSSP Negotiate:\n"));
690 dump_data(5, (const char *)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),
724 auth_len);
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.
747 if(auth_len != 0) {
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;
754 prs_mem_free(&auth_info);
755 return NT_STATUS_OK;
758 /*******************************************************************
759 Creates a DCE/RPC bind authentication response.
760 This is the packet that is sent back to the server once we
761 have received a BIND-ACK, to finish the third leg of
762 the authentication handshake.
763 ********************************************************************/
765 static NTSTATUS create_rpc_bind_resp(struct cli_state *cli,
766 uint32 rpc_call_id,
767 prs_struct *rpc_out)
769 NTSTATUS nt_status;
770 RPC_HDR hdr;
771 RPC_HDR_AUTHA hdr_autha;
772 DATA_BLOB ntlmssp_null_response = data_blob(NULL, 0);
773 DATA_BLOB ntlmssp_reply;
774 int auth_type, auth_level;
776 /* The response is picked up from the internal cache,
777 where it was placed by the rpc_auth_pipe() code */
778 nt_status = ntlmssp_client_update(cli->ntlmssp_pipe_state,
779 ntlmssp_null_response,
780 &ntlmssp_reply);
782 if (!NT_STATUS_EQUAL(nt_status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
783 return nt_status;
786 /* Create the request RPC_HDR */
787 init_rpc_hdr(&hdr, RPC_BINDRESP, 0x0, rpc_call_id,
788 RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN + ntlmssp_reply.length,
789 ntlmssp_reply.length );
791 /* Marshall it. */
792 if(!smb_io_rpc_hdr("hdr", &hdr, rpc_out, 0)) {
793 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR.\n"));
794 data_blob_free(&ntlmssp_reply);
795 return NT_STATUS_NO_MEMORY;
798 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level);
800 /* Create the request RPC_HDR_AUTHA */
801 init_rpc_hdr_autha(&hdr_autha, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN,
802 auth_type, auth_level, 0x00);
804 if(!smb_io_rpc_hdr_autha("hdr_autha", &hdr_autha, rpc_out, 0)) {
805 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR_AUTHA.\n"));
806 data_blob_free(&ntlmssp_reply);
807 return NT_STATUS_NO_MEMORY;
811 * Append the auth data to the outgoing buffer.
814 if(!prs_copy_data_in(rpc_out, (char *)ntlmssp_reply.data, ntlmssp_reply.length)) {
815 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n"));
816 data_blob_free(&ntlmssp_reply);
817 return NT_STATUS_NO_MEMORY;
820 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
821 nt_status = ntlmssp_client_sign_init(cli->ntlmssp_pipe_state);
823 if (!NT_STATUS_IS_OK(nt_status)) {
824 return nt_status;
828 data_blob_free(&ntlmssp_reply);
829 return NT_STATUS_OK;
833 /*******************************************************************
834 Creates a DCE/RPC request.
835 ********************************************************************/
837 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)
839 uint32 alloc_hint;
840 RPC_HDR hdr;
841 RPC_HDR_REQ hdr_req;
842 uint32 callid = oldid ? oldid : get_rpc_call_id();
844 DEBUG(5,("create_rpc_request: opnum: 0x%x data_len: 0x%x\n", op_num, data_len));
846 /* create the rpc header RPC_HDR */
847 init_rpc_hdr(&hdr, RPC_REQUEST, flags,
848 callid, data_len, auth_len);
851 * The alloc hint should be the amount of data, not including
852 * RPC headers & footers.
855 if (auth_len != 0)
856 alloc_hint = data_len - RPC_HEADER_LEN - RPC_HDR_AUTH_LEN - auth_len;
857 else
858 alloc_hint = data_len - RPC_HEADER_LEN;
860 DEBUG(10,("create_rpc_request: data_len: %x auth_len: %x alloc_hint: %x\n",
861 data_len, auth_len, alloc_hint));
863 /* Create the rpc request RPC_HDR_REQ */
864 init_rpc_hdr_req(&hdr_req, alloc_hint, op_num);
866 /* stream-time... */
867 if(!smb_io_rpc_hdr("hdr ", &hdr, rpc_out, 0))
868 return 0;
870 if(!smb_io_rpc_hdr_req("hdr_req", &hdr_req, rpc_out, 0))
871 return 0;
873 if (prs_offset(rpc_out) != RPC_HEADER_LEN + RPC_HDR_REQ_LEN)
874 return 0;
876 return callid;
879 /*******************************************************************
880 Puts an auth header into an rpc request.
881 ********************************************************************/
883 static BOOL create_auth_hdr(prs_struct *outgoing_packet,
884 int auth_type,
885 int auth_level, int padding)
887 RPC_HDR_AUTH hdr_auth;
889 init_rpc_hdr_auth(&hdr_auth, auth_type, auth_level,
890 padding, 1);
891 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth,
892 outgoing_packet, 0)) {
893 DEBUG(0,("create_auth_hdr:Failed to marshal RPC_HDR_AUTH.\n"));
894 return False;
896 return True;
900 * Send a request on an RPC pipe and get a response.
902 * @param data NDR contents of the request to be sent.
903 * @param rdata Unparsed NDR response data.
906 BOOL rpc_api_pipe_req(struct cli_state *cli, uint8 op_num,
907 prs_struct *data, prs_struct *rdata)
909 uint32 auth_len, real_auth_len, auth_hdr_len, max_data, data_left, data_sent;
910 NTSTATUS nt_status;
911 BOOL ret = False;
912 uint32 callid = 0;
913 fstring dump_name;
915 auth_len = 0;
916 real_auth_len = 0;
917 auth_hdr_len = 0;
919 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
920 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
921 auth_len = RPC_AUTH_NTLMSSP_CHK_LEN;
923 if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
924 auth_len = RPC_AUTH_NETSEC_CHK_LEN;
926 auth_hdr_len = RPC_HDR_AUTH_LEN;
930 * calc how much actual data we can send in a PDU fragment
932 max_data = cli->max_xmit_frag - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
933 auth_hdr_len - auth_len - 8;
935 for (data_left = prs_offset(data), data_sent = 0; data_left > 0;) {
936 prs_struct outgoing_packet;
937 prs_struct sec_blob;
938 uint32 data_len, send_size;
939 uint8 flags = 0;
940 uint32 auth_padding = 0;
941 RPC_AUTH_NETSEC_CHK verf;
942 DATA_BLOB sign_blob;
945 * how much will we send this time
947 send_size = MIN(data_left, max_data);
949 if (!prs_init(&sec_blob, send_size, /* will need at least this much */
950 cli->mem_ctx, MARSHALL)) {
951 DEBUG(0,("Could not malloc %u bytes",
952 send_size+auth_padding));
953 return False;
956 if(!prs_append_some_prs_data(&sec_blob, data,
957 data_sent, send_size)) {
958 DEBUG(0,("Failed to append data to netsec blob\n"));
959 prs_mem_free(&sec_blob);
960 return False;
964 * NT expects the data that is sealed to be 8-byte
965 * aligned. The padding must be encrypted as well and
966 * taken into account when generating the
967 * authentication verifier. The amount of padding must
968 * be stored in the auth header.
971 if (cli->pipe_auth_flags) {
972 size_t data_and_padding_size;
973 int auth_type;
974 int auth_level;
975 prs_align_uint64(&sec_blob);
977 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level);
979 data_and_padding_size = prs_offset(&sec_blob);
980 auth_padding = data_and_padding_size - send_size;
982 /* insert the auth header */
984 if(!create_auth_hdr(&sec_blob, auth_type, auth_level, auth_padding)) {
985 prs_mem_free(&sec_blob);
986 return False;
989 /* create an NTLMSSP signature */
990 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
992 * Seal the outgoing data if requested.
994 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) {
996 nt_status = ntlmssp_client_seal_packet(cli->ntlmssp_pipe_state,
997 (unsigned char*)prs_data_p(&sec_blob),
998 data_and_padding_size,
999 &sign_blob);
1000 if (!NT_STATUS_IS_OK(nt_status)) {
1001 prs_mem_free(&sec_blob);
1002 return False;
1005 else if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
1007 nt_status = ntlmssp_client_sign_packet(cli->ntlmssp_pipe_state,
1008 (unsigned char*)prs_data_p(&sec_blob),
1009 data_and_padding_size, &sign_blob);
1010 if (!NT_STATUS_IS_OK(nt_status)) {
1011 prs_mem_free(&sec_blob);
1012 return False;
1017 /* write auth footer onto the packet */
1018 real_auth_len = sign_blob.length;
1020 prs_copy_data_in(&sec_blob, (char *)sign_blob.data, sign_blob.length);
1021 data_blob_free(&sign_blob);
1024 else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
1025 static const uchar netsec_sig[8] = NETSEC_SIGNATURE;
1026 static const uchar nullbytes[8] = { 0,0,0,0,0,0,0,0 };
1027 size_t parse_offset_marker;
1028 DEBUG(10,("SCHANNEL seq_num=%d\n", cli->auth_info.seq_num));
1030 init_rpc_auth_netsec_chk(&verf, netsec_sig, nullbytes,
1031 nullbytes, nullbytes);
1033 netsec_encode(&cli->auth_info,
1034 cli->pipe_auth_flags,
1035 SENDER_IS_INITIATOR,
1036 &verf,
1037 prs_data_p(&sec_blob),
1038 data_and_padding_size);
1040 cli->auth_info.seq_num++;
1042 /* write auth footer onto the packet */
1044 parse_offset_marker = prs_offset(&sec_blob);
1045 if (!smb_io_rpc_auth_netsec_chk("", &verf,
1046 &sec_blob, 0)) {
1047 prs_mem_free(&sec_blob);
1048 return False;
1050 real_auth_len = prs_offset(&sec_blob) - parse_offset_marker;
1054 data_len = RPC_HEADER_LEN + RPC_HDR_REQ_LEN + prs_offset(&sec_blob);
1057 * Malloc parse struct to hold it (and enough for alignments).
1059 if(!prs_init(&outgoing_packet, data_len + 8,
1060 cli->mem_ctx, MARSHALL)) {
1061 DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len ));
1062 return False;
1065 if (data_left == prs_offset(data))
1066 flags |= RPC_FLG_FIRST;
1068 if (data_left <= max_data)
1069 flags |= RPC_FLG_LAST;
1071 * Write out the RPC header and the request header.
1073 if(!(callid = create_rpc_request(&outgoing_packet, op_num,
1074 data_len, real_auth_len, flags,
1075 callid, data_left))) {
1076 DEBUG(0,("rpc_api_pipe_req: Failed to create RPC request.\n"));
1077 prs_mem_free(&outgoing_packet);
1078 prs_mem_free(&sec_blob);
1079 return False;
1082 prs_append_prs_data(&outgoing_packet, &sec_blob);
1083 prs_mem_free(&sec_blob);
1085 DEBUG(100,("data_len: %x data_calc_len: %x\n", data_len,
1086 prs_offset(&outgoing_packet)));
1088 if (flags & RPC_FLG_LAST)
1089 ret = rpc_api_pipe(cli, &outgoing_packet,
1090 rdata, RPC_RESPONSE);
1091 else {
1092 cli_write(cli, cli->nt_pipe_fnum, 0x0008,
1093 prs_data_p(&outgoing_packet),
1094 data_sent, data_len);
1096 prs_mem_free(&outgoing_packet);
1097 data_sent += send_size;
1098 data_left -= send_size;
1100 /* Also capture received data */
1101 slprintf(dump_name, sizeof(dump_name) - 1, "reply_%s",
1102 cli_pipe_get_name(cli));
1103 prs_dump(dump_name, op_num, rdata);
1105 return ret;
1108 /****************************************************************************
1109 Set the handle state.
1110 ****************************************************************************/
1112 static BOOL rpc_pipe_set_hnd_state(struct cli_state *cli, const char *pipe_name, uint16 device_state)
1114 BOOL state_set = False;
1115 char param[2];
1116 uint16 setup[2]; /* only need 2 uint16 setup parameters */
1117 char *rparam = NULL;
1118 char *rdata = NULL;
1119 uint32 rparam_len, rdata_len;
1121 if (pipe_name == NULL)
1122 return False;
1124 DEBUG(5,("Set Handle state Pipe[%x]: %s - device state:%x\n",
1125 cli->nt_pipe_fnum, pipe_name, device_state));
1127 /* create parameters: device state */
1128 SSVAL(param, 0, device_state);
1130 /* create setup parameters. */
1131 setup[0] = 0x0001;
1132 setup[1] = cli->nt_pipe_fnum; /* pipe file handle. got this from an SMBOpenX. */
1134 /* send the data on \PIPE\ */
1135 if (cli_api_pipe(cli, "\\PIPE\\",
1136 setup, 2, 0, /* setup, length, max */
1137 param, 2, 0, /* param, length, max */
1138 NULL, 0, 1024, /* data, length, max */
1139 &rparam, &rparam_len, /* return param, length */
1140 &rdata, &rdata_len)) /* return data, length */
1142 DEBUG(5, ("Set Handle state: return OK\n"));
1143 state_set = True;
1146 SAFE_FREE(rparam);
1147 SAFE_FREE(rdata);
1149 return state_set;
1152 /****************************************************************************
1153 check the rpc bind acknowledge response
1154 ****************************************************************************/
1156 int get_pipe_index( const char *pipe_name )
1158 int pipe_idx = 0;
1160 while (pipe_names[pipe_idx].client_pipe != NULL) {
1161 if (strequal(pipe_name, pipe_names[pipe_idx].client_pipe ))
1162 return pipe_idx;
1163 pipe_idx++;
1166 return -1;
1170 /****************************************************************************
1171 check the rpc bind acknowledge response
1172 ****************************************************************************/
1174 const char* get_pipe_name_from_index( const int pipe_index )
1177 if ( (pipe_index < 0) || (pipe_index >= PI_MAX_PIPES) )
1178 return NULL;
1180 return pipe_names[pipe_index].client_pipe;
1183 /****************************************************************************
1184 Check to see if this pipe index points to one of
1185 the pipes only supported by Win2k
1186 ****************************************************************************/
1188 BOOL is_win2k_pipe( const int pipe_idx )
1190 switch ( pipe_idx )
1192 case PI_LSARPC_DS:
1193 return True;
1196 return False;
1199 /****************************************************************************
1200 check the rpc bind acknowledge response
1201 ****************************************************************************/
1203 static BOOL valid_pipe_name(const int pipe_idx, RPC_IFACE *abstract, RPC_IFACE *transfer)
1205 if ( pipe_idx >= PI_MAX_PIPES ) {
1206 DEBUG(0,("valid_pipe_name: Programmer error! Invalid pipe index [%d]\n",
1207 pipe_idx));
1208 return False;
1211 DEBUG(5,("Bind Abstract Syntax: "));
1212 dump_data(5, (char*)&(pipe_names[pipe_idx].abstr_syntax),
1213 sizeof(pipe_names[pipe_idx].abstr_syntax));
1214 DEBUG(5,("Bind Transfer Syntax: "));
1215 dump_data(5, (char*)&(pipe_names[pipe_idx].trans_syntax),
1216 sizeof(pipe_names[pipe_idx].trans_syntax));
1218 /* copy the required syntaxes out so we can do the right bind */
1220 *transfer = pipe_names[pipe_idx].trans_syntax;
1221 *abstract = pipe_names[pipe_idx].abstr_syntax;
1223 return True;
1226 /****************************************************************************
1227 check the rpc bind acknowledge response
1228 ****************************************************************************/
1230 static BOOL check_bind_response(RPC_HDR_BA *hdr_ba, const int pipe_idx, RPC_IFACE *transfer)
1232 int i = 0;
1234 if ( hdr_ba->addr.len <= 0)
1235 return False;
1237 if ( !strequal(hdr_ba->addr.str, pipe_names[pipe_idx].server_pipe ))
1239 DEBUG(4,("bind_rpc_pipe: pipe_name %s != expected pipe %s. oh well!\n",
1240 pipe_names[i].server_pipe ,hdr_ba->addr.str));
1241 return False;
1244 DEBUG(5,("bind_rpc_pipe: server pipe_name found: %s\n", pipe_names[i].server_pipe ));
1246 if (pipe_names[pipe_idx].server_pipe == NULL) {
1247 DEBUG(2,("bind_rpc_pipe: pipe name %s unsupported\n", hdr_ba->addr.str));
1248 return False;
1251 /* check the transfer syntax */
1252 if ((hdr_ba->transfer.version != transfer->version) ||
1253 (memcmp(&hdr_ba->transfer.uuid, &transfer->uuid, sizeof(transfer->uuid)) !=0)) {
1254 DEBUG(2,("bind_rpc_pipe: transfer syntax differs\n"));
1255 return False;
1258 /* lkclXXXX only accept one result: check the result(s) */
1259 if (hdr_ba->res.num_results != 0x1 || hdr_ba->res.result != 0) {
1260 DEBUG(2,("bind_rpc_pipe: bind denied results: %d reason: %x\n",
1261 hdr_ba->res.num_results, hdr_ba->res.reason));
1264 DEBUG(5,("bind_rpc_pipe: accepted!\n"));
1265 return True;
1268 /****************************************************************************
1269 Create and send the third packet in an RPC auth.
1270 ****************************************************************************/
1272 static BOOL rpc_send_auth_reply(struct cli_state *cli, prs_struct *rdata, uint32 rpc_call_id)
1274 prs_struct rpc_out;
1275 ssize_t ret;
1277 prs_init(&rpc_out, RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN, /* need at least this much */
1278 cli->mem_ctx, MARSHALL);
1280 create_rpc_bind_resp(cli, rpc_call_id,
1281 &rpc_out);
1283 if ((ret = cli_write(cli, cli->nt_pipe_fnum, 0x8, prs_data_p(&rpc_out),
1284 0, (size_t)prs_offset(&rpc_out))) != (ssize_t)prs_offset(&rpc_out)) {
1285 DEBUG(0,("rpc_send_auth_reply: cli_write failed. Return was %d\n", (int)ret));
1286 prs_mem_free(&rpc_out);
1287 return False;
1290 prs_mem_free(&rpc_out);
1291 return True;
1294 /****************************************************************************
1295 Do an rpc bind.
1296 ****************************************************************************/
1298 static BOOL rpc_pipe_bind(struct cli_state *cli, int pipe_idx, const char *my_name)
1300 RPC_IFACE abstract;
1301 RPC_IFACE transfer;
1302 prs_struct rpc_out;
1303 prs_struct rdata;
1304 uint32 rpc_call_id;
1305 char buffer[MAX_PDU_FRAG_LEN];
1307 if ( (pipe_idx < 0) || (pipe_idx >= PI_MAX_PIPES) )
1308 return False;
1310 DEBUG(5,("Bind RPC Pipe[%x]: %s\n", cli->nt_pipe_fnum, pipe_names[pipe_idx].client_pipe));
1312 if (!valid_pipe_name(pipe_idx, &abstract, &transfer))
1313 return False;
1315 prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL);
1318 * Use the MAX_PDU_FRAG_LEN buffer to store the bind request.
1321 prs_give_memory( &rpc_out, buffer, sizeof(buffer), False);
1323 rpc_call_id = get_rpc_call_id();
1325 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) {
1326 NTSTATUS nt_status;
1327 fstring password;
1329 DEBUG(5, ("NTLMSSP authenticated pipe selected\n"));
1331 nt_status = ntlmssp_client_start(&cli->ntlmssp_pipe_state);
1333 if (!NT_STATUS_IS_OK(nt_status))
1334 return False;
1336 nt_status = ntlmssp_set_username(cli->ntlmssp_pipe_state,
1337 cli->user_name);
1338 if (!NT_STATUS_IS_OK(nt_status))
1339 return False;
1341 nt_status = ntlmssp_set_domain(cli->ntlmssp_pipe_state,
1342 cli->domain);
1343 if (!NT_STATUS_IS_OK(nt_status))
1344 return False;
1346 pwd_get_cleartext(&cli->pwd, password);
1347 nt_status = ntlmssp_set_password(cli->ntlmssp_pipe_state,
1348 password);
1349 if (!NT_STATUS_IS_OK(nt_status))
1350 return False;
1352 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) {
1353 cli->ntlmssp_pipe_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN;
1356 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) {
1357 cli->ntlmssp_pipe_state->neg_flags |= NTLMSSP_NEGOTIATE_SEAL;
1359 } else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) {
1360 cli->auth_info.seq_num = 0;
1363 /* Marshall the outgoing data. */
1364 create_rpc_bind_req(cli, &rpc_out, rpc_call_id,
1365 &abstract, &transfer,
1366 global_myname(), cli->domain);
1368 /* Initialize the incoming data struct. */
1369 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
1371 /* send data on \PIPE\. receive a response */
1372 if (rpc_api_pipe(cli, &rpc_out, &rdata, RPC_BINDACK)) {
1373 RPC_HDR_BA hdr_ba;
1375 DEBUG(5, ("rpc_pipe_bind: rpc_api_pipe returned OK.\n"));
1377 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &rdata, 0)) {
1378 DEBUG(0,("rpc_pipe_bind: Failed to unmarshall RPC_HDR_BA.\n"));
1379 prs_mem_free(&rdata);
1380 return False;
1383 if(!check_bind_response(&hdr_ba, pipe_idx, &transfer)) {
1384 DEBUG(2,("rpc_pipe_bind: check_bind_response failed.\n"));
1385 prs_mem_free(&rdata);
1386 return False;
1389 cli->max_xmit_frag = hdr_ba.bba.max_tsize;
1390 cli->max_recv_frag = hdr_ba.bba.max_rsize;
1393 * If we're doing NTLMSSP auth we need to send a reply to
1394 * the bind-ack to complete the 3-way challenge response
1395 * handshake.
1398 if ((cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP)
1399 && !rpc_send_auth_reply(cli, &rdata, rpc_call_id)) {
1400 DEBUG(0,("rpc_pipe_bind: rpc_send_auth_reply failed.\n"));
1401 prs_mem_free(&rdata);
1402 return False;
1404 prs_mem_free(&rdata);
1405 return True;
1408 return False;
1411 /****************************************************************************
1412 Open a session.
1413 ****************************************************************************/
1415 BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
1417 int fnum;
1419 /* At the moment we can't have more than one pipe open over
1420 a cli connection. )-: */
1422 SMB_ASSERT(cli->nt_pipe_fnum == 0);
1424 /* The pipe index must fall within our array */
1426 SMB_ASSERT((pipe_idx >= 0) && (pipe_idx < PI_MAX_PIPES));
1428 if (cli->capabilities & CAP_NT_SMBS) {
1429 if ((fnum = cli_nt_create(cli, &pipe_names[pipe_idx].client_pipe[5], DESIRED_ACCESS_PIPE)) == -1) {
1430 DEBUG(0,("cli_nt_session_open: cli_nt_create failed on pipe %s to machine %s. Error was %s\n",
1431 &pipe_names[pipe_idx].client_pipe[5], cli->desthost, cli_errstr(cli)));
1432 return False;
1435 cli->nt_pipe_fnum = (uint16)fnum;
1436 } else {
1437 if ((fnum = cli_open(cli, pipe_names[pipe_idx].client_pipe, O_CREAT|O_RDWR, DENY_NONE)) == -1) {
1438 DEBUG(0,("cli_nt_session_open: cli_open failed on pipe %s to machine %s. Error was %s\n",
1439 pipe_names[pipe_idx].client_pipe, cli->desthost, cli_errstr(cli)));
1440 return False;
1443 cli->nt_pipe_fnum = (uint16)fnum;
1445 /**************** Set Named Pipe State ***************/
1446 if (!rpc_pipe_set_hnd_state(cli, pipe_names[pipe_idx].client_pipe, 0x4300)) {
1447 DEBUG(0,("cli_nt_session_open: pipe hnd state failed. Error was %s\n",
1448 cli_errstr(cli)));
1449 cli_close(cli, cli->nt_pipe_fnum);
1450 return False;
1454 /******************* bind request on pipe *****************/
1456 if (!rpc_pipe_bind(cli, pipe_idx, global_myname())) {
1457 DEBUG(2,("cli_nt_session_open: rpc bind to %s failed\n",
1458 get_pipe_name_from_index(pipe_idx)));
1459 cli_close(cli, cli->nt_pipe_fnum);
1460 return False;
1464 * Setup the remote server name prefixed by \ and the machine account name.
1467 fstrcpy(cli->srv_name_slash, "\\\\");
1468 fstrcat(cli->srv_name_slash, cli->desthost);
1469 strupper_m(cli->srv_name_slash);
1471 fstrcpy(cli->clnt_name_slash, "\\\\");
1472 fstrcat(cli->clnt_name_slash, global_myname());
1473 strupper_m(cli->clnt_name_slash);
1475 fstrcpy(cli->mach_acct, global_myname());
1476 fstrcat(cli->mach_acct, "$");
1477 strupper_m(cli->mach_acct);
1479 /* Remember which pipe we're talking to */
1480 fstrcpy(cli->pipe_name, pipe_names[pipe_idx].client_pipe);
1482 return True;
1486 /****************************************************************************
1487 Open a session to the NETLOGON pipe using schannel.
1489 (Assumes that the netlogon pipe is already open)
1490 ****************************************************************************/
1492 NTSTATUS cli_nt_establish_netlogon(struct cli_state *cli, int sec_chan,
1493 const uchar trust_password[16])
1495 NTSTATUS result;
1496 /* The 7 here seems to be required to get Win2k not to downgrade us
1497 to NT4. Actually, anything other than 1ff would seem to do... */
1498 uint32 neg_flags = 0x000701ff;
1499 int fnum;
1501 cli_nt_netlogon_netsec_session_close(cli);
1503 if (lp_client_schannel() != False)
1504 neg_flags |= NETLOGON_NEG_SCHANNEL;
1506 result = cli_nt_setup_creds(cli, sec_chan, trust_password,
1507 &neg_flags, 2);
1509 if (!NT_STATUS_IS_OK(result)) {
1510 cli_nt_session_close(cli);
1511 return result;
1514 if ((lp_client_schannel() == True) &&
1515 ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
1517 DEBUG(3, ("Server did not offer schannel\n"));
1518 cli_nt_session_close(cli);
1519 return NT_STATUS_UNSUCCESSFUL;
1522 if ((lp_client_schannel() == False) ||
1523 ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
1524 return NT_STATUS_OK;
1526 /* keep the existing connection to NETLOGON open */
1530 /* Server offered schannel, so try it. */
1532 memcpy(cli->auth_info.sess_key, cli->sess_key,
1533 sizeof(cli->auth_info.sess_key));
1535 cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum;
1537 cli->pipe_auth_flags = AUTH_PIPE_NETSEC;
1538 cli->pipe_auth_flags |= AUTH_PIPE_SIGN;
1539 cli->pipe_auth_flags |= AUTH_PIPE_SEAL;
1541 if (cli->capabilities & CAP_NT_SMBS) {
1543 /* The secure channel connection must be opened on the same
1544 session (TCP connection) as the one the challenge was
1545 requested from. */
1546 if ((fnum = cli_nt_create(cli, PIPE_NETLOGON_PLAIN,
1547 DESIRED_ACCESS_PIPE)) == -1) {
1548 DEBUG(0,("cli_nt_create failed to %s machine %s. "
1549 "Error was %s\n",
1550 PIPE_NETLOGON, cli->desthost,
1551 cli_errstr(cli)));
1552 return NT_STATUS_UNSUCCESSFUL;
1555 cli->nt_pipe_fnum = (uint16)fnum;
1556 } else {
1557 if ((fnum = cli_open(cli, PIPE_NETLOGON,
1558 O_CREAT|O_RDWR, DENY_NONE)) == -1) {
1559 DEBUG(0,("cli_open failed on pipe %s to machine %s. "
1560 "Error was %s\n",
1561 PIPE_NETLOGON, cli->desthost,
1562 cli_errstr(cli)));
1563 return NT_STATUS_UNSUCCESSFUL;
1566 cli->nt_pipe_fnum = (uint16)fnum;
1568 /**************** Set Named Pipe State ***************/
1569 if (!rpc_pipe_set_hnd_state(cli, PIPE_NETLOGON, 0x4300)) {
1570 DEBUG(0,("Pipe hnd state failed. Error was %s\n",
1571 cli_errstr(cli)));
1572 cli_close(cli, cli->nt_pipe_fnum);
1573 return NT_STATUS_UNSUCCESSFUL;
1577 if (!rpc_pipe_bind(cli, PI_NETLOGON, global_myname())) {
1578 DEBUG(2,("rpc bind to %s failed\n", PIPE_NETLOGON));
1579 cli_close(cli, cli->nt_pipe_fnum);
1580 return NT_STATUS_UNSUCCESSFUL;
1583 return NT_STATUS_OK;
1587 NTSTATUS cli_nt_setup_netsec(struct cli_state *cli, int sec_chan,
1588 const uchar trust_password[16])
1590 NTSTATUS result;
1591 /* The 7 here seems to be required to get Win2k not to downgrade us
1592 to NT4. Actually, anything other than 1ff would seem to do... */
1593 uint32 neg_flags = 0x000701ff;
1594 cli->pipe_auth_flags = 0;
1596 if (lp_client_schannel() == False) {
1597 return NT_STATUS_OK;
1600 if (!cli_nt_session_open(cli, PI_NETLOGON)) {
1601 DEBUG(0, ("Could not initialise %s\n",
1602 get_pipe_name_from_index(PI_NETLOGON)));
1603 return NT_STATUS_UNSUCCESSFUL;
1606 if (lp_client_schannel() != False)
1607 neg_flags |= NETLOGON_NEG_SCHANNEL;
1609 neg_flags |= NETLOGON_NEG_SCHANNEL;
1611 result = cli_nt_setup_creds(cli, sec_chan, trust_password,
1612 &neg_flags, 2);
1614 if (!(neg_flags & NETLOGON_NEG_SCHANNEL)
1615 && lp_client_schannel() == True) {
1616 DEBUG(1, ("Could not negotiate SCHANNEL with the DC!\n"));
1617 result = NT_STATUS_UNSUCCESSFUL;
1620 if (!NT_STATUS_IS_OK(result)) {
1621 ZERO_STRUCT(cli->auth_info.sess_key);
1622 ZERO_STRUCT(cli->sess_key);
1623 cli->pipe_auth_flags = 0;
1624 cli_nt_session_close(cli);
1625 return result;
1628 memcpy(cli->auth_info.sess_key, cli->sess_key,
1629 sizeof(cli->auth_info.sess_key));
1631 cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum;
1632 cli->nt_pipe_fnum = 0;
1634 /* doing schannel, not per-user auth */
1635 cli->pipe_auth_flags = AUTH_PIPE_NETSEC | AUTH_PIPE_SIGN | AUTH_PIPE_SEAL;
1637 return NT_STATUS_OK;
1640 const char *cli_pipe_get_name(struct cli_state *cli)
1642 return cli->pipe_name;