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                  1997-1998,
7 *  Copyright (C) Jeremy Allison                    1999,
8 *  Copyright (C) Jim McDonough <jmcd@us.ibm.com>   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.
14 *
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.
19 *
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.
23 */
24
25/*  this module apparently provides an implementation of DCE/RPC over a
26 *  named pipe (IPC$ connection using SMBtrans).  details of DCE/RPC
27 *  documentation are available (in on-line form) from the X-Open group.
28 *
29 *  this module should provide a level of abstraction between SMB
30 *  and DCE/RPC, while minimising the amount of mallocs, unnecessary
31 *  data copies, and network traffic.
32 *
33 *  in this version, which takes a "let's learn what's going on and
34 *  get something running" approach, there is additional network
35 *  traffic generated, but the code should be easier to understand...
36 *
37 *  ... if you read the docs.  or stare at packets for weeks on end.
38 *
39 */
40
41#include "includes.h"
42
43#undef DBGC_CLASS
44#define DBGC_CLASS DBGC_RPC_SRV
45
46/*************************************************************
47 HACK Alert!
48 We need to transfer the session key from one rpc bind to the
49 next. This is the way the netlogon schannel works.
50**************************************************************/
51struct dcinfo last_dcinfo;
52
53static void NTLMSSPcalc_p( pipes_struct *p, unsigned char *data, int len)
54{
55    unsigned char *hash = p->ntlmssp_hash;
56    unsigned char index_i = hash[256];
57    unsigned char index_j = hash[257];
58    int ind;
59
60    for( ind = 0; ind < len; ind++) {
61        unsigned char tc;
62        unsigned char t;
63
64        index_i++;
65        index_j += hash[index_i];
66
67        tc = hash[index_i];
68        hash[index_i] = hash[index_j];
69        hash[index_j] = tc;
70
71        t = hash[index_i] + hash[index_j];
72        data[ind] = data[ind] ^ hash[t];
73    }
74
75    hash[256] = index_i;
76    hash[257] = index_j;
77}
78
79/*******************************************************************
80 Generate the next PDU to be returned from the data in p->rdata.
81 We cheat here as this function doesn't handle the special auth
82 footers of the authenticated bind response reply.
83 ********************************************************************/
84
85BOOL create_next_pdu(pipes_struct *p)
86{
87	RPC_HDR_RESP hdr_resp;
88	BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0);
89	BOOL auth_seal   = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0);
90	uint32 data_len;
91	uint32 data_space_available;
92	uint32 data_len_left;
93	prs_struct outgoing_pdu;
94	uint32 data_pos;
95
96	/*
97	 * If we're in the fault state, keep returning fault PDU's until
98	 * the pipe gets closed. JRA.
99	 */
100
101	if(p->fault_state) {
102		setup_fault_pdu(p, NT_STATUS(0x1c010002));
103		return True;
104	}
105
106	memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
107
108	/* Change the incoming request header to a response. */
109	p->hdr.pkt_type = RPC_RESPONSE;
110
111	/* Set up rpc header flags. */
112	if (p->out_data.data_sent_length == 0)
113		p->hdr.flags = RPC_FLG_FIRST;
114	else
115		p->hdr.flags = 0;
116
117	/*
118	 * Work out how much we can fit in a single PDU.
119	 */
120
121	data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN;
122	if(p->ntlmssp_auth_validated)
123		data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN);
124
125	if(p->netsec_auth_validated)
126		data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NETSEC_CHK_LEN);
127
128	/*
129	 * The amount we send is the minimum of the available
130	 * space and the amount left to send.
131	 */
132
133	data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
134
135	/*
136	 * Ensure there really is data left to send.
137	 */
138
139	if(!data_len_left) {
140		DEBUG(0,("create_next_pdu: no data left to send !\n"));
141		return False;
142	}
143
144	data_len = MIN(data_len_left, data_space_available);
145
146	/*
147	 * Set up the alloc hint. This should be the data left to
148	 * send.
149	 */
150
151	hdr_resp.alloc_hint = data_len_left;
152
153	/*
154	 * Set up the header lengths.
155	 */
156
157	if (p->ntlmssp_auth_validated) {
158		p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len +
159					RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN;
160		p->hdr.auth_len = RPC_AUTH_NTLMSSP_CHK_LEN;
161	} else if (p->netsec_auth_validated) {
162		p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len +
163			RPC_HDR_AUTH_LEN + RPC_AUTH_NETSEC_CHK_LEN;
164		p->hdr.auth_len = RPC_AUTH_NETSEC_CHK_LEN;
165	} else {
166		p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len;
167		p->hdr.auth_len = 0;
168	}
169
170	/*
171	 * Work out if this PDU will be the last.
172	 */
173
174	if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata))
175		p->hdr.flags |= RPC_FLG_LAST;
176
177	/*
178	 * Init the parse struct to point at the outgoing
179	 * data.
180	 */
181
182	prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
183	prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
184
185	/* Store the header in the data stream. */
186	if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) {
187		DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR.\n"));
188		prs_mem_free(&outgoing_pdu);
189		return False;
190	}
191
192	if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
193		DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_RESP.\n"));
194		prs_mem_free(&outgoing_pdu);
195		return False;
196	}
197
198	/* Store the current offset. */
199	data_pos = prs_offset(&outgoing_pdu);
200
201	/* Copy the data into the PDU. */
202
203	if(!prs_append_some_prs_data(&outgoing_pdu, &p->out_data.rdata, p->out_data.data_sent_length, data_len)) {
204		DEBUG(0,("create_next_pdu: failed to copy %u bytes of data.\n", (unsigned int)data_len));
205		prs_mem_free(&outgoing_pdu);
206		return False;
207	}
208
209	if (p->ntlmssp_auth_validated) {
210		uint32 crc32 = 0;
211		char *data;
212
213		DEBUG(5,("create_next_pdu: sign: %s seal: %s data %d auth %d\n",
214			 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len, p->hdr.auth_len));
215
216		/*
217		 * Set data to point to where we copied the data into.
218		 */
219
220		data = prs_data_p(&outgoing_pdu) + data_pos;
221
222		if (auth_seal) {
223			crc32 = crc32_calc_buffer(data, data_len);
224			NTLMSSPcalc_p(p, (uchar*)data, data_len);
225		}
226
227		if (auth_seal || auth_verify) {
228			RPC_HDR_AUTH auth_info;
229
230			init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, RPC_PIPE_AUTH_SEAL_LEVEL,
231					(auth_verify ? RPC_HDR_AUTH_LEN : 0), (auth_verify ? 1 : 0));
232			if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
233				DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n"));
234				prs_mem_free(&outgoing_pdu);
235				return False;
236			}
237		}
238
239		if (auth_verify) {
240			RPC_AUTH_NTLMSSP_CHK ntlmssp_chk;
241			char *auth_data = prs_data_p(&outgoing_pdu);
242
243			p->ntlmssp_seq_num++;
244			init_rpc_auth_ntlmssp_chk(&ntlmssp_chk, NTLMSSP_SIGN_VERSION,
245					crc32, p->ntlmssp_seq_num++);
246			auth_data = prs_data_p(&outgoing_pdu) + prs_offset(&outgoing_pdu) + 4;
247			if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, &outgoing_pdu, 0)) {
248				DEBUG(0,("create_next_pdu: failed to marshall RPC_AUTH_NTLMSSP_CHK.\n"));
249				prs_mem_free(&outgoing_pdu);
250				return False;
251			}
252			NTLMSSPcalc_p(p, (uchar*)auth_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4);
253		}
254	}
255
256	if (p->netsec_auth_validated) {
257		int auth_type, auth_level;
258		char *data;
259		RPC_HDR_AUTH auth_info;
260
261		RPC_AUTH_NETSEC_CHK verf;
262		prs_struct rverf;
263		prs_struct rauth;
264
265		data = prs_data_p(&outgoing_pdu) + data_pos;
266		/* Check it's the type of reply we were expecting to decode */
267
268		get_auth_type_level(p->netsec_auth.auth_flags, &auth_type, &auth_level);
269		init_rpc_hdr_auth(&auth_info, auth_type, auth_level,
270				  RPC_HDR_AUTH_LEN, 1);
271
272		if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
273			DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n"));
274			prs_mem_free(&outgoing_pdu);
275			return False;
276		}
277
278		prs_init(&rverf, 0, p->mem_ctx, MARSHALL);
279		prs_init(&rauth, 0, p->mem_ctx, MARSHALL);
280
281		netsec_encode(&p->netsec_auth,
282			      p->netsec_auth.auth_flags,
283			      SENDER_IS_ACCEPTOR,
284			      &verf, data, data_len);
285
286		smb_io_rpc_auth_netsec_chk("", &verf, &outgoing_pdu, 0);
287
288		p->netsec_auth.seq_num++;
289	}
290
291	/*
292	 * Setup the counts for this PDU.
293	 */
294
295	p->out_data.data_sent_length += data_len;
296	p->out_data.current_pdu_len = p->hdr.frag_len;
297	p->out_data.current_pdu_sent = 0;
298
299	prs_mem_free(&outgoing_pdu);
300	return True;
301}
302
303/*******************************************************************
304 Process an NTLMSSP authentication response.
305 If this function succeeds, the user has been authenticated
306 and their domain, name and calling workstation stored in
307 the pipe struct.
308 The initial challenge is stored in p->challenge.
309 *******************************************************************/
310
311static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlmssp_resp)
312{
313	uchar lm_owf[24];
314	uchar nt_owf[128];
315	int nt_pw_len;
316	int lm_pw_len;
317	fstring user_name;
318	fstring domain;
319	fstring wks;
320
321	NTSTATUS nt_status;
322
323	struct auth_context *auth_context = NULL;
324	auth_usersupplied_info *user_info = NULL;
325	auth_serversupplied_info *server_info = NULL;
326
327	DEBUG(5,("api_pipe_ntlmssp_verify: checking user details\n"));
328
329	memset(p->user_name, '\0', sizeof(p->user_name));
330	memset(p->pipe_user_name, '\0', sizeof(p->pipe_user_name));
331	memset(p->domain, '\0', sizeof(p->domain));
332	memset(p->wks, '\0', sizeof(p->wks));
333
334	/* Set up for non-authenticated user. */
335	delete_nt_token(&p->pipe_user.nt_user_token);
336	p->pipe_user.ngroups = 0;
337	SAFE_FREE( p->pipe_user.groups);
338
339	/*
340	 * Setup an empty password for a guest user.
341	 */
342
343	/*
344	 * We always negotiate UNICODE.
345	 */
346
347	if (p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_UNICODE) {
348		rpcstr_pull(user_name, ntlmssp_resp->user, sizeof(fstring), ntlmssp_resp->hdr_usr.str_str_len*2, 0 );
349		rpcstr_pull(domain, ntlmssp_resp->domain, sizeof(fstring), ntlmssp_resp->hdr_domain.str_str_len*2, 0);
350		rpcstr_pull(wks, ntlmssp_resp->wks, sizeof(fstring), ntlmssp_resp->hdr_wks.str_str_len*2, 0);
351	} else {
352		pull_ascii_fstring(user_name, ntlmssp_resp->user);
353		pull_ascii_fstring(domain, ntlmssp_resp->domain);
354		pull_ascii_fstring(wks, ntlmssp_resp->wks);
355	}
356
357	DEBUG(5,("user: %s domain: %s wks: %s\n", user_name, domain, wks));
358
359	nt_pw_len = MIN(sizeof(nt_owf), ntlmssp_resp->hdr_nt_resp.str_str_len);
360	lm_pw_len = MIN(sizeof(lm_owf), ntlmssp_resp->hdr_lm_resp.str_str_len);
361
362	memcpy(lm_owf, ntlmssp_resp->lm_resp, sizeof(lm_owf));
363	memcpy(nt_owf, ntlmssp_resp->nt_resp, nt_pw_len);
364
365#ifdef DEBUG_PASSWORD
366	DEBUG(100,("lm, nt owfs, chal\n"));
367	dump_data(100, (char *)lm_owf, sizeof(lm_owf));
368	dump_data(100, (char *)nt_owf, nt_pw_len);
369	dump_data(100, (char *)p->challenge, 8);
370#endif
371
372	/*
373	 * Allow guest access. Patch from Shirish Kalele <kalele@veritas.com>.
374	 */
375
376	if (*user_name) {
377
378	 	/*
379		 * Do the length checking only if user is not NULL.
380		 */
381
382 		if (ntlmssp_resp->hdr_lm_resp.str_str_len == 0)
383 			return False;
384 		if (ntlmssp_resp->hdr_nt_resp.str_str_len == 0)
385 			return False;
386 		if (ntlmssp_resp->hdr_usr.str_str_len == 0)
387 			return False;
388 		if (ntlmssp_resp->hdr_domain.str_str_len == 0)
389 			return False;
390 		if (ntlmssp_resp->hdr_wks.str_str_len == 0)
391 			return False;
392
393	}
394
395	make_auth_context_fixed(&auth_context, (uchar*)p->challenge);
396
397	if (!make_user_info_netlogon_network(&user_info,
398					     user_name, domain, wks,
399					     lm_owf, lm_pw_len,
400					     nt_owf, nt_pw_len)) {
401		DEBUG(0,("make_user_info_netlogon_network failed!  Failing authenticaion.\n"));
402		return False;
403	}
404
405	nt_status = auth_context->check_ntlm_password(auth_context, user_info, &server_info);
406
407	(auth_context->free)(&auth_context);
408	free_user_info(&user_info);
409
410	p->ntlmssp_auth_validated = NT_STATUS_IS_OK(nt_status);
411
412	if (!p->ntlmssp_auth_validated) {
413		DEBUG(1,("api_pipe_ntlmssp_verify: User [%s]\\[%s] from machine %s \
414failed authentication on named pipe %s.\n", domain, user_name, wks, p->name ));
415		free_server_info(&server_info);
416		return False;
417	}
418
419	/*
420	 * Set up the sign/seal data.
421	 */
422
423	if (server_info->lm_session_key.length != 16) {
424		DEBUG(1,("api_pipe_ntlmssp_verify: User [%s]\\[%s] from machine %s \
425succeeded authentication on named pipe %s, but session key was of incorrect length [%u].\n",
426			 domain, user_name, wks, p->name, server_info->lm_session_key.length));
427		free_server_info(&server_info);
428		return False;
429	} else {
430		uchar p24[24];
431		NTLMSSPOWFencrypt(server_info->lm_session_key.data, lm_owf, p24);
432		{
433			unsigned char j = 0;
434			int ind;
435
436			unsigned char k2[8];
437
438			memcpy(k2, p24, 5);
439			k2[5] = 0xe5;
440			k2[6] = 0x38;
441			k2[7] = 0xb0;
442
443			for (ind = 0; ind < 256; ind++)
444				p->ntlmssp_hash[ind] = (unsigned char)ind;
445
446			for( ind = 0; ind < 256; ind++) {
447				unsigned char tc;
448
449				j += (p->ntlmssp_hash[ind] + k2[ind%8]);
450
451				tc = p->ntlmssp_hash[ind];
452				p->ntlmssp_hash[ind] = p->ntlmssp_hash[j];
453				p->ntlmssp_hash[j] = tc;
454			}
455
456			p->ntlmssp_hash[256] = 0;
457			p->ntlmssp_hash[257] = 0;
458		}
459
460		dump_data_pw("NTLMSSP hash (v1)\n", p->ntlmssp_hash,
461			     sizeof(p->ntlmssp_hash));
462
463/*		NTLMSSPhash(p->ntlmssp_hash, p24); */
464		p->ntlmssp_seq_num = 0;
465
466	}
467
468	fstrcpy(p->user_name, user_name);
469	fstrcpy(p->pipe_user_name, server_info->unix_name);
470	fstrcpy(p->domain, domain);
471	fstrcpy(p->wks, wks);
472
473	/*
474	 * Store the UNIX credential data (uid/gid pair) in the pipe structure.
475	 */
476
477	p->session_key = data_blob(server_info->lm_session_key.data, server_info->lm_session_key.length);
478
479	p->pipe_user.uid = server_info->uid;
480	p->pipe_user.gid = server_info->gid;
481
482	p->pipe_user.ngroups = server_info->n_groups;
483	if (p->pipe_user.ngroups) {
484		if (!(p->pipe_user.groups = memdup(server_info->groups, sizeof(gid_t) * p->pipe_user.ngroups))) {
485			DEBUG(0,("failed to memdup group list to p->pipe_user.groups\n"));
486			free_server_info(&server_info);
487			return False;
488		}
489	}
490
491	if (server_info->ptok)
492		p->pipe_user.nt_user_token = dup_nt_token(server_info->ptok);
493	else {
494		DEBUG(1,("Error: Authmodule failed to provide nt_user_token\n"));
495		p->pipe_user.nt_user_token = NULL;
496		free_server_info(&server_info);
497		return False;
498	}
499
500	p->ntlmssp_auth_validated = True;
501
502	free_server_info(&server_info);
503	return True;
504}
505
506/*******************************************************************
507 The switch table for the pipe names and the functions to handle them.
508 *******************************************************************/
509
510struct rpc_table
511{
512  struct
513  {
514    const char *clnt;
515    const char *srv;
516  } pipe;
517  struct api_struct *cmds;
518  int n_cmds;
519};
520
521static struct rpc_table *rpc_lookup;
522static int rpc_lookup_size;
523
524/*******************************************************************
525 This is the client reply to our challenge for an authenticated
526 bind request. The challenge we sent is in p->challenge.
527*******************************************************************/
528
529BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p)
530{
531	RPC_HDR_AUTHA autha_info;
532	RPC_AUTH_VERIFIER auth_verifier;
533	RPC_AUTH_NTLMSSP_RESP ntlmssp_resp;
534
535	DEBUG(5,("api_pipe_bind_auth_resp: decode request. %d\n", __LINE__));
536
537	if (p->hdr.auth_len == 0) {
538		DEBUG(0,("api_pipe_bind_auth_resp: No auth field sent !\n"));
539		return False;
540	}
541
542	/*
543	 * Decode the authentication verifier response.
544	 */
545
546	if(!smb_io_rpc_hdr_autha("", &autha_info, rpc_in_p, 0)) {
547		DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_HDR_AUTHA failed.\n"));
548		return False;
549	}
550
551	if (autha_info.auth_type != NTLMSSP_AUTH_TYPE || autha_info.auth_level != RPC_PIPE_AUTH_SEAL_LEVEL) {
552		DEBUG(0,("api_pipe_bind_auth_resp: incorrect auth type (%d) or level (%d).\n",
553			(int)autha_info.auth_type, (int)autha_info.auth_level ));
554		return False;
555	}
556
557	if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) {
558		DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_AUTH_VERIFIER failed.\n"));
559		return False;
560	}
561
562	/*
563	 * Ensure this is a NTLMSSP_AUTH packet type.
564	 */
565
566	if (!rpc_auth_verifier_chk(&auth_verifier, "NTLMSSP", NTLMSSP_AUTH)) {
567		DEBUG(0,("api_pipe_bind_auth_resp: rpc_auth_verifier_chk failed.\n"));
568		return False;
569	}
570
571	if(!smb_io_rpc_auth_ntlmssp_resp("", &ntlmssp_resp, rpc_in_p, 0)) {
572		DEBUG(0,("api_pipe_bind_auth_resp: Failed to unmarshall RPC_AUTH_NTLMSSP_RESP.\n"));
573		return False;
574	}
575
576	/*
577	 * The following call actually checks the challenge/response data.
578	 * for correctness against the given DOMAIN\user name.
579	 */
580
581	if (!api_pipe_ntlmssp_verify(p, &ntlmssp_resp))
582		return False;
583
584	p->pipe_bound = True
585;
586	return True;
587}
588
589/*******************************************************************
590 Marshall a bind_nak pdu.
591*******************************************************************/
592
593static BOOL setup_bind_nak(pipes_struct *p)
594{
595	prs_struct outgoing_rpc;
596	RPC_HDR nak_hdr;
597	uint16 zero = 0;
598
599	/* Free any memory in the current return data buffer. */
600	prs_mem_free(&p->out_data.rdata);
601
602	/*
603	 * Marshall directly into the outgoing PDU space. We
604	 * must do this as we need to set to the bind response
605	 * header and are never sending more than one PDU here.
606	 */
607
608	prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
609	prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
610
611
612	/*
613	 * Initialize a bind_nak header.
614	 */
615
616	init_rpc_hdr(&nak_hdr, RPC_BINDNACK, RPC_FLG_FIRST | RPC_FLG_LAST,
617            p->hdr.call_id, RPC_HEADER_LEN + sizeof(uint16), 0);
618
619	/*
620	 * Marshall the header into the outgoing PDU.
621	 */
622
623	if(!smb_io_rpc_hdr("", &nak_hdr, &outgoing_rpc, 0)) {
624		DEBUG(0,("setup_bind_nak: marshalling of RPC_HDR failed.\n"));
625		prs_mem_free(&outgoing_rpc);
626		return False;
627	}
628
629	/*
630	 * Now add the reject reason.
631	 */
632
633	if(!prs_uint16("reject code", &outgoing_rpc, 0, &zero)) {
634		prs_mem_free(&outgoing_rpc);
635        return False;
636	}
637
638	p->out_data.data_sent_length = 0;
639	p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
640	p->out_data.current_pdu_sent = 0;
641
642	p->pipe_bound = False;
643
644	return True;
645}
646
647/*******************************************************************
648 Marshall a fault pdu.
649*******************************************************************/
650
651BOOL setup_fault_pdu(pipes_struct *p, NTSTATUS status)
652{
653	prs_struct outgoing_pdu;
654	RPC_HDR fault_hdr;
655	RPC_HDR_RESP hdr_resp;
656	RPC_HDR_FAULT fault_resp;
657
658	/* Free any memory in the current return data buffer. */
659	prs_mem_free(&p->out_data.rdata);
660
661	/*
662	 * Marshall directly into the outgoing PDU space. We
663	 * must do this as we need to set to the bind response
664	 * header and are never sending more than one PDU here.
665	 */
666
667	prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
668	prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
669
670	/*
671	 * Initialize a fault header.
672	 */
673
674	init_rpc_hdr(&fault_hdr, RPC_FAULT, RPC_FLG_FIRST | RPC_FLG_LAST | RPC_FLG_NOCALL,
675            p->hdr.call_id, RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN, 0);
676
677	/*
678	 * Initialize the HDR_RESP and FAULT parts of the PDU.
679	 */
680
681	memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
682
683	fault_resp.status = status;
684	fault_resp.reserved = 0;
685
686	/*
687	 * Marshall the header into the outgoing PDU.
688	 */
689
690	if(!smb_io_rpc_hdr("", &fault_hdr, &outgoing_pdu, 0)) {
691		DEBUG(0,("setup_fault_pdu: marshalling of RPC_HDR failed.\n"));
692		prs_mem_free(&outgoing_pdu);
693		return False;
694	}
695
696	if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
697		DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_RESP.\n"));
698		prs_mem_free(&outgoing_pdu);
699		return False;
700	}
701
702	if(!smb_io_rpc_hdr_fault("fault", &fault_resp, &outgoing_pdu, 0)) {
703		DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_FAULT.\n"));
704		prs_mem_free(&outgoing_pdu);
705		return False;
706	}
707
708	p->out_data.data_sent_length = 0;
709	p->out_data.current_pdu_len = prs_offset(&outgoing_pdu);
710	p->out_data.current_pdu_sent = 0;
711
712	prs_mem_free(&outgoing_pdu);
713	return True;
714}
715
716/*******************************************************************
717 Ensure a bind request has the correct abstract & transfer interface.
718 Used to reject unknown binds from Win2k.
719*******************************************************************/
720
721BOOL check_bind_req(struct pipes_struct *p, RPC_IFACE* abstract,
722                    RPC_IFACE* transfer, uint32 context_id)
723{
724	extern struct pipe_id_info pipe_names[];
725	char *pipe_name = p->name;
726	int i=0;
727	fstring pname;
728
729	fstrcpy(pname,"\\PIPE\\");
730	fstrcat(pname,pipe_name);
731
732	DEBUG(3,("check_bind_req for %s\n", pname));
733
734	/* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */
735
736	for ( i=0; pipe_names[i].client_pipe; i++ )
737	{
738		if ( strequal(pipe_names[i].client_pipe, pname)
739			&& (abstract->version == pipe_names[i].abstr_syntax.version)
740			&& (memcmp(&abstract->uuid, &pipe_names[i].abstr_syntax.uuid, sizeof(RPC_UUID)) == 0)
741			&& (transfer->version == pipe_names[i].trans_syntax.version)
742			&& (memcmp(&transfer->uuid, &pipe_names[i].trans_syntax.uuid, sizeof(RPC_UUID)) == 0) )
743		{
744			struct api_struct 	*fns = NULL;
745			int 			n_fns = 0;
746			PIPE_RPC_FNS		*context_fns;
747
748			if ( !(context_fns = malloc(sizeof(PIPE_RPC_FNS))) ) {
749				DEBUG(0,("check_bind_req: malloc() failed!\n"));
750				return False;
751			}
752
753			/* save the RPC function table associated with this bind */
754
755			get_pipe_fns(i, &fns, &n_fns);
756
757			context_fns->cmds = fns;
758			context_fns->n_cmds = n_fns;
759			context_fns->context_id = context_id;
760
761			/* add to the list of open contexts */
762
763			DLIST_ADD( p->contexts, context_fns );
764
765			break;
766		}
767	}
768
769	if(pipe_names[i].client_pipe == NULL)
770		return False;
771
772	return True;
773}
774
775/*******************************************************************
776 Register commands to an RPC pipe
777*******************************************************************/
778NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size)
779{
780        struct rpc_table *rpc_entry;
781
782	if (!clnt || !srv || !cmds) {
783		return NT_STATUS_INVALID_PARAMETER;
784	}
785
786	if (version != SMB_RPC_INTERFACE_VERSION) {
787		DEBUG(0,("Can't register rpc commands!\n"
788			 "You tried to register a rpc module with SMB_RPC_INTERFACE_VERSION %d"
789			 ", while this version of samba uses version %d!\n",
790			 version,SMB_RPC_INTERFACE_VERSION));
791		return NT_STATUS_OBJECT_TYPE_MISMATCH;
792	}
793
794	/* TODO:
795	 *
796	 * we still need to make sure that don't register the same commands twice!!!
797	 *
798	 * --metze
799	 */
800
801        /* We use a temporary variable because this call can fail and
802           rpc_lookup will still be valid afterwards.  It could then succeed if
803           called again later */
804        rpc_entry = realloc(rpc_lookup,
805                            ++rpc_lookup_size*sizeof(struct rpc_table));
806        if (NULL == rpc_entry) {
807                rpc_lookup_size--;
808                DEBUG(0, ("rpc_pipe_register_commands: memory allocation failed\n"));
809                return NT_STATUS_NO_MEMORY;
810        } else {
811                rpc_lookup = rpc_entry;
812        }
813
814        rpc_entry = rpc_lookup + (rpc_lookup_size - 1);
815        ZERO_STRUCTP(rpc_entry);
816        rpc_entry->pipe.clnt = strdup(clnt);
817        rpc_entry->pipe.srv = strdup(srv);
818        rpc_entry->cmds = realloc(rpc_entry->cmds,
819                                  (rpc_entry->n_cmds + size) *
820                                  sizeof(struct api_struct));
821        memcpy(rpc_entry->cmds + rpc_entry->n_cmds, cmds,
822               size * sizeof(struct api_struct));
823        rpc_entry->n_cmds += size;
824
825        return NT_STATUS_OK;
826}
827
828/*******************************************************************
829 Respond to a pipe bind request.
830*******************************************************************/
831
832BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
833{
834	RPC_HDR_BA hdr_ba;
835	RPC_HDR_RB hdr_rb;
836	RPC_HDR_AUTH auth_info;
837	uint16 assoc_gid;
838	fstring ack_pipe_name;
839	prs_struct out_hdr_ba;
840	prs_struct out_auth;
841	prs_struct outgoing_rpc;
842	int i = 0;
843	int auth_len = 0;
844	enum RPC_PKT_TYPE reply_pkt_type;
845
846	p->ntlmssp_auth_requested = False;
847	p->netsec_auth_validated = False;
848
849	DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__));
850
851	/*
852	 * Try and find the correct pipe name to ensure
853	 * that this is a pipe name we support.
854	 */
855
856
857	for (i = 0; i < rpc_lookup_size; i++) {
858	        if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
859                  DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
860                            rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
861                  fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
862                  break;
863                }
864	}
865
866	if (i == rpc_lookup_size) {
867		if (NT_STATUS_IS_ERR(smb_probe_module("rpc", p->name))) {
868                       DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n",
869                                p->name ));
870                       if(!setup_bind_nak(p))
871                               return False;
872                       return True;
873                }
874
875                for (i = 0; i < rpc_lookup_size; i++) {
876                       if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
877                               DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
878                                         rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
879                               fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
880                               break;
881                       }
882                }
883
884		if (i == rpc_lookup_size) {
885			DEBUG(0, ("module %s doesn't provide functions for pipe %s!\n", p->name, p->name));
886			return False;
887		}
888	}
889
890	/* decode the bind request */
891	if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_in_p, 0))  {
892		DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_RB struct.\n"));
893		return False;
894	}
895
896	/*
897	 * Check if this is an authenticated request.
898	 */
899
900	if (p->hdr.auth_len != 0) {
901		RPC_AUTH_VERIFIER auth_verifier;
902		RPC_AUTH_NTLMSSP_NEG ntlmssp_neg;
903
904		/*
905		 * Decode the authentication verifier.
906		 */
907
908		if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) {
909			DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_AUTH struct.\n"));
910			return False;
911		}
912
913		if(auth_info.auth_type == NTLMSSP_AUTH_TYPE) {
914
915			if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) {
916				DEBUG(0,("api_pipe_bind_req: unable to "
917					 "unmarshall RPC_HDR_AUTH struct.\n"));
918				return False;
919			}
920
921			if(!strequal(auth_verifier.signature, "NTLMSSP")) {
922				DEBUG(0,("api_pipe_bind_req: "
923					 "auth_verifier.signature != NTLMSSP\n"));
924				return False;
925			}
926
927			if(auth_verifier.msg_type != NTLMSSP_NEGOTIATE) {
928				DEBUG(0,("api_pipe_bind_req: "
929					 "auth_verifier.msg_type (%d) != NTLMSSP_NEGOTIATE\n",
930					 auth_verifier.msg_type));
931				return False;
932			}
933
934			if(!smb_io_rpc_auth_ntlmssp_neg("", &ntlmssp_neg, rpc_in_p, 0)) {
935				DEBUG(0,("api_pipe_bind_req: "
936					 "Failed to unmarshall RPC_AUTH_NTLMSSP_NEG.\n"));
937				return False;
938			}
939
940			p->ntlmssp_chal_flags = SMBD_NTLMSSP_NEG_FLAGS;
941			p->ntlmssp_auth_requested = True;
942
943		} else if (auth_info.auth_type == NETSEC_AUTH_TYPE) {
944
945			RPC_AUTH_NETSEC_NEG neg;
946			struct netsec_auth_struct *a = &(p->netsec_auth);
947
948			if (!smb_io_rpc_auth_netsec_neg("", &neg, rpc_in_p, 0)) {
949				DEBUG(0,("api_pipe_bind_req: "
950					 "Could not unmarshal SCHANNEL auth neg\n"));
951				return False;
952			}
953
954			p->netsec_auth_validated = True;
955
956			memset(a->sess_key, 0, sizeof(a->sess_key));
957			memcpy(a->sess_key, last_dcinfo.sess_key, sizeof(last_dcinfo.sess_key));
958
959			a->seq_num = 0;
960
961			DEBUG(10,("schannel auth: domain [%s] myname [%s]\n",
962				  neg.domain, neg.myname));
963
964		} else {
965			DEBUG(0,("api_pipe_bind_req: unknown auth type %x requested.\n",
966				 auth_info.auth_type ));
967			return False;
968		}
969	}
970
971	switch(p->hdr.pkt_type) {
972		case RPC_BIND:
973			/* name has to be \PIPE\xxxxx */
974			fstrcpy(ack_pipe_name, "\\PIPE\\");
975			fstrcat(ack_pipe_name, p->pipe_srv_name);
976			reply_pkt_type = RPC_BINDACK;
977			break;
978		case RPC_ALTCONT:
979			/* secondary address CAN be NULL
980			 * as the specs say it's ignored.
981			 * It MUST NULL to have the spoolss working.
982			 */
983			fstrcpy(ack_pipe_name,"");
984			reply_pkt_type = RPC_ALTCONTRESP;
985			break;
986		default:
987			return False;
988	}
989
990	DEBUG(5,("api_pipe_bind_req: make response. %d\n", __LINE__));
991
992	/*
993	 * Marshall directly into the outgoing PDU space. We
994	 * must do this as we need to set to the bind response
995	 * header and are never sending more than one PDU here.
996	 */
997
998	prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
999	prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
1000
1001	/*
1002	 * Setup the memory to marshall the ba header, and the
1003	 * auth footers.
1004	 */
1005
1006	if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) {
1007		DEBUG(0,("api_pipe_bind_req: malloc out_hdr_ba failed.\n"));
1008		prs_mem_free(&outgoing_rpc);
1009		return False;
1010	}
1011
1012	if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) {
1013		DEBUG(0,("pi_pipe_bind_req: malloc out_auth failed.\n"));
1014		prs_mem_free(&outgoing_rpc);
1015		prs_mem_free(&out_hdr_ba);
1016		return False;
1017	}
1018
1019	if (p->ntlmssp_auth_requested)
1020		assoc_gid = 0x7a77;
1021	else
1022		assoc_gid = hdr_rb.bba.assoc_gid ? hdr_rb.bba.assoc_gid : 0x53f0;
1023
1024	/*
1025	 * Create the bind response struct.
1026	 */
1027
1028	/* If the requested abstract synt uuid doesn't match our client pipe,
1029		reject the bind_ack & set the transfer interface synt to all 0's,
1030		ver 0 (observed when NT5 attempts to bind to abstract interfaces
1031		unknown to NT4)
1032		Needed when adding entries to a DACL from NT5 - SK */
1033
1034	if(check_bind_req(p, &hdr_rb.abstract, &hdr_rb.transfer, hdr_rb.context_id ))
1035	{
1036		init_rpc_hdr_ba(&hdr_ba,
1037	                MAX_PDU_FRAG_LEN,
1038	                MAX_PDU_FRAG_LEN,
1039	                assoc_gid,
1040	                ack_pipe_name,
1041	                0x1, 0x0, 0x0,
1042	                &hdr_rb.transfer);
1043	} else {
1044		RPC_IFACE null_interface;
1045		ZERO_STRUCT(null_interface);
1046		/* Rejection reason: abstract syntax not supported */
1047		init_rpc_hdr_ba(&hdr_ba, MAX_PDU_FRAG_LEN,
1048					MAX_PDU_FRAG_LEN, assoc_gid,
1049					ack_pipe_name, 0x1, 0x2, 0x1,
1050					&null_interface);
1051	}
1052
1053	/*
1054	 * and marshall it.
1055	 */
1056
1057	if(!smb_io_rpc_hdr_ba("", &hdr_ba, &out_hdr_ba, 0)) {
1058		DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_BA failed.\n"));
1059		goto err_exit;
1060	}
1061
1062	/*
1063	 * Now the authentication.
1064	 */
1065
1066	if (p->ntlmssp_auth_requested) {
1067		RPC_AUTH_VERIFIER auth_verifier;
1068		RPC_AUTH_NTLMSSP_CHAL ntlmssp_chal;
1069
1070		generate_random_buffer(p->challenge, 8, False);
1071
1072		/*** Authentication info ***/
1073
1074		init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, RPC_PIPE_AUTH_SEAL_LEVEL, RPC_HDR_AUTH_LEN, 1);
1075		if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) {
1076			DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n"));
1077			goto err_exit;
1078		}
1079
1080		/*** NTLMSSP verifier ***/
1081
1082		init_rpc_auth_verifier(&auth_verifier, "NTLMSSP", NTLMSSP_CHALLENGE);
1083		if(!smb_io_rpc_auth_verifier("", &auth_verifier, &out_auth, 0)) {
1084			DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n"));
1085			goto err_exit;
1086		}
1087
1088		/* NTLMSSP challenge ***/
1089
1090		init_rpc_auth_ntlmssp_chal(&ntlmssp_chal, p->ntlmssp_chal_flags, p->challenge);
1091		if(!smb_io_rpc_auth_ntlmssp_chal("", &ntlmssp_chal, &out_auth, 0)) {
1092			DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_NTLMSSP_CHAL failed.\n"));
1093			goto err_exit;
1094		}
1095
1096		/* Auth len in the rpc header doesn't include auth_header. */
1097		auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
1098	}
1099
1100	if (p->netsec_auth_validated) {
1101		RPC_AUTH_VERIFIER auth_verifier;
1102		uint32 flags;
1103
1104		/* The client opens a second RPC NETLOGON pipe without
1105                   doing a auth2. The credentials for the schannel are
1106                   re-used from the auth2 the client did before. */
1107		p->dc = last_dcinfo;
1108
1109		init_rpc_hdr_auth(&auth_info, NETSEC_AUTH_TYPE, RPC_PIPE_AUTH_SEAL_LEVEL, RPC_HDR_AUTH_LEN, 1);
1110		if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) {
1111			DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n"));
1112			goto err_exit;
1113		}
1114
1115		/*** NETSEC verifier ***/
1116
1117		init_rpc_auth_verifier(&auth_verifier, "\001", 0x0);
1118		if(!smb_io_rpc_netsec_verifier("", &auth_verifier, &out_auth, 0)) {
1119			DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n"));
1120			goto err_exit;
1121		}
1122
1123		prs_align(&out_auth);
1124
1125		flags = 5;
1126		if(!prs_uint32("flags ", &out_auth, 0, &flags))
1127			goto err_exit;
1128
1129		auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
1130	}
1131
1132	/*
1133	 * Create the header, now we know the length.
1134	 */
1135
1136	init_rpc_hdr(&p->hdr, reply_pkt_type, RPC_FLG_FIRST | RPC_FLG_LAST,
1137			p->hdr.call_id,
1138			RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth),
1139			auth_len);
1140
1141	/*
1142	 * Marshall the header into the outgoing PDU.
1143	 */
1144
1145	if(!smb_io_rpc_hdr("", &p->hdr, &outgoing_rpc, 0)) {
1146		DEBUG(0,("pi_pipe_bind_req: marshalling of RPC_HDR failed.\n"));
1147		goto err_exit;
1148	}
1149
1150	/*
1151	 * Now add the RPC_HDR_BA and any auth needed.
1152	 */
1153
1154	if(!prs_append_prs_data( &outgoing_rpc, &out_hdr_ba)) {
1155		DEBUG(0,("api_pipe_bind_req: append of RPC_HDR_BA failed.\n"));
1156		goto err_exit;
1157	}
1158
1159	if((p->ntlmssp_auth_requested|p->netsec_auth_validated) &&
1160	   !prs_append_prs_data( &outgoing_rpc, &out_auth)) {
1161		DEBUG(0,("api_pipe_bind_req: append of auth info failed.\n"));
1162		goto err_exit;
1163	}
1164
1165	if(!p->ntlmssp_auth_requested)
1166		p->pipe_bound = True;
1167
1168	/*
1169	 * Setup the lengths for the initial reply.
1170	 */
1171
1172	p->out_data.data_sent_length = 0;
1173	p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
1174	p->out_data.current_pdu_sent = 0;
1175
1176	prs_mem_free(&out_hdr_ba);
1177	prs_mem_free(&out_auth);
1178
1179	return True;
1180
1181  err_exit:
1182
1183	prs_mem_free(&outgoing_rpc);
1184	prs_mem_free(&out_hdr_ba);
1185	prs_mem_free(&out_auth);
1186	return False;
1187}
1188
1189/****************************************************************************
1190 Deal with sign & seal processing on an RPC request.
1191****************************************************************************/
1192
1193BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in)
1194{
1195	/*
1196	 * We always negotiate the following two bits....
1197	 */
1198	BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0);
1199	BOOL auth_seal   = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0);
1200	int data_len;
1201	int auth_len;
1202	uint32 old_offset;
1203	uint32 crc32 = 0;
1204
1205	auth_len = p->hdr.auth_len;
1206
1207	if ((auth_len != RPC_AUTH_NTLMSSP_CHK_LEN) && auth_verify) {
1208		DEBUG(0,("api_pipe_auth_process: Incorrect auth_len %d.\n", auth_len ));
1209		return False;
1210	}
1211
1212	/*
1213	 * The following is that length of the data we must verify or unseal.
1214	 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
1215	 * preceeding the auth_data.
1216	 */
1217
1218	data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
1219			(auth_verify ? RPC_HDR_AUTH_LEN : 0) - auth_len;
1220
1221	DEBUG(5,("api_pipe_auth_process: sign: %s seal: %s data %d auth %d\n",
1222	         BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len, auth_len));
1223
1224	if (auth_seal) {
1225		/*
1226		 * The data in rpc_in doesn't contain the RPC_HEADER as this
1227		 * has already been consumed.
1228		 */
1229		char *data = prs_data_p(rpc_in) + RPC_HDR_REQ_LEN;
1230		dump_data_pw("NTLMSSP hash (v1)\n", p->ntlmssp_hash,
1231			     sizeof(p->ntlmssp_hash));
1232
1233		dump_data_pw("Incoming RPC PDU (NTLMSSP sealed)\n",
1234			     (const unsigned char *)data, data_len);
1235		NTLMSSPcalc_p(p, (uchar*)data, data_len);
1236		dump_data_pw("Incoming RPC PDU (NTLMSSP unsealed)\n",
1237			     (const unsigned char *)data, data_len);
1238		crc32 = crc32_calc_buffer(data, data_len);
1239	}
1240
1241	old_offset = prs_offset(rpc_in);
1242
1243	if (auth_seal || auth_verify) {
1244		RPC_HDR_AUTH auth_info;
1245
1246		if(!prs_set_offset(rpc_in, old_offset + data_len)) {
1247			DEBUG(0,("api_pipe_auth_process: cannot move offset to %u.\n",
1248				(unsigned int)old_offset + data_len ));
1249			return False;
1250		}
1251
1252		if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
1253			DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_HDR_AUTH.\n"));
1254			return False;
1255		}
1256	}
1257
1258	if (auth_verify) {
1259		RPC_AUTH_NTLMSSP_CHK ntlmssp_chk;
1260		char *req_data = prs_data_p(rpc_in) + prs_offset(rpc_in) + 4;
1261
1262		DEBUG(5,("api_pipe_auth_process: auth %d\n", prs_offset(rpc_in) + 4));
1263
1264		/*
1265		 * Ensure we have RPC_AUTH_NTLMSSP_CHK_LEN - 4 more bytes in the
1266		 * incoming buffer.
1267		 */
1268		if(prs_mem_get(rpc_in, RPC_AUTH_NTLMSSP_CHK_LEN - 4) == NULL) {
1269			DEBUG(0,("api_pipe_auth_process: missing %d bytes in buffer.\n",
1270				RPC_AUTH_NTLMSSP_CHK_LEN - 4 ));
1271			return False;
1272		}
1273
1274		NTLMSSPcalc_p(p, (uchar*)req_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4);
1275		if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, rpc_in, 0)) {
1276			DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_AUTH_NTLMSSP_CHK.\n"));
1277			return False;
1278		}
1279
1280		if (!rpc_auth_ntlmssp_chk(&ntlmssp_chk, crc32, p->ntlmssp_seq_num)) {
1281			DEBUG(0,("api_pipe_auth_process: NTLMSSP check failed.\n"));
1282			return False;
1283		}
1284	}
1285
1286	/*
1287	 * Return the current pointer to the data offset.
1288	 */
1289
1290	if(!prs_set_offset(rpc_in, old_offset)) {
1291		DEBUG(0,("api_pipe_auth_process: failed to set offset back to %u\n",
1292			(unsigned int)old_offset ));
1293		return False;
1294	}
1295
1296	return True;
1297}
1298
1299/****************************************************************************
1300 Deal with schannel processing on an RPC request.
1301****************************************************************************/
1302BOOL api_pipe_netsec_process(pipes_struct *p, prs_struct *rpc_in)
1303{
1304	/*
1305	 * We always negotiate the following two bits....
1306	 */
1307	int data_len;
1308	int auth_len;
1309	uint32 old_offset;
1310	RPC_HDR_AUTH auth_info;
1311	RPC_AUTH_NETSEC_CHK netsec_chk;
1312
1313
1314	auth_len = p->hdr.auth_len;
1315
1316	if (auth_len != RPC_AUTH_NETSEC_CHK_LEN) {
1317		DEBUG(0,("Incorrect auth_len %d.\n", auth_len ));
1318		return False;
1319	}
1320
1321	/*
1322	 * The following is that length of the data we must verify or unseal.
1323	 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
1324	 * preceeding the auth_data.
1325	 */
1326
1327	data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
1328		RPC_HDR_AUTH_LEN - auth_len;
1329
1330	DEBUG(5,("data %d auth %d\n", data_len, auth_len));
1331
1332	old_offset = prs_offset(rpc_in);
1333
1334	if(!prs_set_offset(rpc_in, old_offset + data_len)) {
1335		DEBUG(0,("cannot move offset to %u.\n",
1336			 (unsigned int)old_offset + data_len ));
1337		return False;
1338	}
1339
1340	if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
1341		DEBUG(0,("failed to unmarshall RPC_HDR_AUTH.\n"));
1342		return False;
1343	}
1344
1345	if (auth_info.auth_type != NETSEC_AUTH_TYPE) {
1346		DEBUG(0,("Invalid auth info %d on schannel\n",
1347			 auth_info.auth_type));
1348		return False;
1349	}
1350
1351	if (auth_info.auth_level == RPC_PIPE_AUTH_SEAL_LEVEL) {
1352		p->netsec_auth.auth_flags = AUTH_PIPE_NETSEC|AUTH_PIPE_SIGN|AUTH_PIPE_SEAL;
1353	} else if (auth_info.auth_level == RPC_PIPE_AUTH_SIGN_LEVEL) {
1354		p->netsec_auth.auth_flags = AUTH_PIPE_NETSEC|AUTH_PIPE_SIGN;
1355	} else {
1356		DEBUG(0,("Invalid auth level %d on schannel\n",
1357			 auth_info.auth_level));
1358		return False;
1359	}
1360
1361	if(!smb_io_rpc_auth_netsec_chk("", &netsec_chk, rpc_in, 0)) {
1362		DEBUG(0,("failed to unmarshal RPC_AUTH_NETSEC_CHK.\n"));
1363		return False;
1364	}
1365
1366	if (!netsec_decode(&p->netsec_auth,
1367			   p->netsec_auth.auth_flags,
1368			   SENDER_IS_INITIATOR,
1369			   &netsec_chk,
1370			   prs_data_p(rpc_in)+old_offset, data_len)) {
1371		DEBUG(0,("failed to decode PDU\n"));
1372		return False;
1373	}
1374
1375	/*
1376	 * Return the current pointer to the data offset.
1377	 */
1378
1379	if(!prs_set_offset(rpc_in, old_offset)) {
1380		DEBUG(0,("failed to set offset back to %u\n",
1381			 (unsigned int)old_offset ));
1382		return False;
1383	}
1384
1385	/* The sequence number gets incremented on both send and receive. */
1386	p->netsec_auth.seq_num++;
1387
1388	return True;
1389}
1390
1391/****************************************************************************
1392 Return a user struct for a pipe user.
1393****************************************************************************/
1394
1395struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
1396{
1397	if (p->ntlmssp_auth_validated) {
1398		memcpy(user, &p->pipe_user, sizeof(struct current_user));
1399	} else {
1400		extern struct current_user current_user;
1401		memcpy(user, &current_user, sizeof(struct current_user));
1402	}
1403
1404	return user;
1405}
1406
1407/****************************************************************************
1408 Find the set of RPC functions associated with this context_id
1409****************************************************************************/
1410
1411static PIPE_RPC_FNS* find_pipe_fns_by_context( PIPE_RPC_FNS *list, uint32 context_id )
1412{
1413	PIPE_RPC_FNS *fns = NULL;
1414	PIPE_RPC_FNS *tmp = NULL;
1415
1416	if ( !list ) {
1417		DEBUG(0,("find_pipe_fns_by_context: ERROR!  No context list for pipe!\n"));
1418		return NULL;
1419	}
1420
1421	for (tmp=list; tmp; tmp=tmp->next ) {
1422		if ( tmp->context_id == context_id )
1423			break;
1424	}
1425
1426	fns = tmp;
1427
1428	return fns;
1429}
1430
1431/****************************************************************************
1432 memory cleanup
1433****************************************************************************/
1434
1435void free_pipe_rpc_context( PIPE_RPC_FNS *list )
1436{
1437	PIPE_RPC_FNS *tmp = list;
1438	PIPE_RPC_FNS *tmp2;
1439
1440	while (tmp) {
1441		tmp2 = tmp->next;
1442		SAFE_FREE(tmp);
1443		tmp = tmp2;
1444	}
1445
1446	return;
1447}
1448
1449/****************************************************************************
1450 Find the correct RPC function to call for this request.
1451 If the pipe is authenticated then become the correct UNIX user
1452 before doing the call.
1453****************************************************************************/
1454
1455BOOL api_pipe_request(pipes_struct *p)
1456{
1457	BOOL ret = False;
1458	PIPE_RPC_FNS *pipe_fns;
1459
1460	if (p->ntlmssp_auth_validated) {
1461
1462		if(!become_authenticated_pipe_user(p)) {
1463			prs_mem_free(&p->out_data.rdata);
1464			return False;
1465		}
1466	}
1467
1468	DEBUG(5, ("Requested \\PIPE\\%s\n", p->name));
1469
1470	/* get the set of RPC functions for this context */
1471
1472	pipe_fns = find_pipe_fns_by_context(p->contexts, p->hdr_req.context_id);
1473
1474	if ( pipe_fns ) {
1475		set_current_rpc_talloc(p->mem_ctx);
1476		ret = api_rpcTNP(p, p->name, pipe_fns->cmds, pipe_fns->n_cmds);
1477		set_current_rpc_talloc(NULL);
1478	}
1479	else {
1480		DEBUG(0,("api_pipe_request: No rpc function table associated with context [%d] on pipe [%s]\n",
1481			p->hdr_req.context_id, p->name));
1482	}
1483
1484	if(p->ntlmssp_auth_validated)
1485		unbecome_authenticated_pipe_user();
1486
1487	return ret;
1488}
1489
1490/*******************************************************************
1491 Calls the underlying RPC function for a named pipe.
1492 ********************************************************************/
1493
1494BOOL api_rpcTNP(pipes_struct *p, const char *rpc_name,
1495		const struct api_struct *api_rpc_cmds, int n_cmds)
1496{
1497	int fn_num;
1498	fstring name;
1499	uint32 offset1, offset2;
1500
1501	/* interpret the command */
1502	DEBUG(4,("api_rpcTNP: %s op 0x%x - ", rpc_name, p->hdr_req.opnum));
1503
1504	slprintf(name, sizeof(name)-1, "in_%s", rpc_name);
1505	prs_dump(name, p->hdr_req.opnum, &p->in_data.data);
1506
1507	for (fn_num = 0; fn_num < n_cmds; fn_num++) {
1508		if (api_rpc_cmds[fn_num].opnum == p->hdr_req.opnum && api_rpc_cmds[fn_num].fn != NULL) {
1509			DEBUG(3,("api_rpcTNP: rpc command: %s\n", api_rpc_cmds[fn_num].name));
1510			break;
1511		}
1512	}
1513
1514	if (fn_num == n_cmds) {
1515		/*
1516		 * For an unknown RPC just return a fault PDU but
1517		 * return True to allow RPC's on the pipe to continue
1518		 * and not put the pipe into fault state. JRA.
1519		 */
1520		DEBUG(4, ("unknown\n"));
1521		setup_fault_pdu(p, NT_STATUS(0x1c010002));
1522		return True;
1523	}
1524
1525	offset1 = prs_offset(&p->out_data.rdata);
1526
1527        DEBUG(6, ("api_rpc_cmds[%d].fn == %p\n",
1528                fn_num, api_rpc_cmds[fn_num].fn));
1529	/* do the actual command */
1530	if(!api_rpc_cmds[fn_num].fn(p)) {
1531		DEBUG(0,("api_rpcTNP: %s: %s failed.\n", rpc_name, api_rpc_cmds[fn_num].name));
1532		prs_mem_free(&p->out_data.rdata);
1533		return False;
1534	}
1535
1536	if (p->bad_handle_fault_state) {
1537		DEBUG(4,("api_rpcTNP: bad handle fault return.\n"));
1538		p->bad_handle_fault_state = False;
1539		setup_fault_pdu(p, NT_STATUS(0x1C00001A));
1540		return True;
1541	}
1542
1543	slprintf(name, sizeof(name)-1, "out_%s", rpc_name);
1544	offset2 = prs_offset(&p->out_data.rdata);
1545	prs_set_offset(&p->out_data.rdata, offset1);
1546	prs_dump(name, p->hdr_req.opnum, &p->out_data.rdata);
1547	prs_set_offset(&p->out_data.rdata, offset2);
1548
1549	DEBUG(5,("api_rpcTNP: called %s successfully\n", rpc_name));
1550
1551	/* Check for buffer underflow in rpc parsing */
1552
1553	if ((DEBUGLEVEL >= 10) &&
1554	    (prs_offset(&p->in_data.data) != prs_data_size(&p->in_data.data))) {
1555		size_t data_len = prs_data_size(&p->in_data.data) - prs_offset(&p->in_data.data);
1556		char *data;
1557
1558		data = malloc(data_len);
1559
1560		DEBUG(10, ("api_rpcTNP: rpc input buffer underflow (parse error?)\n"));
1561		if (data) {
1562			prs_uint8s(False, "", &p->in_data.data, 0, (unsigned char *)data, (uint32)data_len);
1563			SAFE_FREE(data);
1564		}
1565
1566	}
1567
1568	return True;
1569}
1570
1571/*******************************************************************
1572*******************************************************************/
1573
1574void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
1575{
1576	struct api_struct *cmds = NULL;
1577	int               n_cmds = 0;
1578
1579	switch ( idx ) {
1580		case PI_LSARPC:
1581			lsa_get_pipe_fns( &cmds, &n_cmds );
1582			break;
1583		case PI_LSARPC_DS:
1584			lsa_ds_get_pipe_fns( &cmds, &n_cmds );
1585			break;
1586		case PI_SAMR:
1587			samr_get_pipe_fns( &cmds, &n_cmds );
1588			break;
1589		case PI_NETLOGON:
1590			netlog_get_pipe_fns( &cmds, &n_cmds );
1591			break;
1592		case PI_SRVSVC:
1593			srvsvc_get_pipe_fns( &cmds, &n_cmds );
1594			break;
1595		case PI_WKSSVC:
1596			wkssvc_get_pipe_fns( &cmds, &n_cmds );
1597			break;
1598		case PI_WINREG:
1599			reg_get_pipe_fns( &cmds, &n_cmds );
1600			break;
1601		case PI_SPOOLSS:
1602			spoolss_get_pipe_fns( &cmds, &n_cmds );
1603			break;
1604		case PI_NETDFS:
1605			netdfs_get_pipe_fns( &cmds, &n_cmds );
1606			break;
1607#ifdef DEVELOPER
1608		case PI_ECHO:
1609			echo_get_pipe_fns( &cmds, &n_cmds );
1610			break;
1611#endif
1612		default:
1613			DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx));
1614	}
1615
1616	*fns = cmds;
1617	*n_fns = n_cmds;
1618
1619	return;
1620}
1621
1622
1623