1da6c28aaSamw /* 2da6c28aaSamw * CDDL HEADER START 3da6c28aaSamw * 4da6c28aaSamw * The contents of this file are subject to the terms of the 5da6c28aaSamw * Common Development and Distribution License (the "License"). 6da6c28aaSamw * You may not use this file except in compliance with the License. 7da6c28aaSamw * 8da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10da6c28aaSamw * See the License for the specific language governing permissions 11da6c28aaSamw * and limitations under the License. 12da6c28aaSamw * 13da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18da6c28aaSamw * 19da6c28aaSamw * CDDL HEADER END 20da6c28aaSamw */ 21*148c5f43SAlan Wright 22da6c28aaSamw /* 23*148c5f43SAlan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 24da6c28aaSamw */ 25da6c28aaSamw 26da6c28aaSamw /* 27da6c28aaSamw * NetLogon RPC (NETR) interface definition. This module provides 28da6c28aaSamw * the server side NETR RPC interface and the interface registration 29da6c28aaSamw * function. 30da6c28aaSamw */ 31da6c28aaSamw 32da6c28aaSamw #include <strings.h> 33da6c28aaSamw 34da6c28aaSamw #include <smbsrv/libsmb.h> 358d7e4166Sjose borrego #include <smbsrv/libmlsvc.h> 36da6c28aaSamw #include <smbsrv/ndl/netlogon.ndl> 37da6c28aaSamw #include <smbsrv/nmpipes.h> 38da6c28aaSamw #include <smbsrv/netrauth.h> 39da6c28aaSamw 408d7e4166Sjose borrego static int netr_s_ServerReqChallenge(void *, ndr_xa_t *); 418d7e4166Sjose borrego static int netr_s_ServerAuthenticate2(void *, ndr_xa_t *); 428d7e4166Sjose borrego static int netr_s_ServerPasswordSet(void *, ndr_xa_t *); 438d7e4166Sjose borrego static int netr_s_SamLogon(void *, ndr_xa_t *); 448d7e4166Sjose borrego static int netr_s_SamLogoff(void *, ndr_xa_t *); 45da6c28aaSamw 468d7e4166Sjose borrego static ndr_stub_table_t netr_stub_table[] = { 47da6c28aaSamw { netr_s_ServerReqChallenge, NETR_OPNUM_ServerReqChallenge }, 48da6c28aaSamw { netr_s_ServerAuthenticate2, NETR_OPNUM_ServerAuthenticate2 }, 49da6c28aaSamw { netr_s_ServerPasswordSet, NETR_OPNUM_ServerPasswordSet }, 50da6c28aaSamw { netr_s_SamLogon, NETR_OPNUM_SamLogon }, 51da6c28aaSamw { netr_s_SamLogoff, NETR_OPNUM_SamLogoff }, 52da6c28aaSamw {0} 53da6c28aaSamw }; 54da6c28aaSamw 558d7e4166Sjose borrego static ndr_service_t netr_service = { 56da6c28aaSamw "NETR", /* name */ 57da6c28aaSamw "NetLogon", /* desc */ 58da6c28aaSamw "\\netlogon", /* endpoint */ 59da6c28aaSamw PIPE_LSASS, /* sec_addr_port */ 608d7e4166Sjose borrego "12345678-1234-abcd-ef00-01234567cffb", 1, /* abstract */ 618d7e4166Sjose borrego NDR_TRANSFER_SYNTAX_UUID, 2, /* transfer */ 62da6c28aaSamw 0, /* no bind_instance_size */ 63da6c28aaSamw 0, /* no bind_req() */ 64da6c28aaSamw 0, /* no unbind_and_close() */ 65da6c28aaSamw 0, /* use generic_call_stub() */ 66da6c28aaSamw &TYPEINFO(netr_interface), /* interface ti */ 67da6c28aaSamw netr_stub_table /* stub_table */ 68da6c28aaSamw }; 69da6c28aaSamw 70da6c28aaSamw /* 71da6c28aaSamw * netr_initialize 72da6c28aaSamw * 73da6c28aaSamw * This function registers the NETR RPC interface with the RPC runtime 74da6c28aaSamw * library. It must be called in order to use either the client side 75da6c28aaSamw * or the server side functions. 76da6c28aaSamw */ 77da6c28aaSamw void 78da6c28aaSamw netr_initialize(void) 79da6c28aaSamw { 808d7e4166Sjose borrego (void) ndr_svc_register(&netr_service); 81da6c28aaSamw } 82da6c28aaSamw 83da6c28aaSamw /* 84da6c28aaSamw * netr_s_ServerReqChallenge 85da6c28aaSamw */ 86da6c28aaSamw /*ARGSUSED*/ 87da6c28aaSamw static int 888d7e4166Sjose borrego netr_s_ServerReqChallenge(void *arg, ndr_xa_t *mxa) 89da6c28aaSamw { 90da6c28aaSamw struct netr_ServerReqChallenge *param = arg; 91da6c28aaSamw 92da6c28aaSamw bzero(param, sizeof (struct netr_ServerReqChallenge)); 93da6c28aaSamw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED); 948d7e4166Sjose borrego return (NDR_DRC_OK); 95da6c28aaSamw } 96da6c28aaSamw 97da6c28aaSamw /* 98da6c28aaSamw * netr_s_ServerAuthenticate2 99da6c28aaSamw */ 100da6c28aaSamw /*ARGSUSED*/ 101da6c28aaSamw static int 1028d7e4166Sjose borrego netr_s_ServerAuthenticate2(void *arg, ndr_xa_t *mxa) 103da6c28aaSamw { 104da6c28aaSamw struct netr_ServerAuthenticate2 *param = arg; 105da6c28aaSamw 106da6c28aaSamw bzero(param, sizeof (struct netr_ServerAuthenticate2)); 107da6c28aaSamw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED); 1088d7e4166Sjose borrego return (NDR_DRC_OK); 109da6c28aaSamw } 110da6c28aaSamw 111da6c28aaSamw /* 112da6c28aaSamw * netr_s_ServerPasswordSet 113da6c28aaSamw */ 114da6c28aaSamw /*ARGSUSED*/ 115da6c28aaSamw static int 1168d7e4166Sjose borrego netr_s_ServerPasswordSet(void *arg, ndr_xa_t *mxa) 117da6c28aaSamw { 118da6c28aaSamw struct netr_PasswordSet *param = arg; 119da6c28aaSamw 120da6c28aaSamw bzero(param, sizeof (struct netr_PasswordSet)); 121da6c28aaSamw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED); 1228d7e4166Sjose borrego return (NDR_DRC_OK); 123da6c28aaSamw } 124da6c28aaSamw 125da6c28aaSamw /* 126da6c28aaSamw * netr_s_SamLogon 127da6c28aaSamw */ 128da6c28aaSamw /*ARGSUSED*/ 129da6c28aaSamw static int 1308d7e4166Sjose borrego netr_s_SamLogon(void *arg, ndr_xa_t *mxa) 131da6c28aaSamw { 132da6c28aaSamw struct netr_SamLogon *param = arg; 133da6c28aaSamw 134da6c28aaSamw bzero(param, sizeof (struct netr_SamLogon)); 135da6c28aaSamw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED); 1368d7e4166Sjose borrego return (NDR_DRC_OK); 137da6c28aaSamw } 138da6c28aaSamw 139da6c28aaSamw /* 140da6c28aaSamw * netr_s_SamLogoff 141da6c28aaSamw */ 142da6c28aaSamw /*ARGSUSED*/ 143da6c28aaSamw static int 1448d7e4166Sjose borrego netr_s_SamLogoff(void *arg, ndr_xa_t *mxa) 145da6c28aaSamw { 146da6c28aaSamw struct netr_SamLogoff *param = arg; 147da6c28aaSamw 148da6c28aaSamw bzero(param, sizeof (struct netr_SamLogoff)); 149da6c28aaSamw param->status = NT_SC_ERROR(NT_STATUS_ACCESS_DENIED); 1508d7e4166Sjose borrego return (NDR_DRC_OK); 151da6c28aaSamw } 152da6c28aaSamw 153da6c28aaSamw /* 154da6c28aaSamw * Declare extern references. 155da6c28aaSamw */ 156da6c28aaSamw DECL_FIXUP_STRUCT(netr_validation_u); 157da6c28aaSamw DECL_FIXUP_STRUCT(netr_validation_info); 158da6c28aaSamw DECL_FIXUP_STRUCT(netr_SamLogon); 159da6c28aaSamw 160da6c28aaSamw /* 161da6c28aaSamw * Patch the netr_SamLogon union. 162da6c28aaSamw * This function is called from mlsvc_netr_ndr.c 163da6c28aaSamw */ 164da6c28aaSamw void 165da6c28aaSamw fixup_netr_SamLogon(struct netr_SamLogon *arg) 166da6c28aaSamw { 167da6c28aaSamw unsigned short size1 = 0; 168da6c28aaSamw unsigned short size2 = 0; 169da6c28aaSamw unsigned short size3 = 0; 170da6c28aaSamw WORD level = (WORD)arg->validation_level; 171da6c28aaSamw 172da6c28aaSamw switch (level) { 173da6c28aaSamw case 3: 174da6c28aaSamw /* 175da6c28aaSamw * The netr_validation_u union contains a pointer, which 176da6c28aaSamw * is a DWORD in NDR. So we need to set size1 to ensure 177da6c28aaSamw * that we can correctly decode the remaining parameters. 178da6c28aaSamw */ 179da6c28aaSamw size1 = sizeof (DWORD); 180da6c28aaSamw break; 181da6c28aaSamw 182da6c28aaSamw default: 183da6c28aaSamw /* 184da6c28aaSamw * If the request is badly formed or the level is invalid, 185da6c28aaSamw * the server returns NT_STATUS_INVALID_INFO_CLASS. Size1 186da6c28aaSamw * must be zero to correctly decode the status. 187da6c28aaSamw */ 188da6c28aaSamw size1 = 0; 189da6c28aaSamw break; 190da6c28aaSamw }; 191da6c28aaSamw 192da6c28aaSamw size2 = size1 + (2 * sizeof (DWORD)); 1932c1b14e5Sjose borrego size3 = size2 + sizeof (ndr_request_hdr_t) + sizeof (DWORD); 194da6c28aaSamw 195da6c28aaSamw FIXUP_PDU_SIZE(netr_validation_u, size1); 196da6c28aaSamw FIXUP_PDU_SIZE(netr_validation_info, size2); 197da6c28aaSamw FIXUP_PDU_SIZE(netr_SamLogon, size3); 198da6c28aaSamw } 199