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