xref: /onnv-gate/usr/src/lib/libidmap/common/sidutil.c (revision 10122:96eda55bfd54)
1*10122SJordan.Brown@Sun.COM /*
2*10122SJordan.Brown@Sun.COM  * CDDL HEADER START
3*10122SJordan.Brown@Sun.COM  *
4*10122SJordan.Brown@Sun.COM  * The contents of this file are subject to the terms of the
5*10122SJordan.Brown@Sun.COM  * Common Development and Distribution License (the "License").
6*10122SJordan.Brown@Sun.COM  * You may not use this file except in compliance with the License.
7*10122SJordan.Brown@Sun.COM  *
8*10122SJordan.Brown@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10122SJordan.Brown@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10122SJordan.Brown@Sun.COM  * See the License for the specific language governing permissions
11*10122SJordan.Brown@Sun.COM  * and limitations under the License.
12*10122SJordan.Brown@Sun.COM  *
13*10122SJordan.Brown@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10122SJordan.Brown@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10122SJordan.Brown@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10122SJordan.Brown@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10122SJordan.Brown@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10122SJordan.Brown@Sun.COM  *
19*10122SJordan.Brown@Sun.COM  * CDDL HEADER END
20*10122SJordan.Brown@Sun.COM  */
21*10122SJordan.Brown@Sun.COM /*
22*10122SJordan.Brown@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*10122SJordan.Brown@Sun.COM  * Use is subject to license terms.
24*10122SJordan.Brown@Sun.COM  */
25*10122SJordan.Brown@Sun.COM 
26*10122SJordan.Brown@Sun.COM /*
27*10122SJordan.Brown@Sun.COM  * This is an extract from usr/src/common/smbsrv/smb_sid.c,
28*10122SJordan.Brown@Sun.COM  * with functions renamed as part of a tentative plan for convergence.
29*10122SJordan.Brown@Sun.COM  */
30*10122SJordan.Brown@Sun.COM #ifndef _KERNEL
31*10122SJordan.Brown@Sun.COM #include <stdio.h>
32*10122SJordan.Brown@Sun.COM #include <strings.h>
33*10122SJordan.Brown@Sun.COM #include <stdlib.h>
34*10122SJordan.Brown@Sun.COM #include <syslog.h>
35*10122SJordan.Brown@Sun.COM #else /* _KERNEL */
36*10122SJordan.Brown@Sun.COM #include <sys/types.h>
37*10122SJordan.Brown@Sun.COM #include <sys/sunddi.h>
38*10122SJordan.Brown@Sun.COM #endif /* _KERNEL */
39*10122SJordan.Brown@Sun.COM 
40*10122SJordan.Brown@Sun.COM #include <sidutil.h>
41*10122SJordan.Brown@Sun.COM 
42*10122SJordan.Brown@Sun.COM /*
43*10122SJordan.Brown@Sun.COM  * sid_len
44*10122SJordan.Brown@Sun.COM  *
45*10122SJordan.Brown@Sun.COM  * Returns the number of bytes required to hold the sid.
46*10122SJordan.Brown@Sun.COM  */
47*10122SJordan.Brown@Sun.COM int
sid_len(sid_t * sid)48*10122SJordan.Brown@Sun.COM sid_len(sid_t *sid)
49*10122SJordan.Brown@Sun.COM {
50*10122SJordan.Brown@Sun.COM 	if (sid == NULL)
51*10122SJordan.Brown@Sun.COM 		return (0);
52*10122SJordan.Brown@Sun.COM 
53*10122SJordan.Brown@Sun.COM 	return (sizeof (sid_t) - sizeof (uint32_t)
54*10122SJordan.Brown@Sun.COM 	    + (sid->sid_subauthcnt * sizeof (uint32_t)));
55*10122SJordan.Brown@Sun.COM }
56*10122SJordan.Brown@Sun.COM 
57*10122SJordan.Brown@Sun.COM /*
58*10122SJordan.Brown@Sun.COM  * sid_tostr
59*10122SJordan.Brown@Sun.COM  *
60*10122SJordan.Brown@Sun.COM  * Fill in the passed buffer with the string form of the given
61*10122SJordan.Brown@Sun.COM  * binary sid.
62*10122SJordan.Brown@Sun.COM  */
63*10122SJordan.Brown@Sun.COM void
sid_tostr(sid_t * sid,char * strsid)64*10122SJordan.Brown@Sun.COM sid_tostr(sid_t *sid, char *strsid)
65*10122SJordan.Brown@Sun.COM {
66*10122SJordan.Brown@Sun.COM 	char *p = strsid;
67*10122SJordan.Brown@Sun.COM 	int i;
68*10122SJordan.Brown@Sun.COM 
69*10122SJordan.Brown@Sun.COM 	if (sid == NULL || strsid == NULL)
70*10122SJordan.Brown@Sun.COM 		return;
71*10122SJordan.Brown@Sun.COM 
72*10122SJordan.Brown@Sun.COM 	(void) sprintf(p, "S-%d-", sid->sid_revision);
73*10122SJordan.Brown@Sun.COM 	while (*p)
74*10122SJordan.Brown@Sun.COM 		p++;
75*10122SJordan.Brown@Sun.COM 
76*10122SJordan.Brown@Sun.COM 	for (i = 0; i < NT_SID_AUTH_MAX; ++i) {
77*10122SJordan.Brown@Sun.COM 		if (sid->sid_authority[i] != 0 || i == NT_SID_AUTH_MAX - 1) {
78*10122SJordan.Brown@Sun.COM 			(void) sprintf(p, "%d", sid->sid_authority[i]);
79*10122SJordan.Brown@Sun.COM 			while (*p)
80*10122SJordan.Brown@Sun.COM 				p++;
81*10122SJordan.Brown@Sun.COM 		}
82*10122SJordan.Brown@Sun.COM 	}
83*10122SJordan.Brown@Sun.COM 
84*10122SJordan.Brown@Sun.COM 	for (i = 0; i < sid->sid_subauthcnt && i < NT_SID_SUBAUTH_MAX; ++i) {
85*10122SJordan.Brown@Sun.COM 		(void) sprintf(p, "-%u", sid->sid_subauth[i]);
86*10122SJordan.Brown@Sun.COM 		while (*p)
87*10122SJordan.Brown@Sun.COM 			p++;
88*10122SJordan.Brown@Sun.COM 	}
89*10122SJordan.Brown@Sun.COM }
90*10122SJordan.Brown@Sun.COM 
91*10122SJordan.Brown@Sun.COM /*
92*10122SJordan.Brown@Sun.COM  * sid_fromstr
93*10122SJordan.Brown@Sun.COM  *
94*10122SJordan.Brown@Sun.COM  * Converts a SID in string form to a SID structure. There are lots of
95*10122SJordan.Brown@Sun.COM  * simplifying assumptions in here. The memory for the SID is allocated
96*10122SJordan.Brown@Sun.COM  * as if it was the largest possible SID; the caller is responsible for
97*10122SJordan.Brown@Sun.COM  * freeing the memory when it is no longer required. We assume that the
98*10122SJordan.Brown@Sun.COM  * string starts with "S-1-" and that the authority is held in the last
99*10122SJordan.Brown@Sun.COM  * byte, which should be okay for most situations. It also assumes the
100*10122SJordan.Brown@Sun.COM  * sub-authorities are in decimal format.
101*10122SJordan.Brown@Sun.COM  *
102*10122SJordan.Brown@Sun.COM  * On success, a pointer to a SID is returned. Otherwise a null pointer
103*10122SJordan.Brown@Sun.COM  * is returned.
104*10122SJordan.Brown@Sun.COM  */
105*10122SJordan.Brown@Sun.COM sid_t *
sid_fromstr(char * sidstr)106*10122SJordan.Brown@Sun.COM sid_fromstr(char *sidstr)
107*10122SJordan.Brown@Sun.COM {
108*10122SJordan.Brown@Sun.COM 	sid_t *sid;
109*10122SJordan.Brown@Sun.COM 	char *p;
110*10122SJordan.Brown@Sun.COM 	int size;
111*10122SJordan.Brown@Sun.COM 	uint8_t i;
112*10122SJordan.Brown@Sun.COM 
113*10122SJordan.Brown@Sun.COM 	if (sidstr == NULL)
114*10122SJordan.Brown@Sun.COM 		return (NULL);
115*10122SJordan.Brown@Sun.COM 
116*10122SJordan.Brown@Sun.COM 	if (strncmp(sidstr, "S-1-", 4) != 0)
117*10122SJordan.Brown@Sun.COM 		return (NULL);
118*10122SJordan.Brown@Sun.COM 
119*10122SJordan.Brown@Sun.COM 	size = sizeof (sid_t) + (NT_SID_SUBAUTH_MAX * sizeof (uint32_t));
120*10122SJordan.Brown@Sun.COM 
121*10122SJordan.Brown@Sun.COM 	if ((sid = malloc(size)) == NULL)
122*10122SJordan.Brown@Sun.COM 		return (NULL);
123*10122SJordan.Brown@Sun.COM 
124*10122SJordan.Brown@Sun.COM 	bzero(sid, size);
125*10122SJordan.Brown@Sun.COM 	sid->sid_revision = NT_SID_REVISION;
126*10122SJordan.Brown@Sun.COM 	sid->sid_authority[5] = atoi(&sidstr[4]);
127*10122SJordan.Brown@Sun.COM 
128*10122SJordan.Brown@Sun.COM 	for (i = 0, p = &sidstr[5]; i < NT_SID_SUBAUTH_MAX && *p; ++i) {
129*10122SJordan.Brown@Sun.COM 		while (*p && *p == '-')
130*10122SJordan.Brown@Sun.COM 			++p;
131*10122SJordan.Brown@Sun.COM 
132*10122SJordan.Brown@Sun.COM 		if (*p < '0' || *p > '9') {
133*10122SJordan.Brown@Sun.COM 			free(sid);
134*10122SJordan.Brown@Sun.COM 			return (NULL);
135*10122SJordan.Brown@Sun.COM 		}
136*10122SJordan.Brown@Sun.COM 
137*10122SJordan.Brown@Sun.COM 		sid->sid_subauth[i] = strtoul(p, NULL, 10);
138*10122SJordan.Brown@Sun.COM 
139*10122SJordan.Brown@Sun.COM 		while (*p && *p != '-')
140*10122SJordan.Brown@Sun.COM 			++p;
141*10122SJordan.Brown@Sun.COM 	}
142*10122SJordan.Brown@Sun.COM 
143*10122SJordan.Brown@Sun.COM 	sid->sid_subauthcnt = i;
144*10122SJordan.Brown@Sun.COM 	return (sid);
145*10122SJordan.Brown@Sun.COM }
146*10122SJordan.Brown@Sun.COM 
147*10122SJordan.Brown@Sun.COM void
sid_free(sid_t * sid)148*10122SJordan.Brown@Sun.COM sid_free(sid_t *sid)
149*10122SJordan.Brown@Sun.COM {
150*10122SJordan.Brown@Sun.COM #ifdef _KERNEL
151*10122SJordan.Brown@Sun.COM 	if (sid == NULL)
152*10122SJordan.Brown@Sun.COM 		return;
153*10122SJordan.Brown@Sun.COM 
154*10122SJordan.Brown@Sun.COM 	kmem_free(sid, sid_len(sid));
155*10122SJordan.Brown@Sun.COM #else
156*10122SJordan.Brown@Sun.COM 	free(sid);
157*10122SJordan.Brown@Sun.COM #endif
158*10122SJordan.Brown@Sun.COM }
159*10122SJordan.Brown@Sun.COM 
160*10122SJordan.Brown@Sun.COM void
sid_to_le(sid_t * sid)161*10122SJordan.Brown@Sun.COM sid_to_le(sid_t *sid)
162*10122SJordan.Brown@Sun.COM {
163*10122SJordan.Brown@Sun.COM 	int i;
164*10122SJordan.Brown@Sun.COM 
165*10122SJordan.Brown@Sun.COM 	for (i = 0; i < sid->sid_subauthcnt && i < NT_SID_SUBAUTH_MAX; ++i) {
166*10122SJordan.Brown@Sun.COM 		uint32_t v = sid->sid_subauth[i];
167*10122SJordan.Brown@Sun.COM 		uint8_t *p = (uint8_t *)&sid->sid_subauth[i];
168*10122SJordan.Brown@Sun.COM 
169*10122SJordan.Brown@Sun.COM 		p[0] = v & 0xff;
170*10122SJordan.Brown@Sun.COM 		p[1] = (v >> 8) & 0xff;
171*10122SJordan.Brown@Sun.COM 		p[2] = (v >> 16) & 0xff;
172*10122SJordan.Brown@Sun.COM 		p[3] = (v >> 24) & 0xff;
173*10122SJordan.Brown@Sun.COM 	}
174*10122SJordan.Brown@Sun.COM }
175*10122SJordan.Brown@Sun.COM 
176*10122SJordan.Brown@Sun.COM void
sid_from_le(sid_t * sid)177*10122SJordan.Brown@Sun.COM sid_from_le(sid_t *sid)
178*10122SJordan.Brown@Sun.COM {
179*10122SJordan.Brown@Sun.COM 	int i;
180*10122SJordan.Brown@Sun.COM 
181*10122SJordan.Brown@Sun.COM 	for (i = 0; i < sid->sid_subauthcnt && i < NT_SID_SUBAUTH_MAX; ++i) {
182*10122SJordan.Brown@Sun.COM 		uint32_t v;
183*10122SJordan.Brown@Sun.COM 		uint8_t *p = (uint8_t *)&sid->sid_subauth[i];
184*10122SJordan.Brown@Sun.COM 
185*10122SJordan.Brown@Sun.COM 		v = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
186*10122SJordan.Brown@Sun.COM 
187*10122SJordan.Brown@Sun.COM 		sid->sid_subauth[i] = v;
188*10122SJordan.Brown@Sun.COM 	}
189*10122SJordan.Brown@Sun.COM }
190