r1643: syncing all changes from 3.0 and hopefully get 3.0.6rc2 out tomorrow
[Samba.git] / source / rpc_server / srv_pipe.c
blobbcf5eb533fd743afd567484386d451e57ab84c0d
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.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 /* 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.
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.
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...
37 * ... if you read the docs. or stare at packets for weeks on end.
41 #include "includes.h"
43 #undef DBGC_CLASS
44 #define DBGC_CLASS DBGC_RPC_SRV
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 **************************************************************/
51 struct dcinfo last_dcinfo;
53 static void NTLMSSPcalc_p( pipes_struct *p, unsigned char *data, int len)
55 unsigned char *hash = p->ntlmssp_hash;
56 unsigned char index_i = hash[256];
57 unsigned char index_j = hash[257];
58 int ind;
60 for( ind = 0; ind < len; ind++) {
61 unsigned char tc;
62 unsigned char t;
64 index_i++;
65 index_j += hash[index_i];
67 tc = hash[index_i];
68 hash[index_i] = hash[index_j];
69 hash[index_j] = tc;
71 t = hash[index_i] + hash[index_j];
72 data[ind] = data[ind] ^ hash[t];
75 hash[256] = index_i;
76 hash[257] = index_j;
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 ********************************************************************/
85 BOOL create_next_pdu(pipes_struct *p)
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 ss_padding_len = 0;
91 uint32 data_len;
92 uint32 data_space_available;
93 uint32 data_len_left;
94 prs_struct outgoing_pdu;
95 uint32 data_pos;
98 * If we're in the fault state, keep returning fault PDU's until
99 * the pipe gets closed. JRA.
102 if(p->fault_state) {
103 setup_fault_pdu(p, NT_STATUS(0x1c010002));
104 return True;
107 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
109 /* Change the incoming request header to a response. */
110 p->hdr.pkt_type = RPC_RESPONSE;
112 /* Set up rpc header flags. */
113 if (p->out_data.data_sent_length == 0) {
114 p->hdr.flags = RPC_FLG_FIRST;
115 } else {
116 p->hdr.flags = 0;
120 * Work out how much we can fit in a single PDU.
123 data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN;
124 if(p->ntlmssp_auth_validated) {
125 data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN);
126 } else if(p->netsec_auth_validated) {
127 data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN);
131 * The amount we send is the minimum of the available
132 * space and the amount left to send.
135 data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
138 * Ensure there really is data left to send.
141 if(!data_len_left) {
142 DEBUG(0,("create_next_pdu: no data left to send !\n"));
143 return False;
146 data_len = MIN(data_len_left, data_space_available);
149 * Set up the alloc hint. This should be the data left to
150 * send.
153 hdr_resp.alloc_hint = data_len_left;
156 * Work out if this PDU will be the last.
159 if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata)) {
160 p->hdr.flags |= RPC_FLG_LAST;
161 if ((auth_seal || auth_verify) && (data_len_left % 8)) {
162 ss_padding_len = 8 - (data_len_left % 8);
163 DEBUG(10,("create_next_pdu: adding sign/seal padding of %u\n",
164 ss_padding_len ));
169 * Set up the header lengths.
172 if (p->ntlmssp_auth_validated) {
173 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN +
174 data_len + ss_padding_len +
175 RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN;
176 p->hdr.auth_len = RPC_AUTH_NTLMSSP_CHK_LEN;
177 } else if (p->netsec_auth_validated) {
178 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN +
179 data_len + ss_padding_len +
180 RPC_HDR_AUTH_LEN + RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN;
181 p->hdr.auth_len = RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN;
182 } else {
183 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len;
184 p->hdr.auth_len = 0;
188 * Init the parse struct to point at the outgoing
189 * data.
192 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
193 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
195 /* Store the header in the data stream. */
196 if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) {
197 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR.\n"));
198 prs_mem_free(&outgoing_pdu);
199 return False;
202 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
203 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_RESP.\n"));
204 prs_mem_free(&outgoing_pdu);
205 return False;
208 /* Store the current offset. */
209 data_pos = prs_offset(&outgoing_pdu);
211 /* Copy the data into the PDU. */
213 if(!prs_append_some_prs_data(&outgoing_pdu, &p->out_data.rdata, p->out_data.data_sent_length, data_len)) {
214 DEBUG(0,("create_next_pdu: failed to copy %u bytes of data.\n", (unsigned int)data_len));
215 prs_mem_free(&outgoing_pdu);
216 return False;
219 /* Copy the sign/seal padding data. */
220 if (ss_padding_len) {
221 char pad[8];
222 memset(pad, '\0', 8);
223 if (!prs_copy_data_in(&outgoing_pdu, pad, ss_padding_len)) {
224 DEBUG(0,("create_next_pdu: failed to add %u bytes of pad data.\n", (unsigned int)ss_padding_len));
225 prs_mem_free(&outgoing_pdu);
226 return False;
230 if (p->ntlmssp_auth_validated) {
232 * NTLMSSP processing. Mutually exclusive with Schannel.
234 uint32 crc32 = 0;
235 char *data;
237 DEBUG(5,("create_next_pdu: sign: %s seal: %s data %d auth %d\n",
238 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len + ss_padding_len, p->hdr.auth_len));
241 * Set data to point to where we copied the data into.
244 data = prs_data_p(&outgoing_pdu) + data_pos;
246 if (auth_seal) {
247 crc32 = crc32_calc_buffer(data, data_len + ss_padding_len);
248 NTLMSSPcalc_p(p, (uchar*)data, data_len + ss_padding_len);
251 if (auth_seal || auth_verify) {
252 RPC_HDR_AUTH auth_info;
254 init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE,
255 auth_seal ? RPC_PIPE_AUTH_SEAL_LEVEL : RPC_PIPE_AUTH_SIGN_LEVEL,
256 (auth_verify ? ss_padding_len : 0), (auth_verify ? 1 : 0));
257 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
258 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n"));
259 prs_mem_free(&outgoing_pdu);
260 return False;
264 if (auth_verify) {
265 RPC_AUTH_NTLMSSP_CHK ntlmssp_chk;
266 char *auth_data = prs_data_p(&outgoing_pdu);
268 p->ntlmssp_seq_num++;
269 init_rpc_auth_ntlmssp_chk(&ntlmssp_chk, NTLMSSP_SIGN_VERSION,
270 crc32, p->ntlmssp_seq_num++);
271 auth_data = prs_data_p(&outgoing_pdu) + prs_offset(&outgoing_pdu) + 4;
272 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, &outgoing_pdu, 0)) {
273 DEBUG(0,("create_next_pdu: failed to marshall RPC_AUTH_NTLMSSP_CHK.\n"));
274 prs_mem_free(&outgoing_pdu);
275 return False;
277 NTLMSSPcalc_p(p, (uchar*)auth_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4);
279 } else if (p->netsec_auth_validated) {
281 * Schannel processing. Mutually exclusive with NTLMSSP.
283 int auth_type, auth_level;
284 char *data;
285 RPC_HDR_AUTH auth_info;
287 RPC_AUTH_NETSEC_CHK verf;
288 prs_struct rverf;
289 prs_struct rauth;
291 data = prs_data_p(&outgoing_pdu) + data_pos;
292 /* Check it's the type of reply we were expecting to decode */
294 get_auth_type_level(p->netsec_auth.auth_flags, &auth_type, &auth_level);
295 init_rpc_hdr_auth(&auth_info, auth_type, auth_level,
296 ss_padding_len, 1);
298 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
299 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n"));
300 prs_mem_free(&outgoing_pdu);
301 return False;
304 prs_init(&rverf, 0, p->mem_ctx, MARSHALL);
305 prs_init(&rauth, 0, p->mem_ctx, MARSHALL);
307 netsec_encode(&p->netsec_auth,
308 p->netsec_auth.auth_flags,
309 SENDER_IS_ACCEPTOR,
310 &verf, data, data_len + ss_padding_len);
312 smb_io_rpc_auth_netsec_chk("", RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN,
313 &verf, &outgoing_pdu, 0);
315 p->netsec_auth.seq_num++;
319 * Setup the counts for this PDU.
322 p->out_data.data_sent_length += data_len;
323 p->out_data.current_pdu_len = p->hdr.frag_len;
324 p->out_data.current_pdu_sent = 0;
326 prs_mem_free(&outgoing_pdu);
327 return True;
330 /*******************************************************************
331 Process an NTLMSSP authentication response.
332 If this function succeeds, the user has been authenticated
333 and their domain, name and calling workstation stored in
334 the pipe struct.
335 The initial challenge is stored in p->challenge.
336 *******************************************************************/
338 static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlmssp_resp)
340 uchar lm_owf[24];
341 uchar nt_owf[128];
342 int nt_pw_len;
343 int lm_pw_len;
344 fstring user_name;
345 fstring domain;
346 fstring wks;
348 NTSTATUS nt_status;
350 struct auth_context *auth_context = NULL;
351 auth_usersupplied_info *user_info = NULL;
352 auth_serversupplied_info *server_info = NULL;
354 DEBUG(5,("api_pipe_ntlmssp_verify: checking user details\n"));
356 memset(p->user_name, '\0', sizeof(p->user_name));
357 memset(p->pipe_user_name, '\0', sizeof(p->pipe_user_name));
358 memset(p->domain, '\0', sizeof(p->domain));
359 memset(p->wks, '\0', sizeof(p->wks));
361 /* Set up for non-authenticated user. */
362 delete_nt_token(&p->pipe_user.nt_user_token);
363 p->pipe_user.ngroups = 0;
364 SAFE_FREE( p->pipe_user.groups);
367 * Setup an empty password for a guest user.
371 * We always negotiate UNICODE.
374 if (p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_UNICODE) {
375 rpcstr_pull(user_name, ntlmssp_resp->user, sizeof(fstring), ntlmssp_resp->hdr_usr.str_str_len*2, 0 );
376 rpcstr_pull(domain, ntlmssp_resp->domain, sizeof(fstring), ntlmssp_resp->hdr_domain.str_str_len*2, 0);
377 rpcstr_pull(wks, ntlmssp_resp->wks, sizeof(fstring), ntlmssp_resp->hdr_wks.str_str_len*2, 0);
378 } else {
379 pull_ascii_fstring(user_name, ntlmssp_resp->user);
380 pull_ascii_fstring(domain, ntlmssp_resp->domain);
381 pull_ascii_fstring(wks, ntlmssp_resp->wks);
384 DEBUG(5,("user: %s domain: %s wks: %s\n", user_name, domain, wks));
386 nt_pw_len = MIN(sizeof(nt_owf), ntlmssp_resp->hdr_nt_resp.str_str_len);
387 lm_pw_len = MIN(sizeof(lm_owf), ntlmssp_resp->hdr_lm_resp.str_str_len);
389 memcpy(lm_owf, ntlmssp_resp->lm_resp, sizeof(lm_owf));
390 memcpy(nt_owf, ntlmssp_resp->nt_resp, nt_pw_len);
392 #ifdef DEBUG_PASSWORD
393 DEBUG(100,("lm, nt owfs, chal\n"));
394 dump_data(100, (char *)lm_owf, sizeof(lm_owf));
395 dump_data(100, (char *)nt_owf, nt_pw_len);
396 dump_data(100, (char *)p->challenge, 8);
397 #endif
400 * Allow guest access. Patch from Shirish Kalele <kalele@veritas.com>.
403 if (*user_name) {
406 * Do the length checking only if user is not NULL.
409 if (ntlmssp_resp->hdr_lm_resp.str_str_len == 0)
410 return False;
411 if (ntlmssp_resp->hdr_nt_resp.str_str_len == 0)
412 return False;
413 if (ntlmssp_resp->hdr_usr.str_str_len == 0)
414 return False;
415 if (ntlmssp_resp->hdr_domain.str_str_len == 0)
416 return False;
417 if (ntlmssp_resp->hdr_wks.str_str_len == 0)
418 return False;
422 make_auth_context_fixed(&auth_context, (uchar*)p->challenge);
424 if (!make_user_info_netlogon_network(&user_info,
425 user_name, domain, wks,
426 lm_owf, lm_pw_len,
427 nt_owf, nt_pw_len)) {
428 DEBUG(0,("make_user_info_netlogon_network failed! Failing authenticaion.\n"));
429 return False;
432 nt_status = auth_context->check_ntlm_password(auth_context, user_info, &server_info);
434 (auth_context->free)(&auth_context);
435 free_user_info(&user_info);
437 p->ntlmssp_auth_validated = NT_STATUS_IS_OK(nt_status);
439 if (!p->ntlmssp_auth_validated) {
440 DEBUG(1,("api_pipe_ntlmssp_verify: User [%s]\\[%s] from machine %s \
441 failed authentication on named pipe %s.\n", domain, user_name, wks, p->name ));
442 free_server_info(&server_info);
443 return False;
447 * Set up the sign/seal data.
450 if (server_info->lm_session_key.length != 16) {
451 DEBUG(1,("api_pipe_ntlmssp_verify: User [%s]\\[%s] from machine %s \
452 succeeded authentication on named pipe %s, but session key was of incorrect length [%u].\n",
453 domain, user_name, wks, p->name, server_info->lm_session_key.length));
454 free_server_info(&server_info);
455 return False;
456 } else {
457 uchar p24[24];
458 NTLMSSPOWFencrypt(server_info->lm_session_key.data, lm_owf, p24);
460 unsigned char j = 0;
461 int ind;
463 unsigned char k2[8];
465 memcpy(k2, p24, 5);
466 k2[5] = 0xe5;
467 k2[6] = 0x38;
468 k2[7] = 0xb0;
470 for (ind = 0; ind < 256; ind++)
471 p->ntlmssp_hash[ind] = (unsigned char)ind;
473 for( ind = 0; ind < 256; ind++) {
474 unsigned char tc;
476 j += (p->ntlmssp_hash[ind] + k2[ind%8]);
478 tc = p->ntlmssp_hash[ind];
479 p->ntlmssp_hash[ind] = p->ntlmssp_hash[j];
480 p->ntlmssp_hash[j] = tc;
483 p->ntlmssp_hash[256] = 0;
484 p->ntlmssp_hash[257] = 0;
487 dump_data_pw("NTLMSSP hash (v1)\n", p->ntlmssp_hash,
488 sizeof(p->ntlmssp_hash));
490 /* NTLMSSPhash(p->ntlmssp_hash, p24); */
491 p->ntlmssp_seq_num = 0;
495 fstrcpy(p->user_name, user_name);
496 fstrcpy(p->pipe_user_name, server_info->unix_name);
497 fstrcpy(p->domain, domain);
498 fstrcpy(p->wks, wks);
501 * Store the UNIX credential data (uid/gid pair) in the pipe structure.
504 if (p->session_key.data) {
505 data_blob_free(&p->session_key);
507 p->session_key = data_blob(server_info->lm_session_key.data, server_info->lm_session_key.length);
509 p->pipe_user.uid = server_info->uid;
510 p->pipe_user.gid = server_info->gid;
512 p->pipe_user.ngroups = server_info->n_groups;
513 if (p->pipe_user.ngroups) {
514 if (!(p->pipe_user.groups = memdup(server_info->groups, sizeof(gid_t) * p->pipe_user.ngroups))) {
515 DEBUG(0,("failed to memdup group list to p->pipe_user.groups\n"));
516 free_server_info(&server_info);
517 return False;
521 if (server_info->ptok)
522 p->pipe_user.nt_user_token = dup_nt_token(server_info->ptok);
523 else {
524 DEBUG(1,("Error: Authmodule failed to provide nt_user_token\n"));
525 p->pipe_user.nt_user_token = NULL;
526 free_server_info(&server_info);
527 return False;
530 p->ntlmssp_auth_validated = True;
532 free_server_info(&server_info);
533 return True;
536 /*******************************************************************
537 The switch table for the pipe names and the functions to handle them.
538 *******************************************************************/
540 struct rpc_table
542 struct
544 const char *clnt;
545 const char *srv;
546 } pipe;
547 struct api_struct *cmds;
548 int n_cmds;
551 static struct rpc_table *rpc_lookup;
552 static int rpc_lookup_size;
554 /*******************************************************************
555 This is the client reply to our challenge for an authenticated
556 bind request. The challenge we sent is in p->challenge.
557 *******************************************************************/
559 BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p)
561 RPC_HDR_AUTHA autha_info;
562 RPC_AUTH_VERIFIER auth_verifier;
563 RPC_AUTH_NTLMSSP_RESP ntlmssp_resp;
565 DEBUG(5,("api_pipe_bind_auth_resp: decode request. %d\n", __LINE__));
567 if (p->hdr.auth_len == 0) {
568 DEBUG(0,("api_pipe_bind_auth_resp: No auth field sent !\n"));
569 return False;
573 * Decode the authentication verifier response.
576 if(!smb_io_rpc_hdr_autha("", &autha_info, rpc_in_p, 0)) {
577 DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_HDR_AUTHA failed.\n"));
578 return False;
581 if (autha_info.auth_type != NTLMSSP_AUTH_TYPE || autha_info.auth_level != RPC_PIPE_AUTH_SEAL_LEVEL) {
582 DEBUG(0,("api_pipe_bind_auth_resp: incorrect auth type (%d) or level (%d).\n",
583 (int)autha_info.auth_type, (int)autha_info.auth_level ));
584 return False;
587 if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) {
588 DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_AUTH_VERIFIER failed.\n"));
589 return False;
593 * Ensure this is a NTLMSSP_AUTH packet type.
596 if (!rpc_auth_verifier_chk(&auth_verifier, "NTLMSSP", NTLMSSP_AUTH)) {
597 DEBUG(0,("api_pipe_bind_auth_resp: rpc_auth_verifier_chk failed.\n"));
598 return False;
601 if(!smb_io_rpc_auth_ntlmssp_resp("", &ntlmssp_resp, rpc_in_p, 0)) {
602 DEBUG(0,("api_pipe_bind_auth_resp: Failed to unmarshall RPC_AUTH_NTLMSSP_RESP.\n"));
603 return False;
607 * The following call actually checks the challenge/response data.
608 * for correctness against the given DOMAIN\user name.
611 if (!api_pipe_ntlmssp_verify(p, &ntlmssp_resp))
612 return False;
614 p->pipe_bound = True
616 return True;
619 /*******************************************************************
620 Marshall a bind_nak pdu.
621 *******************************************************************/
623 static BOOL setup_bind_nak(pipes_struct *p)
625 prs_struct outgoing_rpc;
626 RPC_HDR nak_hdr;
627 uint16 zero = 0;
629 /* Free any memory in the current return data buffer. */
630 prs_mem_free(&p->out_data.rdata);
633 * Marshall directly into the outgoing PDU space. We
634 * must do this as we need to set to the bind response
635 * header and are never sending more than one PDU here.
638 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
639 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
643 * Initialize a bind_nak header.
646 init_rpc_hdr(&nak_hdr, RPC_BINDNACK, RPC_FLG_FIRST | RPC_FLG_LAST,
647 p->hdr.call_id, RPC_HEADER_LEN + sizeof(uint16), 0);
650 * Marshall the header into the outgoing PDU.
653 if(!smb_io_rpc_hdr("", &nak_hdr, &outgoing_rpc, 0)) {
654 DEBUG(0,("setup_bind_nak: marshalling of RPC_HDR failed.\n"));
655 prs_mem_free(&outgoing_rpc);
656 return False;
660 * Now add the reject reason.
663 if(!prs_uint16("reject code", &outgoing_rpc, 0, &zero)) {
664 prs_mem_free(&outgoing_rpc);
665 return False;
668 p->out_data.data_sent_length = 0;
669 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
670 p->out_data.current_pdu_sent = 0;
672 p->pipe_bound = False;
674 return True;
677 /*******************************************************************
678 Marshall a fault pdu.
679 *******************************************************************/
681 BOOL setup_fault_pdu(pipes_struct *p, NTSTATUS status)
683 prs_struct outgoing_pdu;
684 RPC_HDR fault_hdr;
685 RPC_HDR_RESP hdr_resp;
686 RPC_HDR_FAULT fault_resp;
688 /* Free any memory in the current return data buffer. */
689 prs_mem_free(&p->out_data.rdata);
692 * Marshall directly into the outgoing PDU space. We
693 * must do this as we need to set to the bind response
694 * header and are never sending more than one PDU here.
697 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
698 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
701 * Initialize a fault header.
704 init_rpc_hdr(&fault_hdr, RPC_FAULT, RPC_FLG_FIRST | RPC_FLG_LAST | RPC_FLG_NOCALL,
705 p->hdr.call_id, RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN, 0);
708 * Initialize the HDR_RESP and FAULT parts of the PDU.
711 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
713 fault_resp.status = status;
714 fault_resp.reserved = 0;
717 * Marshall the header into the outgoing PDU.
720 if(!smb_io_rpc_hdr("", &fault_hdr, &outgoing_pdu, 0)) {
721 DEBUG(0,("setup_fault_pdu: marshalling of RPC_HDR failed.\n"));
722 prs_mem_free(&outgoing_pdu);
723 return False;
726 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
727 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_RESP.\n"));
728 prs_mem_free(&outgoing_pdu);
729 return False;
732 if(!smb_io_rpc_hdr_fault("fault", &fault_resp, &outgoing_pdu, 0)) {
733 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_FAULT.\n"));
734 prs_mem_free(&outgoing_pdu);
735 return False;
738 p->out_data.data_sent_length = 0;
739 p->out_data.current_pdu_len = prs_offset(&outgoing_pdu);
740 p->out_data.current_pdu_sent = 0;
742 prs_mem_free(&outgoing_pdu);
743 return True;
746 /*******************************************************************
747 Ensure a bind request has the correct abstract & transfer interface.
748 Used to reject unknown binds from Win2k.
749 *******************************************************************/
751 BOOL check_bind_req(struct pipes_struct *p, RPC_IFACE* abstract,
752 RPC_IFACE* transfer, uint32 context_id)
754 extern struct pipe_id_info pipe_names[];
755 char *pipe_name = p->name;
756 int i=0;
757 fstring pname;
759 fstrcpy(pname,"\\PIPE\\");
760 fstrcat(pname,pipe_name);
762 DEBUG(3,("check_bind_req for %s\n", pname));
764 /* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */
766 for ( i=0; pipe_names[i].client_pipe; i++ )
768 if ( strequal(pipe_names[i].client_pipe, pname)
769 && (abstract->version == pipe_names[i].abstr_syntax.version)
770 && (memcmp(&abstract->uuid, &pipe_names[i].abstr_syntax.uuid, sizeof(struct uuid)) == 0)
771 && (transfer->version == pipe_names[i].trans_syntax.version)
772 && (memcmp(&transfer->uuid, &pipe_names[i].trans_syntax.uuid, sizeof(struct uuid)) == 0) )
774 struct api_struct *fns = NULL;
775 int n_fns = 0;
776 PIPE_RPC_FNS *context_fns;
778 if ( !(context_fns = malloc(sizeof(PIPE_RPC_FNS))) ) {
779 DEBUG(0,("check_bind_req: malloc() failed!\n"));
780 return False;
783 /* save the RPC function table associated with this bind */
785 get_pipe_fns(i, &fns, &n_fns);
787 context_fns->cmds = fns;
788 context_fns->n_cmds = n_fns;
789 context_fns->context_id = context_id;
791 /* add to the list of open contexts */
793 DLIST_ADD( p->contexts, context_fns );
795 break;
799 if(pipe_names[i].client_pipe == NULL)
800 return False;
802 return True;
805 /*******************************************************************
806 Register commands to an RPC pipe
807 *******************************************************************/
808 NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size)
810 struct rpc_table *rpc_entry;
812 if (!clnt || !srv || !cmds) {
813 return NT_STATUS_INVALID_PARAMETER;
816 if (version != SMB_RPC_INTERFACE_VERSION) {
817 DEBUG(0,("Can't register rpc commands!\n"
818 "You tried to register a rpc module with SMB_RPC_INTERFACE_VERSION %d"
819 ", while this version of samba uses version %d!\n",
820 version,SMB_RPC_INTERFACE_VERSION));
821 return NT_STATUS_OBJECT_TYPE_MISMATCH;
824 /* TODO:
826 * we still need to make sure that don't register the same commands twice!!!
828 * --metze
831 /* We use a temporary variable because this call can fail and
832 rpc_lookup will still be valid afterwards. It could then succeed if
833 called again later */
834 rpc_entry = realloc(rpc_lookup,
835 ++rpc_lookup_size*sizeof(struct rpc_table));
836 if (NULL == rpc_entry) {
837 rpc_lookup_size--;
838 DEBUG(0, ("rpc_pipe_register_commands: memory allocation failed\n"));
839 return NT_STATUS_NO_MEMORY;
840 } else {
841 rpc_lookup = rpc_entry;
844 rpc_entry = rpc_lookup + (rpc_lookup_size - 1);
845 ZERO_STRUCTP(rpc_entry);
846 rpc_entry->pipe.clnt = strdup(clnt);
847 rpc_entry->pipe.srv = strdup(srv);
848 rpc_entry->cmds = realloc(rpc_entry->cmds,
849 (rpc_entry->n_cmds + size) *
850 sizeof(struct api_struct));
851 memcpy(rpc_entry->cmds + rpc_entry->n_cmds, cmds,
852 size * sizeof(struct api_struct));
853 rpc_entry->n_cmds += size;
855 return NT_STATUS_OK;
858 /*******************************************************************
859 Respond to a pipe bind request.
860 *******************************************************************/
862 BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
864 RPC_HDR_BA hdr_ba;
865 RPC_HDR_RB hdr_rb;
866 RPC_HDR_AUTH auth_info;
867 uint16 assoc_gid;
868 fstring ack_pipe_name;
869 prs_struct out_hdr_ba;
870 prs_struct out_auth;
871 prs_struct outgoing_rpc;
872 int i = 0;
873 int auth_len = 0;
874 enum RPC_PKT_TYPE reply_pkt_type;
876 p->ntlmssp_auth_requested = False;
877 p->netsec_auth_validated = False;
879 DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__));
882 * Try and find the correct pipe name to ensure
883 * that this is a pipe name we support.
887 for (i = 0; i < rpc_lookup_size; i++) {
888 if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
889 DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
890 rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
891 fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
892 break;
896 if (i == rpc_lookup_size) {
897 if (NT_STATUS_IS_ERR(smb_probe_module("rpc", p->name))) {
898 DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n",
899 p->name ));
900 if(!setup_bind_nak(p))
901 return False;
902 return True;
905 for (i = 0; i < rpc_lookup_size; i++) {
906 if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
907 DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
908 rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
909 fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
910 break;
914 if (i == rpc_lookup_size) {
915 DEBUG(0, ("module %s doesn't provide functions for pipe %s!\n", p->name, p->name));
916 return False;
920 /* decode the bind request */
921 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_in_p, 0)) {
922 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_RB struct.\n"));
923 return False;
927 * Check if this is an authenticated request.
930 if (p->hdr.auth_len != 0) {
931 RPC_AUTH_VERIFIER auth_verifier;
932 RPC_AUTH_NTLMSSP_NEG ntlmssp_neg;
935 * Decode the authentication verifier.
938 if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) {
939 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_AUTH struct.\n"));
940 return False;
943 if(auth_info.auth_type == NTLMSSP_AUTH_TYPE) {
945 if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) {
946 DEBUG(0,("api_pipe_bind_req: unable to "
947 "unmarshall RPC_HDR_AUTH struct.\n"));
948 return False;
951 if(!strequal(auth_verifier.signature, "NTLMSSP")) {
952 DEBUG(0,("api_pipe_bind_req: "
953 "auth_verifier.signature != NTLMSSP\n"));
954 return False;
957 if(auth_verifier.msg_type != NTLMSSP_NEGOTIATE) {
958 DEBUG(0,("api_pipe_bind_req: "
959 "auth_verifier.msg_type (%d) != NTLMSSP_NEGOTIATE\n",
960 auth_verifier.msg_type));
961 return False;
964 if(!smb_io_rpc_auth_ntlmssp_neg("", &ntlmssp_neg, rpc_in_p, 0)) {
965 DEBUG(0,("api_pipe_bind_req: "
966 "Failed to unmarshall RPC_AUTH_NTLMSSP_NEG.\n"));
967 return False;
970 p->ntlmssp_chal_flags = SMBD_NTLMSSP_NEG_FLAGS;
971 p->ntlmssp_auth_requested = True;
973 } else if (auth_info.auth_type == NETSEC_AUTH_TYPE) {
975 RPC_AUTH_NETSEC_NEG neg;
976 struct netsec_auth_struct *a = &(p->netsec_auth);
978 if (!smb_io_rpc_auth_netsec_neg("", &neg, rpc_in_p, 0)) {
979 DEBUG(0,("api_pipe_bind_req: "
980 "Could not unmarshal SCHANNEL auth neg\n"));
981 return False;
984 p->netsec_auth_validated = True;
986 memset(a->sess_key, 0, sizeof(a->sess_key));
987 memcpy(a->sess_key, last_dcinfo.sess_key, sizeof(last_dcinfo.sess_key));
989 a->seq_num = 0;
991 DEBUG(10,("schannel auth: domain [%s] myname [%s]\n",
992 neg.domain, neg.myname));
994 } else {
995 DEBUG(0,("api_pipe_bind_req: unknown auth type %x requested.\n",
996 auth_info.auth_type ));
997 return False;
1001 switch(p->hdr.pkt_type) {
1002 case RPC_BIND:
1003 /* name has to be \PIPE\xxxxx */
1004 fstrcpy(ack_pipe_name, "\\PIPE\\");
1005 fstrcat(ack_pipe_name, p->pipe_srv_name);
1006 reply_pkt_type = RPC_BINDACK;
1007 break;
1008 case RPC_ALTCONT:
1009 /* secondary address CAN be NULL
1010 * as the specs say it's ignored.
1011 * It MUST NULL to have the spoolss working.
1013 fstrcpy(ack_pipe_name,"");
1014 reply_pkt_type = RPC_ALTCONTRESP;
1015 break;
1016 default:
1017 return False;
1020 DEBUG(5,("api_pipe_bind_req: make response. %d\n", __LINE__));
1023 * Marshall directly into the outgoing PDU space. We
1024 * must do this as we need to set to the bind response
1025 * header and are never sending more than one PDU here.
1028 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
1029 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
1032 * Setup the memory to marshall the ba header, and the
1033 * auth footers.
1036 if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) {
1037 DEBUG(0,("api_pipe_bind_req: malloc out_hdr_ba failed.\n"));
1038 prs_mem_free(&outgoing_rpc);
1039 return False;
1042 if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) {
1043 DEBUG(0,("pi_pipe_bind_req: malloc out_auth failed.\n"));
1044 prs_mem_free(&outgoing_rpc);
1045 prs_mem_free(&out_hdr_ba);
1046 return False;
1049 if (p->ntlmssp_auth_requested)
1050 assoc_gid = 0x7a77;
1051 else
1052 assoc_gid = hdr_rb.bba.assoc_gid ? hdr_rb.bba.assoc_gid : 0x53f0;
1055 * Create the bind response struct.
1058 /* If the requested abstract synt uuid doesn't match our client pipe,
1059 reject the bind_ack & set the transfer interface synt to all 0's,
1060 ver 0 (observed when NT5 attempts to bind to abstract interfaces
1061 unknown to NT4)
1062 Needed when adding entries to a DACL from NT5 - SK */
1064 if(check_bind_req(p, &hdr_rb.abstract, &hdr_rb.transfer, hdr_rb.context_id ))
1066 init_rpc_hdr_ba(&hdr_ba,
1067 MAX_PDU_FRAG_LEN,
1068 MAX_PDU_FRAG_LEN,
1069 assoc_gid,
1070 ack_pipe_name,
1071 0x1, 0x0, 0x0,
1072 &hdr_rb.transfer);
1073 } else {
1074 RPC_IFACE null_interface;
1075 ZERO_STRUCT(null_interface);
1076 /* Rejection reason: abstract syntax not supported */
1077 init_rpc_hdr_ba(&hdr_ba, MAX_PDU_FRAG_LEN,
1078 MAX_PDU_FRAG_LEN, assoc_gid,
1079 ack_pipe_name, 0x1, 0x2, 0x1,
1080 &null_interface);
1084 * and marshall it.
1087 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &out_hdr_ba, 0)) {
1088 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_BA failed.\n"));
1089 goto err_exit;
1093 * Now the authentication.
1096 if (p->ntlmssp_auth_requested) {
1097 RPC_AUTH_VERIFIER auth_verifier;
1098 RPC_AUTH_NTLMSSP_CHAL ntlmssp_chal;
1100 generate_random_buffer(p->challenge, 8);
1102 /*** Authentication info ***/
1104 init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, RPC_PIPE_AUTH_SEAL_LEVEL, RPC_HDR_AUTH_LEN, 1);
1105 if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) {
1106 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n"));
1107 goto err_exit;
1110 /*** NTLMSSP verifier ***/
1112 init_rpc_auth_verifier(&auth_verifier, "NTLMSSP", NTLMSSP_CHALLENGE);
1113 if(!smb_io_rpc_auth_verifier("", &auth_verifier, &out_auth, 0)) {
1114 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n"));
1115 goto err_exit;
1118 /* NTLMSSP challenge ***/
1120 init_rpc_auth_ntlmssp_chal(&ntlmssp_chal, p->ntlmssp_chal_flags, p->challenge);
1121 if(!smb_io_rpc_auth_ntlmssp_chal("", &ntlmssp_chal, &out_auth, 0)) {
1122 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_NTLMSSP_CHAL failed.\n"));
1123 goto err_exit;
1126 /* Auth len in the rpc header doesn't include auth_header. */
1127 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
1130 if (p->netsec_auth_validated) {
1131 RPC_AUTH_VERIFIER auth_verifier;
1132 uint32 flags;
1134 /* The client opens a second RPC NETLOGON pipe without
1135 doing a auth2. The credentials for the schannel are
1136 re-used from the auth2 the client did before. */
1137 p->dc = last_dcinfo;
1139 init_rpc_hdr_auth(&auth_info, NETSEC_AUTH_TYPE, auth_info.auth_level, RPC_HDR_AUTH_LEN, 1);
1140 if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) {
1141 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n"));
1142 goto err_exit;
1145 /*** NETSEC verifier ***/
1147 init_rpc_auth_verifier(&auth_verifier, "\001", 0x0);
1148 if(!smb_io_rpc_netsec_verifier("", &auth_verifier, &out_auth, 0)) {
1149 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n"));
1150 goto err_exit;
1153 prs_align(&out_auth);
1155 flags = 5;
1156 if(!prs_uint32("flags ", &out_auth, 0, &flags))
1157 goto err_exit;
1159 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
1163 * Create the header, now we know the length.
1166 init_rpc_hdr(&p->hdr, reply_pkt_type, RPC_FLG_FIRST | RPC_FLG_LAST,
1167 p->hdr.call_id,
1168 RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth),
1169 auth_len);
1172 * Marshall the header into the outgoing PDU.
1175 if(!smb_io_rpc_hdr("", &p->hdr, &outgoing_rpc, 0)) {
1176 DEBUG(0,("pi_pipe_bind_req: marshalling of RPC_HDR failed.\n"));
1177 goto err_exit;
1181 * Now add the RPC_HDR_BA and any auth needed.
1184 if(!prs_append_prs_data( &outgoing_rpc, &out_hdr_ba)) {
1185 DEBUG(0,("api_pipe_bind_req: append of RPC_HDR_BA failed.\n"));
1186 goto err_exit;
1189 if((p->ntlmssp_auth_requested|p->netsec_auth_validated) &&
1190 !prs_append_prs_data( &outgoing_rpc, &out_auth)) {
1191 DEBUG(0,("api_pipe_bind_req: append of auth info failed.\n"));
1192 goto err_exit;
1195 if(!p->ntlmssp_auth_requested)
1196 p->pipe_bound = True;
1199 * Setup the lengths for the initial reply.
1202 p->out_data.data_sent_length = 0;
1203 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
1204 p->out_data.current_pdu_sent = 0;
1206 prs_mem_free(&out_hdr_ba);
1207 prs_mem_free(&out_auth);
1209 return True;
1211 err_exit:
1213 prs_mem_free(&outgoing_rpc);
1214 prs_mem_free(&out_hdr_ba);
1215 prs_mem_free(&out_auth);
1216 return False;
1219 /****************************************************************************
1220 Deal with sign & seal processing on an RPC request.
1221 ****************************************************************************/
1223 BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in)
1226 * We always negotiate the following two bits....
1228 BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0);
1229 BOOL auth_seal = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0);
1230 int data_len;
1231 int auth_len;
1232 uint32 old_offset;
1233 uint32 crc32 = 0;
1235 auth_len = p->hdr.auth_len;
1237 if ((auth_len != RPC_AUTH_NTLMSSP_CHK_LEN) && auth_verify) {
1238 DEBUG(0,("api_pipe_auth_process: Incorrect auth_len %d.\n", auth_len ));
1239 return False;
1243 * The following is that length of the data we must verify or unseal.
1244 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
1245 * preceeding the auth_data.
1248 data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
1249 (auth_verify ? RPC_HDR_AUTH_LEN : 0) - auth_len;
1251 DEBUG(5,("api_pipe_auth_process: sign: %s seal: %s data %d auth %d\n",
1252 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len, auth_len));
1254 if (auth_seal) {
1256 * The data in rpc_in doesn't contain the RPC_HEADER as this
1257 * has already been consumed.
1259 char *data = prs_data_p(rpc_in) + RPC_HDR_REQ_LEN;
1260 dump_data_pw("NTLMSSP hash (v1)\n", p->ntlmssp_hash,
1261 sizeof(p->ntlmssp_hash));
1263 dump_data_pw("Incoming RPC PDU (NTLMSSP sealed)\n",
1264 (const unsigned char *)data, data_len);
1265 NTLMSSPcalc_p(p, (uchar*)data, data_len);
1266 dump_data_pw("Incoming RPC PDU (NTLMSSP unsealed)\n",
1267 (const unsigned char *)data, data_len);
1268 crc32 = crc32_calc_buffer(data, data_len);
1271 old_offset = prs_offset(rpc_in);
1273 if (auth_seal || auth_verify) {
1274 RPC_HDR_AUTH auth_info;
1276 if(!prs_set_offset(rpc_in, old_offset + data_len)) {
1277 DEBUG(0,("api_pipe_auth_process: cannot move offset to %u.\n",
1278 (unsigned int)old_offset + data_len ));
1279 return False;
1282 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
1283 DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_HDR_AUTH.\n"));
1284 return False;
1288 if (auth_verify) {
1289 RPC_AUTH_NTLMSSP_CHK ntlmssp_chk;
1290 char *req_data = prs_data_p(rpc_in) + prs_offset(rpc_in) + 4;
1292 DEBUG(5,("api_pipe_auth_process: auth %d\n", prs_offset(rpc_in) + 4));
1295 * Ensure we have RPC_AUTH_NTLMSSP_CHK_LEN - 4 more bytes in the
1296 * incoming buffer.
1298 if(prs_mem_get(rpc_in, RPC_AUTH_NTLMSSP_CHK_LEN - 4) == NULL) {
1299 DEBUG(0,("api_pipe_auth_process: missing %d bytes in buffer.\n",
1300 RPC_AUTH_NTLMSSP_CHK_LEN - 4 ));
1301 return False;
1304 NTLMSSPcalc_p(p, (uchar*)req_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4);
1305 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, rpc_in, 0)) {
1306 DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_AUTH_NTLMSSP_CHK.\n"));
1307 return False;
1310 if (!rpc_auth_ntlmssp_chk(&ntlmssp_chk, crc32, p->ntlmssp_seq_num)) {
1311 DEBUG(0,("api_pipe_auth_process: NTLMSSP check failed.\n"));
1312 return False;
1317 * Return the current pointer to the data offset.
1320 if(!prs_set_offset(rpc_in, old_offset)) {
1321 DEBUG(0,("api_pipe_auth_process: failed to set offset back to %u\n",
1322 (unsigned int)old_offset ));
1323 return False;
1326 return True;
1329 /****************************************************************************
1330 Deal with schannel processing on an RPC request.
1331 ****************************************************************************/
1332 BOOL api_pipe_netsec_process(pipes_struct *p, prs_struct *rpc_in)
1335 * We always negotiate the following two bits....
1337 int data_len;
1338 int auth_len;
1339 uint32 old_offset;
1340 RPC_HDR_AUTH auth_info;
1341 RPC_AUTH_NETSEC_CHK netsec_chk;
1344 auth_len = p->hdr.auth_len;
1346 if (auth_len != RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN) {
1347 DEBUG(0,("Incorrect auth_len %d.\n", auth_len ));
1348 return False;
1352 * The following is that length of the data we must verify or unseal.
1353 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
1354 * preceeding the auth_data.
1357 data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
1358 RPC_HDR_AUTH_LEN - auth_len;
1360 DEBUG(5,("data %d auth %d\n", data_len, auth_len));
1362 old_offset = prs_offset(rpc_in);
1364 if(!prs_set_offset(rpc_in, old_offset + data_len)) {
1365 DEBUG(0,("cannot move offset to %u.\n",
1366 (unsigned int)old_offset + data_len ));
1367 return False;
1370 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
1371 DEBUG(0,("failed to unmarshall RPC_HDR_AUTH.\n"));
1372 return False;
1375 if (auth_info.auth_type != NETSEC_AUTH_TYPE) {
1376 DEBUG(0,("Invalid auth info %d on schannel\n",
1377 auth_info.auth_type));
1378 return False;
1381 if (auth_info.auth_level == RPC_PIPE_AUTH_SEAL_LEVEL) {
1382 p->netsec_auth.auth_flags = AUTH_PIPE_NETSEC|AUTH_PIPE_SIGN|AUTH_PIPE_SEAL;
1383 } else if (auth_info.auth_level == RPC_PIPE_AUTH_SIGN_LEVEL) {
1384 p->netsec_auth.auth_flags = AUTH_PIPE_NETSEC|AUTH_PIPE_SIGN;
1385 } else {
1386 DEBUG(0,("Invalid auth level %d on schannel\n",
1387 auth_info.auth_level));
1388 return False;
1391 if(!smb_io_rpc_auth_netsec_chk("", RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN,
1392 &netsec_chk, rpc_in, 0))
1394 DEBUG(0,("failed to unmarshal RPC_AUTH_NETSEC_CHK.\n"));
1395 return False;
1398 if (!netsec_decode(&p->netsec_auth,
1399 p->netsec_auth.auth_flags,
1400 SENDER_IS_INITIATOR,
1401 &netsec_chk,
1402 prs_data_p(rpc_in)+old_offset, data_len)) {
1403 DEBUG(3,("failed to decode PDU\n"));
1404 return False;
1408 * Return the current pointer to the data offset.
1411 if(!prs_set_offset(rpc_in, old_offset)) {
1412 DEBUG(0,("failed to set offset back to %u\n",
1413 (unsigned int)old_offset ));
1414 return False;
1417 /* The sequence number gets incremented on both send and receive. */
1418 p->netsec_auth.seq_num++;
1420 return True;
1423 /****************************************************************************
1424 Return a user struct for a pipe user.
1425 ****************************************************************************/
1427 struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
1429 if (p->ntlmssp_auth_validated) {
1430 memcpy(user, &p->pipe_user, sizeof(struct current_user));
1431 } else {
1432 extern struct current_user current_user;
1433 memcpy(user, &current_user, sizeof(struct current_user));
1436 return user;
1439 /****************************************************************************
1440 Find the set of RPC functions associated with this context_id
1441 ****************************************************************************/
1443 static PIPE_RPC_FNS* find_pipe_fns_by_context( PIPE_RPC_FNS *list, uint32 context_id )
1445 PIPE_RPC_FNS *fns = NULL;
1446 PIPE_RPC_FNS *tmp = NULL;
1448 if ( !list ) {
1449 DEBUG(0,("find_pipe_fns_by_context: ERROR! No context list for pipe!\n"));
1450 return NULL;
1453 for (tmp=list; tmp; tmp=tmp->next ) {
1454 if ( tmp->context_id == context_id )
1455 break;
1458 fns = tmp;
1460 return fns;
1463 /****************************************************************************
1464 memory cleanup
1465 ****************************************************************************/
1467 void free_pipe_rpc_context( PIPE_RPC_FNS *list )
1469 PIPE_RPC_FNS *tmp = list;
1470 PIPE_RPC_FNS *tmp2;
1472 while (tmp) {
1473 tmp2 = tmp->next;
1474 SAFE_FREE(tmp);
1475 tmp = tmp2;
1478 return;
1481 /****************************************************************************
1482 Find the correct RPC function to call for this request.
1483 If the pipe is authenticated then become the correct UNIX user
1484 before doing the call.
1485 ****************************************************************************/
1487 BOOL api_pipe_request(pipes_struct *p)
1489 BOOL ret = False;
1490 PIPE_RPC_FNS *pipe_fns;
1492 if (p->ntlmssp_auth_validated) {
1494 if(!become_authenticated_pipe_user(p)) {
1495 prs_mem_free(&p->out_data.rdata);
1496 return False;
1500 DEBUG(5, ("Requested \\PIPE\\%s\n", p->name));
1502 /* get the set of RPC functions for this context */
1504 pipe_fns = find_pipe_fns_by_context(p->contexts, p->hdr_req.context_id);
1506 if ( pipe_fns ) {
1507 set_current_rpc_talloc(p->mem_ctx);
1508 ret = api_rpcTNP(p, p->name, pipe_fns->cmds, pipe_fns->n_cmds);
1509 set_current_rpc_talloc(NULL);
1511 else {
1512 DEBUG(0,("api_pipe_request: No rpc function table associated with context [%d] on pipe [%s]\n",
1513 p->hdr_req.context_id, p->name));
1516 if(p->ntlmssp_auth_validated)
1517 unbecome_authenticated_pipe_user();
1519 return ret;
1522 /*******************************************************************
1523 Calls the underlying RPC function for a named pipe.
1524 ********************************************************************/
1526 BOOL api_rpcTNP(pipes_struct *p, const char *rpc_name,
1527 const struct api_struct *api_rpc_cmds, int n_cmds)
1529 int fn_num;
1530 fstring name;
1531 uint32 offset1, offset2;
1533 /* interpret the command */
1534 DEBUG(4,("api_rpcTNP: %s op 0x%x - ", rpc_name, p->hdr_req.opnum));
1536 slprintf(name, sizeof(name)-1, "in_%s", rpc_name);
1537 prs_dump(name, p->hdr_req.opnum, &p->in_data.data);
1539 for (fn_num = 0; fn_num < n_cmds; fn_num++) {
1540 if (api_rpc_cmds[fn_num].opnum == p->hdr_req.opnum && api_rpc_cmds[fn_num].fn != NULL) {
1541 DEBUG(3,("api_rpcTNP: rpc command: %s\n", api_rpc_cmds[fn_num].name));
1542 break;
1546 if (fn_num == n_cmds) {
1548 * For an unknown RPC just return a fault PDU but
1549 * return True to allow RPC's on the pipe to continue
1550 * and not put the pipe into fault state. JRA.
1552 DEBUG(4, ("unknown\n"));
1553 setup_fault_pdu(p, NT_STATUS(0x1c010002));
1554 return True;
1557 offset1 = prs_offset(&p->out_data.rdata);
1559 DEBUG(6, ("api_rpc_cmds[%d].fn == %p\n",
1560 fn_num, api_rpc_cmds[fn_num].fn));
1561 /* do the actual command */
1562 if(!api_rpc_cmds[fn_num].fn(p)) {
1563 DEBUG(0,("api_rpcTNP: %s: %s failed.\n", rpc_name, api_rpc_cmds[fn_num].name));
1564 prs_mem_free(&p->out_data.rdata);
1565 return False;
1568 if (p->bad_handle_fault_state) {
1569 DEBUG(4,("api_rpcTNP: bad handle fault return.\n"));
1570 p->bad_handle_fault_state = False;
1571 setup_fault_pdu(p, NT_STATUS(0x1C00001A));
1572 return True;
1575 slprintf(name, sizeof(name)-1, "out_%s", rpc_name);
1576 offset2 = prs_offset(&p->out_data.rdata);
1577 prs_set_offset(&p->out_data.rdata, offset1);
1578 prs_dump(name, p->hdr_req.opnum, &p->out_data.rdata);
1579 prs_set_offset(&p->out_data.rdata, offset2);
1581 DEBUG(5,("api_rpcTNP: called %s successfully\n", rpc_name));
1583 /* Check for buffer underflow in rpc parsing */
1585 if ((DEBUGLEVEL >= 10) &&
1586 (prs_offset(&p->in_data.data) != prs_data_size(&p->in_data.data))) {
1587 size_t data_len = prs_data_size(&p->in_data.data) - prs_offset(&p->in_data.data);
1588 char *data;
1590 data = malloc(data_len);
1592 DEBUG(10, ("api_rpcTNP: rpc input buffer underflow (parse error?)\n"));
1593 if (data) {
1594 prs_uint8s(False, "", &p->in_data.data, 0, (unsigned char *)data, (uint32)data_len);
1595 SAFE_FREE(data);
1600 return True;
1603 /*******************************************************************
1604 *******************************************************************/
1606 void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
1608 struct api_struct *cmds = NULL;
1609 int n_cmds = 0;
1611 switch ( idx ) {
1612 case PI_LSARPC:
1613 lsa_get_pipe_fns( &cmds, &n_cmds );
1614 break;
1615 case PI_LSARPC_DS:
1616 lsa_ds_get_pipe_fns( &cmds, &n_cmds );
1617 break;
1618 case PI_SAMR:
1619 samr_get_pipe_fns( &cmds, &n_cmds );
1620 break;
1621 case PI_NETLOGON:
1622 netlog_get_pipe_fns( &cmds, &n_cmds );
1623 break;
1624 case PI_SRVSVC:
1625 srvsvc_get_pipe_fns( &cmds, &n_cmds );
1626 break;
1627 case PI_WKSSVC:
1628 wkssvc_get_pipe_fns( &cmds, &n_cmds );
1629 break;
1630 case PI_WINREG:
1631 reg_get_pipe_fns( &cmds, &n_cmds );
1632 break;
1633 case PI_SPOOLSS:
1634 spoolss_get_pipe_fns( &cmds, &n_cmds );
1635 break;
1636 case PI_NETDFS:
1637 netdfs_get_pipe_fns( &cmds, &n_cmds );
1638 break;
1639 #ifdef DEVELOPER
1640 case PI_ECHO:
1641 echo_get_pipe_fns( &cmds, &n_cmds );
1642 break;
1643 #endif
1644 default:
1645 DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx));
1648 *fns = cmds;
1649 *n_fns = n_cmds;
1651 return;