xref: /onnv-gate/usr/src/lib/libsmbfs/smb/spnegoparse.h (revision 6007:d57e38e8fdd1)
1*6007Sthurlow // Copyright (C) 2002 Microsoft Corporation
2*6007Sthurlow // All rights reserved.
3*6007Sthurlow //
4*6007Sthurlow // THIS CODE AND INFORMATION IS PROVIDED "AS IS"
5*6007Sthurlow // WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
6*6007Sthurlow // OR IMPLIED, INCLUDING BUT NOT LIMITED
7*6007Sthurlow // TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY
8*6007Sthurlow // AND/OR FITNESS FOR A PARTICULAR PURPOSE.
9*6007Sthurlow //
10*6007Sthurlow // Date    - 10/08/2002
11*6007Sthurlow // Author  - Sanj Surati
12*6007Sthurlow 
13*6007Sthurlow /////////////////////////////////////////////////////////////
14*6007Sthurlow //
15*6007Sthurlow // SPNEGOPARSE.H
16*6007Sthurlow //
17*6007Sthurlow // SPNEGO Token Parser Header File
18*6007Sthurlow //
19*6007Sthurlow // Contains the definitions required to properly parse a
20*6007Sthurlow // SPNEGO token using ASN.1 DER helpers.
21*6007Sthurlow //
22*6007Sthurlow /////////////////////////////////////////////////////////////
23*6007Sthurlow 
24*6007Sthurlow #pragma ident	"%Z%%M%	%I%	%E% SMI"
25*6007Sthurlow 
26*6007Sthurlow #ifndef __SPNEGOPARSE_H__
27*6007Sthurlow #define __SPNEGOPARSE_H__
28*6007Sthurlow 
29*6007Sthurlow // C++ Specific
30*6007Sthurlow #if defined(__cplusplus)
31*6007Sthurlow extern "C"
32*6007Sthurlow {
33*6007Sthurlow #endif
34*6007Sthurlow 
35*6007Sthurlow // Indicates if we copy data when creating a SPNEGO_TOKEN structure or not
36*6007Sthurlow #define SPNEGO_TOKEN_INTERNAL_COPYPTR           0
37*6007Sthurlow #define SPNEGO_TOKEN_INTERNAL_COPYDATA          0x1
38*6007Sthurlow 
39*6007Sthurlow // Internal flag dictates whether or not we will free the binary data when
40*6007Sthurlow // the SPNEG_TOKEN structure is destroyed
41*6007Sthurlow #define  SPNEGO_TOKEN_INTERNAL_FLAGS_FREEDATA   0x1
42*6007Sthurlow 
43*6007Sthurlow    //
44*6007Sthurlow // Each SPNEGO Token Type can be broken down into a
45*6007Sthurlow // maximum of 4 separate elements.
46*6007Sthurlow //
47*6007Sthurlow 
48*6007Sthurlow #define  MAX_NUM_TOKEN_ELEMENTS  4
49*6007Sthurlow 
50*6007Sthurlow //
51*6007Sthurlow // Element offsets in the array
52*6007Sthurlow //
53*6007Sthurlow 
54*6007Sthurlow // INIT elements
55*6007Sthurlow #define  SPNEGO_INIT_MECHTYPES_ELEMENT    0
56*6007Sthurlow #define  SPNEGO_INIT_REQFLAGS_ELEMENT     1
57*6007Sthurlow #define  SPNEGO_INIT_MECHTOKEN_ELEMENT    2
58*6007Sthurlow #define  SPNEGO_INIT_MECHLISTMIC_ELEMENT  3
59*6007Sthurlow 
60*6007Sthurlow // Response elements
61*6007Sthurlow #define  SPNEGO_TARG_NEGRESULT_ELEMENT    0
62*6007Sthurlow #define  SPNEGO_TARG_SUPPMECH_ELEMENT     1
63*6007Sthurlow #define  SPNEGO_TARG_RESPTOKEN_ELEMENT    2
64*6007Sthurlow #define  SPNEGO_TARG_MECHLISTMIC_ELEMENT  3
65*6007Sthurlow 
66*6007Sthurlow //
67*6007Sthurlow // Defines an individual SPNEGO Token Element.
68*6007Sthurlow //
69*6007Sthurlow 
70*6007Sthurlow typedef struct SpnegoElement
71*6007Sthurlow {
72*6007Sthurlow    size_t                nStructSize;        // Size of the element structure
73*6007Sthurlow    int                   iElementPresent;    // Is the field present?  Must be either
74*6007Sthurlow                                              // SPNEGO_TOKEN_ELEMENT_UNAVAILABLE or
75*6007Sthurlow                                              // SPNEGO_TOKEN_ELEMENT_AVAILABLE
76*6007Sthurlow 
77*6007Sthurlow    SPNEGO_ELEMENT_TYPE   eElementType;       // The Element Type
78*6007Sthurlow 
79*6007Sthurlow    unsigned char         type;               // Data Type
80*6007Sthurlow 
81*6007Sthurlow    unsigned char*        pbData;             // Points to actual Data
82*6007Sthurlow 
83*6007Sthurlow    unsigned long         nDatalength;        // Actual Data Length
84*6007Sthurlow 
85*6007Sthurlow } SPNEGO_ELEMENT;
86*6007Sthurlow 
87*6007Sthurlow // Structure size in case we later choose to extend the structure
88*6007Sthurlow #define  SPNEGO_ELEMENT_SIZE sizeof(SPNEGO_ELEMENT)
89*6007Sthurlow 
90*6007Sthurlow //
91*6007Sthurlow // Packages a SPNEGO Token Encoding.  There are two types of
92*6007Sthurlow // encodings: NegTokenInit and NegTokenTarg.  Each encoding can
93*6007Sthurlow // contain up to four distinct, optional elements.
94*6007Sthurlow //
95*6007Sthurlow 
96*6007Sthurlow typedef struct SpnegoToken
97*6007Sthurlow {
98*6007Sthurlow    size_t            nStructSize;                              // Size of the Token structure
99*6007Sthurlow    unsigned long     ulFlags;                                  // Internal Structure Flags - Reserved!
100*6007Sthurlow    int               ucTokenType;                              // Token Type - Must be
101*6007Sthurlow                                                                // SPNEGO_TOKEN_INIT or
102*6007Sthurlow                                                                // SPNEGO_TOKEN_TARG
103*6007Sthurlow 
104*6007Sthurlow    unsigned char*    pbBinaryData;                             // Points to binary token data
105*6007Sthurlow 
106*6007Sthurlow    unsigned long     ulBinaryDataLen;                          // Length of the actual binary data
107*6007Sthurlow    int               nNumElements;                             // Number of elements
108*6007Sthurlow    SPNEGO_ELEMENT    aElementArray [MAX_NUM_TOKEN_ELEMENTS];   // Holds the elements for the token
109*6007Sthurlow } SPNEGO_TOKEN;
110*6007Sthurlow 
111*6007Sthurlow // Structure size in case we later choose to extend the structure
112*6007Sthurlow #define  SPNEGO_TOKEN_SIZE sizeof(SPNEGO_TOKEN)
113*6007Sthurlow 
114*6007Sthurlow //
115*6007Sthurlow // Function definitions
116*6007Sthurlow //
117*6007Sthurlow 
118*6007Sthurlow SPNEGO_TOKEN* AllocEmptySpnegoToken( unsigned char ucCopyData, unsigned long ulFlags,
119*6007Sthurlow                                     unsigned char * pbTokenData, unsigned long ulTokenSize );
120*6007Sthurlow void FreeSpnegoToken( SPNEGO_TOKEN* pSpnegoToken );
121*6007Sthurlow void InitSpnegoTokenElementArray( SPNEGO_TOKEN* pSpnegoToken );
122*6007Sthurlow int InitSpnegoTokenType( SPNEGO_TOKEN* pSpnegoToken, long* pnTokenLength,
123*6007Sthurlow                            long* pnRemainingTokenLength, unsigned char** ppbFirstElement );
124*6007Sthurlow int InitSpnegoTokenElements( SPNEGO_TOKEN* pSpnegoToken, unsigned char* pbTokenData,
125*6007Sthurlow                            long nRemainingTokenLength  );
126*6007Sthurlow int GetSpnegoInitTokenMechList( unsigned char* pbTokenData, int nMechListLength,
127*6007Sthurlow                                  SPNEGO_ELEMENT* pSpnegoElement );
128*6007Sthurlow int InitSpnegoTokenElementFromBasicType( unsigned char* pbTokenData, int nElementLength,
129*6007Sthurlow                                           unsigned char ucExpectedType,
130*6007Sthurlow                                           SPNEGO_ELEMENT_TYPE spnegoElementType,
131*6007Sthurlow                                           SPNEGO_ELEMENT* pSpnegoElement );
132*6007Sthurlow int InitSpnegoTokenElementFromOID( unsigned char* pbTokenData, int nElementLength,
133*6007Sthurlow                                    SPNEGO_ELEMENT_TYPE spnegoElementType,
134*6007Sthurlow                                    SPNEGO_ELEMENT* pSpnegoElement );
135*6007Sthurlow int FindMechOIDInMechList( SPNEGO_ELEMENT* pSpnegoElement, SPNEGO_MECH_OID MechOID,
136*6007Sthurlow                            int * piMechTypeIndex );
137*6007Sthurlow int ValidateMechList( unsigned char* pbMechListData, long nBoundaryLength );
138*6007Sthurlow int CalculateMinSpnegoInitTokenSize( long nMechTokenLength, long nMechListMICLength,
139*6007Sthurlow                                     SPNEGO_MECH_OID mechOid, int nReqFlagsAvailable,
140*6007Sthurlow                                     long* plTokenSize, long* plInternalLength );
141*6007Sthurlow int CalculateMinSpnegoTargTokenSize( SPNEGO_MECH_OID MechType, SPNEGO_NEGRESULT spnegoNegResult,
142*6007Sthurlow                                     long nMechTokenLen,
143*6007Sthurlow                                     long nMechTokenMIC, long* pnTokenSize,
144*6007Sthurlow                                     long* pnInternalTokenLength );
145*6007Sthurlow int CreateSpnegoInitToken( SPNEGO_MECH_OID MechType,
146*6007Sthurlow           unsigned char ucContextFlags, unsigned char* pbMechToken,
147*6007Sthurlow           unsigned long ulMechTokenLen, unsigned char* pbMechListMIC,
148*6007Sthurlow           unsigned long ulMechListMICLen, unsigned char* pbTokenData,
149*6007Sthurlow           long nTokenLength, long nInternalTokenLength );
150*6007Sthurlow int CreateSpnegoTargToken( SPNEGO_MECH_OID MechType,
151*6007Sthurlow           SPNEGO_NEGRESULT eNegResult, unsigned char* pbMechToken,
152*6007Sthurlow           unsigned long ulMechTokenLen, unsigned char* pbMechListMIC,
153*6007Sthurlow           unsigned long ulMechListMICLen, unsigned char* pbTokenData,
154*6007Sthurlow           long nTokenLength, long nInternalTokenLength );
155*6007Sthurlow int IsValidMechOid( SPNEGO_MECH_OID mechOid );
156*6007Sthurlow int IsValidContextFlags( unsigned char ucContextFlags );
157*6007Sthurlow int IsValidNegResult( SPNEGO_NEGRESULT negResult );
158*6007Sthurlow int IsValidSpnegoToken( SPNEGO_TOKEN* pSpnegoToken );
159*6007Sthurlow int IsValidSpnegoElement( SPNEGO_TOKEN* pSpnegoToken,SPNEGO_ELEMENT_TYPE spnegoElement );
160*6007Sthurlow int CalculateElementArrayIndex( SPNEGO_TOKEN* pSpnegoToken,SPNEGO_ELEMENT_TYPE spnegoElement );
161*6007Sthurlow int InitTokenFromBinary( unsigned char ucCopyData, unsigned long ulFlags,
162*6007Sthurlow                         unsigned char* pbTokenData, unsigned long ulLength,
163*6007Sthurlow                         SPNEGO_TOKEN** ppSpnegoToken );
164*6007Sthurlow 
165*6007Sthurlow    // C++ Specific
166*6007Sthurlow #if defined(__cplusplus)
167*6007Sthurlow }
168*6007Sthurlow #endif
169*6007Sthurlow 
170*6007Sthurlow #endif
171