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