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  */
21da6c28aaSamw /*
22*148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23da6c28aaSamw  */
24da6c28aaSamw 
25da6c28aaSamw #include <stdlib.h>
26da6c28aaSamw #include <strings.h>
27da6c28aaSamw #include <rpc/xdr.h>
28da6c28aaSamw #include <errno.h>
299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <syslog.h>
30da6c28aaSamw #include <smbsrv/libsmb.h>
31da6c28aaSamw #include <smbsrv/smb_xdr.h>
329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
33da6c28aaSamw 
34da6c28aaSamw 
35da6c28aaSamw /*
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Generic XDR encoder.
37da6c28aaSamw  *
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns a malloc'd, encoded buffer upon success.
399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Otherwise, returns NULL.
40da6c28aaSamw  */
41da6c28aaSamw char *
smb_common_encode(void * data,xdrproc_t proc,size_t * rsize)429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_common_encode(void *data, xdrproc_t proc, size_t *rsize)
43da6c28aaSamw {
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	XDR	xdrs;
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char	*buf;
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t	len;
47da6c28aaSamw 
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (proc == NULL || data == NULL || rsize == NULL) {
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_ERR, "smb_common_encode: invalid parameter");
50da6c28aaSamw 		return (NULL);
51da6c28aaSamw 	}
52da6c28aaSamw 
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	len = xdr_sizeof(proc, data);
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((buf = malloc(len)) == NULL) {
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_ERR, "smb_common_encode: %m");
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*rsize = 0;
58da6c28aaSamw 		return (NULL);
59da6c28aaSamw 	}
60da6c28aaSamw 
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdrmem_create(&xdrs, buf, len, XDR_ENCODE);
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	*rsize = len;
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!proc(&xdrs, data)) {
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smb_common_encode: encode error");
66da6c28aaSamw 		free(buf);
67da6c28aaSamw 		buf = NULL;
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*rsize = 0;
69da6c28aaSamw 	}
70da6c28aaSamw 
71da6c28aaSamw 	xdr_destroy(&xdrs);
72da6c28aaSamw 	return (buf);
73da6c28aaSamw }
74da6c28aaSamw 
75da6c28aaSamw /*
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Generic XDR decoder.  Ensure that data is non-null and bzero'd.
77da6c28aaSamw  */
78da6c28aaSamw int
smb_common_decode(char * buf,size_t len,xdrproc_t proc,void * data)799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_common_decode(char *buf, size_t len, xdrproc_t proc, void *data)
80da6c28aaSamw {
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	XDR xdrs;
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc = 0;
83da6c28aaSamw 
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (data == NULL)
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
86da6c28aaSamw 
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdrmem_create(&xdrs, buf, len, XDR_DECODE);
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!proc(&xdrs, data))
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = -1;
90da6c28aaSamw 
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_destroy(&xdrs);
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
93da6c28aaSamw }
94da6c28aaSamw 
95da6c28aaSamw char *
smb_string_encode(char * s,size_t * rsize)969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_string_encode(char *s, size_t *rsize)
97da6c28aaSamw {
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_string_t	obj;
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	XDR		xdrs;
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*buf = NULL;
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		len;
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((obj.buf = s) == NULL) {
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smb_string_encode: invalid param");
1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		goto smb_string_encode_failed;
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
107da6c28aaSamw 
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	len = xdr_sizeof(smb_string_xdr, &obj);
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((buf = calloc(len, 1)) == NULL) {
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smb_string_encode: %m");
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		goto smb_string_encode_failed;
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
113da6c28aaSamw 
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdrmem_create(&xdrs, buf, len, XDR_ENCODE);
115da6c28aaSamw 
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_string_xdr(&xdrs, &obj)) {
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		syslog(LOG_DEBUG, "smb_string_encode: encode failed");
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_destroy(&xdrs);
1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free(buf);
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		goto smb_string_encode_failed;
121da6c28aaSamw 	}
1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_destroy(&xdrs);
1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rsize)
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*rsize = len;
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (buf);
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_string_encode_failed:
1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rsize)
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*rsize = 0;
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (NULL);
132da6c28aaSamw }
133da6c28aaSamw 
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_string_decode(smb_string_t * obj,char * buf,size_t buflen)1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_string_decode(smb_string_t *obj, char *buf, size_t buflen)
136da6c28aaSamw {
1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	XDR xdrs;
1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc = 0;
1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(obj, sizeof (smb_string_t));
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_string_xdr(&xdrs, obj))
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = -1;
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	xdr_destroy(&xdrs);
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
148da6c28aaSamw }
149fe1c642dSBill Krier 
150fe1c642dSBill Krier /*
151fe1c642dSBill Krier  * Encode an lsa_account_t into a buffer.
152fe1c642dSBill Krier  */
153fe1c642dSBill Krier int
lsa_account_encode(lsa_account_t * acct,uint8_t * buf,uint32_t buflen)154fe1c642dSBill Krier lsa_account_encode(lsa_account_t *acct, uint8_t *buf, uint32_t buflen)
155fe1c642dSBill Krier {
156fe1c642dSBill Krier 	XDR xdrs;
157fe1c642dSBill Krier 	int rc = 0;
158fe1c642dSBill Krier 
159fe1c642dSBill Krier 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
160fe1c642dSBill Krier 
161fe1c642dSBill Krier 	if (!lsa_account_xdr(&xdrs, acct))
162fe1c642dSBill Krier 		rc = -1;
163fe1c642dSBill Krier 
164fe1c642dSBill Krier 	xdr_destroy(&xdrs);
165fe1c642dSBill Krier 	return (rc);
166fe1c642dSBill Krier }
167fe1c642dSBill Krier 
168fe1c642dSBill Krier /*
169fe1c642dSBill Krier  * Decode an XDR buffer into an lsa_account_t.
170fe1c642dSBill Krier  */
171fe1c642dSBill Krier int
lsa_account_decode(lsa_account_t * acct,uint8_t * buf,uint32_t buflen)172fe1c642dSBill Krier lsa_account_decode(lsa_account_t *acct, uint8_t *buf, uint32_t buflen)
173fe1c642dSBill Krier {
174fe1c642dSBill Krier 	XDR xdrs;
175fe1c642dSBill Krier 	int rc = 0;
176fe1c642dSBill Krier 
177fe1c642dSBill Krier 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
178fe1c642dSBill Krier 
179fe1c642dSBill Krier 	bzero(acct, sizeof (lsa_account_t));
180fe1c642dSBill Krier 	if (!lsa_account_xdr(&xdrs, acct))
181fe1c642dSBill Krier 		rc = -1;
182fe1c642dSBill Krier 
183fe1c642dSBill Krier 	xdr_destroy(&xdrs);
184fe1c642dSBill Krier 	return (rc);
185fe1c642dSBill Krier }
186fe1c642dSBill Krier 
187fe1c642dSBill Krier bool_t
lsa_account_xdr(XDR * xdrs,lsa_account_t * objp)188fe1c642dSBill Krier lsa_account_xdr(XDR *xdrs, lsa_account_t *objp)
189fe1c642dSBill Krier {
190fe1c642dSBill Krier 	if (!xdr_uint16_t(xdrs, &objp->a_sidtype))
191fe1c642dSBill Krier 		return (FALSE);
192fe1c642dSBill Krier 	if (!xdr_uint32_t(xdrs, &objp->a_status))
193fe1c642dSBill Krier 		return (FALSE);
194fe1c642dSBill Krier 	if (!xdr_vector(xdrs, (char *)objp->a_domain, MAXNAMELEN,
195fe1c642dSBill Krier 	    sizeof (char), (xdrproc_t)xdr_char))
196fe1c642dSBill Krier 		return (FALSE);
197fe1c642dSBill Krier 	if (!xdr_vector(xdrs, (char *)objp->a_name, MAXNAMELEN,
198fe1c642dSBill Krier 	    sizeof (char), (xdrproc_t)xdr_char))
199fe1c642dSBill Krier 		return (FALSE);
200fe1c642dSBill Krier 	if (!xdr_vector(xdrs, (char *)objp->a_sid, SMB_SID_STRSZ,
201fe1c642dSBill Krier 	    sizeof (char), (xdrproc_t)xdr_char))
202fe1c642dSBill Krier 		return (FALSE);
203fe1c642dSBill Krier 	return (TRUE);
204fe1c642dSBill Krier }
205