xref: /titanic_52/usr/src/lib/libsmbfs/netsmb/spnego.h (revision 12b65585e720714b31036daaa2b30eb76014048e)
1*12b65585SGordon Ross /*
2*12b65585SGordon Ross  * Copyright (C) 2002 Microsoft Corporation
3*12b65585SGordon Ross  * All rights reserved.
4*12b65585SGordon Ross  *
5*12b65585SGordon Ross  * THIS CODE AND INFORMATION IS PROVIDED "AS IS"
6*12b65585SGordon Ross  * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
7*12b65585SGordon Ross  * OR IMPLIED, INCLUDING BUT NOT LIMITED
8*12b65585SGordon Ross  * TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY
9*12b65585SGordon Ross  * AND/OR FITNESS FOR A PARTICULAR PURPOSE.
10*12b65585SGordon Ross  *
11*12b65585SGordon Ross  * Date    - 10/08/2002
12*12b65585SGordon Ross  * Author  - Sanj Surati
13*12b65585SGordon Ross  */
14*12b65585SGordon Ross 
15*12b65585SGordon Ross /*
16*12b65585SGordon Ross  * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
17*12b65585SGordon Ross  */
18*12b65585SGordon Ross 
19*12b65585SGordon Ross /*
20*12b65585SGordon Ross  * spnego.h
21*12b65585SGordon Ross  *
22*12b65585SGordon Ross  * SPNEGO Token Handler Header File
23*12b65585SGordon Ross  *
24*12b65585SGordon Ross  * Contains the definitions required to interpret and create
25*12b65585SGordon Ross  * SPNEGO tokens so that Kerberos GSS tokens can be
26*12b65585SGordon Ross  * Unpackaged/packaged.
27*12b65585SGordon Ross  */
28*12b65585SGordon Ross 
29*12b65585SGordon Ross #ifndef _SPNEGO_H
30*12b65585SGordon Ross #define	_SPNEGO_H
31*12b65585SGordon Ross 
32*12b65585SGordon Ross #ifdef __cplusplus
33*12b65585SGordon Ross extern "C" {
34*12b65585SGordon Ross #endif
35*12b65585SGordon Ross 
36*12b65585SGordon Ross /*
37*12b65585SGordon Ross  * Type Definitions
38*12b65585SGordon Ross  */
39*12b65585SGordon Ross 
40*12b65585SGordon Ross /*
41*12b65585SGordon Ross  * Users of SPNEGO Token Handler API will request
42*12b65585SGordon Ross  * these as well as free them,
43*12b65585SGordon Ross  */
44*12b65585SGordon Ross typedef void*  SPNEGO_TOKEN_HANDLE;
45*12b65585SGordon Ross 
46*12b65585SGordon Ross /*
47*12b65585SGordon Ross  * Defines the element types that are found
48*12b65585SGordon Ross  * in each of the tokens.
49*12b65585SGordon Ross  */
50*12b65585SGordon Ross 
51*12b65585SGordon Ross typedef enum spnego_element_type
52*12b65585SGordon Ross {
53*12b65585SGordon Ross 	spnego_element_min,  /* Lower bound */
54*12b65585SGordon Ross 
55*12b65585SGordon Ross 	/* Init token elements */
56*12b65585SGordon Ross 	spnego_init_mechtypes,
57*12b65585SGordon Ross 	spnego_init_reqFlags,
58*12b65585SGordon Ross 	spnego_init_mechToken,
59*12b65585SGordon Ross 	spnego_init_mechListMIC,
60*12b65585SGordon Ross 
61*12b65585SGordon Ross 	/* Targ token elements */
62*12b65585SGordon Ross 	spnego_targ_negResult,
63*12b65585SGordon Ross 	spnego_targ_supportedMech,
64*12b65585SGordon Ross 	spnego_targ_responseToken,
65*12b65585SGordon Ross 	spnego_targ_mechListMIC,
66*12b65585SGordon Ross 
67*12b65585SGordon Ross 	spnego_element_max   /* Upper bound */
68*12b65585SGordon Ross 
69*12b65585SGordon Ross } SPNEGO_ELEMENT_TYPE;
70*12b65585SGordon Ross 
71*12b65585SGordon Ross /*
72*12b65585SGordon Ross  * Token Element Availability.  Elements in both
73*12b65585SGordon Ross  * token types are optional.  Since there are only
74*12b65585SGordon Ross  * 4 elements in each Token, we will allocate space
75*12b65585SGordon Ross  * to hold the information, but we need a way to
76*12b65585SGordon Ross  * indicate whether or not an element is available
77*12b65585SGordon Ross  */
78*12b65585SGordon Ross 
79*12b65585SGordon Ross #define	SPNEGO_TOKEN_ELEMENT_UNAVAILABLE 0
80*12b65585SGordon Ross #define	SPNEGO_TOKEN_ELEMENT_AVAILABLE 1
81*12b65585SGordon Ross 
82*12b65585SGordon Ross /*
83*12b65585SGordon Ross  * Token type values.  SPNEGO has 2 token types:
84*12b65585SGordon Ross  * NegTokenInit and NegTokenTarg
85*12b65585SGordon Ross  */
86*12b65585SGordon Ross 
87*12b65585SGordon Ross #define	SPNEGO_TOKEN_INIT 0
88*12b65585SGordon Ross #define	SPNEGO_TOKEN_TARG 1
89*12b65585SGordon Ross 
90*12b65585SGordon Ross /*
91*12b65585SGordon Ross  * GSS Mechanism OID enumeration.  We only really handle
92*12b65585SGordon Ross  * 3 different OIDs.  These are stored in an array structure
93*12b65585SGordon Ross  * defined in the parsing code.
94*12b65585SGordon Ross  */
95*12b65585SGordon Ross 
96*12b65585SGordon Ross typedef enum spnego_mech_oid
97*12b65585SGordon Ross {
98*12b65585SGordon Ross 	/* Init token elements */
99*12b65585SGordon Ross 	spnego_mech_oid_Kerberos_V5_Legacy, /* Really V5, but OID off by 1 */
100*12b65585SGordon Ross 	spnego_mech_oid_Kerberos_V5,
101*12b65585SGordon Ross 	spnego_mech_oid_Spnego,
102*12b65585SGordon Ross 	spnego_mech_oid_NTLMSSP,
103*12b65585SGordon Ross 	spnego_mech_oid_NotUsed = -1
104*12b65585SGordon Ross 
105*12b65585SGordon Ross } SPNEGO_MECH_OID;
106*12b65585SGordon Ross 
107*12b65585SGordon Ross /*
108*12b65585SGordon Ross  * Defines the negResult values.
109*12b65585SGordon Ross  */
110*12b65585SGordon Ross 
111*12b65585SGordon Ross typedef enum spnego_negResult
112*12b65585SGordon Ross {
113*12b65585SGordon Ross 	spnego_negresult_success,
114*12b65585SGordon Ross 	spnego_negresult_incomplete,
115*12b65585SGordon Ross 	spnego_negresult_rejected,
116*12b65585SGordon Ross 	spnego_negresult_NotUsed = -1
117*12b65585SGordon Ross } SPNEGO_NEGRESULT;
118*12b65585SGordon Ross 
119*12b65585SGordon Ross /*
120*12b65585SGordon Ross  * Context Flags in NegTokenInit
121*12b65585SGordon Ross  */
122*12b65585SGordon Ross 
123*12b65585SGordon Ross /*
124*12b65585SGordon Ross  * ContextFlags values MUST be zero or a combination
125*12b65585SGordon Ross  * of the below
126*12b65585SGordon Ross  */
127*12b65585SGordon Ross 
128*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_DELEG_FLAG	0x80
129*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_MUTUAL_FLAG	0x40
130*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_REPLAY_FLAG	0x20
131*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_SEQUENCE_FLAG	0x10
132*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_ANON_FLAG	0x8
133*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_CONF_FLAG	0x4
134*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_INTEG_FLAG	0x2
135*12b65585SGordon Ross 
136*12b65585SGordon Ross /*
137*12b65585SGordon Ross  * Mask to retrieve valid values.
138*12b65585SGordon Ross  */
139*12b65585SGordon Ross 
140*12b65585SGordon Ross #define	SPNEGO_NEGINIT_CONTEXT_MASK	0xFE
141*12b65585SGordon Ross 
142*12b65585SGordon Ross /*
143*12b65585SGordon Ross  * SPNEGO API return codes.
144*12b65585SGordon Ross  */
145*12b65585SGordon Ross 
146*12b65585SGordon Ross /* API function was successful */
147*12b65585SGordon Ross #define	SPNEGO_E_SUCCESS		0
148*12b65585SGordon Ross 
149*12b65585SGordon Ross /* The supplied Token was invalid */
150*12b65585SGordon Ross #define	SPNEGO_E_INVALID_TOKEN		-1
151*12b65585SGordon Ross 
152*12b65585SGordon Ross /* An invalid length was encountered */
153*12b65585SGordon Ross #define	SPNEGO_E_INVALID_LENGTH		-2
154*12b65585SGordon Ross 
155*12b65585SGordon Ross /* The Token Parse failed */
156*12b65585SGordon Ross #define	SPNEGO_E_PARSE_FAILED		-3
157*12b65585SGordon Ross 
158*12b65585SGordon Ross /* The requested value was not found */
159*12b65585SGordon Ross #define	SPNEGO_E_NOT_FOUND		-4
160*12b65585SGordon Ross 
161*12b65585SGordon Ross /* The requested element is not available */
162*12b65585SGordon Ross #define	SPNEGO_E_ELEMENT_UNAVAILABLE	-5
163*12b65585SGordon Ross 
164*12b65585SGordon Ross /* Out of Memory */
165*12b65585SGordon Ross #define	SPNEGO_E_OUT_OF_MEMORY		-6
166*12b65585SGordon Ross 
167*12b65585SGordon Ross /* Not Implemented */
168*12b65585SGordon Ross #define	SPNEGO_E_NOT_IMPLEMENTED	-7
169*12b65585SGordon Ross 
170*12b65585SGordon Ross /* Invalid Parameter */
171*12b65585SGordon Ross #define	SPNEGO_E_INVALID_PARAMETER	-8
172*12b65585SGordon Ross 
173*12b65585SGordon Ross /* Token Handler encountered an unexpected OID */
174*12b65585SGordon Ross #define	SPNEGO_E_UNEXPECTED_OID		-9
175*12b65585SGordon Ross 
176*12b65585SGordon Ross /* The requested token was not found */
177*12b65585SGordon Ross #define	SPNEGO_E_TOKEN_NOT_FOUND	-10
178*12b65585SGordon Ross 
179*12b65585SGordon Ross /* An unexpected type was encountered in the encoding */
180*12b65585SGordon Ross #define	SPNEGO_E_UNEXPECTED_TYPE	-11
181*12b65585SGordon Ross 
182*12b65585SGordon Ross /* The buffer was too small */
183*12b65585SGordon Ross #define	SPNEGO_E_BUFFER_TOO_SMALL	-12
184*12b65585SGordon Ross 
185*12b65585SGordon Ross /* A Token Element was invalid (e.g. improper length or value) */
186*12b65585SGordon Ross #define	SPNEGO_E_INVALID_ELEMENT	-13
187*12b65585SGordon Ross 
188*12b65585SGordon Ross /* Miscelaneous API Functions */
189*12b65585SGordon Ross 
190*12b65585SGordon Ross /* Frees opaque data */
191*12b65585SGordon Ross void spnegoFreeData(SPNEGO_TOKEN_HANDLE hSpnegoToken);
192*12b65585SGordon Ross 
193*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure from DER encoded binary data */
194*12b65585SGordon Ross int spnegoInitFromBinary(unsigned char *pbTokenData, unsigned long ulLength,
195*12b65585SGordon Ross 	SPNEGO_TOKEN_HANDLE* phSpnegoToken);
196*12b65585SGordon Ross 
197*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure for a NegTokenInit type */
198*12b65585SGordon Ross int spnegoCreateNegTokenHint(SPNEGO_MECH_OID *pMechTypeList, int MechTypeCnt,
199*12b65585SGordon Ross 	unsigned char *pbPrincipal, SPNEGO_TOKEN_HANDLE* phSpnegoToken);
200*12b65585SGordon Ross 
201*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure for a NegTokenInit type */
202*12b65585SGordon Ross int spnegoCreateNegTokenInit(SPNEGO_MECH_OID MechType,
203*12b65585SGordon Ross 	unsigned char ucContextFlags, unsigned char *pbMechToken,
204*12b65585SGordon Ross 	unsigned long ulMechTokenLen, unsigned char *pbMechTokenMIC,
205*12b65585SGordon Ross 	unsigned long ulMechTokenMIC, SPNEGO_TOKEN_HANDLE *phSpnegoToken);
206*12b65585SGordon Ross 
207*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure for a NegTokenTarg type */
208*12b65585SGordon Ross int spnegoCreateNegTokenTarg(SPNEGO_MECH_OID MechType,
209*12b65585SGordon Ross 	SPNEGO_NEGRESULT spnegoNegResult, unsigned char *pbMechToken,
210*12b65585SGordon Ross 	unsigned long ulMechTokenLen, unsigned char *pbMechListMIC,
211*12b65585SGordon Ross 	unsigned long ulMechListMICLen, SPNEGO_TOKEN_HANDLE* phSpnegoToken);
212*12b65585SGordon Ross 
213*12b65585SGordon Ross /* Copies binary representation of SPNEGO Data into user supplied buffer */
214*12b65585SGordon Ross int spnegoTokenGetBinary(SPNEGO_TOKEN_HANDLE hSpnegoToken,
215*12b65585SGordon Ross 	unsigned char *pbTokenData, unsigned long *pulDataLen);
216*12b65585SGordon Ross 
217*12b65585SGordon Ross /* Returns SPNEGO Token Type */
218*12b65585SGordon Ross int spnegoGetTokenType(SPNEGO_TOKEN_HANDLE hSpnegoToken, int *piTokenType);
219*12b65585SGordon Ross 
220*12b65585SGordon Ross /* Reading an Init Token */
221*12b65585SGordon Ross 
222*12b65585SGordon Ross /* Returns the Initial Mech Type in the MechList element in the NegInitToken. */
223*12b65585SGordon Ross int spnegoIsMechTypeAvailable(SPNEGO_TOKEN_HANDLE hSpnegoToken,
224*12b65585SGordon Ross 	SPNEGO_MECH_OID MechOID, int *piMechTypeIndex);
225*12b65585SGordon Ross 
226*12b65585SGordon Ross /* Returns the value from the context flags element in the NegInitToken */
227*12b65585SGordon Ross int spnegoGetContextFlags(SPNEGO_TOKEN_HANDLE hSpnegoToken,
228*12b65585SGordon Ross 	unsigned char *pucContextFlags);
229*12b65585SGordon Ross 
230*12b65585SGordon Ross /* Reading a Response Token */
231*12b65585SGordon Ross 
232*12b65585SGordon Ross /*
233*12b65585SGordon Ross  * Returns the value from the negResult element
234*12b65585SGordon Ross  * (Status code of GSS call - 0,1,2)
235*12b65585SGordon Ross  */
236*12b65585SGordon Ross int spnegoGetNegotiationResult(SPNEGO_TOKEN_HANDLE hSpnegoToken,
237*12b65585SGordon Ross 	SPNEGO_NEGRESULT* pnegResult);
238*12b65585SGordon Ross 
239*12b65585SGordon Ross /* Returns the Supported Mech Type from the NegTokenTarg. */
240*12b65585SGordon Ross int spnegoGetSupportedMechType(SPNEGO_TOKEN_HANDLE hSpnegoToken,
241*12b65585SGordon Ross 	SPNEGO_MECH_OID* pMechOID);
242*12b65585SGordon Ross 
243*12b65585SGordon Ross /* Reading either Token Type */
244*12b65585SGordon Ross 
245*12b65585SGordon Ross /*
246*12b65585SGordon Ross  * Returns the actual Mechanism data from the token
247*12b65585SGordon Ross  * (this is what is passed into GSS-API functions
248*12b65585SGordon Ross  */
249*12b65585SGordon Ross int spnegoGetMechToken(SPNEGO_TOKEN_HANDLE hSpnegoToken,
250*12b65585SGordon Ross 	unsigned char *pbTokenData, unsigned long *pulDataLen);
251*12b65585SGordon Ross 
252*12b65585SGordon Ross /* Returns the Message Integrity BLOB in the token */
253*12b65585SGordon Ross int spnegoGetMechListMIC(SPNEGO_TOKEN_HANDLE hSpnegoToken,
254*12b65585SGordon Ross 	unsigned char *pbMICData, unsigned long *pulDataLen);
255*12b65585SGordon Ross 
256*12b65585SGordon Ross #ifdef __cplusplus
257*12b65585SGordon Ross }
258*12b65585SGordon Ross #endif
259*12b65585SGordon Ross 
260*12b65585SGordon Ross #endif /* _SPNEGO_H */
261