[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[Samba/gebeck_regimport.git] / source3 / rpc_server / srv_pipe.c
blob72ce72fb28d6987d49c100bf15b4d05b6dc4e5c2
1 /*
2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Almost completely rewritten by (C) Jeremy Allison 2005.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 /* this module apparently provides an implementation of DCE/RPC over a
21 * named pipe (IPC$ connection using SMBtrans). details of DCE/RPC
22 * documentation are available (in on-line form) from the X-Open group.
24 * this module should provide a level of abstraction between SMB
25 * and DCE/RPC, while minimising the amount of mallocs, unnecessary
26 * data copies, and network traffic.
30 #include "includes.h"
32 extern struct pipe_id_info pipe_names[];
33 extern struct current_user current_user;
35 #undef DBGC_CLASS
36 #define DBGC_CLASS DBGC_RPC_SRV
38 static void free_pipe_ntlmssp_auth_data(struct pipe_auth_data *auth)
40 AUTH_NTLMSSP_STATE *a = auth->a_u.auth_ntlmssp_state;
42 if (a) {
43 auth_ntlmssp_end(&a);
45 auth->a_u.auth_ntlmssp_state = NULL;
48 /*******************************************************************
49 Generate the next PDU to be returned from the data in p->rdata.
50 Handle NTLMSSP.
51 ********************************************************************/
53 static BOOL create_next_pdu_ntlmssp(pipes_struct *p)
55 RPC_HDR_RESP hdr_resp;
56 uint32 ss_padding_len = 0;
57 uint32 data_space_available;
58 uint32 data_len_left;
59 uint32 data_len;
60 prs_struct outgoing_pdu;
61 NTSTATUS status;
62 DATA_BLOB auth_blob;
63 RPC_HDR_AUTH auth_info;
64 uint8 auth_type, auth_level;
65 AUTH_NTLMSSP_STATE *a = p->auth.a_u.auth_ntlmssp_state;
68 * If we're in the fault state, keep returning fault PDU's until
69 * the pipe gets closed. JRA.
72 if(p->fault_state) {
73 setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
74 return True;
77 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
79 /* Change the incoming request header to a response. */
80 p->hdr.pkt_type = RPC_RESPONSE;
82 /* Set up rpc header flags. */
83 if (p->out_data.data_sent_length == 0) {
84 p->hdr.flags = RPC_FLG_FIRST;
85 } else {
86 p->hdr.flags = 0;
90 * Work out how much we can fit in a single PDU.
93 data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
96 * Ensure there really is data left to send.
99 if(!data_len_left) {
100 DEBUG(0,("create_next_pdu_ntlmssp: no data left to send !\n"));
101 return False;
104 data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN -
105 RPC_HDR_AUTH_LEN - NTLMSSP_SIG_SIZE;
108 * The amount we send is the minimum of the available
109 * space and the amount left to send.
112 data_len = MIN(data_len_left, data_space_available);
115 * Set up the alloc hint. This should be the data left to
116 * send.
119 hdr_resp.alloc_hint = data_len_left;
122 * Work out if this PDU will be the last.
125 if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata)) {
126 p->hdr.flags |= RPC_FLG_LAST;
127 if (data_len_left % 8) {
128 ss_padding_len = 8 - (data_len_left % 8);
129 DEBUG(10,("create_next_pdu_ntlmssp: adding sign/seal padding of %u\n",
130 ss_padding_len ));
135 * Set up the header lengths.
138 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN +
139 data_len + ss_padding_len +
140 RPC_HDR_AUTH_LEN + NTLMSSP_SIG_SIZE;
141 p->hdr.auth_len = NTLMSSP_SIG_SIZE;
145 * Init the parse struct to point at the outgoing
146 * data.
149 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
150 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
152 /* Store the header in the data stream. */
153 if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) {
154 DEBUG(0,("create_next_pdu_ntlmssp: failed to marshall RPC_HDR.\n"));
155 prs_mem_free(&outgoing_pdu);
156 return False;
159 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
160 DEBUG(0,("create_next_pdu_ntlmssp: failed to marshall RPC_HDR_RESP.\n"));
161 prs_mem_free(&outgoing_pdu);
162 return False;
165 /* Copy the data into the PDU. */
167 if(!prs_append_some_prs_data(&outgoing_pdu, &p->out_data.rdata, p->out_data.data_sent_length, data_len)) {
168 DEBUG(0,("create_next_pdu_ntlmssp: failed to copy %u bytes of data.\n", (unsigned int)data_len));
169 prs_mem_free(&outgoing_pdu);
170 return False;
173 /* Copy the sign/seal padding data. */
174 if (ss_padding_len) {
175 char pad[8];
177 memset(pad, '\0', 8);
178 if (!prs_copy_data_in(&outgoing_pdu, pad, ss_padding_len)) {
179 DEBUG(0,("create_next_pdu_ntlmssp: failed to add %u bytes of pad data.\n",
180 (unsigned int)ss_padding_len));
181 prs_mem_free(&outgoing_pdu);
182 return False;
187 /* Now write out the auth header and null blob. */
188 if (p->auth.auth_type == PIPE_AUTH_TYPE_NTLMSSP) {
189 auth_type = RPC_NTLMSSP_AUTH_TYPE;
190 } else {
191 auth_type = RPC_SPNEGO_AUTH_TYPE;
193 if (p->auth.auth_level == PIPE_AUTH_LEVEL_PRIVACY) {
194 auth_level = RPC_AUTH_LEVEL_PRIVACY;
195 } else {
196 auth_level = RPC_AUTH_LEVEL_INTEGRITY;
199 init_rpc_hdr_auth(&auth_info, auth_type, auth_level, ss_padding_len, 1 /* context id. */);
200 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
201 DEBUG(0,("create_next_pdu_ntlmssp: failed to marshall RPC_HDR_AUTH.\n"));
202 prs_mem_free(&outgoing_pdu);
203 return False;
206 /* Generate the sign blob. */
208 switch (p->auth.auth_level) {
209 case PIPE_AUTH_LEVEL_PRIVACY:
210 /* Data portion is encrypted. */
211 status = ntlmssp_seal_packet(a->ntlmssp_state,
212 (unsigned char *)prs_data_p(&outgoing_pdu) + RPC_HEADER_LEN + RPC_HDR_RESP_LEN,
213 data_len + ss_padding_len,
214 (unsigned char *)prs_data_p(&outgoing_pdu),
215 (size_t)prs_offset(&outgoing_pdu),
216 &auth_blob);
217 if (!NT_STATUS_IS_OK(status)) {
218 data_blob_free(&auth_blob);
219 prs_mem_free(&outgoing_pdu);
220 return False;
222 break;
223 case PIPE_AUTH_LEVEL_INTEGRITY:
224 /* Data is signed. */
225 status = ntlmssp_sign_packet(a->ntlmssp_state,
226 (unsigned char *)prs_data_p(&outgoing_pdu) + RPC_HEADER_LEN + RPC_HDR_RESP_LEN,
227 data_len + ss_padding_len,
228 (unsigned char *)prs_data_p(&outgoing_pdu),
229 (size_t)prs_offset(&outgoing_pdu),
230 &auth_blob);
231 if (!NT_STATUS_IS_OK(status)) {
232 data_blob_free(&auth_blob);
233 prs_mem_free(&outgoing_pdu);
234 return False;
236 break;
237 default:
238 prs_mem_free(&outgoing_pdu);
239 return False;
242 /* Append the auth blob. */
243 if (!prs_copy_data_in(&outgoing_pdu, (char *)auth_blob.data, NTLMSSP_SIG_SIZE)) {
244 DEBUG(0,("create_next_pdu_ntlmssp: failed to add %u bytes auth blob.\n",
245 (unsigned int)NTLMSSP_SIG_SIZE));
246 data_blob_free(&auth_blob);
247 prs_mem_free(&outgoing_pdu);
248 return False;
251 data_blob_free(&auth_blob);
254 * Setup the counts for this PDU.
257 p->out_data.data_sent_length += data_len;
258 p->out_data.current_pdu_len = p->hdr.frag_len;
259 p->out_data.current_pdu_sent = 0;
261 prs_mem_free(&outgoing_pdu);
262 return True;
265 /*******************************************************************
266 Generate the next PDU to be returned from the data in p->rdata.
267 Return an schannel authenticated fragment.
268 ********************************************************************/
270 static BOOL create_next_pdu_schannel(pipes_struct *p)
272 RPC_HDR_RESP hdr_resp;
273 uint32 ss_padding_len = 0;
274 uint32 data_len;
275 uint32 data_space_available;
276 uint32 data_len_left;
277 prs_struct outgoing_pdu;
278 uint32 data_pos;
281 * If we're in the fault state, keep returning fault PDU's until
282 * the pipe gets closed. JRA.
285 if(p->fault_state) {
286 setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
287 return True;
290 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
292 /* Change the incoming request header to a response. */
293 p->hdr.pkt_type = RPC_RESPONSE;
295 /* Set up rpc header flags. */
296 if (p->out_data.data_sent_length == 0) {
297 p->hdr.flags = RPC_FLG_FIRST;
298 } else {
299 p->hdr.flags = 0;
303 * Work out how much we can fit in a single PDU.
306 data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
309 * Ensure there really is data left to send.
312 if(!data_len_left) {
313 DEBUG(0,("create_next_pdu_schannel: no data left to send !\n"));
314 return False;
317 data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN -
318 RPC_HDR_AUTH_LEN - RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN;
321 * The amount we send is the minimum of the available
322 * space and the amount left to send.
325 data_len = MIN(data_len_left, data_space_available);
328 * Set up the alloc hint. This should be the data left to
329 * send.
332 hdr_resp.alloc_hint = data_len_left;
335 * Work out if this PDU will be the last.
338 if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata)) {
339 p->hdr.flags |= RPC_FLG_LAST;
340 if (data_len_left % 8) {
341 ss_padding_len = 8 - (data_len_left % 8);
342 DEBUG(10,("create_next_pdu_schannel: adding sign/seal padding of %u\n",
343 ss_padding_len ));
347 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len + ss_padding_len +
348 RPC_HDR_AUTH_LEN + RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN;
349 p->hdr.auth_len = RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN;
352 * Init the parse struct to point at the outgoing
353 * data.
356 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
357 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
359 /* Store the header in the data stream. */
360 if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) {
361 DEBUG(0,("create_next_pdu_schannel: failed to marshall RPC_HDR.\n"));
362 prs_mem_free(&outgoing_pdu);
363 return False;
366 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
367 DEBUG(0,("create_next_pdu_schannel: failed to marshall RPC_HDR_RESP.\n"));
368 prs_mem_free(&outgoing_pdu);
369 return False;
372 /* Store the current offset. */
373 data_pos = prs_offset(&outgoing_pdu);
375 /* Copy the data into the PDU. */
377 if(!prs_append_some_prs_data(&outgoing_pdu, &p->out_data.rdata, p->out_data.data_sent_length, data_len)) {
378 DEBUG(0,("create_next_pdu_schannel: failed to copy %u bytes of data.\n", (unsigned int)data_len));
379 prs_mem_free(&outgoing_pdu);
380 return False;
383 /* Copy the sign/seal padding data. */
384 if (ss_padding_len) {
385 char pad[8];
386 memset(pad, '\0', 8);
387 if (!prs_copy_data_in(&outgoing_pdu, pad, ss_padding_len)) {
388 DEBUG(0,("create_next_pdu_schannel: failed to add %u bytes of pad data.\n", (unsigned int)ss_padding_len));
389 prs_mem_free(&outgoing_pdu);
390 return False;
396 * Schannel processing.
398 char *data;
399 RPC_HDR_AUTH auth_info;
400 RPC_AUTH_SCHANNEL_CHK verf;
402 data = prs_data_p(&outgoing_pdu) + data_pos;
403 /* Check it's the type of reply we were expecting to decode */
405 init_rpc_hdr_auth(&auth_info,
406 RPC_SCHANNEL_AUTH_TYPE,
407 p->auth.auth_level == PIPE_AUTH_LEVEL_PRIVACY ?
408 RPC_AUTH_LEVEL_PRIVACY : RPC_AUTH_LEVEL_INTEGRITY,
409 ss_padding_len, 1);
411 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) {
412 DEBUG(0,("create_next_pdu_schannel: failed to marshall RPC_HDR_AUTH.\n"));
413 prs_mem_free(&outgoing_pdu);
414 return False;
417 schannel_encode(p->auth.a_u.schannel_auth,
418 p->auth.auth_level,
419 SENDER_IS_ACCEPTOR,
420 &verf, data, data_len + ss_padding_len);
422 if (!smb_io_rpc_auth_schannel_chk("", RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN,
423 &verf, &outgoing_pdu, 0)) {
424 prs_mem_free(&outgoing_pdu);
425 return False;
428 p->auth.a_u.schannel_auth->seq_num++;
432 * Setup the counts for this PDU.
435 p->out_data.data_sent_length += data_len;
436 p->out_data.current_pdu_len = p->hdr.frag_len;
437 p->out_data.current_pdu_sent = 0;
439 prs_mem_free(&outgoing_pdu);
440 return True;
443 /*******************************************************************
444 Generate the next PDU to be returned from the data in p->rdata.
445 No authentication done.
446 ********************************************************************/
448 static BOOL create_next_pdu_noauth(pipes_struct *p)
450 RPC_HDR_RESP hdr_resp;
451 uint32 data_len;
452 uint32 data_space_available;
453 uint32 data_len_left;
454 prs_struct outgoing_pdu;
457 * If we're in the fault state, keep returning fault PDU's until
458 * the pipe gets closed. JRA.
461 if(p->fault_state) {
462 setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
463 return True;
466 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
468 /* Change the incoming request header to a response. */
469 p->hdr.pkt_type = RPC_RESPONSE;
471 /* Set up rpc header flags. */
472 if (p->out_data.data_sent_length == 0) {
473 p->hdr.flags = RPC_FLG_FIRST;
474 } else {
475 p->hdr.flags = 0;
479 * Work out how much we can fit in a single PDU.
482 data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
485 * Ensure there really is data left to send.
488 if(!data_len_left) {
489 DEBUG(0,("create_next_pdu_noath: no data left to send !\n"));
490 return False;
493 data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN;
496 * The amount we send is the minimum of the available
497 * space and the amount left to send.
500 data_len = MIN(data_len_left, data_space_available);
503 * Set up the alloc hint. This should be the data left to
504 * send.
507 hdr_resp.alloc_hint = data_len_left;
510 * Work out if this PDU will be the last.
513 if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata)) {
514 p->hdr.flags |= RPC_FLG_LAST;
518 * Set up the header lengths.
521 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len;
522 p->hdr.auth_len = 0;
525 * Init the parse struct to point at the outgoing
526 * data.
529 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
530 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
532 /* Store the header in the data stream. */
533 if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) {
534 DEBUG(0,("create_next_pdu_noath: failed to marshall RPC_HDR.\n"));
535 prs_mem_free(&outgoing_pdu);
536 return False;
539 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
540 DEBUG(0,("create_next_pdu_noath: failed to marshall RPC_HDR_RESP.\n"));
541 prs_mem_free(&outgoing_pdu);
542 return False;
545 /* Copy the data into the PDU. */
547 if(!prs_append_some_prs_data(&outgoing_pdu, &p->out_data.rdata, p->out_data.data_sent_length, data_len)) {
548 DEBUG(0,("create_next_pdu_noauth: failed to copy %u bytes of data.\n", (unsigned int)data_len));
549 prs_mem_free(&outgoing_pdu);
550 return False;
554 * Setup the counts for this PDU.
557 p->out_data.data_sent_length += data_len;
558 p->out_data.current_pdu_len = p->hdr.frag_len;
559 p->out_data.current_pdu_sent = 0;
561 prs_mem_free(&outgoing_pdu);
562 return True;
565 /*******************************************************************
566 Generate the next PDU to be returned from the data in p->rdata.
567 ********************************************************************/
569 BOOL create_next_pdu(pipes_struct *p)
571 switch(p->auth.auth_level) {
572 case PIPE_AUTH_LEVEL_NONE:
573 case PIPE_AUTH_LEVEL_CONNECT:
574 /* This is incorrect for auth level connect. Fixme. JRA */
575 return create_next_pdu_noauth(p);
577 default:
578 switch(p->auth.auth_type) {
579 case PIPE_AUTH_TYPE_NTLMSSP:
580 case PIPE_AUTH_TYPE_SPNEGO_NTLMSSP:
581 return create_next_pdu_ntlmssp(p);
582 case PIPE_AUTH_TYPE_SCHANNEL:
583 return create_next_pdu_schannel(p);
584 default:
585 break;
589 DEBUG(0,("create_next_pdu: invalid internal auth level %u / type %u",
590 (unsigned int)p->auth.auth_level,
591 (unsigned int)p->auth.auth_type));
592 return False;
595 /*******************************************************************
596 Process an NTLMSSP authentication response.
597 If this function succeeds, the user has been authenticated
598 and their domain, name and calling workstation stored in
599 the pipe struct.
600 *******************************************************************/
602 static BOOL pipe_ntlmssp_verify_final(pipes_struct *p, DATA_BLOB *p_resp_blob)
604 DATA_BLOB reply;
605 NTSTATUS status;
606 AUTH_NTLMSSP_STATE *a = p->auth.a_u.auth_ntlmssp_state;
608 DEBUG(5,("pipe_ntlmssp_verify_final: pipe %s checking user details\n", p->name));
610 ZERO_STRUCT(reply);
612 memset(p->user_name, '\0', sizeof(p->user_name));
613 memset(p->pipe_user_name, '\0', sizeof(p->pipe_user_name));
614 memset(p->domain, '\0', sizeof(p->domain));
615 memset(p->wks, '\0', sizeof(p->wks));
617 /* Set up for non-authenticated user. */
618 TALLOC_FREE(p->pipe_user.nt_user_token);
619 p->pipe_user.ut.ngroups = 0;
620 SAFE_FREE( p->pipe_user.ut.groups);
622 /* this has to be done as root in order to verify the password */
623 become_root();
624 status = auth_ntlmssp_update(a, *p_resp_blob, &reply);
625 unbecome_root();
627 /* Don't generate a reply. */
628 data_blob_free(&reply);
630 if (!NT_STATUS_IS_OK(status)) {
631 return False;
634 /* Finally - if the pipe negotiated integrity (sign) or privacy (seal)
635 ensure the underlying NTLMSSP flags are also set. If not we should
636 refuse the bind. */
638 if (p->auth.auth_level == PIPE_AUTH_LEVEL_INTEGRITY) {
639 if (!(a->ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SIGN)) {
640 DEBUG(0,("pipe_ntlmssp_verify_final: pipe %s : packet integrity requested "
641 "but client declined signing.\n",
642 p->name ));
643 return False;
646 if (p->auth.auth_level == PIPE_AUTH_LEVEL_PRIVACY) {
647 if (!(a->ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SEAL)) {
648 DEBUG(0,("pipe_ntlmssp_verify_final: pipe %s : packet privacy requested "
649 "but client declined sealing.\n",
650 p->name ));
651 return False;
655 fstrcpy(p->user_name, a->ntlmssp_state->user);
656 fstrcpy(p->pipe_user_name, a->server_info->unix_name);
657 fstrcpy(p->domain, a->ntlmssp_state->domain);
658 fstrcpy(p->wks, a->ntlmssp_state->workstation);
660 DEBUG(5,("pipe_ntlmssp_verify_final: OK: user: %s domain: %s workstation: %s\n",
661 p->user_name, p->domain, p->wks));
664 * Store the UNIX credential data (uid/gid pair) in the pipe structure.
667 p->pipe_user.ut.uid = a->server_info->uid;
668 p->pipe_user.ut.gid = a->server_info->gid;
671 * Copy the session key from the ntlmssp state.
674 data_blob_free(&p->session_key);
675 p->session_key = data_blob(a->ntlmssp_state->session_key.data, a->ntlmssp_state->session_key.length);
676 if (!p->session_key.data) {
677 return False;
680 p->pipe_user.ut.ngroups = a->server_info->n_groups;
681 if (p->pipe_user.ut.ngroups) {
682 if (!(p->pipe_user.ut.groups = (gid_t *)memdup(a->server_info->groups,
683 sizeof(gid_t) * p->pipe_user.ut.ngroups))) {
684 DEBUG(0,("failed to memdup group list to p->pipe_user.groups\n"));
685 return False;
689 if (a->server_info->ptok) {
690 p->pipe_user.nt_user_token =
691 dup_nt_token(NULL, a->server_info->ptok);
692 } else {
693 DEBUG(1,("Error: Authmodule failed to provide nt_user_token\n"));
694 p->pipe_user.nt_user_token = NULL;
695 return False;
698 return True;
701 /*******************************************************************
702 The switch table for the pipe names and the functions to handle them.
703 *******************************************************************/
705 struct rpc_table {
706 struct {
707 const char *clnt;
708 const char *srv;
709 } pipe;
710 struct api_struct *cmds;
711 int n_cmds;
714 static struct rpc_table *rpc_lookup;
715 static int rpc_lookup_size;
717 /*******************************************************************
718 This is the "stage3" NTLMSSP response after a bind request and reply.
719 *******************************************************************/
721 BOOL api_pipe_bind_auth3(pipes_struct *p, prs_struct *rpc_in_p)
723 RPC_HDR_AUTH auth_info;
724 uint32 pad;
725 DATA_BLOB blob;
727 ZERO_STRUCT(blob);
729 DEBUG(5,("api_pipe_bind_auth3: decode request. %d\n", __LINE__));
731 if (p->hdr.auth_len == 0) {
732 DEBUG(0,("api_pipe_bind_auth3: No auth field sent !\n"));
733 goto err;
736 /* 4 bytes padding. */
737 if (!prs_uint32("pad", rpc_in_p, 0, &pad)) {
738 DEBUG(0,("api_pipe_bind_auth3: unmarshall of 4 byte pad failed.\n"));
739 goto err;
743 * Decode the authentication verifier response.
746 if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) {
747 DEBUG(0,("api_pipe_bind_auth3: unmarshall of RPC_HDR_AUTH failed.\n"));
748 goto err;
751 if (auth_info.auth_type != RPC_NTLMSSP_AUTH_TYPE) {
752 DEBUG(0,("api_pipe_bind_auth3: incorrect auth type (%u).\n",
753 (unsigned int)auth_info.auth_type ));
754 return False;
757 blob = data_blob(NULL,p->hdr.auth_len);
759 if (!prs_copy_data_out((char *)blob.data, rpc_in_p, p->hdr.auth_len)) {
760 DEBUG(0,("api_pipe_bind_auth3: Failed to pull %u bytes - the response blob.\n",
761 (unsigned int)p->hdr.auth_len ));
762 goto err;
766 * The following call actually checks the challenge/response data.
767 * for correctness against the given DOMAIN\user name.
770 if (!pipe_ntlmssp_verify_final(p, &blob)) {
771 goto err;
774 data_blob_free(&blob);
776 p->pipe_bound = True;
778 return True;
780 err:
782 data_blob_free(&blob);
783 free_pipe_ntlmssp_auth_data(&p->auth);
784 p->auth.a_u.auth_ntlmssp_state = NULL;
786 return False;
789 /*******************************************************************
790 Marshall a bind_nak pdu.
791 *******************************************************************/
793 static BOOL setup_bind_nak(pipes_struct *p)
795 prs_struct outgoing_rpc;
796 RPC_HDR nak_hdr;
797 uint16 zero = 0;
799 /* Free any memory in the current return data buffer. */
800 prs_mem_free(&p->out_data.rdata);
803 * Marshall directly into the outgoing PDU space. We
804 * must do this as we need to set to the bind response
805 * header and are never sending more than one PDU here.
808 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
809 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
812 * Initialize a bind_nak header.
815 init_rpc_hdr(&nak_hdr, RPC_BINDNACK, RPC_FLG_FIRST | RPC_FLG_LAST,
816 p->hdr.call_id, RPC_HEADER_LEN + sizeof(uint16), 0);
819 * Marshall the header into the outgoing PDU.
822 if(!smb_io_rpc_hdr("", &nak_hdr, &outgoing_rpc, 0)) {
823 DEBUG(0,("setup_bind_nak: marshalling of RPC_HDR failed.\n"));
824 prs_mem_free(&outgoing_rpc);
825 return False;
829 * Now add the reject reason.
832 if(!prs_uint16("reject code", &outgoing_rpc, 0, &zero)) {
833 prs_mem_free(&outgoing_rpc);
834 return False;
837 p->out_data.data_sent_length = 0;
838 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
839 p->out_data.current_pdu_sent = 0;
841 if (p->auth.auth_data_free_func) {
842 (*p->auth.auth_data_free_func)(&p->auth);
844 p->auth.auth_level = PIPE_AUTH_LEVEL_NONE;
845 p->auth.auth_type = PIPE_AUTH_TYPE_NONE;
846 p->pipe_bound = False;
848 return True;
851 /*******************************************************************
852 Marshall a fault pdu.
853 *******************************************************************/
855 BOOL setup_fault_pdu(pipes_struct *p, NTSTATUS status)
857 prs_struct outgoing_pdu;
858 RPC_HDR fault_hdr;
859 RPC_HDR_RESP hdr_resp;
860 RPC_HDR_FAULT fault_resp;
862 /* Free any memory in the current return data buffer. */
863 prs_mem_free(&p->out_data.rdata);
866 * Marshall directly into the outgoing PDU space. We
867 * must do this as we need to set to the bind response
868 * header and are never sending more than one PDU here.
871 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
872 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
875 * Initialize a fault header.
878 init_rpc_hdr(&fault_hdr, RPC_FAULT, RPC_FLG_FIRST | RPC_FLG_LAST | RPC_FLG_NOCALL,
879 p->hdr.call_id, RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN, 0);
882 * Initialize the HDR_RESP and FAULT parts of the PDU.
885 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
887 fault_resp.status = status;
888 fault_resp.reserved = 0;
891 * Marshall the header into the outgoing PDU.
894 if(!smb_io_rpc_hdr("", &fault_hdr, &outgoing_pdu, 0)) {
895 DEBUG(0,("setup_fault_pdu: marshalling of RPC_HDR failed.\n"));
896 prs_mem_free(&outgoing_pdu);
897 return False;
900 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) {
901 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_RESP.\n"));
902 prs_mem_free(&outgoing_pdu);
903 return False;
906 if(!smb_io_rpc_hdr_fault("fault", &fault_resp, &outgoing_pdu, 0)) {
907 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_FAULT.\n"));
908 prs_mem_free(&outgoing_pdu);
909 return False;
912 p->out_data.data_sent_length = 0;
913 p->out_data.current_pdu_len = prs_offset(&outgoing_pdu);
914 p->out_data.current_pdu_sent = 0;
916 prs_mem_free(&outgoing_pdu);
917 return True;
920 #if 0
921 /*******************************************************************
922 Marshall a cancel_ack pdu.
923 We should probably check the auth-verifier here.
924 *******************************************************************/
926 BOOL setup_cancel_ack_reply(pipes_struct *p, prs_struct *rpc_in_p)
928 prs_struct outgoing_pdu;
929 RPC_HDR ack_reply_hdr;
931 /* Free any memory in the current return data buffer. */
932 prs_mem_free(&p->out_data.rdata);
935 * Marshall directly into the outgoing PDU space. We
936 * must do this as we need to set to the bind response
937 * header and are never sending more than one PDU here.
940 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
941 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
944 * Initialize a cancel_ack header.
947 init_rpc_hdr(&ack_reply_hdr, RPC_CANCEL_ACK, RPC_FLG_FIRST | RPC_FLG_LAST,
948 p->hdr.call_id, RPC_HEADER_LEN, 0);
951 * Marshall the header into the outgoing PDU.
954 if(!smb_io_rpc_hdr("", &ack_reply_hdr, &outgoing_pdu, 0)) {
955 DEBUG(0,("setup_cancel_ack_reply: marshalling of RPC_HDR failed.\n"));
956 prs_mem_free(&outgoing_pdu);
957 return False;
960 p->out_data.data_sent_length = 0;
961 p->out_data.current_pdu_len = prs_offset(&outgoing_pdu);
962 p->out_data.current_pdu_sent = 0;
964 prs_mem_free(&outgoing_pdu);
965 return True;
967 #endif
969 /*******************************************************************
970 Ensure a bind request has the correct abstract & transfer interface.
971 Used to reject unknown binds from Win2k.
972 *******************************************************************/
974 BOOL check_bind_req(struct pipes_struct *p, RPC_IFACE* abstract,
975 RPC_IFACE* transfer, uint32 context_id)
977 char *pipe_name = p->name;
978 int i=0;
979 fstring pname;
981 fstrcpy(pname,"\\PIPE\\");
982 fstrcat(pname,pipe_name);
984 DEBUG(3,("check_bind_req for %s\n", pname));
986 /* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */
988 for ( i=0; pipe_names[i].client_pipe; i++ ) {
989 DEBUG(10,("checking %s\n", pipe_names[i].client_pipe));
990 if ( strequal(pipe_names[i].client_pipe, pname)
991 && (abstract->version == pipe_names[i].abstr_syntax.version)
992 && (memcmp(&abstract->uuid, &pipe_names[i].abstr_syntax.uuid, sizeof(struct GUID)) == 0)
993 && (transfer->version == pipe_names[i].trans_syntax.version)
994 && (memcmp(&transfer->uuid, &pipe_names[i].trans_syntax.uuid, sizeof(struct GUID)) == 0) ) {
995 struct api_struct *fns = NULL;
996 int n_fns = 0;
997 PIPE_RPC_FNS *context_fns;
999 if ( !(context_fns = SMB_MALLOC_P(PIPE_RPC_FNS)) ) {
1000 DEBUG(0,("check_bind_req: malloc() failed!\n"));
1001 return False;
1004 /* save the RPC function table associated with this bind */
1006 get_pipe_fns(i, &fns, &n_fns);
1008 context_fns->cmds = fns;
1009 context_fns->n_cmds = n_fns;
1010 context_fns->context_id = context_id;
1012 /* add to the list of open contexts */
1014 DLIST_ADD( p->contexts, context_fns );
1016 break;
1020 if(pipe_names[i].client_pipe == NULL) {
1021 return False;
1024 return True;
1027 /*******************************************************************
1028 Register commands to an RPC pipe
1029 *******************************************************************/
1031 NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size)
1033 struct rpc_table *rpc_entry;
1035 if (!clnt || !srv || !cmds) {
1036 return NT_STATUS_INVALID_PARAMETER;
1039 if (version != SMB_RPC_INTERFACE_VERSION) {
1040 DEBUG(0,("Can't register rpc commands!\n"
1041 "You tried to register a rpc module with SMB_RPC_INTERFACE_VERSION %d"
1042 ", while this version of samba uses version %d!\n",
1043 version,SMB_RPC_INTERFACE_VERSION));
1044 return NT_STATUS_OBJECT_TYPE_MISMATCH;
1047 /* TODO:
1049 * we still need to make sure that don't register the same commands twice!!!
1051 * --metze
1054 /* We use a temporary variable because this call can fail and
1055 rpc_lookup will still be valid afterwards. It could then succeed if
1056 called again later */
1057 rpc_lookup_size++;
1058 rpc_entry = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(rpc_lookup, struct rpc_table, rpc_lookup_size);
1059 if (NULL == rpc_entry) {
1060 rpc_lookup_size--;
1061 DEBUG(0, ("rpc_pipe_register_commands: memory allocation failed\n"));
1062 return NT_STATUS_NO_MEMORY;
1063 } else {
1064 rpc_lookup = rpc_entry;
1067 rpc_entry = rpc_lookup + (rpc_lookup_size - 1);
1068 ZERO_STRUCTP(rpc_entry);
1069 rpc_entry->pipe.clnt = SMB_STRDUP(clnt);
1070 rpc_entry->pipe.srv = SMB_STRDUP(srv);
1071 rpc_entry->cmds = SMB_REALLOC_ARRAY(rpc_entry->cmds, struct api_struct, rpc_entry->n_cmds + size);
1072 if (!rpc_entry->cmds) {
1073 return NT_STATUS_NO_MEMORY;
1075 memcpy(rpc_entry->cmds + rpc_entry->n_cmds, cmds, size * sizeof(struct api_struct));
1076 rpc_entry->n_cmds += size;
1078 return NT_STATUS_OK;
1081 /*******************************************************************
1082 Handle a SPNEGO krb5 bind auth.
1083 *******************************************************************/
1085 static BOOL pipe_spnego_auth_bind_kerberos(pipes_struct *p, prs_struct *rpc_in_p, RPC_HDR_AUTH *pauth_info,
1086 DATA_BLOB *psecblob, prs_struct *pout_auth)
1088 return False;
1091 /*******************************************************************
1092 Handle the first part of a SPNEGO bind auth.
1093 *******************************************************************/
1095 static BOOL pipe_spnego_auth_bind_negotiate(pipes_struct *p, prs_struct *rpc_in_p,
1096 RPC_HDR_AUTH *pauth_info, prs_struct *pout_auth)
1098 DATA_BLOB blob;
1099 DATA_BLOB secblob;
1100 DATA_BLOB response;
1101 DATA_BLOB chal;
1102 char *OIDs[ASN1_MAX_OIDS];
1103 int i;
1104 NTSTATUS status;
1105 BOOL got_kerberos_mechanism = False;
1106 AUTH_NTLMSSP_STATE *a = NULL;
1107 RPC_HDR_AUTH auth_info;
1109 ZERO_STRUCT(secblob);
1110 ZERO_STRUCT(chal);
1111 ZERO_STRUCT(response);
1113 /* Grab the SPNEGO blob. */
1114 blob = data_blob(NULL,p->hdr.auth_len);
1116 if (!prs_copy_data_out((char *)blob.data, rpc_in_p, p->hdr.auth_len)) {
1117 DEBUG(0,("pipe_spnego_auth_bind_negotiate: Failed to pull %u bytes - the SPNEGO auth header.\n",
1118 (unsigned int)p->hdr.auth_len ));
1119 goto err;
1122 if (blob.data[0] != ASN1_APPLICATION(0)) {
1123 goto err;
1126 /* parse out the OIDs and the first sec blob */
1127 if (!parse_negTokenTarg(blob, OIDs, &secblob)) {
1128 DEBUG(0,("pipe_spnego_auth_bind_negotiate: Failed to parse the security blob.\n"));
1129 goto err;
1132 if (strcmp(OID_KERBEROS5, OIDs[0]) == 0 || strcmp(OID_KERBEROS5_OLD, OIDs[0]) == 0) {
1133 got_kerberos_mechanism = True;
1136 for (i=0;OIDs[i];i++) {
1137 DEBUG(3,("pipe_spnego_auth_bind_negotiate: Got OID %s\n", OIDs[i]));
1138 SAFE_FREE(OIDs[i]);
1140 DEBUG(3,("pipe_spnego_auth_bind_negotiate: Got secblob of size %lu\n", (unsigned long)secblob.length));
1142 if ( got_kerberos_mechanism && ((lp_security()==SEC_ADS) || lp_use_kerberos_keytab()) ) {
1143 BOOL ret = pipe_spnego_auth_bind_kerberos(p, rpc_in_p, pauth_info, &secblob, pout_auth);
1144 data_blob_free(&secblob);
1145 data_blob_free(&blob);
1146 return ret;
1149 if (p->auth.auth_type == PIPE_AUTH_TYPE_SPNEGO_NTLMSSP && p->auth.a_u.auth_ntlmssp_state) {
1150 /* Free any previous auth type. */
1151 free_pipe_ntlmssp_auth_data(&p->auth);
1154 /* Initialize the NTLM engine. */
1155 status = auth_ntlmssp_start(&a);
1156 if (!NT_STATUS_IS_OK(status)) {
1157 goto err;
1161 * Pass the first security blob of data to it.
1162 * This can return an error or NT_STATUS_MORE_PROCESSING_REQUIRED
1163 * which means we need another packet to complete the bind.
1166 status = auth_ntlmssp_update(a, secblob, &chal);
1168 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1169 DEBUG(3,("pipe_spnego_auth_bind_negotiate: auth_ntlmssp_update failed.\n"));
1170 goto err;
1173 /* Generate the response blob we need for step 2 of the bind. */
1174 response = spnego_gen_auth_response(&chal, status, OID_NTLMSSP);
1176 /* Copy the blob into the pout_auth parse struct */
1177 init_rpc_hdr_auth(&auth_info, RPC_SPNEGO_AUTH_TYPE, pauth_info->auth_level, RPC_HDR_AUTH_LEN, 1);
1178 if(!smb_io_rpc_hdr_auth("", &auth_info, pout_auth, 0)) {
1179 DEBUG(0,("pipe_spnego_auth_bind_negotiate: marshalling of RPC_HDR_AUTH failed.\n"));
1180 goto err;
1183 if (!prs_copy_data_in(pout_auth, (char *)response.data, response.length)) {
1184 DEBUG(0,("pipe_spnego_auth_bind_negotiate: marshalling of data blob failed.\n"));
1185 goto err;
1188 p->auth.a_u.auth_ntlmssp_state = a;
1189 p->auth.auth_data_free_func = &free_pipe_ntlmssp_auth_data;
1190 p->auth.auth_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;
1192 data_blob_free(&blob);
1193 data_blob_free(&secblob);
1194 data_blob_free(&chal);
1195 data_blob_free(&response);
1197 /* We can't set pipe_bound True yet - we need an RPC_ALTER_CONTEXT response packet... */
1198 return True;
1200 err:
1202 data_blob_free(&blob);
1203 data_blob_free(&secblob);
1204 data_blob_free(&chal);
1205 data_blob_free(&response);
1207 p->auth.a_u.auth_ntlmssp_state = NULL;
1209 return False;
1212 /*******************************************************************
1213 Handle the second part of a SPNEGO bind auth.
1214 *******************************************************************/
1216 static BOOL pipe_spnego_auth_bind_continue(pipes_struct *p, prs_struct *rpc_in_p,
1217 RPC_HDR_AUTH *pauth_info, prs_struct *pout_auth)
1219 RPC_HDR_AUTH auth_info;
1220 DATA_BLOB spnego_blob;
1221 DATA_BLOB auth_blob;
1222 DATA_BLOB auth_reply;
1223 DATA_BLOB response;
1224 AUTH_NTLMSSP_STATE *a = p->auth.a_u.auth_ntlmssp_state;
1226 ZERO_STRUCT(spnego_blob);
1227 ZERO_STRUCT(auth_blob);
1228 ZERO_STRUCT(auth_reply);
1229 ZERO_STRUCT(response);
1231 if (p->auth.auth_type != PIPE_AUTH_TYPE_SPNEGO_NTLMSSP || !a) {
1232 DEBUG(0,("pipe_spnego_auth_bind_continue: not in NTLMSSP auth state.\n"));
1233 goto err;
1236 /* Grab the SPNEGO blob. */
1237 spnego_blob = data_blob(NULL,p->hdr.auth_len);
1239 if (!prs_copy_data_out((char *)spnego_blob.data, rpc_in_p, p->hdr.auth_len)) {
1240 DEBUG(0,("pipe_spnego_auth_bind_continue: Failed to pull %u bytes - the SPNEGO auth header.\n",
1241 (unsigned int)p->hdr.auth_len ));
1242 goto err;
1245 if (spnego_blob.data[0] != ASN1_CONTEXT(1)) {
1246 DEBUG(0,("pipe_spnego_auth_bind_continue: invalid SPNEGO blob type.\n"));
1247 goto err;
1250 if (!spnego_parse_auth(spnego_blob, &auth_blob)) {
1251 DEBUG(0,("pipe_spnego_auth_bind_continue: invalid SPNEGO blob.\n"));
1252 goto err;
1256 * The following call actually checks the challenge/response data.
1257 * for correctness against the given DOMAIN\user name.
1260 if (!pipe_ntlmssp_verify_final(p, &auth_blob)) {
1261 goto err;
1264 data_blob_free(&spnego_blob);
1265 data_blob_free(&auth_blob);
1267 /* Generate the spnego "accept completed" blob - no incoming data. */
1268 response = spnego_gen_auth_response(&auth_reply, NT_STATUS_OK, OID_NTLMSSP);
1270 /* Copy the blob into the pout_auth parse struct */
1271 init_rpc_hdr_auth(&auth_info, RPC_SPNEGO_AUTH_TYPE, pauth_info->auth_level, RPC_HDR_AUTH_LEN, 1);
1272 if(!smb_io_rpc_hdr_auth("", &auth_info, pout_auth, 0)) {
1273 DEBUG(0,("pipe_spnego_auth_bind_continue: marshalling of RPC_HDR_AUTH failed.\n"));
1274 goto err;
1277 if (!prs_copy_data_in(pout_auth, (char *)response.data, response.length)) {
1278 DEBUG(0,("pipe_spnego_auth_bind_continue: marshalling of data blob failed.\n"));
1279 goto err;
1282 data_blob_free(&auth_reply);
1283 data_blob_free(&response);
1285 p->pipe_bound = True;
1287 return True;
1289 err:
1291 data_blob_free(&spnego_blob);
1292 data_blob_free(&auth_blob);
1293 data_blob_free(&auth_reply);
1294 data_blob_free(&response);
1296 free_pipe_ntlmssp_auth_data(&p->auth);
1297 p->auth.a_u.auth_ntlmssp_state = NULL;
1299 return False;
1302 /*******************************************************************
1303 Handle an schannel bind auth.
1304 *******************************************************************/
1306 static BOOL pipe_schannel_auth_bind(pipes_struct *p, prs_struct *rpc_in_p,
1307 RPC_HDR_AUTH *pauth_info, prs_struct *pout_auth)
1309 RPC_HDR_AUTH auth_info;
1310 RPC_AUTH_SCHANNEL_NEG neg;
1311 RPC_AUTH_VERIFIER auth_verifier;
1312 BOOL ret;
1313 struct dcinfo *pdcinfo;
1314 uint32 flags;
1316 if (!smb_io_rpc_auth_schannel_neg("", &neg, rpc_in_p, 0)) {
1317 DEBUG(0,("pipe_schannel_auth_bind: Could not unmarshal SCHANNEL auth neg\n"));
1318 return False;
1322 * The neg.myname key here must match the remote computer name
1323 * given in the DOM_CLNT_SRV.uni_comp_name used on all netlogon pipe
1324 * operations that use credentials.
1327 become_root();
1328 ret = secrets_restore_schannel_session_info(p->mem_ctx, neg.myname, &pdcinfo);
1329 unbecome_root();
1331 if (!ret) {
1332 DEBUG(0, ("pipe_schannel_auth_bind: Attempt to bind using schannel without successful serverauth2\n"));
1333 return False;
1336 p->auth.a_u.schannel_auth = TALLOC_P(p->pipe_state_mem_ctx, struct schannel_auth_struct);
1337 if (!p->auth.a_u.schannel_auth) {
1338 TALLOC_FREE(pdcinfo);
1339 return False;
1342 memset(p->auth.a_u.schannel_auth->sess_key, 0, sizeof(p->auth.a_u.schannel_auth->sess_key));
1343 memcpy(p->auth.a_u.schannel_auth->sess_key, pdcinfo->sess_key,
1344 sizeof(pdcinfo->sess_key));
1346 TALLOC_FREE(pdcinfo);
1348 p->auth.a_u.schannel_auth->seq_num = 0;
1351 * JRA. Should we also copy the schannel session key into the pipe session key p->session_key
1352 * here ? We do that for NTLMSSP, but the session key is already set up from the vuser
1353 * struct of the person who opened the pipe. I need to test this further. JRA.
1356 init_rpc_hdr_auth(&auth_info, RPC_SCHANNEL_AUTH_TYPE, pauth_info->auth_level, RPC_HDR_AUTH_LEN, 1);
1357 if(!smb_io_rpc_hdr_auth("", &auth_info, pout_auth, 0)) {
1358 DEBUG(0,("pipe_schannel_auth_bind: marshalling of RPC_HDR_AUTH failed.\n"));
1359 return False;
1362 /*** SCHANNEL verifier ***/
1364 init_rpc_auth_verifier(&auth_verifier, "\001", 0x0);
1365 if(!smb_io_rpc_schannel_verifier("", &auth_verifier, pout_auth, 0)) {
1366 DEBUG(0,("pipe_schannel_auth_bind: marshalling of RPC_AUTH_VERIFIER failed.\n"));
1367 return False;
1370 prs_align(pout_auth);
1372 flags = 5;
1373 if(!prs_uint32("flags ", pout_auth, 0, &flags)) {
1374 return False;
1377 DEBUG(10,("pipe_schannel_auth_bind: schannel auth: domain [%s] myname [%s]\n",
1378 neg.domain, neg.myname));
1380 /* We're finished with this bind - no more packets. */
1381 p->auth.auth_data_free_func = NULL;
1382 p->auth.auth_type = PIPE_AUTH_TYPE_SCHANNEL;
1384 p->pipe_bound = True;
1386 return True;
1389 /*******************************************************************
1390 Handle an NTLMSSP bind auth.
1391 *******************************************************************/
1393 static BOOL pipe_ntlmssp_auth_bind(pipes_struct *p, prs_struct *rpc_in_p,
1394 RPC_HDR_AUTH *pauth_info, prs_struct *pout_auth)
1396 RPC_HDR_AUTH auth_info;
1397 DATA_BLOB blob;
1398 DATA_BLOB response;
1399 NTSTATUS status;
1400 AUTH_NTLMSSP_STATE *a = NULL;
1402 ZERO_STRUCT(blob);
1403 ZERO_STRUCT(response);
1405 /* Grab the NTLMSSP blob. */
1406 blob = data_blob(NULL,p->hdr.auth_len);
1408 if (!prs_copy_data_out((char *)blob.data, rpc_in_p, p->hdr.auth_len)) {
1409 DEBUG(0,("pipe_ntlmssp_auth_bind: Failed to pull %u bytes - the NTLM auth header.\n",
1410 (unsigned int)p->hdr.auth_len ));
1411 goto err;
1414 if (strncmp((char *)blob.data, "NTLMSSP", 7) != 0) {
1415 DEBUG(0,("pipe_ntlmssp_auth_bind: Failed to read NTLMSSP in blob\n"));
1416 goto err;
1419 /* We have an NTLMSSP blob. */
1420 status = auth_ntlmssp_start(&a);
1421 if (!NT_STATUS_IS_OK(status)) {
1422 DEBUG(0,("pipe_ntlmssp_auth_bind: auth_ntlmssp_start failed: %s\n",
1423 nt_errstr(status) ));
1424 goto err;
1427 status = auth_ntlmssp_update(a, blob, &response);
1428 if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
1429 DEBUG(0,("pipe_ntlmssp_auth_bind: auth_ntlmssp_update failed: %s\n",
1430 nt_errstr(status) ));
1431 goto err;
1434 data_blob_free(&blob);
1436 /* Copy the blob into the pout_auth parse struct */
1437 init_rpc_hdr_auth(&auth_info, RPC_NTLMSSP_AUTH_TYPE, pauth_info->auth_level, RPC_HDR_AUTH_LEN, 1);
1438 if(!smb_io_rpc_hdr_auth("", &auth_info, pout_auth, 0)) {
1439 DEBUG(0,("pipe_ntlmssp_auth_bind: marshalling of RPC_HDR_AUTH failed.\n"));
1440 goto err;
1443 if (!prs_copy_data_in(pout_auth, (char *)response.data, response.length)) {
1444 DEBUG(0,("pipe_ntlmssp_auth_bind: marshalling of data blob failed.\n"));
1445 goto err;
1448 p->auth.a_u.auth_ntlmssp_state = a;
1449 p->auth.auth_data_free_func = &free_pipe_ntlmssp_auth_data;
1450 p->auth.auth_type = PIPE_AUTH_TYPE_NTLMSSP;
1452 data_blob_free(&blob);
1453 data_blob_free(&response);
1455 DEBUG(10,("pipe_ntlmssp_auth_bind: NTLMSSP auth started\n"));
1457 /* We can't set pipe_bound True yet - we need an RPC_AUTH3 response packet... */
1458 return True;
1460 err:
1462 data_blob_free(&blob);
1463 data_blob_free(&response);
1465 free_pipe_ntlmssp_auth_data(&p->auth);
1466 p->auth.a_u.auth_ntlmssp_state = NULL;
1467 return False;
1470 /*******************************************************************
1471 Respond to a pipe bind request.
1472 *******************************************************************/
1474 BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
1476 RPC_HDR_BA hdr_ba;
1477 RPC_HDR_RB hdr_rb;
1478 RPC_HDR_AUTH auth_info;
1479 uint16 assoc_gid;
1480 fstring ack_pipe_name;
1481 prs_struct out_hdr_ba;
1482 prs_struct out_auth;
1483 prs_struct outgoing_rpc;
1484 int i = 0;
1485 int auth_len = 0;
1486 unsigned int auth_type = RPC_ANONYMOUS_AUTH_TYPE;
1488 /* No rebinds on a bound pipe - use alter context. */
1489 if (p->pipe_bound) {
1490 DEBUG(2,("api_pipe_bind_req: rejecting bind request on bound pipe %s.\n", p->pipe_srv_name));
1491 return setup_bind_nak(p);
1494 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
1497 * Marshall directly into the outgoing PDU space. We
1498 * must do this as we need to set to the bind response
1499 * header and are never sending more than one PDU here.
1502 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
1505 * Setup the memory to marshall the ba header, and the
1506 * auth footers.
1509 if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) {
1510 DEBUG(0,("api_pipe_bind_req: malloc out_hdr_ba failed.\n"));
1511 prs_mem_free(&outgoing_rpc);
1512 return False;
1515 if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) {
1516 DEBUG(0,("api_pipe_bind_req: malloc out_auth failed.\n"));
1517 prs_mem_free(&outgoing_rpc);
1518 prs_mem_free(&out_hdr_ba);
1519 return False;
1522 DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__));
1525 * Try and find the correct pipe name to ensure
1526 * that this is a pipe name we support.
1530 for (i = 0; i < rpc_lookup_size; i++) {
1531 if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
1532 DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
1533 rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
1534 fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
1535 break;
1539 if (i == rpc_lookup_size) {
1540 if (NT_STATUS_IS_ERR(smb_probe_module("rpc", p->name))) {
1541 DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n",
1542 p->name ));
1543 prs_mem_free(&outgoing_rpc);
1544 prs_mem_free(&out_hdr_ba);
1545 prs_mem_free(&out_auth);
1547 return setup_bind_nak(p);
1550 for (i = 0; i < rpc_lookup_size; i++) {
1551 if (strequal(rpc_lookup[i].pipe.clnt, p->name)) {
1552 DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
1553 rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv));
1554 fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv);
1555 break;
1559 if (i == rpc_lookup_size) {
1560 DEBUG(0, ("module %s doesn't provide functions for pipe %s!\n", p->name, p->name));
1561 goto err_exit;
1565 /* decode the bind request */
1566 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_in_p, 0)) {
1567 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_RB struct.\n"));
1568 goto err_exit;
1571 /* name has to be \PIPE\xxxxx */
1572 fstrcpy(ack_pipe_name, "\\PIPE\\");
1573 fstrcat(ack_pipe_name, p->pipe_srv_name);
1575 DEBUG(5,("api_pipe_bind_req: make response. %d\n", __LINE__));
1578 * Check if this is an authenticated bind request.
1581 if (p->hdr.auth_len) {
1583 * Decode the authentication verifier.
1586 if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) {
1587 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_AUTH struct.\n"));
1588 goto err_exit;
1591 auth_type = auth_info.auth_type;
1593 /* Work out if we have to sign or seal etc. */
1594 switch (auth_info.auth_level) {
1595 case RPC_AUTH_LEVEL_INTEGRITY:
1596 p->auth.auth_level = PIPE_AUTH_LEVEL_INTEGRITY;
1597 break;
1598 case RPC_AUTH_LEVEL_PRIVACY:
1599 p->auth.auth_level = PIPE_AUTH_LEVEL_PRIVACY;
1600 break;
1601 default:
1602 DEBUG(0,("api_pipe_bind_req: unexpected auth level (%u).\n",
1603 (unsigned int)auth_info.auth_level ));
1604 goto err_exit;
1606 } else {
1607 ZERO_STRUCT(auth_info);
1610 assoc_gid = hdr_rb.bba.assoc_gid ? hdr_rb.bba.assoc_gid : 0x53f0;
1612 switch(auth_type) {
1613 case RPC_NTLMSSP_AUTH_TYPE:
1614 if (!pipe_ntlmssp_auth_bind(p, rpc_in_p, &auth_info, &out_auth)) {
1615 goto err_exit;
1617 assoc_gid = 0x7a77;
1618 break;
1620 case RPC_SCHANNEL_AUTH_TYPE:
1621 if (!pipe_schannel_auth_bind(p, rpc_in_p, &auth_info, &out_auth)) {
1622 goto err_exit;
1624 break;
1626 case RPC_SPNEGO_AUTH_TYPE:
1627 if (!pipe_spnego_auth_bind_negotiate(p, rpc_in_p, &auth_info, &out_auth)) {
1628 goto err_exit;
1630 break;
1632 case RPC_ANONYMOUS_AUTH_TYPE:
1633 /* Unauthenticated bind request. */
1634 /* Get the authenticated pipe user from current_user */
1635 if (!copy_current_user(&p->pipe_user, &current_user)) {
1636 DEBUG(10, ("Could not copy current user\n"));
1637 goto err_exit;
1639 /* We're finished - no more packets. */
1640 p->auth.auth_type = PIPE_AUTH_TYPE_NONE;
1641 /* We must set the pipe auth_level here also. */
1642 p->auth.auth_level = PIPE_AUTH_LEVEL_NONE;
1643 p->pipe_bound = True;
1644 /* The session key was initialized from the SMB
1645 * session in make_internal_rpc_pipe_p */
1646 break;
1648 default:
1649 DEBUG(0,("api_pipe_bind_req: unknown auth type %x requested.\n", auth_type ));
1650 goto err_exit;
1654 * Create the bind response struct.
1657 /* If the requested abstract synt uuid doesn't match our client pipe,
1658 reject the bind_ack & set the transfer interface synt to all 0's,
1659 ver 0 (observed when NT5 attempts to bind to abstract interfaces
1660 unknown to NT4)
1661 Needed when adding entries to a DACL from NT5 - SK */
1663 if(check_bind_req(p, &hdr_rb.rpc_context[0].abstract, &hdr_rb.rpc_context[0].transfer[0],
1664 hdr_rb.rpc_context[0].context_id )) {
1665 init_rpc_hdr_ba(&hdr_ba,
1666 RPC_MAX_PDU_FRAG_LEN,
1667 RPC_MAX_PDU_FRAG_LEN,
1668 assoc_gid,
1669 ack_pipe_name,
1670 0x1, 0x0, 0x0,
1671 &hdr_rb.rpc_context[0].transfer[0]);
1672 } else {
1673 RPC_IFACE null_interface;
1674 ZERO_STRUCT(null_interface);
1675 /* Rejection reason: abstract syntax not supported */
1676 init_rpc_hdr_ba(&hdr_ba, RPC_MAX_PDU_FRAG_LEN,
1677 RPC_MAX_PDU_FRAG_LEN, assoc_gid,
1678 ack_pipe_name, 0x1, 0x2, 0x1,
1679 &null_interface);
1680 p->pipe_bound = False;
1684 * and marshall it.
1687 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &out_hdr_ba, 0)) {
1688 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_BA failed.\n"));
1689 goto err_exit;
1693 * Create the header, now we know the length.
1696 if (prs_offset(&out_auth)) {
1697 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
1700 init_rpc_hdr(&p->hdr, RPC_BINDACK, RPC_FLG_FIRST | RPC_FLG_LAST,
1701 p->hdr.call_id,
1702 RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth),
1703 auth_len);
1706 * Marshall the header into the outgoing PDU.
1709 if(!smb_io_rpc_hdr("", &p->hdr, &outgoing_rpc, 0)) {
1710 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR failed.\n"));
1711 goto err_exit;
1715 * Now add the RPC_HDR_BA and any auth needed.
1718 if(!prs_append_prs_data( &outgoing_rpc, &out_hdr_ba)) {
1719 DEBUG(0,("api_pipe_bind_req: append of RPC_HDR_BA failed.\n"));
1720 goto err_exit;
1723 if (auth_len && !prs_append_prs_data( &outgoing_rpc, &out_auth)) {
1724 DEBUG(0,("api_pipe_bind_req: append of auth info failed.\n"));
1725 goto err_exit;
1729 * Setup the lengths for the initial reply.
1732 p->out_data.data_sent_length = 0;
1733 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
1734 p->out_data.current_pdu_sent = 0;
1736 prs_mem_free(&out_hdr_ba);
1737 prs_mem_free(&out_auth);
1739 return True;
1741 err_exit:
1743 prs_mem_free(&outgoing_rpc);
1744 prs_mem_free(&out_hdr_ba);
1745 prs_mem_free(&out_auth);
1746 return setup_bind_nak(p);
1749 /****************************************************************************
1750 Deal with an alter context call. Can be third part of 3 leg auth request for
1751 SPNEGO calls.
1752 ****************************************************************************/
1754 BOOL api_pipe_alter_context(pipes_struct *p, prs_struct *rpc_in_p)
1756 RPC_HDR_BA hdr_ba;
1757 RPC_HDR_RB hdr_rb;
1758 RPC_HDR_AUTH auth_info;
1759 uint16 assoc_gid;
1760 fstring ack_pipe_name;
1761 prs_struct out_hdr_ba;
1762 prs_struct out_auth;
1763 prs_struct outgoing_rpc;
1764 int auth_len = 0;
1766 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
1769 * Marshall directly into the outgoing PDU space. We
1770 * must do this as we need to set to the bind response
1771 * header and are never sending more than one PDU here.
1774 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
1777 * Setup the memory to marshall the ba header, and the
1778 * auth footers.
1781 if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) {
1782 DEBUG(0,("api_pipe_alter_context: malloc out_hdr_ba failed.\n"));
1783 prs_mem_free(&outgoing_rpc);
1784 return False;
1787 if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) {
1788 DEBUG(0,("api_pipe_alter_context: malloc out_auth failed.\n"));
1789 prs_mem_free(&outgoing_rpc);
1790 prs_mem_free(&out_hdr_ba);
1791 return False;
1794 DEBUG(5,("api_pipe_alter_context: decode request. %d\n", __LINE__));
1796 /* decode the alter context request */
1797 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_in_p, 0)) {
1798 DEBUG(0,("api_pipe_alter_context: unable to unmarshall RPC_HDR_RB struct.\n"));
1799 goto err_exit;
1802 /* secondary address CAN be NULL
1803 * as the specs say it's ignored.
1804 * It MUST be NULL to have the spoolss working.
1806 fstrcpy(ack_pipe_name,"");
1808 DEBUG(5,("api_pipe_alter_context: make response. %d\n", __LINE__));
1811 * Check if this is an authenticated alter context request.
1814 if (p->hdr.auth_len != 0) {
1816 * Decode the authentication verifier.
1819 if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) {
1820 DEBUG(0,("api_pipe_alter_context: unable to unmarshall RPC_HDR_AUTH struct.\n"));
1821 goto err_exit;
1825 * Currently only the SPNEGO auth type uses the alter ctx
1826 * response in place of the NTLMSSP auth3 type.
1829 if (auth_info.auth_type == RPC_SPNEGO_AUTH_TYPE) {
1830 /* We can only finish if the pipe is unbound. */
1831 if (!p->pipe_bound) {
1832 if (!pipe_spnego_auth_bind_continue(p, rpc_in_p, &auth_info, &out_auth)) {
1833 goto err_exit;
1835 } else {
1836 goto err_exit;
1839 } else {
1840 ZERO_STRUCT(auth_info);
1843 assoc_gid = hdr_rb.bba.assoc_gid ? hdr_rb.bba.assoc_gid : 0x53f0;
1846 * Create the bind response struct.
1849 /* If the requested abstract synt uuid doesn't match our client pipe,
1850 reject the bind_ack & set the transfer interface synt to all 0's,
1851 ver 0 (observed when NT5 attempts to bind to abstract interfaces
1852 unknown to NT4)
1853 Needed when adding entries to a DACL from NT5 - SK */
1855 if(check_bind_req(p, &hdr_rb.rpc_context[0].abstract, &hdr_rb.rpc_context[0].transfer[0],
1856 hdr_rb.rpc_context[0].context_id )) {
1857 init_rpc_hdr_ba(&hdr_ba,
1858 RPC_MAX_PDU_FRAG_LEN,
1859 RPC_MAX_PDU_FRAG_LEN,
1860 assoc_gid,
1861 ack_pipe_name,
1862 0x1, 0x0, 0x0,
1863 &hdr_rb.rpc_context[0].transfer[0]);
1864 } else {
1865 RPC_IFACE null_interface;
1866 ZERO_STRUCT(null_interface);
1867 /* Rejection reason: abstract syntax not supported */
1868 init_rpc_hdr_ba(&hdr_ba, RPC_MAX_PDU_FRAG_LEN,
1869 RPC_MAX_PDU_FRAG_LEN, assoc_gid,
1870 ack_pipe_name, 0x1, 0x2, 0x1,
1871 &null_interface);
1872 p->pipe_bound = False;
1876 * and marshall it.
1879 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &out_hdr_ba, 0)) {
1880 DEBUG(0,("api_pipe_alter_context: marshalling of RPC_HDR_BA failed.\n"));
1881 goto err_exit;
1885 * Create the header, now we know the length.
1888 if (prs_offset(&out_auth)) {
1889 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN;
1892 init_rpc_hdr(&p->hdr, RPC_ALTCONTRESP, RPC_FLG_FIRST | RPC_FLG_LAST,
1893 p->hdr.call_id,
1894 RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth),
1895 auth_len);
1898 * Marshall the header into the outgoing PDU.
1901 if(!smb_io_rpc_hdr("", &p->hdr, &outgoing_rpc, 0)) {
1902 DEBUG(0,("api_pipe_alter_context: marshalling of RPC_HDR failed.\n"));
1903 goto err_exit;
1907 * Now add the RPC_HDR_BA and any auth needed.
1910 if(!prs_append_prs_data( &outgoing_rpc, &out_hdr_ba)) {
1911 DEBUG(0,("api_pipe_alter_context: append of RPC_HDR_BA failed.\n"));
1912 goto err_exit;
1915 if (auth_len && !prs_append_prs_data( &outgoing_rpc, &out_auth)) {
1916 DEBUG(0,("api_pipe_alter_context: append of auth info failed.\n"));
1917 goto err_exit;
1921 * Setup the lengths for the initial reply.
1924 p->out_data.data_sent_length = 0;
1925 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc);
1926 p->out_data.current_pdu_sent = 0;
1928 prs_mem_free(&out_hdr_ba);
1929 prs_mem_free(&out_auth);
1931 return True;
1933 err_exit:
1935 prs_mem_free(&outgoing_rpc);
1936 prs_mem_free(&out_hdr_ba);
1937 prs_mem_free(&out_auth);
1938 return setup_bind_nak(p);
1941 /****************************************************************************
1942 Deal with NTLMSSP sign & seal processing on an RPC request.
1943 ****************************************************************************/
1945 BOOL api_pipe_ntlmssp_auth_process(pipes_struct *p, prs_struct *rpc_in,
1946 uint32 *p_ss_padding_len, NTSTATUS *pstatus)
1948 RPC_HDR_AUTH auth_info;
1949 uint32 auth_len = p->hdr.auth_len;
1950 uint32 save_offset = prs_offset(rpc_in);
1951 AUTH_NTLMSSP_STATE *a = p->auth.a_u.auth_ntlmssp_state;
1952 unsigned char *data = NULL;
1953 size_t data_len;
1954 unsigned char *full_packet_data = NULL;
1955 size_t full_packet_data_len;
1956 DATA_BLOB auth_blob;
1958 *pstatus = NT_STATUS_OK;
1960 if (p->auth.auth_level == PIPE_AUTH_LEVEL_NONE || p->auth.auth_level == PIPE_AUTH_LEVEL_CONNECT) {
1961 return True;
1964 if (!a) {
1965 *pstatus = NT_STATUS_INVALID_PARAMETER;
1966 return False;
1969 /* Ensure there's enough data for an authenticated request. */
1970 if ((auth_len > RPC_MAX_SIGN_SIZE) ||
1971 (RPC_HEADER_LEN + RPC_HDR_REQ_LEN + RPC_HDR_AUTH_LEN + auth_len > p->hdr.frag_len)) {
1972 DEBUG(0,("api_pipe_ntlmssp_auth_process: auth_len %u is too large.\n",
1973 (unsigned int)auth_len ));
1974 *pstatus = NT_STATUS_INVALID_PARAMETER;
1975 return False;
1979 * We need the full packet data + length (minus auth stuff) as well as the packet data + length
1980 * after the RPC header.
1981 * We need to pass in the full packet (minus auth len) to the NTLMSSP sign and check seal
1982 * functions as NTLMv2 checks the rpc headers also.
1985 data = (unsigned char *)(prs_data_p(rpc_in) + RPC_HDR_REQ_LEN);
1986 data_len = (size_t)(p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN - RPC_HDR_AUTH_LEN - auth_len);
1988 full_packet_data = p->in_data.current_in_pdu;
1989 full_packet_data_len = p->hdr.frag_len - auth_len;
1991 /* Pull the auth header and the following data into a blob. */
1992 if(!prs_set_offset(rpc_in, RPC_HDR_REQ_LEN + data_len)) {
1993 DEBUG(0,("api_pipe_ntlmssp_auth_process: cannot move offset to %u.\n",
1994 (unsigned int)RPC_HDR_REQ_LEN + (unsigned int)data_len ));
1995 *pstatus = NT_STATUS_INVALID_PARAMETER;
1996 return False;
1999 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
2000 DEBUG(0,("api_pipe_ntlmssp_auth_process: failed to unmarshall RPC_HDR_AUTH.\n"));
2001 *pstatus = NT_STATUS_INVALID_PARAMETER;
2002 return False;
2005 auth_blob.data = (unsigned char *)prs_data_p(rpc_in) + prs_offset(rpc_in);
2006 auth_blob.length = auth_len;
2008 switch (p->auth.auth_level) {
2009 case PIPE_AUTH_LEVEL_PRIVACY:
2010 /* Data is encrypted. */
2011 *pstatus = ntlmssp_unseal_packet(a->ntlmssp_state,
2012 data, data_len,
2013 full_packet_data,
2014 full_packet_data_len,
2015 &auth_blob);
2016 if (!NT_STATUS_IS_OK(*pstatus)) {
2017 return False;
2019 break;
2020 case PIPE_AUTH_LEVEL_INTEGRITY:
2021 /* Data is signed. */
2022 *pstatus = ntlmssp_check_packet(a->ntlmssp_state,
2023 data, data_len,
2024 full_packet_data,
2025 full_packet_data_len,
2026 &auth_blob);
2027 if (!NT_STATUS_IS_OK(*pstatus)) {
2028 return False;
2030 break;
2031 default:
2032 *pstatus = NT_STATUS_INVALID_PARAMETER;
2033 return False;
2037 * Return the current pointer to the data offset.
2040 if(!prs_set_offset(rpc_in, save_offset)) {
2041 DEBUG(0,("api_pipe_auth_process: failed to set offset back to %u\n",
2042 (unsigned int)save_offset ));
2043 *pstatus = NT_STATUS_INVALID_PARAMETER;
2044 return False;
2048 * Remember the padding length. We must remove it from the real data
2049 * stream once the sign/seal is done.
2052 *p_ss_padding_len = auth_info.auth_pad_len;
2054 return True;
2057 /****************************************************************************
2058 Deal with schannel processing on an RPC request.
2059 ****************************************************************************/
2061 BOOL api_pipe_schannel_process(pipes_struct *p, prs_struct *rpc_in, uint32 *p_ss_padding_len)
2063 uint32 data_len;
2064 uint32 auth_len;
2065 uint32 save_offset = prs_offset(rpc_in);
2066 RPC_HDR_AUTH auth_info;
2067 RPC_AUTH_SCHANNEL_CHK schannel_chk;
2069 auth_len = p->hdr.auth_len;
2071 if (auth_len != RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN) {
2072 DEBUG(0,("Incorrect auth_len %u.\n", (unsigned int)auth_len ));
2073 return False;
2077 * The following is that length of the data we must verify or unseal.
2078 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN
2079 * preceeding the auth_data.
2082 if (p->hdr.frag_len < RPC_HEADER_LEN + RPC_HDR_REQ_LEN + RPC_HDR_AUTH_LEN + auth_len) {
2083 DEBUG(0,("Incorrect frag %u, auth %u.\n",
2084 (unsigned int)p->hdr.frag_len,
2085 (unsigned int)auth_len ));
2086 return False;
2089 data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
2090 RPC_HDR_AUTH_LEN - auth_len;
2092 DEBUG(5,("data %d auth %d\n", data_len, auth_len));
2094 if(!prs_set_offset(rpc_in, RPC_HDR_REQ_LEN + data_len)) {
2095 DEBUG(0,("cannot move offset to %u.\n",
2096 (unsigned int)RPC_HDR_REQ_LEN + data_len ));
2097 return False;
2100 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) {
2101 DEBUG(0,("failed to unmarshall RPC_HDR_AUTH.\n"));
2102 return False;
2105 if (auth_info.auth_type != RPC_SCHANNEL_AUTH_TYPE) {
2106 DEBUG(0,("Invalid auth info %d on schannel\n",
2107 auth_info.auth_type));
2108 return False;
2111 if(!smb_io_rpc_auth_schannel_chk("", RPC_AUTH_SCHANNEL_SIGN_OR_SEAL_CHK_LEN, &schannel_chk, rpc_in, 0)) {
2112 DEBUG(0,("failed to unmarshal RPC_AUTH_SCHANNEL_CHK.\n"));
2113 return False;
2116 if (!schannel_decode(p->auth.a_u.schannel_auth,
2117 p->auth.auth_level,
2118 SENDER_IS_INITIATOR,
2119 &schannel_chk,
2120 prs_data_p(rpc_in)+RPC_HDR_REQ_LEN, data_len)) {
2121 DEBUG(3,("failed to decode PDU\n"));
2122 return False;
2126 * Return the current pointer to the data offset.
2129 if(!prs_set_offset(rpc_in, save_offset)) {
2130 DEBUG(0,("failed to set offset back to %u\n",
2131 (unsigned int)save_offset ));
2132 return False;
2135 /* The sequence number gets incremented on both send and receive. */
2136 p->auth.a_u.schannel_auth->seq_num++;
2139 * Remember the padding length. We must remove it from the real data
2140 * stream once the sign/seal is done.
2143 *p_ss_padding_len = auth_info.auth_pad_len;
2145 return True;
2148 /****************************************************************************
2149 Return a user struct for a pipe user.
2150 ****************************************************************************/
2152 struct current_user *get_current_user(struct current_user *user, pipes_struct *p)
2154 if (p->pipe_bound &&
2155 (p->auth.auth_type == PIPE_AUTH_TYPE_NTLMSSP ||
2156 (p->auth.auth_type == PIPE_AUTH_TYPE_SPNEGO_NTLMSSP))) {
2157 memcpy(user, &p->pipe_user, sizeof(struct current_user));
2158 } else {
2159 memcpy(user, &current_user, sizeof(struct current_user));
2162 return user;
2165 /****************************************************************************
2166 Find the set of RPC functions associated with this context_id
2167 ****************************************************************************/
2169 static PIPE_RPC_FNS* find_pipe_fns_by_context( PIPE_RPC_FNS *list, uint32 context_id )
2171 PIPE_RPC_FNS *fns = NULL;
2172 PIPE_RPC_FNS *tmp = NULL;
2174 if ( !list ) {
2175 DEBUG(0,("find_pipe_fns_by_context: ERROR! No context list for pipe!\n"));
2176 return NULL;
2179 for (tmp=list; tmp; tmp=tmp->next ) {
2180 if ( tmp->context_id == context_id )
2181 break;
2184 fns = tmp;
2186 return fns;
2189 /****************************************************************************
2190 Memory cleanup.
2191 ****************************************************************************/
2193 void free_pipe_rpc_context( PIPE_RPC_FNS *list )
2195 PIPE_RPC_FNS *tmp = list;
2196 PIPE_RPC_FNS *tmp2;
2198 while (tmp) {
2199 tmp2 = tmp->next;
2200 SAFE_FREE(tmp);
2201 tmp = tmp2;
2204 return;
2207 /****************************************************************************
2208 Find the correct RPC function to call for this request.
2209 If the pipe is authenticated then become the correct UNIX user
2210 before doing the call.
2211 ****************************************************************************/
2213 BOOL api_pipe_request(pipes_struct *p)
2215 BOOL ret = False;
2216 BOOL changed_user = False;
2217 PIPE_RPC_FNS *pipe_fns;
2219 if (p->pipe_bound &&
2220 ((p->auth.auth_type == PIPE_AUTH_TYPE_NTLMSSP) ||
2221 (p->auth.auth_type == PIPE_AUTH_TYPE_SPNEGO_NTLMSSP))) {
2222 if(!become_authenticated_pipe_user(p)) {
2223 prs_mem_free(&p->out_data.rdata);
2224 return False;
2226 changed_user = True;
2229 DEBUG(5, ("Requested \\PIPE\\%s\n", p->name));
2231 /* get the set of RPC functions for this context */
2233 pipe_fns = find_pipe_fns_by_context(p->contexts, p->hdr_req.context_id);
2235 if ( pipe_fns ) {
2236 TALLOC_CTX *frame = talloc_stackframe();
2237 ret = api_rpcTNP(p, p->name, pipe_fns->cmds, pipe_fns->n_cmds);
2238 TALLOC_FREE(frame);
2240 else {
2241 DEBUG(0,("api_pipe_request: No rpc function table associated with context [%d] on pipe [%s]\n",
2242 p->hdr_req.context_id, p->name));
2245 if (changed_user) {
2246 unbecome_authenticated_pipe_user();
2249 return ret;
2252 /*******************************************************************
2253 Calls the underlying RPC function for a named pipe.
2254 ********************************************************************/
2256 BOOL api_rpcTNP(pipes_struct *p, const char *rpc_name,
2257 const struct api_struct *api_rpc_cmds, int n_cmds)
2259 int fn_num;
2260 fstring name;
2261 uint32 offset1, offset2;
2263 /* interpret the command */
2264 DEBUG(4,("api_rpcTNP: %s op 0x%x - ", rpc_name, p->hdr_req.opnum));
2266 slprintf(name, sizeof(name)-1, "in_%s", rpc_name);
2267 prs_dump(name, p->hdr_req.opnum, &p->in_data.data);
2269 for (fn_num = 0; fn_num < n_cmds; fn_num++) {
2270 if (api_rpc_cmds[fn_num].opnum == p->hdr_req.opnum && api_rpc_cmds[fn_num].fn != NULL) {
2271 DEBUG(3,("api_rpcTNP: rpc command: %s\n", api_rpc_cmds[fn_num].name));
2272 break;
2276 if (fn_num == n_cmds) {
2278 * For an unknown RPC just return a fault PDU but
2279 * return True to allow RPC's on the pipe to continue
2280 * and not put the pipe into fault state. JRA.
2282 DEBUG(4, ("unknown\n"));
2283 setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
2284 return True;
2287 offset1 = prs_offset(&p->out_data.rdata);
2289 DEBUG(6, ("api_rpc_cmds[%d].fn == %p\n",
2290 fn_num, api_rpc_cmds[fn_num].fn));
2291 /* do the actual command */
2292 if(!api_rpc_cmds[fn_num].fn(p)) {
2293 DEBUG(0,("api_rpcTNP: %s: %s failed.\n", rpc_name, api_rpc_cmds[fn_num].name));
2294 prs_mem_free(&p->out_data.rdata);
2295 return False;
2298 if (p->bad_handle_fault_state) {
2299 DEBUG(4,("api_rpcTNP: bad handle fault return.\n"));
2300 p->bad_handle_fault_state = False;
2301 setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_CONTEXT_MISMATCH));
2302 return True;
2305 if (p->rng_fault_state) {
2306 DEBUG(4, ("api_rpcTNP: rng fault return\n"));
2307 p->rng_fault_state = False;
2308 setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
2309 return True;
2312 slprintf(name, sizeof(name)-1, "out_%s", rpc_name);
2313 offset2 = prs_offset(&p->out_data.rdata);
2314 prs_set_offset(&p->out_data.rdata, offset1);
2315 prs_dump(name, p->hdr_req.opnum, &p->out_data.rdata);
2316 prs_set_offset(&p->out_data.rdata, offset2);
2318 DEBUG(5,("api_rpcTNP: called %s successfully\n", rpc_name));
2320 /* Check for buffer underflow in rpc parsing */
2322 if ((DEBUGLEVEL >= 10) &&
2323 (prs_offset(&p->in_data.data) != prs_data_size(&p->in_data.data))) {
2324 size_t data_len = prs_data_size(&p->in_data.data) - prs_offset(&p->in_data.data);
2325 char *data = (char *)SMB_MALLOC(data_len);
2327 DEBUG(10, ("api_rpcTNP: rpc input buffer underflow (parse error?)\n"));
2328 if (data) {
2329 prs_uint8s(False, "", &p->in_data.data, 0, (unsigned char *)data, (uint32)data_len);
2330 SAFE_FREE(data);
2335 return True;
2338 /*******************************************************************
2339 *******************************************************************/
2341 void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
2343 struct api_struct *cmds = NULL;
2344 int n_cmds = 0;
2346 switch ( idx ) {
2347 case PI_LSARPC:
2348 lsa_get_pipe_fns( &cmds, &n_cmds );
2349 break;
2350 case PI_LSARPC_DS:
2351 lsa_ds_get_pipe_fns( &cmds, &n_cmds );
2352 break;
2353 case PI_SAMR:
2354 samr_get_pipe_fns( &cmds, &n_cmds );
2355 break;
2356 case PI_NETLOGON:
2357 netlog_get_pipe_fns( &cmds, &n_cmds );
2358 break;
2359 case PI_SRVSVC:
2360 srvsvc2_get_pipe_fns( &cmds, &n_cmds );
2361 break;
2362 case PI_WKSSVC:
2363 wkssvc_get_pipe_fns( &cmds, &n_cmds );
2364 break;
2365 case PI_WINREG:
2366 winreg_get_pipe_fns( &cmds, &n_cmds );
2367 break;
2368 case PI_SPOOLSS:
2369 spoolss_get_pipe_fns( &cmds, &n_cmds );
2370 break;
2371 case PI_NETDFS:
2372 netdfs_get_pipe_fns( &cmds, &n_cmds );
2373 break;
2374 case PI_SVCCTL:
2375 svcctl2_get_pipe_fns( &cmds, &n_cmds );
2376 break;
2377 case PI_EVENTLOG:
2378 eventlog2_get_pipe_fns( &cmds, &n_cmds );
2379 break;
2380 case PI_NTSVCS:
2381 ntsvcs_get_pipe_fns( &cmds, &n_cmds );
2382 break;
2383 #ifdef DEVELOPER
2384 case PI_RPCECHO:
2385 rpcecho_get_pipe_fns( &cmds, &n_cmds );
2386 break;
2387 #endif
2388 default:
2389 DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx));
2392 *fns = cmds;
2393 *n_fns = n_cmds;
2395 return;