Allow multiple fragment RPC's to be sent.
[Samba/gebeck_regimport.git] / source3 / rpc_client / cli_pipe.c
blobadfdfe986e5e6aba0500303f02221b9d2b78cee4
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 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "includes.h"
26 #undef DBGC_CLASS
27 #define DBGC_CLASS DBGC_RPC_CLI
29 extern struct pipe_id_info pipe_names[];
30 extern fstring global_myworkgroup;
31 extern pstring global_myname;
33 /********************************************************************
34 Rpc pipe call id.
35 ********************************************************************/
37 static uint32 get_rpc_call_id(void)
39 static uint32 call_id = 0;
40 return ++call_id;
43 /*******************************************************************
44 Use SMBreadX to get rest of one fragment's worth of rpc data.
45 ********************************************************************/
47 static BOOL rpc_read(struct cli_state *cli, prs_struct *rdata, uint32 data_to_read, uint32 *rdata_offset)
49 size_t size = (size_t)cli->max_recv_frag;
50 int stream_offset = 0;
51 int num_read;
52 char *pdata;
53 int extra_data_size = ((int)*rdata_offset) + ((int)data_to_read) - (int)prs_data_size(rdata);
55 DEBUG(5,("rpc_read: data_to_read: %u rdata offset: %u extra_data_size: %d\n",
56 (int)data_to_read, (unsigned int)*rdata_offset, extra_data_size));
59 * Grow the buffer if needed to accommodate the data to be read.
62 if (extra_data_size > 0) {
63 if(!prs_force_grow(rdata, (uint32)extra_data_size)) {
64 DEBUG(0,("rpc_read: Failed to grow parse struct by %d bytes.\n", extra_data_size ));
65 return False;
67 DEBUG(5,("rpc_read: grew buffer by %d bytes to %u\n", extra_data_size, prs_data_size(rdata) ));
70 pdata = prs_data_p(rdata) + *rdata_offset;
72 do /* read data using SMBreadX */
74 uint32 ecode;
75 uint8 eclass;
77 if (size > (size_t)data_to_read)
78 size = (size_t)data_to_read;
80 num_read = (int)cli_read(cli, cli->nt_pipe_fnum, pdata, (off_t)stream_offset, size);
82 DEBUG(5,("rpc_read: num_read = %d, read offset: %d, to read: %d\n",
83 num_read, stream_offset, data_to_read));
85 if (cli_is_dos_error(cli)) {
86 cli_dos_error(cli, &eclass, &ecode);
87 if (eclass != ERRDOS && ecode != ERRmoredata) {
88 DEBUG(0,("rpc_read: Error %d/%u in cli_read\n",
89 eclass, (unsigned int)ecode));
90 return False;
94 data_to_read -= num_read;
95 stream_offset += num_read;
96 pdata += num_read;
98 } while (num_read > 0 && data_to_read > 0);
99 /* && err == (0x80000000 | STATUS_BUFFER_OVERFLOW)); */
102 * Update the current offset into rdata by the amount read.
104 *rdata_offset += stream_offset;
106 return True;
109 /****************************************************************************
110 Checks the header. This will set the endian bit in the rdata prs_struct. JRA.
111 ****************************************************************************/
113 static BOOL rpc_check_hdr(prs_struct *rdata, RPC_HDR *rhdr,
114 BOOL *first, BOOL *last, uint32 *len)
116 DEBUG(5,("rpc_check_hdr: rdata->data_size = %u\n", (uint32)prs_data_size(rdata) ));
118 /* Next call sets endian bit. */
120 if(!smb_io_rpc_hdr("rpc_hdr ", rhdr, rdata, 0)) {
121 DEBUG(0,("rpc_check_hdr: Failed to unmarshall RPC_HDR.\n"));
122 return False;
125 if (prs_offset(rdata) != RPC_HEADER_LEN) {
126 DEBUG(0,("rpc_check_hdr: offset was %x, should be %x.\n", prs_offset(rdata), RPC_HEADER_LEN));
127 return False;
130 (*first) = ((rhdr->flags & RPC_FLG_FIRST) != 0);
131 (*last) = ((rhdr->flags & RPC_FLG_LAST ) != 0);
132 (*len) = (uint32)rhdr->frag_len - prs_data_size(rdata);
134 return (rhdr->pkt_type != RPC_FAULT);
137 static void NTLMSSPcalc_ap( struct cli_state *cli, unsigned char *data, uint32 len)
139 unsigned char *hash = cli->ntlmssp_hash;
140 unsigned char index_i = hash[256];
141 unsigned char index_j = hash[257];
142 int ind;
144 for( ind = 0; ind < len; ind++) {
145 unsigned char tc;
146 unsigned char t;
148 index_i++;
149 index_j += hash[index_i];
151 tc = hash[index_i];
152 hash[index_i] = hash[index_j];
153 hash[index_j] = tc;
155 t = hash[index_i] + hash[index_j];
156 data[ind] = data[ind] ^ hash[t];
159 hash[256] = index_i;
160 hash[257] = index_j;
163 /****************************************************************************
164 Verify data on an rpc pipe.
165 The VERIFY & SEAL code is only executed on packets that look like this :
167 Request/Response PDU's look like the following...
169 |<------------------PDU len----------------------------------------------->|
170 |<-HDR_LEN-->|<--REQ LEN------>|.............|<-AUTH_HDRLEN->|<-AUTH_LEN-->|
172 +------------+-----------------+-------------+---------------+-------------+
173 | RPC HEADER | REQ/RESP HEADER | DATA ...... | AUTH_HDR | AUTH DATA |
174 +------------+-----------------+-------------+---------------+-------------+
176 Never on bind requests/responses.
177 ****************************************************************************/
179 static BOOL rpc_auth_pipe(struct cli_state *cli, prs_struct *rdata, int len, int auth_len)
182 * The following is that length of the data we must sign or seal.
183 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
184 * preceeding the auth_data.
187 int data_len = len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len;
190 * The start of the data to sign/seal is just after the RPC headers.
192 char *reply_data = prs_data_p(rdata) + RPC_HEADER_LEN + RPC_HDR_REQ_LEN;
194 BOOL auth_verify = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SIGN) != 0);
195 BOOL auth_seal = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SEAL) != 0);
197 DEBUG(5,("rpc_auth_pipe: len: %d auth_len: %d verify %s seal %s\n",
198 len, auth_len, BOOLSTR(auth_verify), BOOLSTR(auth_seal)));
201 * Unseal any sealed data in the PDU, not including the
202 * 8 byte auth_header or the auth_data.
205 if (auth_seal) {
206 DEBUG(10,("rpc_auth_pipe: unseal\n"));
207 dump_data(100, reply_data, data_len);
208 NTLMSSPcalc_ap(cli, (uchar*)reply_data, data_len);
209 dump_data(100, reply_data, data_len);
212 if (auth_verify || auth_seal) {
213 RPC_HDR_AUTH rhdr_auth;
214 prs_struct auth_req;
215 char data[RPC_HDR_AUTH_LEN];
217 * We set dp to be the end of the packet, minus the auth_len
218 * and the length of the header that preceeds the auth_data.
220 char *dp = prs_data_p(rdata) + len - auth_len - RPC_HDR_AUTH_LEN;
222 if(dp - prs_data_p(rdata) > prs_data_size(rdata)) {
223 DEBUG(0,("rpc_auth_pipe: auth data > data size !\n"));
224 return False;
227 memcpy(data, dp, sizeof(data));
229 prs_init(&auth_req , 0, cli->mem_ctx, UNMARSHALL);
231 /* The endianness must be preserved... JRA. */
233 prs_set_endian_data(&auth_req, rdata->bigendian_data);
235 prs_give_memory(&auth_req, data, RPC_HDR_AUTH_LEN, False);
238 * Unmarshall the 8 byte auth_header that comes before the
239 * auth data.
242 if(!smb_io_rpc_hdr_auth("hdr_auth", &rhdr_auth, &auth_req, 0)) {
243 DEBUG(0,("rpc_auth_pipe: unmarshalling RPC_HDR_AUTH failed.\n"));
244 return False;
247 if (!rpc_hdr_auth_chk(&rhdr_auth)) {
248 DEBUG(0,("rpc_auth_pipe: rpc_hdr_auth_chk failed.\n"));
249 return False;
254 * Now unseal and check the auth verifier in the auth_data at
255 * then end of the packet. The 4 bytes skipped in the unseal
256 * seem to be a buffer pointer preceeding the sealed data.
259 if (auth_verify) {
260 RPC_AUTH_NTLMSSP_CHK chk;
261 uint32 crc32;
262 prs_struct auth_verf;
263 char data[RPC_AUTH_NTLMSSP_CHK_LEN];
264 char *dp = prs_data_p(rdata) + len - auth_len;
266 if(dp - prs_data_p(rdata) > prs_data_size(rdata)) {
267 DEBUG(0,("rpc_auth_pipe: auth data > data size !\n"));
268 return False;
271 DEBUG(10,("rpc_auth_pipe: verify\n"));
272 dump_data(100, dp, auth_len);
273 NTLMSSPcalc_ap(cli, (uchar*)(dp+4), auth_len - 4);
275 memcpy(data, dp, RPC_AUTH_NTLMSSP_CHK_LEN);
276 dump_data(100, data, auth_len);
278 prs_init(&auth_verf, 0, cli->mem_ctx, UNMARSHALL);
280 /* The endinness must be preserved. JRA. */
281 prs_set_endian_data( &auth_verf, rdata->bigendian_data);
283 prs_give_memory(&auth_verf, data, RPC_AUTH_NTLMSSP_CHK_LEN, False);
285 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &chk, &auth_verf, 0)) {
286 DEBUG(0,("rpc_auth_pipe: unmarshalling RPC_AUTH_NTLMSSP_CHK failed.\n"));
287 return False;
290 crc32 = crc32_calc_buffer(reply_data, data_len);
292 if (!rpc_auth_ntlmssp_chk(&chk, crc32 , cli->ntlmssp_seq_num)) {
293 DEBUG(0,("rpc_auth_pipe: rpc_auth_ntlmssp_chk failed.\n"));
294 return False;
296 cli->ntlmssp_seq_num++;
298 return True;
302 /****************************************************************************
303 Send data on an rpc pipe, which *must* be in one fragment.
304 receive response data from an rpc pipe, which may be large...
306 Read the first fragment: unfortunately have to use SMBtrans for the first
307 bit, then SMBreadX for subsequent bits.
309 If first fragment received also wasn't the last fragment, continue
310 getting fragments until we _do_ receive the last fragment.
312 Request/Response PDU's look like the following...
314 |<------------------PDU len----------------------------------------------->|
315 |<-HDR_LEN-->|<--REQ LEN------>|.............|<-AUTH_HDRLEN->|<-AUTH_LEN-->|
317 +------------+-----------------+-------------+---------------+-------------+
318 | RPC HEADER | REQ/RESP HEADER | DATA ...... | AUTH_HDR | AUTH DATA |
319 +------------+-----------------+-------------+---------------+-------------+
321 Where the presence of the AUTH_HDR and AUTH are dependent on the
322 signing & sealing being neogitated.
324 ****************************************************************************/
326 static BOOL rpc_api_pipe(struct cli_state *cli, prs_struct *data, prs_struct *rdata)
328 uint32 len;
329 char *rparam = NULL;
330 uint32 rparam_len = 0;
331 uint16 setup[2];
332 BOOL first = True;
333 BOOL last = True;
334 RPC_HDR rhdr;
335 char *pdata = data ? prs_data_p(data) : NULL;
336 uint32 data_len = data ? prs_offset(data) : 0;
337 char *prdata = NULL;
338 uint32 rdata_len = 0;
339 uint32 current_offset = 0;
340 uint32 max_data = cli->max_xmit_frag ? cli->max_xmit_frag : 1024;
342 /* Create setup parameters - must be in native byte order. */
344 setup[0] = 0x26;
345 setup[1] = cli->nt_pipe_fnum; /* Pipe file handle. */
347 DEBUG(5,("rpc_api_pipe: fnum:%x\n", (int)cli->nt_pipe_fnum));
349 /* Send the RPC request and receive a response. For short RPC
350 calls (about 1024 bytes or so) the RPC request and response
351 appears in a SMBtrans request and response. Larger RPC
352 responses are received further on. */
354 if (!cli_api_pipe(cli, "\\PIPE\\",
355 setup, 2, 0, /* Setup, length, max */
356 NULL, 0, 0, /* Params, length, max */
357 pdata, data_len, max_data, /* data, length, max */
358 &rparam, &rparam_len, /* return params, len */
359 &prdata, &rdata_len)) /* return data, len */
361 DEBUG(0, ("cli_pipe: return critical error. Error was %s\n", cli_errstr(cli)));
362 return False;
365 /* Throw away returned params - we know we won't use them. */
367 SAFE_FREE(rparam);
369 if (prdata == NULL) {
370 DEBUG(0,("rpc_api_pipe: pipe %x failed to return data.\n",
371 (int)cli->nt_pipe_fnum));
372 return False;
376 * Give this memory as dynamically allocated to the return parse
377 * struct.
380 prs_give_memory(rdata, prdata, rdata_len, True);
381 current_offset = rdata_len;
383 /* This next call sets the endian bit correctly in rdata. */
385 if (!rpc_check_hdr(rdata, &rhdr, &first, &last, &len)) {
386 prs_mem_free(rdata);
387 return False;
390 if (rhdr.pkt_type == RPC_BINDACK) {
391 if (!last && !first) {
392 DEBUG(5,("rpc_api_pipe: bug in server (AS/U?), setting fragment first/last ON.\n"));
393 first = True;
394 last = True;
398 if (rhdr.pkt_type == RPC_RESPONSE) {
399 RPC_HDR_RESP rhdr_resp;
400 if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, rdata, 0)) {
401 DEBUG(5,("rpc_api_pipe: failed to unmarshal RPC_HDR_RESP.\n"));
402 prs_mem_free(rdata);
403 return False;
407 DEBUG(5,("rpc_api_pipe: len left: %u smbtrans read: %u\n",
408 (unsigned int)len, (unsigned int)rdata_len ));
410 /* check if data to be sent back was too large for one SMBtrans */
411 /* err status is only informational: the _real_ check is on the
412 length */
414 if (len > 0) {
415 /* || err == (0x80000000 | STATUS_BUFFER_OVERFLOW)) */
417 /* Read the remaining part of the first response fragment */
419 if (!rpc_read(cli, rdata, len, &current_offset)) {
420 prs_mem_free(rdata);
421 return False;
426 * Now we have a complete PDU, check the auth struct if any was sent.
429 if (rhdr.auth_len != 0) {
430 if(!rpc_auth_pipe(cli, rdata, rhdr.frag_len, rhdr.auth_len))
431 return False;
433 * Drop the auth footers from the current offset.
434 * We need this if there are more fragments.
435 * The auth footers consist of the auth_data and the
436 * preceeding 8 byte auth_header.
438 current_offset -= (rhdr.auth_len + RPC_HDR_AUTH_LEN);
442 * Only one rpc fragment, and it has been read.
445 if (first && last) {
446 DEBUG(6,("rpc_api_pipe: fragment first and last both set\n"));
447 return True;
451 * Read more fragments using SMBreadX until we get one with the
452 * last bit set.
455 while (!last) {
456 RPC_HDR_RESP rhdr_resp;
457 int num_read;
458 char hdr_data[RPC_HEADER_LEN+RPC_HDR_RESP_LEN];
459 prs_struct hps;
460 uint8 eclass;
461 uint32 ecode;
464 * First read the header of the next PDU.
467 prs_init(&hps, 0, cli->mem_ctx, UNMARSHALL);
468 prs_give_memory(&hps, hdr_data, sizeof(hdr_data), False);
470 num_read = cli_read(cli, cli->nt_pipe_fnum, hdr_data, 0, RPC_HEADER_LEN+RPC_HDR_RESP_LEN);
471 if (cli_is_dos_error(cli)) {
472 cli_dos_error(cli, &eclass, &ecode);
473 if (eclass != ERRDOS && ecode != ERRmoredata) {
474 DEBUG(0,("rpc_api_pipe: cli_read error : %d/%d\n", eclass, ecode));
475 return False;
479 DEBUG(5,("rpc_api_pipe: read header (size:%d)\n", num_read));
481 if (num_read != RPC_HEADER_LEN+RPC_HDR_RESP_LEN) {
482 DEBUG(0,("rpc_api_pipe: Error : requested %d bytes, got %d.\n",
483 RPC_HEADER_LEN+RPC_HDR_RESP_LEN, num_read ));
484 return False;
487 /* This call sets the endianness in hps. */
489 if (!rpc_check_hdr(&hps, &rhdr, &first, &last, &len))
490 return False;
492 /* Ensure the endianness in rdata is set correctly - must be same as hps. */
494 if (hps.bigendian_data != rdata->bigendian_data) {
495 DEBUG(0,("rpc_api_pipe: Error : Endianness changed from %s to %s\n",
496 rdata->bigendian_data ? "big" : "little",
497 hps.bigendian_data ? "big" : "little" ));
498 return False;
501 if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, &hps, 0)) {
502 DEBUG(0,("rpc_api_pipe: Error in unmarshalling RPC_HDR_RESP.\n"));
503 return False;
506 if (first) {
507 DEBUG(0,("rpc_api_pipe: secondary PDU rpc header has 'first' set !\n"));
508 return False;
512 * Now read the rest of the PDU.
515 if (!rpc_read(cli, rdata, len, &current_offset))
516 return False;
519 * Verify any authentication footer.
522 if (rhdr.auth_len != 0 ) {
523 if(!rpc_auth_pipe(cli, rdata, rhdr.frag_len, rhdr.auth_len))
524 return False;
526 * Drop the auth footers from the current offset.
527 * The auth footers consist of the auth_data and the
528 * preceeding 8 byte auth_header.
529 * We need this if there are more fragments.
531 current_offset -= (rhdr.auth_len + RPC_HDR_AUTH_LEN);
535 return True;
538 /*******************************************************************
539 creates a DCE/RPC bind request
541 - initialises the parse structure.
542 - dynamically allocates the header data structure
543 - caller is expected to free the header data structure once used.
545 ********************************************************************/
547 static BOOL create_rpc_bind_req(prs_struct *rpc_out, BOOL do_auth, uint32 rpc_call_id,
548 RPC_IFACE *abstract, RPC_IFACE *transfer,
549 char *my_name, char *domain, uint32 neg_flags)
551 RPC_HDR hdr;
552 RPC_HDR_RB hdr_rb;
553 char buffer[4096];
554 prs_struct auth_info;
555 int auth_len = 0;
557 prs_init(&auth_info, 0, prs_get_mem_context(rpc_out), MARSHALL);
559 if (do_auth) {
560 RPC_HDR_AUTH hdr_auth;
561 RPC_AUTH_VERIFIER auth_verifier;
562 RPC_AUTH_NTLMSSP_NEG ntlmssp_neg;
565 * Create the auth structs we will marshall.
568 init_rpc_hdr_auth(&hdr_auth, NTLMSSP_AUTH_TYPE, NTLMSSP_AUTH_LEVEL, 0x00, 1);
569 init_rpc_auth_verifier(&auth_verifier, "NTLMSSP", NTLMSSP_NEGOTIATE);
570 init_rpc_auth_ntlmssp_neg(&ntlmssp_neg, neg_flags, my_name, domain);
573 * Use the 4k buffer to store the auth info.
576 prs_give_memory( &auth_info, buffer, sizeof(buffer), False);
579 * Now marshall the data into the temporary parse_struct.
582 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, &auth_info, 0)) {
583 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR_AUTH.\n"));
584 return False;
587 if(!smb_io_rpc_auth_verifier("auth_verifier", &auth_verifier, &auth_info, 0)) {
588 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_AUTH_VERIFIER.\n"));
589 return False;
592 if(!smb_io_rpc_auth_ntlmssp_neg("ntlmssp_neg", &ntlmssp_neg, &auth_info, 0)) {
593 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_AUTH_NTLMSSP_NEG.\n"));
594 return False;
597 /* Auth len in the rpc header doesn't include auth_header. */
598 auth_len = prs_offset(&auth_info) - RPC_HDR_AUTH_LEN;
601 /* create the request RPC_HDR */
602 init_rpc_hdr(&hdr, RPC_BIND, 0x3, rpc_call_id,
603 RPC_HEADER_LEN + RPC_HDR_RB_LEN + prs_offset(&auth_info),
604 auth_len);
606 if(!smb_io_rpc_hdr("hdr" , &hdr, rpc_out, 0)) {
607 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR.\n"));
608 return False;
611 /* create the bind request RPC_HDR_RB */
612 init_rpc_hdr_rb(&hdr_rb, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN, 0x0,
613 0x1, 0x0, 0x1, abstract, transfer);
615 /* Marshall the bind request data */
616 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_out, 0)) {
617 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR_RB.\n"));
618 return False;
622 * Grow the outgoing buffer to store any auth info.
625 if(hdr.auth_len != 0) {
626 if(!prs_append_prs_data( rpc_out, &auth_info)) {
627 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n"));
628 return False;
632 return True;
635 /*******************************************************************
636 Creates a DCE/RPC bind authentication response.
637 This is the packet that is sent back to the server once we
638 have received a BIND-ACK, to finish the third leg of
639 the authentication handshake.
640 ********************************************************************/
642 static BOOL create_rpc_bind_resp(struct pwd_info *pwd,
643 char *domain, char *user_name, char *my_name,
644 uint32 ntlmssp_cli_flgs,
645 uint32 rpc_call_id,
646 prs_struct *rpc_out)
648 unsigned char lm_owf[24];
649 unsigned char nt_owf[24];
650 RPC_HDR hdr;
651 RPC_HDR_AUTHA hdr_autha;
652 RPC_AUTH_VERIFIER auth_verifier;
653 RPC_AUTH_NTLMSSP_RESP ntlmssp_resp;
654 char buffer[4096];
655 prs_struct auth_info;
658 * Marshall the variable length data into a temporary parse
659 * struct, pointing into a 4k local buffer.
661 prs_init(&auth_info, 0, prs_get_mem_context(rpc_out), MARSHALL);
664 * Use the 4k buffer to store the auth info.
667 prs_give_memory( &auth_info, buffer, sizeof(buffer), False);
670 * Create the variable length auth_data.
673 init_rpc_auth_verifier(&auth_verifier, "NTLMSSP", NTLMSSP_AUTH);
675 pwd_get_lm_nt_owf(pwd, lm_owf, nt_owf);
677 init_rpc_auth_ntlmssp_resp(&ntlmssp_resp,
678 lm_owf, nt_owf,
679 domain, user_name, my_name,
680 ntlmssp_cli_flgs);
683 * Marshall the variable length auth_data into a temp parse_struct.
686 if(!smb_io_rpc_auth_verifier("auth_verifier", &auth_verifier, &auth_info, 0)) {
687 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_AUTH_VERIFIER.\n"));
688 return False;
691 if(!smb_io_rpc_auth_ntlmssp_resp("ntlmssp_resp", &ntlmssp_resp, &auth_info, 0)) {
692 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_AUTH_NTLMSSP_RESP.\n"));
693 return False;
696 /* Create the request RPC_HDR */
697 init_rpc_hdr(&hdr, RPC_BINDRESP, 0x0, rpc_call_id,
698 RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN + prs_offset(&auth_info),
699 prs_offset(&auth_info) );
701 /* Marshall it. */
702 if(!smb_io_rpc_hdr("hdr", &hdr, rpc_out, 0)) {
703 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR.\n"));
704 return False;
707 /* Create the request RPC_HDR_AUTHA */
708 init_rpc_hdr_autha(&hdr_autha, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN,
709 NTLMSSP_AUTH_TYPE, NTLMSSP_AUTH_LEVEL, 0x00);
711 if(!smb_io_rpc_hdr_autha("hdr_autha", &hdr_autha, rpc_out, 0)) {
712 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR_AUTHA.\n"));
713 return False;
717 * Append the auth data to the outgoing buffer.
720 if(!prs_append_prs_data(rpc_out, &auth_info)) {
721 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n"));
722 return False;
725 return True;
729 /*******************************************************************
730 Creates a DCE/RPC request.
731 ********************************************************************/
733 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)
735 uint32 alloc_hint;
736 RPC_HDR hdr;
737 RPC_HDR_REQ hdr_req;
738 uint32 callid = oldid ? oldid : get_rpc_call_id();
740 DEBUG(5,("create_rpc_request: opnum: 0x%x data_len: 0x%x\n", op_num, data_len));
742 /* create the rpc header RPC_HDR */
743 init_rpc_hdr(&hdr, RPC_REQUEST, flags,
744 callid, data_len, auth_len);
747 * The alloc hint should be the amount of data, not including
748 * RPC headers & footers.
751 if (auth_len != 0)
752 alloc_hint = data_left - RPC_HEADER_LEN - RPC_HDR_AUTH_LEN - auth_len;
753 else
754 alloc_hint = data_left - RPC_HEADER_LEN;
756 DEBUG(10,("create_rpc_request: data_len: %x auth_len: %x alloc_hint: %x\n",
757 data_len, auth_len, alloc_hint));
759 /* Create the rpc request RPC_HDR_REQ */
760 init_rpc_hdr_req(&hdr_req, alloc_hint, op_num);
762 /* stream-time... */
763 if(!smb_io_rpc_hdr("hdr ", &hdr, rpc_out, 0))
764 return 0;
766 if(!smb_io_rpc_hdr_req("hdr_req", &hdr_req, rpc_out, 0))
767 return 0;
769 if (prs_offset(rpc_out) != RPC_HEADER_LEN + RPC_HDR_REQ_LEN)
770 return 0;
772 return callid;
775 static BOOL create_auth_hdr(prs_struct *outgoing_packet, BOOL auth_verify)
777 RPC_HDR_AUTH hdr_auth;
779 init_rpc_hdr_auth(&hdr_auth, NTLMSSP_AUTH_TYPE,
780 NTLMSSP_AUTH_LEVEL, 0x08,
781 (auth_verify ? 1 : 0));
782 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth,
783 outgoing_packet, 0)) {
784 DEBUG(0,("create_auth_hdr:Failed to marshal RPC_HDR_AUTH.\n"));
785 return False;
787 return True;
790 static BOOL create_auth_data(struct cli_state *cli, uint32 crc32,
791 prs_struct *outgoing_packet)
793 char *pdata_out = prs_data_p(outgoing_packet);
794 RPC_AUTH_NTLMSSP_CHK chk;
795 uint32 current_offset = prs_offset(outgoing_packet);
797 init_rpc_auth_ntlmssp_chk(&chk, NTLMSSP_SIGN_VERSION,
798 crc32, cli->ntlmssp_seq_num++);
799 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &chk,
800 outgoing_packet, 0)) {
801 DEBUG(0,("create_auth_data: Failed to marshal RPC_AUTH_NTLMSSP_CHK.\n"));
802 return False;
804 NTLMSSPcalc_ap(cli, (unsigned char*)
805 &pdata_out[current_offset+4],
806 RPC_AUTH_NTLMSSP_CHK_LEN - 4);
807 return True;
810 BOOL rpc_api_pipe_req(struct cli_state *cli, uint8 op_num,
811 prs_struct *data, prs_struct *rdata)
813 uint32 auth_len, max_data, data_left, data_sent;
814 BOOL ret = False;
815 BOOL auth_verify, auth_seal;
816 fstring dump_name;
818 auth_verify = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SIGN) != 0);
819 auth_seal = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SEAL) != 0);
821 auth_len = (auth_verify ? RPC_AUTH_NTLMSSP_CHK_LEN : 0);
824 * calc how much actual data we can send in a PDU fragment
826 max_data = cli->max_xmit_frag - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
827 (auth_verify ? RPC_HDR_AUTH_LEN : 0) - auth_len;
829 for (data_left = prs_offset(data), data_sent = 0; data_left > 0;) {
830 prs_struct outgoing_packet;
831 uint32 data_len, send_size;
832 uint8 flags = 0;
833 uint32 crc32 = 0;
834 uint32 callid;
837 * how much will we send this time
839 send_size = MIN(data_left, max_data);
840 data_len = RPC_HEADER_LEN + RPC_HDR_REQ_LEN + send_size +
841 (auth_verify ? RPC_HDR_AUTH_LEN : 0) + auth_len;
844 * Malloc parse struct to hold it (and enough for alignments).
846 if(!prs_init(&outgoing_packet, data_len + 8,
847 cli->mem_ctx, MARSHALL)) {
848 DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len ));
849 return False;
852 if (data_left == prs_offset(data)) {
853 flags |= RPC_FLG_FIRST;
854 callid = 0;
856 if (data_left < max_data)
857 flags |= RPC_FLG_LAST;
859 * Write out the RPC header and the request header.
861 if(!(callid = create_rpc_request(&outgoing_packet, op_num,
862 data_len, auth_len, flags,
863 callid, data_left))) {
864 DEBUG(0,("rpc_api_pipe_req: Failed to create RPC request.\n"));
865 prs_mem_free(&outgoing_packet);
866 return False;
870 * Seal the outgoing data if requested.
872 if (auth_seal) {
873 crc32 = crc32_calc_buffer(prs_data_p(data) + data_sent,
874 send_size);
875 NTLMSSPcalc_ap(cli, (unsigned char*)prs_data_p(data) +
876 data_sent, send_size);
880 * Now copy the data into the outgoing packet.
882 if(!prs_append_some_prs_data(&outgoing_packet, data,
883 data_sent, send_size)) {
884 DEBUG(0,("rpc_api_pipe_req: Failed to append data to outgoing packet.\n"));
885 prs_mem_free(&outgoing_packet);
886 return False;
890 * Add a trailing auth_verifier if needed.
892 if (auth_seal || auth_verify) {
893 if(!create_auth_hdr(&outgoing_packet, auth_verify)) {
894 prs_mem_free(&outgoing_packet);
895 return False;
900 * Finally the auth data itself.
902 if (auth_verify) {
903 if (!create_auth_data(cli, crc32, &outgoing_packet)) {
904 prs_mem_free(&outgoing_packet);
905 return False;
909 DEBUG(100,("data_len: %x data_calc_len: %x\n", data_len,
910 prs_offset(&outgoing_packet)));
912 if (flags & RPC_FLG_LAST)
913 ret = rpc_api_pipe(cli, &outgoing_packet, rdata);
914 else {
915 cli_write(cli, cli->nt_pipe_fnum, 0x0008,
916 prs_data_p(&outgoing_packet),
917 data_sent, data_len);
919 prs_mem_free(&outgoing_packet);
920 data_sent += send_size;
921 data_left -= send_size;
923 /* Also capture received data */
924 slprintf(dump_name, sizeof(dump_name) - 1, "reply_%s",
925 cli_pipe_get_name(cli));
926 prs_dump(dump_name, op_num, rdata);
928 return ret;
932 * Send a request on an RPC pipe and get a response.
934 * @param data NDR contents of the request to be sent.
935 * @param rdata Unparsed NDR response data.
938 BOOL rpc_api_pipe_req2(struct cli_state *cli, uint8 op_num,
939 prs_struct *data, prs_struct *rdata)
941 prs_struct outgoing_packet;
942 uint32 data_len;
943 uint32 auth_len;
944 BOOL ret;
945 BOOL auth_verify;
946 BOOL auth_seal;
947 uint32 crc32 = 0;
948 char *pdata_out = NULL;
949 fstring dump_name;
951 auth_verify = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SIGN) != 0);
952 auth_seal = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SEAL) != 0);
954 /* Optionally capture for use in debugging */
955 slprintf(dump_name, sizeof(dump_name) - 1, "call_%s",
956 cli_pipe_get_name(cli));
957 prs_dump_before(dump_name, op_num, data);
960 * The auth_len doesn't include the RPC_HDR_AUTH_LEN.
963 auth_len = (auth_verify ? RPC_AUTH_NTLMSSP_CHK_LEN : 0);
966 * PDU len is header, plus request header, plus data, plus
967 * auth_header_len (if present), plus auth_len (if present).
968 * NB. The auth stuff should be aligned on an 8 byte boundary
969 * to be totally DCE/RPC spec complient. For now we cheat and
970 * hope that the data structs defined are a multiple of 8 bytes.
973 if((prs_offset(data) % 8) != 0) {
974 DEBUG(5,("rpc_api_pipe_req: Outgoing data not a multiple of 8 bytes....\n"));
977 data_len = RPC_HEADER_LEN + RPC_HDR_REQ_LEN + prs_offset(data) +
978 (auth_verify ? RPC_HDR_AUTH_LEN : 0) + auth_len;
981 * Malloc a parse struct to hold it (and enough for alignments).
984 if(!prs_init(&outgoing_packet, data_len + 8, cli->mem_ctx, MARSHALL)) {
985 DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len ));
986 return False;
989 pdata_out = prs_data_p(&outgoing_packet);
992 * Write out the RPC header and the request header.
995 if(!create_rpc_request(&outgoing_packet, op_num, data_len, auth_len,
996 (uint8) RPC_FLG_FIRST | RPC_FLG_LAST, 0, data_len)) {
997 DEBUG(0,("rpc_api_pipe_req: Failed to create RPC request.\n"));
998 prs_mem_free(&outgoing_packet);
999 return False;
1003 * Seal the outgoing data if requested.
1006 if (auth_seal) {
1007 crc32 = crc32_calc_buffer(prs_data_p(data), prs_offset(data));
1008 NTLMSSPcalc_ap(cli, (unsigned char*)prs_data_p(data), prs_offset(data));
1012 * Now copy the data into the outgoing packet.
1015 if(!prs_append_prs_data( &outgoing_packet, data)) {
1016 DEBUG(0,("rpc_api_pipe_req: Failed to append data to outgoing packet.\n"));
1017 prs_mem_free(&outgoing_packet);
1018 return False;
1022 * Add a trailing auth_verifier if needed.
1025 if (auth_seal || auth_verify) {
1026 RPC_HDR_AUTH hdr_auth;
1028 init_rpc_hdr_auth(&hdr_auth, NTLMSSP_AUTH_TYPE,
1029 NTLMSSP_AUTH_LEVEL, 0x08, (auth_verify ? 1 : 0));
1030 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, &outgoing_packet, 0)) {
1031 DEBUG(0,("rpc_api_pipe_req: Failed to marshal RPC_HDR_AUTH.\n"));
1032 prs_mem_free(&outgoing_packet);
1033 return False;
1038 * Finally the auth data itself.
1041 if (auth_verify) {
1042 RPC_AUTH_NTLMSSP_CHK chk;
1043 uint32 current_offset = prs_offset(&outgoing_packet);
1045 init_rpc_auth_ntlmssp_chk(&chk, NTLMSSP_SIGN_VERSION, crc32, cli->ntlmssp_seq_num++);
1046 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &chk, &outgoing_packet, 0)) {
1047 DEBUG(0,("rpc_api_pipe_req: Failed to marshal RPC_AUTH_NTLMSSP_CHK.\n"));
1048 prs_mem_free(&outgoing_packet);
1049 return False;
1051 NTLMSSPcalc_ap(cli, (unsigned char*)&pdata_out[current_offset+4], RPC_AUTH_NTLMSSP_CHK_LEN - 4);
1054 DEBUG(100,("data_len: %x data_calc_len: %x\n", data_len, prs_offset(&outgoing_packet)));
1056 ret = rpc_api_pipe(cli, &outgoing_packet, rdata);
1058 /* Also capture received data */
1059 slprintf(dump_name, sizeof(dump_name) - 1, "reply_%s",
1060 cli_pipe_get_name(cli));
1061 prs_dump(dump_name, op_num, rdata);
1063 prs_mem_free(&outgoing_packet);
1065 return ret;
1068 /****************************************************************************
1069 Set the handle state.
1070 ****************************************************************************/
1072 static BOOL rpc_pipe_set_hnd_state(struct cli_state *cli, const char *pipe_name, uint16 device_state)
1074 BOOL state_set = False;
1075 char param[2];
1076 uint16 setup[2]; /* only need 2 uint16 setup parameters */
1077 char *rparam = NULL;
1078 char *rdata = NULL;
1079 uint32 rparam_len, rdata_len;
1081 if (pipe_name == NULL)
1082 return False;
1084 DEBUG(5,("Set Handle state Pipe[%x]: %s - device state:%x\n",
1085 cli->nt_pipe_fnum, pipe_name, device_state));
1087 /* create parameters: device state */
1088 SSVAL(param, 0, device_state);
1090 /* create setup parameters. */
1091 setup[0] = 0x0001;
1092 setup[1] = cli->nt_pipe_fnum; /* pipe file handle. got this from an SMBOpenX. */
1094 /* send the data on \PIPE\ */
1095 if (cli_api_pipe(cli, "\\PIPE\\",
1096 setup, 2, 0, /* setup, length, max */
1097 param, 2, 0, /* param, length, max */
1098 NULL, 0, 1024, /* data, length, max */
1099 &rparam, &rparam_len, /* return param, length */
1100 &rdata, &rdata_len)) /* return data, length */
1102 DEBUG(5, ("Set Handle state: return OK\n"));
1103 state_set = True;
1106 SAFE_FREE(rparam);
1107 SAFE_FREE(rdata);
1109 return state_set;
1112 /****************************************************************************
1113 check the rpc bind acknowledge response
1114 ****************************************************************************/
1116 int get_pipe_index( const char *pipe_name )
1118 int pipe_idx = 0;
1120 while (pipe_names[pipe_idx].client_pipe != NULL) {
1121 if (strequal(pipe_name, pipe_names[pipe_idx].client_pipe ))
1122 return pipe_idx;
1123 pipe_idx++;
1126 return -1;
1130 /****************************************************************************
1131 check the rpc bind acknowledge response
1132 ****************************************************************************/
1134 char* get_pipe_name_from_index( const int pipe_index )
1137 if ( (pipe_index < 0) || (pipe_index >= PI_MAX_PIPES) )
1138 return NULL;
1140 return pipe_names[pipe_index].client_pipe;
1143 /****************************************************************************
1144 Check to see if this pipe index points to one of
1145 the pipes only supported by Win2k
1146 ****************************************************************************/
1148 BOOL is_win2k_pipe( const int pipe_idx )
1150 switch ( pipe_idx )
1152 case PI_LSARPC_DS:
1153 return True;
1156 return False;
1159 /****************************************************************************
1160 check the rpc bind acknowledge response
1161 ****************************************************************************/
1163 static BOOL valid_pipe_name(const int pipe_idx, RPC_IFACE *abstract, RPC_IFACE *transfer)
1165 if ( pipe_idx >= PI_MAX_PIPES ) {
1166 DEBUG(0,("valid_pipe_name: Programmer error! Invalid pipe index [%d]\n",
1167 pipe_idx));
1168 return False;
1171 DEBUG(5,("Bind Abstract Syntax: "));
1172 dump_data(5, (char*)&(pipe_names[pipe_idx].abstr_syntax),
1173 sizeof(pipe_names[pipe_idx].abstr_syntax));
1174 DEBUG(5,("Bind Transfer Syntax: "));
1175 dump_data(5, (char*)&(pipe_names[pipe_idx].trans_syntax),
1176 sizeof(pipe_names[pipe_idx].trans_syntax));
1178 /* copy the required syntaxes out so we can do the right bind */
1180 *transfer = pipe_names[pipe_idx].trans_syntax;
1181 *abstract = pipe_names[pipe_idx].abstr_syntax;
1183 return True;
1186 /****************************************************************************
1187 check the rpc bind acknowledge response
1188 ****************************************************************************/
1190 static BOOL check_bind_response(RPC_HDR_BA *hdr_ba, const int pipe_idx, RPC_IFACE *transfer)
1192 int i = 0;
1194 if ( hdr_ba->addr.len <= 0)
1195 return False;
1197 if ( !strequal(hdr_ba->addr.str, pipe_names[pipe_idx].server_pipe ))
1199 DEBUG(4,("bind_rpc_pipe: pipe_name %s != expected pipe %s. oh well!\n",
1200 pipe_names[i].server_pipe ,hdr_ba->addr.str));
1201 return False;
1204 DEBUG(5,("bind_rpc_pipe: server pipe_name found: %s\n", pipe_names[i].server_pipe ));
1206 if (pipe_names[pipe_idx].server_pipe == NULL) {
1207 DEBUG(2,("bind_rpc_pipe: pipe name %s unsupported\n", hdr_ba->addr.str));
1208 return False;
1211 /* check the transfer syntax */
1212 if ((hdr_ba->transfer.version != transfer->version) ||
1213 (memcmp(&hdr_ba->transfer.uuid, &transfer->uuid, sizeof(transfer->uuid)) !=0)) {
1214 DEBUG(2,("bind_rpc_pipe: transfer syntax differs\n"));
1215 return False;
1218 /* lkclXXXX only accept one result: check the result(s) */
1219 if (hdr_ba->res.num_results != 0x1 || hdr_ba->res.result != 0) {
1220 DEBUG(2,("bind_rpc_pipe: bind denied results: %d reason: %x\n",
1221 hdr_ba->res.num_results, hdr_ba->res.reason));
1224 DEBUG(5,("bind_rpc_pipe: accepted!\n"));
1225 return True;
1228 /****************************************************************************
1229 Create and send the third packet in an RPC auth.
1230 ****************************************************************************/
1232 static BOOL rpc_send_auth_reply(struct cli_state *cli, prs_struct *rdata, uint32 rpc_call_id)
1234 RPC_HDR_AUTH rhdr_auth;
1235 RPC_AUTH_VERIFIER rhdr_verf;
1236 RPC_AUTH_NTLMSSP_CHAL rhdr_chal;
1237 char buffer[MAX_PDU_FRAG_LEN];
1238 prs_struct rpc_out;
1239 ssize_t ret;
1241 unsigned char p24[24];
1242 unsigned char lm_owf[24];
1243 unsigned char lm_hash[16];
1245 if(!smb_io_rpc_hdr_auth("", &rhdr_auth, rdata, 0)) {
1246 DEBUG(0,("rpc_send_auth_reply: Failed to unmarshall RPC_HDR_AUTH.\n"));
1247 return False;
1249 if(!smb_io_rpc_auth_verifier("", &rhdr_verf, rdata, 0)) {
1250 DEBUG(0,("rpc_send_auth_reply: Failed to unmarshall RPC_AUTH_VERIFIER.\n"));
1251 return False;
1253 if(!smb_io_rpc_auth_ntlmssp_chal("", &rhdr_chal, rdata, 0)) {
1254 DEBUG(0,("rpc_send_auth_reply: Failed to unmarshall RPC_AUTH_NTLMSSP_CHAL.\n"));
1255 return False;
1258 cli->ntlmssp_cli_flgs = rhdr_chal.neg_flags;
1260 pwd_make_lm_nt_owf(&cli->pwd, rhdr_chal.challenge);
1262 prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL);
1264 prs_give_memory( &rpc_out, buffer, sizeof(buffer), False);
1266 create_rpc_bind_resp(&cli->pwd, cli->domain,
1267 cli->user_name, global_myname,
1268 cli->ntlmssp_cli_flgs, rpc_call_id,
1269 &rpc_out);
1271 pwd_get_lm_nt_owf(&cli->pwd, lm_owf, NULL);
1272 pwd_get_lm_nt_16(&cli->pwd, lm_hash, NULL);
1274 NTLMSSPOWFencrypt(lm_hash, lm_owf, p24);
1277 unsigned char j = 0;
1278 int ind;
1279 unsigned char k2[8];
1281 memcpy(k2, p24, 5);
1282 k2[5] = 0xe5;
1283 k2[6] = 0x38;
1284 k2[7] = 0xb0;
1286 for (ind = 0; ind < 256; ind++)
1287 cli->ntlmssp_hash[ind] = (unsigned char)ind;
1289 for( ind = 0; ind < 256; ind++) {
1290 unsigned char tc;
1292 j += (cli->ntlmssp_hash[ind] + k2[ind%8]);
1294 tc = cli->ntlmssp_hash[ind];
1295 cli->ntlmssp_hash[ind] = cli->ntlmssp_hash[j];
1296 cli->ntlmssp_hash[j] = tc;
1299 cli->ntlmssp_hash[256] = 0;
1300 cli->ntlmssp_hash[257] = 0;
1303 memset((char *)lm_hash, '\0', sizeof(lm_hash));
1305 if ((ret = cli_write(cli, cli->nt_pipe_fnum, 0x8, prs_data_p(&rpc_out),
1306 0, (size_t)prs_offset(&rpc_out))) != (ssize_t)prs_offset(&rpc_out)) {
1307 DEBUG(0,("rpc_send_auth_reply: cli_write failed. Return was %d\n", (int)ret));
1308 return False;
1311 cli->ntlmssp_srv_flgs = rhdr_chal.neg_flags;
1312 return True;
1315 /****************************************************************************
1316 Do an rpc bind.
1317 ****************************************************************************/
1319 BOOL rpc_pipe_bind(struct cli_state *cli, const int pipe_idx, char *my_name)
1321 RPC_IFACE abstract;
1322 RPC_IFACE transfer;
1323 prs_struct rpc_out;
1324 prs_struct rdata;
1325 BOOL do_auth = (cli->ntlmssp_cli_flgs != 0);
1326 uint32 rpc_call_id;
1327 char buffer[MAX_PDU_FRAG_LEN];
1329 if ( (pipe_idx < 0) || (pipe_idx >= PI_MAX_PIPES) )
1330 return False;
1332 DEBUG(5,("Bind RPC Pipe[%x]: %s\n", cli->nt_pipe_fnum, pipe_names[pipe_idx].client_pipe));
1334 if (!valid_pipe_name(pipe_idx, &abstract, &transfer))
1335 return False;
1337 prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL);
1340 * Use the MAX_PDU_FRAG_LEN buffer to store the bind request.
1343 prs_give_memory( &rpc_out, buffer, sizeof(buffer), False);
1345 rpc_call_id = get_rpc_call_id();
1347 /* Marshall the outgoing data. */
1348 create_rpc_bind_req(&rpc_out, do_auth, rpc_call_id,
1349 &abstract, &transfer,
1350 global_myname, cli->domain, cli->ntlmssp_cli_flgs);
1352 /* Initialize the incoming data struct. */
1353 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
1355 /* send data on \PIPE\. receive a response */
1356 if (rpc_api_pipe(cli, &rpc_out, &rdata)) {
1357 RPC_HDR_BA hdr_ba;
1359 DEBUG(5, ("rpc_pipe_bind: rpc_api_pipe returned OK.\n"));
1361 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &rdata, 0)) {
1362 DEBUG(0,("rpc_pipe_bind: Failed to unmarshall RPC_HDR_BA.\n"));
1363 prs_mem_free(&rdata);
1364 return False;
1367 if(!check_bind_response(&hdr_ba, pipe_idx, &transfer)) {
1368 DEBUG(2,("rpc_pipe_bind: check_bind_response failed.\n"));
1369 prs_mem_free(&rdata);
1370 return False;
1373 cli->max_xmit_frag = hdr_ba.bba.max_tsize;
1374 cli->max_recv_frag = hdr_ba.bba.max_rsize;
1377 * If we're doing NTLMSSP auth we need to send a reply to
1378 * the bind-ack to complete the 3-way challenge response
1379 * handshake.
1382 if (do_auth && !rpc_send_auth_reply(cli, &rdata, rpc_call_id)) {
1383 DEBUG(0,("rpc_pipe_bind: rpc_send_auth_reply failed.\n"));
1384 prs_mem_free(&rdata);
1385 return False;
1389 prs_mem_free(&rdata);
1390 return True;
1393 /****************************************************************************
1394 Set ntlmssp negotiation flags.
1395 ****************************************************************************/
1397 void cli_nt_set_ntlmssp_flgs(struct cli_state *cli, uint32 ntlmssp_flgs)
1399 cli->ntlmssp_cli_flgs = ntlmssp_flgs;
1403 /****************************************************************************
1404 Open a session.
1405 ****************************************************************************/
1407 BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
1409 int fnum;
1411 SMB_ASSERT(cli->nt_pipe_fnum == 0);
1413 /* The pipe index must fall within our array */
1415 SMB_ASSERT((pipe_idx >= 0) && (pipe_idx < PI_MAX_PIPES));
1417 if (cli->capabilities & CAP_NT_SMBS) {
1418 if ((fnum = cli_nt_create(cli, &pipe_names[pipe_idx].client_pipe[5], DESIRED_ACCESS_PIPE)) == -1) {
1419 DEBUG(0,("cli_nt_session_open: cli_nt_create failed on pipe %s to machine %s. Error was %s\n",
1420 &pipe_names[pipe_idx].client_pipe[5], cli->desthost, cli_errstr(cli)));
1421 return False;
1424 cli->nt_pipe_fnum = (uint16)fnum;
1425 } else {
1426 if ((fnum = cli_open(cli, pipe_names[pipe_idx].client_pipe, O_CREAT|O_RDWR, DENY_NONE)) == -1) {
1427 DEBUG(0,("cli_nt_session_open: cli_open failed on pipe %s to machine %s. Error was %s\n",
1428 pipe_names[pipe_idx].client_pipe, cli->desthost, cli_errstr(cli)));
1429 return False;
1432 cli->nt_pipe_fnum = (uint16)fnum;
1434 /**************** Set Named Pipe State ***************/
1435 if (!rpc_pipe_set_hnd_state(cli, pipe_names[pipe_idx].client_pipe, 0x4300)) {
1436 DEBUG(0,("cli_nt_session_open: pipe hnd state failed. Error was %s\n",
1437 cli_errstr(cli)));
1438 cli_close(cli, cli->nt_pipe_fnum);
1439 return False;
1443 /******************* bind request on pipe *****************/
1445 if (!rpc_pipe_bind(cli, pipe_idx, global_myname)) {
1446 DEBUG(2,("cli_nt_session_open: rpc bind to %s failed\n",
1447 get_pipe_name_from_index(pipe_idx)));
1448 cli_close(cli, cli->nt_pipe_fnum);
1449 return False;
1453 * Setup the remote server name prefixed by \ and the machine account name.
1456 fstrcpy(cli->srv_name_slash, "\\\\");
1457 fstrcat(cli->srv_name_slash, cli->desthost);
1458 strupper(cli->srv_name_slash);
1460 fstrcpy(cli->clnt_name_slash, "\\\\");
1461 fstrcat(cli->clnt_name_slash, global_myname);
1462 strupper(cli->clnt_name_slash);
1464 fstrcpy(cli->mach_acct, global_myname);
1465 fstrcat(cli->mach_acct, "$");
1466 strupper(cli->mach_acct);
1468 /* Remember which pipe we're talking to */
1469 fstrcpy(cli->pipe_name, pipe_names[pipe_idx].client_pipe);
1471 return True;
1475 const char *cli_pipe_get_name(struct cli_state *cli)
1477 return cli->pipe_name;
1481 /****************************************************************************
1482 close the session
1483 ****************************************************************************/
1485 void cli_nt_session_close(struct cli_state *cli)
1487 cli_close(cli, cli->nt_pipe_fnum);
1488 cli->nt_pipe_fnum = 0;