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 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 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 * 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 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 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 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