2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1998
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1998,
7 * Copyright (C) Paul Ashton 1997-1998.
8 * Copyright (C) Jeremy Allison 1999.
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.
43 extern int DEBUGLEVEL;
45 static void NTLMSSPcalc_p( pipes_struct *p, unsigned char *data, int len)
47 unsigned char *hash = p->ntlmssp_hash;
48 unsigned char index_i = hash[256];
49 unsigned char index_j = hash[257];
52 for( ind = 0; ind < len; ind++) {
57 index_j += hash[index_i];
60 hash[index_i] = hash[index_j];
63 t = hash[index_i] + hash[index_j];
64 data[ind] = data[ind] ^ hash[t];
71 /*******************************************************************
72 Generate the next PDU to be returned from the data in p->rdata.
73 We cheat here as this function doesn't handle the special auth
74 footers of the authenticated bind response reply.
75 ********************************************************************/
77 BOOL create_next_pdu(pipes_struct *p)
79 RPC_HDR_RESP hdr_resp;
80 BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0);
81 BOOL auth_seal = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0);
83 uint32 data_space_available;
85 prs_struct outgoing_pdu;
91 * If we're in the fault state, keep returning fault PDU's until
92 * the pipe gets closed. JRA.
96 setup_fault_pdu(p, NT_STATUS(0x1c010002));
100 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
102 /* Change the incoming request header to a response. */
103 p->hdr.pkt_type = RPC_RESPONSE;
105 /* Set up rpc header flags. */
106 if (p->out_data.data_sent_length == 0)
107 p->hdr.flags = RPC_FLG_FIRST;
112 * Work out how much we can fit in a single PDU.
115 data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN;
116 if(p->ntlmssp_auth_validated)
117 data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN);
120 * The amount we send is the minimum of the available
121 * space and the amount left to send.
124 data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
127 * Ensure there really is data left to send.
131 DEBUG(0,("create_next_pdu: no data left to send !\n"));
135 data_len = MIN(data_len_left, data_space_available);
138 * Set up the alloc hint. This should be the data left to
142 hdr_resp.alloc_hint = data_len_left;
145 * Set up the header lengths.
148 if (p->ntlmssp_auth_validated) {
149 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len +
150 RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN;
151 p->hdr.auth_len = RPC_AUTH_NTLMSSP_CHK_LEN;
153 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len;
158 * Work out if this PDU will be the last.
161 if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata))
162 p->hdr.flags |= RPC_FLG_LAST;
165 * Init the parse struct to point at the outgoing
169 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
170 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
172 /* Store the header in the data stream. */
173 if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) {
174 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR.\n"));
175 prs_mem_free(&outgoing_pdu);
179 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
180 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_RESP.\n"));
181 prs_mem_free(&outgoing_pdu);
185 /* Store the current offset. */
186 data_pos = prs_offset(&outgoing_pdu);
188 /* Copy the data into the PDU. */
189 data_from = prs_data_p(&p->out_data.rdata) + p->out_data.data_sent_length;
191 if(!prs_append_data(&outgoing_pdu, data_from, data_len)) {
192 DEBUG(0,("create_next_pdu: failed to copy %u bytes of data.\n", (unsigned int)data_len));
193 prs_mem_free(&outgoing_pdu);
198 * Set data to point to where we copied the data into.
201 data = prs_data_p(&outgoing_pdu) + data_pos;
203 if (p->hdr.auth_len > 0) {
206 DEBUG(5,("create_next_pdu: sign: %s seal: %s data %d auth %d\n",
207 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len, p->hdr.auth_len));
210 crc32 = crc32_calc_buffer(data, data_len);
211 NTLMSSPcalc_p(p, (uchar*)data, data_len);
214 if (auth_seal || auth_verify) {
215 RPC_HDR_AUTH auth_info;
217 init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, NTLMSSP_AUTH_LEVEL,
218 (auth_verify ? RPC_HDR_AUTH_LEN : 0), (auth_verify ? 1 : 0));
219 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
220 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n"));
221 prs_mem_free(&outgoing_pdu);
227 RPC_AUTH_NTLMSSP_CHK ntlmssp_chk;
228 char *auth_data = prs_data_p(&outgoing_pdu);
230 p->ntlmssp_seq_num++;
231 init_rpc_auth_ntlmssp_chk(&ntlmssp_chk, NTLMSSP_SIGN_VERSION,
232 crc32, p->ntlmssp_seq_num++);
233 auth_data = prs_data_p(&outgoing_pdu) + prs_offset(&outgoing_pdu) + 4;
234 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, &outgoing_pdu, 0)) {
235 DEBUG(0,("create_next_pdu: failed to marshall RPC_AUTH_NTLMSSP_CHK.\n"));
236 prs_mem_free(&outgoing_pdu);
239 NTLMSSPcalc_p(p, (uchar*)auth_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4);
244 * Setup the counts for this PDU.
247 p->out_data.data_sent_length += data_len;
248 p->out_data.current_pdu_len = p->hdr.frag_len;
249 p->out_data.current_pdu_sent = 0;
251 prs_mem_free(&outgoing_pdu);
255 /*******************************************************************
256 Process an NTLMSSP authentication response.
257 If this function succeeds, the user has been authenticated
258 and their domain, name and calling workstation stored in
260 The initial challenge is stored in p->challenge.
261 *******************************************************************/
263 static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlmssp_resp)
270 fstring pipe_user_name;
273 BOOL guest_user = False;
274 SAM_ACCOUNT *sampass = NULL;
275 uchar null_smb_passwd[16];
276 uchar *smb_passwd_ptr = NULL;
278 DEBUG(5,("api_pipe_ntlmssp_verify: checking user details\n"));
280 memset(p->user_name, '\0', sizeof(p->user_name));
281 memset(p->pipe_user_name, '\0', sizeof(p->pipe_user_name));
282 memset(p->domain, '\0', sizeof(p->domain));
283 memset(p->wks, '\0', sizeof(p->wks));
285 /* Set up for non-authenticated user. */
286 delete_nt_token(&p->pipe_user.nt_user_token);
287 p->pipe_user.ngroups = 0;
288 safe_free( p->pipe_user.groups);
291 * Setup an empty password for a guest user.
294 memset(null_smb_passwd,0,16);
297 * We always negotiate UNICODE.
300 if (p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_UNICODE) {
301 rpcstr_pull(user_name, ntlmssp_resp->user, sizeof(fstring), ntlmssp_resp->hdr_usr.str_str_len*2, 0 );
302 rpcstr_pull(domain, ntlmssp_resp->domain, sizeof(fstring), ntlmssp_resp->hdr_domain.str_str_len*2, 0);
303 rpcstr_pull(wks, ntlmssp_resp->wks, sizeof(fstring), ntlmssp_resp->hdr_wks.str_str_len*2, 0);
305 fstrcpy(user_name, ntlmssp_resp->user);
306 fstrcpy(domain, ntlmssp_resp->domain);
307 fstrcpy(wks, ntlmssp_resp->wks);
310 DEBUG(5,("user: %s domain: %s wks: %s\n", user_name, domain, wks));
312 nt_pw_len = MIN(sizeof(nt_owf), ntlmssp_resp->hdr_nt_resp.str_str_len);
313 lm_pw_len = MIN(sizeof(lm_owf), ntlmssp_resp->hdr_lm_resp.str_str_len);
315 memcpy(lm_owf, ntlmssp_resp->lm_resp, sizeof(lm_owf));
316 memcpy(nt_owf, ntlmssp_resp->nt_resp, nt_pw_len);
318 #ifdef DEBUG_PASSWORD
319 DEBUG(100,("lm, nt owfs, chal\n"));
320 dump_data(100, (char *)lm_owf, sizeof(lm_owf));
321 dump_data(100, (char *)nt_owf, nt_pw_len);
322 dump_data(100, (char *)p->challenge, 8);
326 * Allow guest access. Patch from Shirish Kalele <kalele@veritas.com>.
329 if((strlen(user_name) == 0) &&
330 (ntlmssp_resp->hdr_nt_resp.str_str_len==0))
334 fstrcpy(pipe_user_name, lp_guestaccount(-1));
335 DEBUG(100,("Null user in NTLMSSP verification. Using guest = %s\n", pipe_user_name));
337 smb_passwd_ptr = null_smb_passwd;
342 * Pass the user through the NT -> unix user mapping
346 fstrcpy(pipe_user_name, user_name);
347 (void)map_username(pipe_user_name);
350 * Do the length checking only if user is not NULL.
353 if (ntlmssp_resp->hdr_lm_resp.str_str_len == 0)
355 if (ntlmssp_resp->hdr_nt_resp.str_str_len == 0)
357 if (ntlmssp_resp->hdr_usr.str_str_len == 0)
359 if (ntlmssp_resp->hdr_domain.str_str_len == 0)
361 if (ntlmssp_resp->hdr_wks.str_str_len == 0)
370 p->ntlmssp_auth_validated =
371 NT_STATUS_IS_OK(pass_check_smb_with_chal(pipe_user_name, domain,
372 (uchar*)p->challenge,
375 if (!p->ntlmssp_auth_validated) {
376 DEBUG(1,("api_pipe_ntlmssp_verify: User %s\\%s from machine %s \
377 failed authentication on named pipe %s.\n", domain, pipe_user_name, wks, p->name ));
382 pdb_init_sam(&sampass);
384 if(!pdb_getsampwnam(sampass, pipe_user_name)) {
385 DEBUG(1,("api_pipe_ntlmssp_verify: Cannot find user %s in smb passwd database.\n",
387 pdb_free_sam(sampass);
394 /* Quit if the account was disabled. */
395 if((pdb_get_acct_ctrl(sampass) & ACB_DISABLED) || !pdb_get_lanman_passwd(sampass)) {
396 DEBUG(1,("Account for user '%s' was disabled.\n", pipe_user_name));
397 pdb_free_sam(sampass);
401 if(!pdb_get_nt_passwd(sampass)) {
402 DEBUG(1,("Account for user '%s' has no NT password hash.\n", pipe_user_name));
403 pdb_free_sam(sampass);
407 smb_passwd_ptr = pdb_get_lanman_passwd(sampass);
411 * Set up the sign/seal data.
416 NTLMSSPOWFencrypt(smb_passwd_ptr, lm_owf, p24);
428 for (ind = 0; ind < 256; ind++)
429 p->ntlmssp_hash[ind] = (unsigned char)ind;
431 for( ind = 0; ind < 256; ind++) {
434 j += (p->ntlmssp_hash[ind] + k2[ind%8]);
436 tc = p->ntlmssp_hash[ind];
437 p->ntlmssp_hash[ind] = p->ntlmssp_hash[j];
438 p->ntlmssp_hash[j] = tc;
441 p->ntlmssp_hash[256] = 0;
442 p->ntlmssp_hash[257] = 0;
444 /* NTLMSSPhash(p->ntlmssp_hash, p24); */
445 p->ntlmssp_seq_num = 0;
449 fstrcpy(p->user_name, user_name);
450 fstrcpy(p->pipe_user_name, pipe_user_name);
451 fstrcpy(p->domain, domain);
452 fstrcpy(p->wks, wks);
455 * Store the UNIX credential data (uid/gid pair) in the pipe structure.
458 p->pipe_user.uid = pdb_get_uid(sampass);
459 p->pipe_user.gid = pdb_get_gid(sampass);
461 /* Set up pipe user group membership. */
462 initialise_groups(pipe_user_name, p->pipe_user.uid, p->pipe_user.gid);
463 get_current_groups( &p->pipe_user.ngroups, &p->pipe_user.groups);
465 /* Create an NT_USER_TOKEN struct for this user. */
466 p->pipe_user.nt_user_token = create_nt_token(p->pipe_user.uid,p->pipe_user.gid,
467 p->pipe_user.ngroups, p->pipe_user.groups,
470 p->ntlmssp_auth_validated = True;
472 pdb_free_sam(sampass);
476 /*******************************************************************
477 The switch table for the pipe names and the functions to handle them.
478 *******************************************************************/
482 char * pipe_clnt_name;
483 char * pipe_srv_name;
484 BOOL (*fn) (pipes_struct *);
487 static struct api_cmd api_fd_commands[] =
489 { "lsarpc", "lsass", api_ntlsa_rpc },
490 { "samr", "lsass", api_samr_rpc },
491 { "srvsvc", "ntsvcs", api_srvsvc_rpc },
492 { "wkssvc", "ntsvcs", api_wkssvc_rpc },
493 { "NETLOGON", "lsass", api_netlog_rpc },
494 { "winreg", "winreg", api_reg_rpc },
495 { "spoolss", "spoolss", api_spoolss_rpc },
496 { "netdfs", "netdfs" , api_netdfs_rpc },
500 /*******************************************************************
501 This is the client reply to our challenge for an authenticated
502 bind request. The challenge we sent is in p->challenge.
503 *******************************************************************/
505 BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p)
507 RPC_HDR_AUTHA autha_info;
508 RPC_AUTH_VERIFIER auth_verifier;
509 RPC_AUTH_NTLMSSP_RESP ntlmssp_resp;
511 DEBUG(5,("api_pipe_bind_auth_resp: decode request. %d\n", __LINE__));
513 if (p->hdr.auth_len == 0) {
514 DEBUG(0,("api_pipe_bind_auth_resp: No auth field sent !\n"));
519 * Decode the authentication verifier response.
522 if(!smb_io_rpc_hdr_autha("", &autha_info, rpc_in_p, 0)) {
523 DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_HDR_AUTHA failed.\n"));
527 if (autha_info.auth_type != NTLMSSP_AUTH_TYPE || autha_info.auth_level != NTLMSSP_AUTH_LEVEL) {
528 DEBUG(0,("api_pipe_bind_auth_resp: incorrect auth type (%d) or level (%d).\n",
529 (int)autha_info.auth_type, (int)autha_info.auth_level ));
533 if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) {
534 DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_AUTH_VERIFIER failed.\n"));
539 * Ensure this is a NTLMSSP_AUTH packet type.
542 if (!rpc_auth_verifier_chk(&auth_verifier, "NTLMSSP", NTLMSSP_AUTH)) {
543 DEBUG(0,("api_pipe_bind_auth_resp: rpc_auth_verifier_chk failed.\n"));
547 if(!smb_io_rpc_auth_ntlmssp_resp("", &ntlmssp_resp, rpc_in_p, 0)) {
548 DEBUG(0,("api_pipe_bind_auth_resp: Failed to unmarshall RPC_AUTH_NTLMSSP_RESP.\n"));
553 * The following call actually checks the challenge/response data.
554 * for correctness against the given DOMAIN\user name.
557 if (!api_pipe_ntlmssp_verify(p, &ntlmssp_resp))
565 /*******************************************************************
566 Marshall a bind_nak pdu.
567 *******************************************************************/
569 static BOOL setup_bind_nak(pipes_struct *p)
571 prs_struct outgoing_rpc;
575 /* Free any memory in the current return data buffer. */
576 prs_mem_free(&p->out_data.rdata);
579 * Marshall directly into the outgoing PDU space. We
580 * must do this as we need to set to the bind response
581 * header and are never sending more than one PDU here.
584 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
585 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
589 * Initialize a bind_nak header.
592 init_rpc_hdr(&nak_hdr, RPC_BINDNACK, RPC_FLG_FIRST | RPC_FLG_LAST,
593 p->hdr.call_id, RPC_HEADER_LEN + sizeof(uint16), 0);
596 * Marshall the header into the outgoing PDU.
599 if(!smb_io_rpc_hdr("", &nak_hdr, &outgoing_rpc, 0)) {
600 DEBUG(0,("setup_bind_nak: marshalling of RPC_HDR failed.\n"));
601 prs_mem_free(&outgoing_rpc);
606 * Now add the reject reason.
609 if(!prs_uint16("reject code", &outgoing_rpc, 0, &zero)) {
610 prs_mem_free(&outgoing_rpc);
614 p->out_data.data_sent_length = 0;
615 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
616 p->out_data.current_pdu_sent = 0;
618 p->pipe_bound = False;
623 /*******************************************************************
624 Marshall a fault pdu.
625 *******************************************************************/
627 BOOL setup_fault_pdu(pipes_struct *p, NTSTATUS status)
629 prs_struct outgoing_pdu;
631 RPC_HDR_RESP hdr_resp;
632 RPC_HDR_FAULT fault_resp;
634 /* Free any memory in the current return data buffer. */
635 prs_mem_free(&p->out_data.rdata);
638 * Marshall directly into the outgoing PDU space. We
639 * must do this as we need to set to the bind response
640 * header and are never sending more than one PDU here.
643 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
644 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
647 * Initialize a fault header.
650 init_rpc_hdr(&fault_hdr, RPC_FAULT, RPC_FLG_FIRST | RPC_FLG_LAST | RPC_FLG_NOCALL,
651 p->hdr.call_id, RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN, 0);
654 * Initialize the HDR_RESP and FAULT parts of the PDU.
657 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
659 fault_resp.status = status;
660 fault_resp.reserved = 0;
663 * Marshall the header into the outgoing PDU.
666 if(!smb_io_rpc_hdr("", &fault_hdr, &outgoing_pdu, 0)) {
667 DEBUG(0,("setup_fault_pdu: marshalling of RPC_HDR failed.\n"));
668 prs_mem_free(&outgoing_pdu);
672 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
673 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_RESP.\n"));
674 prs_mem_free(&outgoing_pdu);
678 if(!smb_io_rpc_hdr_fault("fault", &fault_resp, &outgoing_pdu, 0)) {
679 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_FAULT.\n"));
680 prs_mem_free(&outgoing_pdu);
684 p->out_data.data_sent_length = 0;
685 p->out_data.current_pdu_len = prs_offset(&outgoing_pdu);
686 p->out_data.current_pdu_sent = 0;
688 prs_mem_free(&outgoing_pdu);
692 /*******************************************************************
693 Ensure a bind request has the correct abstract & transfer interface.
694 Used to reject unknown binds from Win2k.
695 *******************************************************************/
697 BOOL check_bind_req(char* pipe_name, RPC_IFACE* abstract,
700 extern struct pipe_id_info pipe_names[];
703 fstrcpy(pname,"\\PIPE\\");
704 fstrcat(pname,pipe_name);
706 for(i=0;pipe_names[i].client_pipe; i++) {
707 if(strequal(pipe_names[i].client_pipe, pname))
711 if(pipe_names[i].client_pipe == NULL)
714 /* check the abstract interface */
715 if((abstract->version != pipe_names[i].abstr_syntax.version) ||
716 (memcmp(&abstract->uuid, &pipe_names[i].abstr_syntax.uuid,
717 sizeof(RPC_UUID)) != 0))
720 /* check the transfer interface */
721 if((transfer->version != pipe_names[i].trans_syntax.version) ||
722 (memcmp(&transfer->uuid, &pipe_names[i].trans_syntax.uuid,
723 sizeof(RPC_UUID)) != 0))
729 /*******************************************************************
730 Respond to a pipe bind request.
731 *******************************************************************/
733 BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
737 RPC_HDR_AUTH auth_info;
739 fstring ack_pipe_name;
740 prs_struct out_hdr_ba;
742 prs_struct outgoing_rpc;
745 enum RPC_PKT_TYPE reply_pkt_type;
747 p->ntlmssp_auth_requested = False;
749 DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__));
752 * Try and find the correct pipe name to ensure
753 * that this is a pipe name we support.
756 for (i = 0; api_fd_commands[i].pipe_clnt_name; i++) {
757 if (strequal(api_fd_commands[i].pipe_clnt_name, p->name) &&
758 api_fd_commands[i].fn != NULL) {
759 DEBUG(3,("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
760 api_fd_commands[i].pipe_clnt_name,
761 api_fd_commands[i].pipe_srv_name));
762 fstrcpy(p->pipe_srv_name, api_fd_commands[i].pipe_srv_name);
767 if (api_fd_commands[i].fn == NULL) {
768 DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n",
770 if(!setup_bind_nak(p))
775 /* decode the bind request */
776 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_in_p, 0)) {
777 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_RB struct.\n"));
782 * Check if this is an authenticated request.
785 if (p->hdr.auth_len != 0) {
786 RPC_AUTH_VERIFIER auth_verifier;
787 RPC_AUTH_NTLMSSP_NEG ntlmssp_neg;
790 * Decode the authentication verifier.
793 if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) {
794 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_AUTH struct.\n"));
799 * We only support NTLMSSP_AUTH_TYPE requests.
802 if(auth_info.auth_type != NTLMSSP_AUTH_TYPE) {
803 DEBUG(0,("api_pipe_bind_req: unknown auth type %x requested.\n",
804 auth_info.auth_type ));
808 if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) {
809 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_AUTH struct.\n"));
813 if(!strequal(auth_verifier.signature, "NTLMSSP")) {
814 DEBUG(0,("api_pipe_bind_req: auth_verifier.signature != NTLMSSP\n"));
818 if(auth_verifier.msg_type != NTLMSSP_NEGOTIATE) {
819 DEBUG(0,("api_pipe_bind_req: auth_verifier.msg_type (%d) != NTLMSSP_NEGOTIATE\n",
820 auth_verifier.msg_type));
824 if(!smb_io_rpc_auth_ntlmssp_neg("", &ntlmssp_neg, rpc_in_p, 0)) {
825 DEBUG(0,("api_pipe_bind_req: Failed to unmarshall RPC_AUTH_NTLMSSP_NEG.\n"));
829 p->ntlmssp_chal_flags = SMBD_NTLMSSP_NEG_FLAGS;
830 p->ntlmssp_auth_requested = True;
833 switch(p->hdr.pkt_type) {
835 /* name has to be \PIPE\xxxxx */
836 fstrcpy(ack_pipe_name, "\\PIPE\\");
837 fstrcat(ack_pipe_name, p->pipe_srv_name);
838 reply_pkt_type = RPC_BINDACK;
841 /* secondary address CAN be NULL
842 * as the specs say it's ignored.
843 * It MUST NULL to have the spoolss working.
845 fstrcpy(ack_pipe_name,"");
846 reply_pkt_type = RPC_ALTCONTRESP;
852 DEBUG(5,("api_pipe_bind_req: make response. %d\n", __LINE__));
855 * Marshall directly into the outgoing PDU space. We
856 * must do this as we need to set to the bind response
857 * header and are never sending more than one PDU here.
860 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
861 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
864 * Setup the memory to marshall the ba header, and the
868 if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) {
869 DEBUG(0,("api_pipe_bind_req: malloc out_hdr_ba failed.\n"));
870 prs_mem_free(&outgoing_rpc);
874 if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) {
875 DEBUG(0,("pi_pipe_bind_req: malloc out_auth failed.\n"));
876 prs_mem_free(&outgoing_rpc);
877 prs_mem_free(&out_hdr_ba);
881 if (p->ntlmssp_auth_requested)
884 assoc_gid = hdr_rb.bba.assoc_gid ? hdr_rb.bba.assoc_gid : 0x53f0;
887 * Create the bind response struct.
890 /* If the requested abstract synt uuid doesn't match our client pipe,
891 reject the bind_ack & set the transfer interface synt to all 0's,
892 ver 0 (observed when NT5 attempts to bind to abstract interfaces
894 Needed when adding entries to a DACL from NT5 - SK */
896 if(check_bind_req(p->name, &hdr_rb.abstract, &hdr_rb.transfer)) {
897 init_rpc_hdr_ba(&hdr_ba,
905 RPC_IFACE null_interface;
906 ZERO_STRUCT(null_interface);
907 /* Rejection reason: abstract syntax not supported */
908 init_rpc_hdr_ba(&hdr_ba, MAX_PDU_FRAG_LEN,
909 MAX_PDU_FRAG_LEN, assoc_gid,
910 ack_pipe_name, 0x1, 0x2, 0x1,
918 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &out_hdr_ba, 0)) {
919 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_BA failed.\n"));
924 * Now the authentication.
927 if (p->ntlmssp_auth_requested) {
928 RPC_AUTH_VERIFIER auth_verifier;
929 RPC_AUTH_NTLMSSP_CHAL ntlmssp_chal;
931 generate_random_buffer(p->challenge, 8, False);
933 /*** Authentication info ***/
935 init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, NTLMSSP_AUTH_LEVEL, RPC_HDR_AUTH_LEN, 1);
936 if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) {
937 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n"));
941 /*** NTLMSSP verifier ***/
943 init_rpc_auth_verifier(&auth_verifier, "NTLMSSP", NTLMSSP_CHALLENGE);
944 if(!smb_io_rpc_auth_verifier("", &auth_verifier, &out_auth, 0)) {
945 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n"));
949 /* NTLMSSP challenge ***/
951 init_rpc_auth_ntlmssp_chal(&ntlmssp_chal, p->ntlmssp_chal_flags, p->challenge);
952 if(!smb_io_rpc_auth_ntlmssp_chal("", &ntlmssp_chal, &out_auth, 0)) {
953 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_NTLMSSP_CHAL failed.\n"));
957 /* Auth len in the rpc header doesn't include auth_header. */
958 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
962 * Create the header, now we know the length.
965 init_rpc_hdr(&p->hdr, reply_pkt_type, RPC_FLG_FIRST | RPC_FLG_LAST,
967 RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth),
971 * Marshall the header into the outgoing PDU.
974 if(!smb_io_rpc_hdr("", &p->hdr, &outgoing_rpc, 0)) {
975 DEBUG(0,("pi_pipe_bind_req: marshalling of RPC_HDR failed.\n"));
980 * Now add the RPC_HDR_BA and any auth needed.
983 if(!prs_append_prs_data( &outgoing_rpc, &out_hdr_ba)) {
984 DEBUG(0,("api_pipe_bind_req: append of RPC_HDR_BA failed.\n"));
988 if(p->ntlmssp_auth_requested && !prs_append_prs_data( &outgoing_rpc, &out_auth)) {
989 DEBUG(0,("api_pipe_bind_req: append of auth info failed.\n"));
993 if(!p->ntlmssp_auth_requested)
994 p->pipe_bound = True;
997 * Setup the lengths for the initial reply.
1000 p->out_data.data_sent_length = 0;
1001 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
1002 p->out_data.current_pdu_sent = 0;
1004 prs_mem_free(&out_hdr_ba);
1005 prs_mem_free(&out_auth);
1011 prs_mem_free(&outgoing_rpc);
1012 prs_mem_free(&out_hdr_ba);
1013 prs_mem_free(&out_auth);
1017 /****************************************************************************
1018 Deal with sign & seal processing on an RPC request.
1019 ****************************************************************************/
1021 BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in)
1024 * We always negotiate the following two bits....
1026 BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0);
1027 BOOL auth_seal = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0);
1033 auth_len = p->hdr.auth_len;
1035 if ((auth_len != RPC_AUTH_NTLMSSP_CHK_LEN) && auth_verify) {
1036 DEBUG(0,("api_pipe_auth_process: Incorrect auth_len %d.\n", auth_len ));
1041 * The following is that length of the data we must verify or unseal.
1042 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
1043 * preceeding the auth_data.
1046 data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
1047 (auth_verify ? RPC_HDR_AUTH_LEN : 0) - auth_len;
1049 DEBUG(5,("api_pipe_auth_process: sign: %s seal: %s data %d auth %d\n",
1050 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len, auth_len));
1054 * The data in rpc_in doesn't contain the RPC_HEADER as this
1055 * has already been consumed.
1057 char *data = prs_data_p(rpc_in) + RPC_HDR_REQ_LEN;
1058 NTLMSSPcalc_p(p, (uchar*)data, data_len);
1059 crc32 = crc32_calc_buffer(data, data_len);
1062 old_offset = prs_offset(rpc_in);
1064 if (auth_seal || auth_verify) {
1065 RPC_HDR_AUTH auth_info;
1067 if(!prs_set_offset(rpc_in, old_offset + data_len)) {
1068 DEBUG(0,("api_pipe_auth_process: cannot move offset to %u.\n",
1069 (unsigned int)old_offset + data_len ));
1073 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
1074 DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_HDR_AUTH.\n"));
1080 RPC_AUTH_NTLMSSP_CHK ntlmssp_chk;
1081 char *req_data = prs_data_p(rpc_in) + prs_offset(rpc_in) + 4;
1083 DEBUG(5,("api_pipe_auth_process: auth %d\n", prs_offset(rpc_in) + 4));
1086 * Ensure we have RPC_AUTH_NTLMSSP_CHK_LEN - 4 more bytes in the
1089 if(prs_mem_get(rpc_in, RPC_AUTH_NTLMSSP_CHK_LEN - 4) == NULL) {
1090 DEBUG(0,("api_pipe_auth_process: missing %d bytes in buffer.\n",
1091 RPC_AUTH_NTLMSSP_CHK_LEN - 4 ));
1095 NTLMSSPcalc_p(p, (uchar*)req_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4);
1096 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, rpc_in, 0)) {
1097 DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_AUTH_NTLMSSP_CHK.\n"));
1101 if (!rpc_auth_ntlmssp_chk(&ntlmssp_chk, crc32, p->ntlmssp_seq_num)) {
1102 DEBUG(0,("api_pipe_auth_process: NTLMSSP check failed.\n"));
1108 * Return the current pointer to the data offset.
1111 if(!prs_set_offset(rpc_in, old_offset)) {
1112 DEBUG(0,("api_pipe_auth_process: failed to set offset back to %u\n",
1113 (unsigned int)old_offset ));
1120 /****************************************************************************
1121 Return a user struct for a pipe user.
1122 ****************************************************************************/
1124 struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
1126 if (p->ntlmssp_auth_validated) {
1127 memcpy(user, &p->pipe_user, sizeof(struct current_user));
1129 extern struct current_user current_user;
1130 memcpy(user, ¤t_user, sizeof(struct current_user));
1136 /****************************************************************************
1137 Find the correct RPC function to call for this request.
1138 If the pipe is authenticated then become the correct UNIX user
1139 before doing the call.
1140 ****************************************************************************/
1142 BOOL api_pipe_request(pipes_struct *p)
1146 BOOL changed_user_id = False;
1148 if (p->ntlmssp_auth_validated) {
1150 if(!become_authenticated_pipe_user(p)) {
1151 prs_mem_free(&p->out_data.rdata);
1155 changed_user_id = True;
1158 for (i = 0; api_fd_commands[i].pipe_clnt_name; i++) {
1159 if (strequal(api_fd_commands[i].pipe_clnt_name, p->name) &&
1160 api_fd_commands[i].fn != NULL) {
1161 DEBUG(3,("Doing \\PIPE\\%s\n", api_fd_commands[i].pipe_clnt_name));
1162 set_current_rpc_talloc(p->mem_ctx);
1163 ret = api_fd_commands[i].fn(p);
1164 set_current_rpc_talloc(NULL);
1169 unbecome_authenticated_pipe_user(p);
1174 /*******************************************************************
1175 Calls the underlying RPC function for a named pipe.
1176 ********************************************************************/
1178 BOOL api_rpcTNP(pipes_struct *p, char *rpc_name,
1179 struct api_struct *api_rpc_cmds)
1183 uint32 offset1, offset2;
1185 /* interpret the command */
1186 DEBUG(4,("api_rpcTNP: %s op 0x%x - ", rpc_name, p->hdr_req.opnum));
1188 slprintf(name, sizeof(name)-1, "in_%s", rpc_name);
1189 prs_dump(name, p->hdr_req.opnum, &p->in_data.data);
1191 for (fn_num = 0; api_rpc_cmds[fn_num].name; fn_num++) {
1192 if (api_rpc_cmds[fn_num].opnum == p->hdr_req.opnum && api_rpc_cmds[fn_num].fn != NULL) {
1193 DEBUG(3,("api_rpcTNP: rpc command: %s\n", api_rpc_cmds[fn_num].name));
1198 if (api_rpc_cmds[fn_num].name == NULL) {
1200 * For an unknown RPC just return a fault PDU but
1201 * return True to allow RPC's on the pipe to continue
1202 * and not put the pipe into fault state. JRA.
1204 DEBUG(4, ("unknown\n"));
1205 setup_fault_pdu(p, NT_STATUS(0x1c010002));
1209 offset1 = prs_offset(&p->out_data.rdata);
1211 /* do the actual command */
1212 if(!api_rpc_cmds[fn_num].fn(p)) {
1213 DEBUG(0,("api_rpcTNP: %s: %s failed.\n", rpc_name, api_rpc_cmds[fn_num].name));
1214 prs_mem_free(&p->out_data.rdata);
1218 slprintf(name, sizeof(name)-1, "out_%s", rpc_name);
1219 offset2 = prs_offset(&p->out_data.rdata);
1220 prs_set_offset(&p->out_data.rdata, offset1);
1221 prs_dump(name, p->hdr_req.opnum, &p->out_data.rdata);
1222 prs_set_offset(&p->out_data.rdata, offset2);
1224 DEBUG(5,("api_rpcTNP: called %s successfully\n", rpc_name));
1226 /* Check for buffer underflow in rpc parsing */
1228 if ((DEBUGLEVEL >= 10) &&
1229 (p->in_data.data.data_offset != p->in_data.data.buffer_size)) {
1230 int data_len = p->in_data.data.buffer_size -
1231 p->in_data.data.data_offset;
1234 data = malloc(data_len);
1236 DEBUG(10, ("api_rpcTNP: rpc input buffer underflow (parse error?)\n"));
1238 prs_uint8s(False, "", &p->in_data.data, 0, (unsigned char *)data,