xref: /illumos-gate/usr/src/common/smbsrv/smb_token_xdr.c (revision da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0)
1*da6c28aaSamw /*
2*da6c28aaSamw  * CDDL HEADER START
3*da6c28aaSamw  *
4*da6c28aaSamw  * The contents of this file are subject to the terms of the
5*da6c28aaSamw  * Common Development and Distribution License (the "License").
6*da6c28aaSamw  * You may not use this file except in compliance with the License.
7*da6c28aaSamw  *
8*da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10*da6c28aaSamw  * See the License for the specific language governing permissions
11*da6c28aaSamw  * and limitations under the License.
12*da6c28aaSamw  *
13*da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14*da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16*da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17*da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18*da6c28aaSamw  *
19*da6c28aaSamw  * CDDL HEADER END
20*da6c28aaSamw  */
21*da6c28aaSamw /*
22*da6c28aaSamw  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*da6c28aaSamw  * Use is subject to license terms.
24*da6c28aaSamw  */
25*da6c28aaSamw 
26*da6c28aaSamw #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*da6c28aaSamw 
28*da6c28aaSamw /*
29*da6c28aaSamw  * This file was originally generated using rpcgen.
30*da6c28aaSamw  */
31*da6c28aaSamw 
32*da6c28aaSamw #ifndef _KERNEL
33*da6c28aaSamw #include <stdlib.h>
34*da6c28aaSamw #endif /* !_KERNEL */
35*da6c28aaSamw #include <smbsrv/smb_vops.h>
36*da6c28aaSamw #include <smbsrv/wintypes.h>
37*da6c28aaSamw #include <smbsrv/ntsid.h>
38*da6c28aaSamw #include <smbsrv/smb_xdr.h>
39*da6c28aaSamw #include <smbsrv/smb_token.h>
40*da6c28aaSamw 
41*da6c28aaSamw bool_t
42*da6c28aaSamw xdr_ntsid_helper(xdrs, sid)
43*da6c28aaSamw 	XDR *xdrs;
44*da6c28aaSamw 	char **sid;
45*da6c28aaSamw {
46*da6c28aaSamw 	uint32_t pos, len;
47*da6c28aaSamw 	uint8_t dummy, cnt;
48*da6c28aaSamw 	bool_t rc;
49*da6c28aaSamw 
50*da6c28aaSamw 	switch (xdrs->x_op) {
51*da6c28aaSamw 	case XDR_DECODE:
52*da6c28aaSamw 		/*
53*da6c28aaSamw 		 * chicken-and-egg: Can't use nt_sid_length() since it takes
54*da6c28aaSamw 		 * SID as its parameter while sid is yet to be decoded.
55*da6c28aaSamw 		 */
56*da6c28aaSamw 		pos = xdr_getpos(xdrs);
57*da6c28aaSamw 
58*da6c28aaSamw 		if (!xdr_bool(xdrs, &rc))
59*da6c28aaSamw 			return (FALSE);
60*da6c28aaSamw 
61*da6c28aaSamw 		if (!xdr_uint8_t(xdrs, &dummy))
62*da6c28aaSamw 			return (FALSE);
63*da6c28aaSamw 
64*da6c28aaSamw 		if (!xdr_uint8_t(xdrs, &cnt))
65*da6c28aaSamw 			return (FALSE);
66*da6c28aaSamw 
67*da6c28aaSamw 		rc = xdr_setpos(xdrs, pos);
68*da6c28aaSamw 
69*da6c28aaSamw 		if (rc == FALSE)
70*da6c28aaSamw 			return (FALSE);
71*da6c28aaSamw 
72*da6c28aaSamw 		len = sizeof (nt_sid_t) - sizeof (uint32_t) +
73*da6c28aaSamw 		    (cnt * sizeof (uint32_t));
74*da6c28aaSamw 
75*da6c28aaSamw 		if (!xdr_pointer(xdrs, sid, len, (xdrproc_t)xdr_nt_sid_t))
76*da6c28aaSamw 			return (FALSE);
77*da6c28aaSamw 		break;
78*da6c28aaSamw 
79*da6c28aaSamw 	case XDR_ENCODE:
80*da6c28aaSamw 	case XDR_FREE:
81*da6c28aaSamw 		if (*sid == NULL)
82*da6c28aaSamw 			return (FALSE);
83*da6c28aaSamw 
84*da6c28aaSamw 		len = nt_sid_length((nt_sid_t *)(uintptr_t)*sid);
85*da6c28aaSamw 		if (!xdr_pointer(xdrs, sid, len, (xdrproc_t)xdr_nt_sid_t))
86*da6c28aaSamw 			return (FALSE);
87*da6c28aaSamw 		break;
88*da6c28aaSamw 	}
89*da6c28aaSamw 
90*da6c28aaSamw 	return (TRUE);
91*da6c28aaSamw }
92*da6c28aaSamw 
93*da6c28aaSamw bool_t
94*da6c28aaSamw xdr_smb_privset_helper(xdrs, privs)
95*da6c28aaSamw 	XDR *xdrs;
96*da6c28aaSamw 	char **privs;
97*da6c28aaSamw {
98*da6c28aaSamw 	uint32_t pos, len;
99*da6c28aaSamw 	uint32_t cnt;
100*da6c28aaSamw 	bool_t rc;
101*da6c28aaSamw 	smb_privset_t *p;
102*da6c28aaSamw 
103*da6c28aaSamw 	if (xdrs->x_op == XDR_DECODE) {
104*da6c28aaSamw 		pos = xdr_getpos(xdrs);
105*da6c28aaSamw 
106*da6c28aaSamw 		if (!xdr_bool(xdrs, &rc))
107*da6c28aaSamw 			return (FALSE);
108*da6c28aaSamw 
109*da6c28aaSamw 		if (!xdr_uint32_t(xdrs, &cnt))
110*da6c28aaSamw 			return (FALSE);
111*da6c28aaSamw 
112*da6c28aaSamw 		rc = xdr_setpos(xdrs, pos);
113*da6c28aaSamw 
114*da6c28aaSamw 		if (rc == FALSE)
115*da6c28aaSamw 			return (FALSE);
116*da6c28aaSamw 	} else {
117*da6c28aaSamw 		if (*privs == NULL)
118*da6c28aaSamw 			return (FALSE);
119*da6c28aaSamw 
120*da6c28aaSamw 		p = (smb_privset_t *)(uintptr_t)*privs;
121*da6c28aaSamw 		cnt = p->priv_cnt;
122*da6c28aaSamw 	}
123*da6c28aaSamw 
124*da6c28aaSamw 	len = sizeof (smb_privset_t)
125*da6c28aaSamw 	    - sizeof (smb_luid_attrs_t)
126*da6c28aaSamw 	    + (cnt * sizeof (smb_luid_attrs_t));
127*da6c28aaSamw 
128*da6c28aaSamw 	if (!xdr_pointer(xdrs, privs, len, (xdrproc_t)xdr_smb_privset_t))
129*da6c28aaSamw 		return (FALSE);
130*da6c28aaSamw 
131*da6c28aaSamw 	return (TRUE);
132*da6c28aaSamw }
133*da6c28aaSamw 
134*da6c28aaSamw bool_t
135*da6c28aaSamw xdr_smb_win_grps_helper(xdrs, grps)
136*da6c28aaSamw 	XDR *xdrs;
137*da6c28aaSamw 	char **grps;
138*da6c28aaSamw {
139*da6c28aaSamw 	uint32_t pos, len;
140*da6c28aaSamw 	uint16_t cnt;
141*da6c28aaSamw 	bool_t rc;
142*da6c28aaSamw 
143*da6c28aaSamw 	if (xdrs->x_op == XDR_DECODE) {
144*da6c28aaSamw 		pos = xdr_getpos(xdrs);
145*da6c28aaSamw 
146*da6c28aaSamw 		if (!xdr_bool(xdrs, &rc))
147*da6c28aaSamw 			return (FALSE);
148*da6c28aaSamw 
149*da6c28aaSamw 		if (!xdr_uint16_t(xdrs, &cnt))
150*da6c28aaSamw 			return (FALSE);
151*da6c28aaSamw 
152*da6c28aaSamw 		rc = xdr_setpos(xdrs, pos);
153*da6c28aaSamw 		if (rc == FALSE)
154*da6c28aaSamw 			return (FALSE);
155*da6c28aaSamw 	} else {
156*da6c28aaSamw 		if (*grps == NULL)
157*da6c28aaSamw 			return (FALSE);
158*da6c28aaSamw 
159*da6c28aaSamw 		cnt = ((smb_win_grps_t *)(uintptr_t)*grps)->wg_count;
160*da6c28aaSamw 	}
161*da6c28aaSamw 
162*da6c28aaSamw 	len = cnt * sizeof (smb_id_t) + sizeof (smb_win_grps_t);
163*da6c28aaSamw 
164*da6c28aaSamw 	if (!xdr_pointer(xdrs, grps, len, (xdrproc_t)xdr_smb_win_grps_t))
165*da6c28aaSamw 		return (FALSE);
166*da6c28aaSamw 
167*da6c28aaSamw 	return (TRUE);
168*da6c28aaSamw }
169*da6c28aaSamw 
170*da6c28aaSamw bool_t
171*da6c28aaSamw xdr_smb_id_t(xdrs, objp)
172*da6c28aaSamw 	XDR *xdrs;
173*da6c28aaSamw 	smb_id_t *objp;
174*da6c28aaSamw {
175*da6c28aaSamw 	if (!xdr_smb_sid_attrs_t(xdrs, &objp->i_sidattr))
176*da6c28aaSamw 		return (FALSE);
177*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, (uint32_t *)&objp->i_id))
178*da6c28aaSamw 		return (FALSE);
179*da6c28aaSamw 	return (TRUE);
180*da6c28aaSamw }
181*da6c28aaSamw 
182*da6c28aaSamw bool_t
183*da6c28aaSamw xdr_smb_win_grps_t(xdrs, objp)
184*da6c28aaSamw 	XDR *xdrs;
185*da6c28aaSamw 	smb_win_grps_t *objp;
186*da6c28aaSamw {
187*da6c28aaSamw 	if (!xdr_uint16_t(xdrs, &objp->wg_count))
188*da6c28aaSamw 		return (FALSE);
189*da6c28aaSamw 	if (!xdr_vector(xdrs, (char *)objp->wg_groups, objp->wg_count,
190*da6c28aaSamw 		sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t))
191*da6c28aaSamw 		return (FALSE);
192*da6c28aaSamw 	return (TRUE);
193*da6c28aaSamw }
194*da6c28aaSamw 
195*da6c28aaSamw bool_t
196*da6c28aaSamw xdr_smb_posix_grps_t(xdrs, objp)
197*da6c28aaSamw 	XDR *xdrs;
198*da6c28aaSamw 	smb_posix_grps_t *objp;
199*da6c28aaSamw {
200*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->pg_ngrps))
201*da6c28aaSamw 		return (FALSE);
202*da6c28aaSamw 	if (!xdr_vector(xdrs, (char *)objp->pg_grps, objp->pg_ngrps,
203*da6c28aaSamw 		sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
204*da6c28aaSamw 		return (FALSE);
205*da6c28aaSamw 	return (TRUE);
206*da6c28aaSamw }
207*da6c28aaSamw 
208*da6c28aaSamw bool_t
209*da6c28aaSamw xdr_smb_posix_grps_helper(xdrs, identity)
210*da6c28aaSamw 	XDR *xdrs;
211*da6c28aaSamw 	char **identity;
212*da6c28aaSamw {
213*da6c28aaSamw 	uint32_t pos, len;
214*da6c28aaSamw 	uint32_t cnt;
215*da6c28aaSamw 	bool_t rc;
216*da6c28aaSamw 
217*da6c28aaSamw 	if (xdrs->x_op == XDR_DECODE) {
218*da6c28aaSamw 		pos = xdr_getpos(xdrs);
219*da6c28aaSamw 
220*da6c28aaSamw 		if (!xdr_bool(xdrs, &rc))
221*da6c28aaSamw 			return (FALSE);
222*da6c28aaSamw 
223*da6c28aaSamw 		if (!xdr_uint32_t(xdrs, &cnt))
224*da6c28aaSamw 			return (FALSE);
225*da6c28aaSamw 
226*da6c28aaSamw 		rc = xdr_setpos(xdrs, pos);
227*da6c28aaSamw 		if (rc == FALSE)
228*da6c28aaSamw 			return (FALSE);
229*da6c28aaSamw 	} else {
230*da6c28aaSamw 		if (*identity == NULL)
231*da6c28aaSamw 			return (FALSE);
232*da6c28aaSamw 		cnt = ((smb_posix_grps_t *)(uintptr_t)*identity)->pg_ngrps;
233*da6c28aaSamw 	}
234*da6c28aaSamw 
235*da6c28aaSamw 	len = SMB_POSIX_GRPS_SIZE(cnt);
236*da6c28aaSamw 
237*da6c28aaSamw 	if (!xdr_pointer(xdrs, identity, len, (xdrproc_t)xdr_smb_posix_grps_t))
238*da6c28aaSamw 		return (FALSE);
239*da6c28aaSamw 	return (TRUE);
240*da6c28aaSamw }
241*da6c28aaSamw 
242*da6c28aaSamw bool_t
243*da6c28aaSamw xdr_smb_session_key_t(xdrs, objp)
244*da6c28aaSamw 	XDR *xdrs;
245*da6c28aaSamw 	smb_session_key_t *objp;
246*da6c28aaSamw {
247*da6c28aaSamw 	if (!xdr_vector(xdrs, (char *)objp->data, 16,
248*da6c28aaSamw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
249*da6c28aaSamw 		return (FALSE);
250*da6c28aaSamw 	return (TRUE);
251*da6c28aaSamw }
252*da6c28aaSamw 
253*da6c28aaSamw bool_t
254*da6c28aaSamw xdr_netr_client_t(xdrs, objp)
255*da6c28aaSamw 	XDR *xdrs;
256*da6c28aaSamw 	netr_client_t *objp;
257*da6c28aaSamw {
258*da6c28aaSamw 	if (!xdr_uint16_t(xdrs, &objp->logon_level))
259*da6c28aaSamw 		return (FALSE);
260*da6c28aaSamw 	if (!xdr_string(xdrs, &objp->username, ~0))
261*da6c28aaSamw 		return (FALSE);
262*da6c28aaSamw 	if (!xdr_string(xdrs, &objp->domain, ~0))
263*da6c28aaSamw 		return (FALSE);
264*da6c28aaSamw 	if (!xdr_string(xdrs, &objp->workstation, ~0))
265*da6c28aaSamw 		return (FALSE);
266*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->ipaddr))
267*da6c28aaSamw 		return (FALSE);
268*da6c28aaSamw 	if (!xdr_array(xdrs, (char **)&objp->challenge_key.challenge_key_val,
269*da6c28aaSamw 	    (uint32_t *)&objp->challenge_key.challenge_key_len, ~0,
270*da6c28aaSamw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
271*da6c28aaSamw 		return (FALSE);
272*da6c28aaSamw 	if (!xdr_array(xdrs, (char **)&objp->nt_password.nt_password_val,
273*da6c28aaSamw 	    (uint32_t *)&objp->nt_password.nt_password_len, ~0,
274*da6c28aaSamw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
275*da6c28aaSamw 		return (FALSE);
276*da6c28aaSamw 	if (!xdr_array(xdrs, (char **)&objp->lm_password.lm_password_val,
277*da6c28aaSamw 	    (uint32_t *)&objp->lm_password.lm_password_len, ~0,
278*da6c28aaSamw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
279*da6c28aaSamw 		return (FALSE);
280*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->logon_id))
281*da6c28aaSamw 		return (FALSE);
282*da6c28aaSamw 	if (!xdr_int(xdrs, &objp->native_os))
283*da6c28aaSamw 		return (FALSE);
284*da6c28aaSamw 	if (!xdr_int(xdrs, &objp->native_lm))
285*da6c28aaSamw 		return (FALSE);
286*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->local_ipaddr))
287*da6c28aaSamw 		return (FALSE);
288*da6c28aaSamw 	if (!xdr_uint16_t(xdrs, &objp->local_port))
289*da6c28aaSamw 		return (FALSE);
290*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->flags))
291*da6c28aaSamw 		return (FALSE);
292*da6c28aaSamw 	return (TRUE);
293*da6c28aaSamw }
294*da6c28aaSamw 
295*da6c28aaSamw bool_t
296*da6c28aaSamw xdr_nt_sid_t(xdrs, objp)
297*da6c28aaSamw 	XDR *xdrs;
298*da6c28aaSamw 	nt_sid_t *objp;
299*da6c28aaSamw {
300*da6c28aaSamw 	if (!xdr_uint8_t(xdrs, &objp->Revision))
301*da6c28aaSamw 		return (FALSE);
302*da6c28aaSamw 	if (!xdr_uint8_t(xdrs, &objp->SubAuthCount))
303*da6c28aaSamw 		return (FALSE);
304*da6c28aaSamw 	if (!xdr_vector(xdrs, (char *)objp->Authority, NT_SID_AUTH_MAX,
305*da6c28aaSamw 	    sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
306*da6c28aaSamw 		return (FALSE);
307*da6c28aaSamw 	if (!xdr_vector(xdrs, (char *)objp->SubAuthority, objp->SubAuthCount,
308*da6c28aaSamw 	    sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
309*da6c28aaSamw 		return (FALSE);
310*da6c28aaSamw 	return (TRUE);
311*da6c28aaSamw }
312*da6c28aaSamw 
313*da6c28aaSamw bool_t
314*da6c28aaSamw xdr_smb_luid_t(xdrs, objp)
315*da6c28aaSamw 	XDR *xdrs;
316*da6c28aaSamw 	smb_luid_t *objp;
317*da6c28aaSamw {
318*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->lo_part))
319*da6c28aaSamw 		return (FALSE);
320*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->hi_part))
321*da6c28aaSamw 		return (FALSE);
322*da6c28aaSamw 	return (TRUE);
323*da6c28aaSamw }
324*da6c28aaSamw 
325*da6c28aaSamw bool_t
326*da6c28aaSamw xdr_smb_luid_attrs_t(xdrs, objp)
327*da6c28aaSamw 	XDR *xdrs;
328*da6c28aaSamw 	smb_luid_attrs_t *objp;
329*da6c28aaSamw {
330*da6c28aaSamw 	if (!xdr_smb_luid_t(xdrs, &objp->luid))
331*da6c28aaSamw 		return (FALSE);
332*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->attrs))
333*da6c28aaSamw 		return (FALSE);
334*da6c28aaSamw 	return (TRUE);
335*da6c28aaSamw }
336*da6c28aaSamw 
337*da6c28aaSamw bool_t
338*da6c28aaSamw xdr_smb_privset_t(xdrs, objp)
339*da6c28aaSamw 	XDR *xdrs;
340*da6c28aaSamw 	smb_privset_t *objp;
341*da6c28aaSamw {
342*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->priv_cnt))
343*da6c28aaSamw 		return (FALSE);
344*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->control))
345*da6c28aaSamw 		return (FALSE);
346*da6c28aaSamw 	if (!xdr_vector(xdrs, (char *)objp->priv, objp->priv_cnt,
347*da6c28aaSamw 	    sizeof (smb_luid_attrs_t),
348*da6c28aaSamw 	    (xdrproc_t)xdr_smb_luid_attrs_t))
349*da6c28aaSamw 		return (FALSE);
350*da6c28aaSamw 	return (TRUE);
351*da6c28aaSamw }
352*da6c28aaSamw 
353*da6c28aaSamw bool_t
354*da6c28aaSamw xdr_smb_sid_attrs_t(xdrs, objp)
355*da6c28aaSamw 	XDR *xdrs;
356*da6c28aaSamw 	smb_sid_attrs_t *objp;
357*da6c28aaSamw {
358*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->attrs))
359*da6c28aaSamw 		return (FALSE);
360*da6c28aaSamw 	return (xdr_ntsid_helper(xdrs, (char **)&objp->sid));
361*da6c28aaSamw }
362*da6c28aaSamw 
363*da6c28aaSamw bool_t
364*da6c28aaSamw xdr_smb_token_t(xdrs, objp)
365*da6c28aaSamw 	XDR *xdrs;
366*da6c28aaSamw 	smb_token_t *objp;
367*da6c28aaSamw {
368*da6c28aaSamw 	if (!xdr_pointer(xdrs, (char **)&objp->tkn_user,
369*da6c28aaSamw 	    sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t))
370*da6c28aaSamw 		return (FALSE);
371*da6c28aaSamw 	if (!xdr_pointer(xdrs, (char **)&objp->tkn_owner,
372*da6c28aaSamw 	    sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t))
373*da6c28aaSamw 		return (FALSE);
374*da6c28aaSamw 	if (!xdr_pointer(xdrs, (char **)&objp->tkn_primary_grp,
375*da6c28aaSamw 	    sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t))
376*da6c28aaSamw 		return (FALSE);
377*da6c28aaSamw 	if (!xdr_smb_win_grps_helper(xdrs, (char **)&objp->tkn_win_grps))
378*da6c28aaSamw 		return (FALSE);
379*da6c28aaSamw 	if (!xdr_smb_privset_helper(xdrs, (char **)&objp->tkn_privileges))
380*da6c28aaSamw 		return (FALSE);
381*da6c28aaSamw 	if (!xdr_string(xdrs, &objp->tkn_account_name, ~0))
382*da6c28aaSamw 		return (FALSE);
383*da6c28aaSamw 	if (!xdr_string(xdrs, &objp->tkn_domain_name, ~0))
384*da6c28aaSamw 		return (FALSE);
385*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->tkn_flags))
386*da6c28aaSamw 		return (FALSE);
387*da6c28aaSamw 	if (!xdr_uint32_t(xdrs, &objp->tkn_audit_sid))
388*da6c28aaSamw 		return (FALSE);
389*da6c28aaSamw 	if (!xdr_pointer(xdrs, (char **)&objp->tkn_session_key,
390*da6c28aaSamw 	    sizeof (smb_session_key_t), (xdrproc_t)xdr_smb_session_key_t))
391*da6c28aaSamw 		return (FALSE);
392*da6c28aaSamw 	if (!xdr_smb_posix_grps_helper(xdrs, (char **)&objp->tkn_posix_grps))
393*da6c28aaSamw 		return (FALSE);
394*da6c28aaSamw 	return (TRUE);
395*da6c28aaSamw }
396