xref: /titanic_44/usr/src/lib/libsmbfs/smb/derparse.h (revision 4bff34e37def8a90f9194d81bc345c52ba20086a)
1*4bff34e3Sthurlow // Copyright (C) 2002 Microsoft Corporation
2*4bff34e3Sthurlow // All rights reserved.
3*4bff34e3Sthurlow //
4*4bff34e3Sthurlow // THIS CODE AND INFORMATION IS PROVIDED "AS IS"
5*4bff34e3Sthurlow // WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
6*4bff34e3Sthurlow // OR IMPLIED, INCLUDING BUT NOT LIMITED
7*4bff34e3Sthurlow // TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY
8*4bff34e3Sthurlow // AND/OR FITNESS FOR A PARTICULAR PURPOSE.
9*4bff34e3Sthurlow //
10*4bff34e3Sthurlow // Date    - 10/08/2002
11*4bff34e3Sthurlow // Author  - Sanj Surati
12*4bff34e3Sthurlow 
13*4bff34e3Sthurlow /////////////////////////////////////////////////////////////
14*4bff34e3Sthurlow //
15*4bff34e3Sthurlow // DERPARSE.H
16*4bff34e3Sthurlow //
17*4bff34e3Sthurlow // SPNEGO Token Handler Header File
18*4bff34e3Sthurlow //
19*4bff34e3Sthurlow // Contains the definitions required to properly parse the
20*4bff34e3Sthurlow // SPNEGO DER encoding.
21*4bff34e3Sthurlow //
22*4bff34e3Sthurlow /////////////////////////////////////////////////////////////
23*4bff34e3Sthurlow 
24*4bff34e3Sthurlow #pragma ident	"%Z%%M%	%I%	%E% SMI"
25*4bff34e3Sthurlow 
26*4bff34e3Sthurlow #ifndef __DERPARSE_H__
27*4bff34e3Sthurlow #define __DERPARSE_H__
28*4bff34e3Sthurlow 
29*4bff34e3Sthurlow // C++ Specific
30*4bff34e3Sthurlow #if defined(__cplusplus)
31*4bff34e3Sthurlow extern "C"
32*4bff34e3Sthurlow {
33*4bff34e3Sthurlow #endif
34*4bff34e3Sthurlow 
35*4bff34e3Sthurlow /* Identifier Types */
36*4bff34e3Sthurlow #define  IDENTIFIER_MASK               0xC0  // Bits 7 and 8
37*4bff34e3Sthurlow #define  IDENTIFIER_UNIVERSAL          0x00  // 00 = universal
38*4bff34e3Sthurlow #define  IDENTIFIER_APPLICATION        0x40  // 01 = application
39*4bff34e3Sthurlow #define  IDENTIFIER_CONTEXT_SPECIFIC   0x80  // 10 = context specific
40*4bff34e3Sthurlow #define  IDENTIFIER_PRIVATE            0xC0  // 11 = Private
41*4bff34e3Sthurlow 
42*4bff34e3Sthurlow /* Encoding type */
43*4bff34e3Sthurlow 
44*4bff34e3Sthurlow #define FORM_MASK       0x20    /* Bit 6 */
45*4bff34e3Sthurlow #define PRIMITIVE       0x00    /* 0 = primitive */
46*4bff34e3Sthurlow #define CONSTRUCTED     0x20    /* 1 = constructed */
47*4bff34e3Sthurlow 
48*4bff34e3Sthurlow /* Universal tags */
49*4bff34e3Sthurlow 
50*4bff34e3Sthurlow #define TAG_MASK        0x1F    /* Bits 5 - 1 */
51*4bff34e3Sthurlow #define BOOLEAN         0x01    /*  1: TRUE or FALSE */
52*4bff34e3Sthurlow #define INTEGER         0x02    /*  2: Arbitrary precision integer */
53*4bff34e3Sthurlow #define BITSTRING       0x03    /*  2: Sequence of bits */
54*4bff34e3Sthurlow #define OCTETSTRING     0x04    /*  4: Sequence of bytes */
55*4bff34e3Sthurlow #define NULLTAG         0x05    /*  5: NULL */
56*4bff34e3Sthurlow #define OID             0x06    /*  6: Object Identifier (numeric sequence) */
57*4bff34e3Sthurlow #define OBJDESCRIPTOR   0x07    /*  7: Object Descriptor (human readable) */
58*4bff34e3Sthurlow #define EXTERNAL        0x08    /*  8: External / Instance Of */
59*4bff34e3Sthurlow #define REAL            0x09    /*  9: Real (Mantissa * Base^Exponent) */
60*4bff34e3Sthurlow #define ENUMERATED      0x0A    /* 10: Enumerated */
61*4bff34e3Sthurlow #define EMBEDDED_PDV    0x0B    /* 11: Embedded Presentation Data Value */
62*4bff34e3Sthurlow #define SEQUENCE        0x10    /* 16: Constructed Sequence / Sequence Of */
63*4bff34e3Sthurlow #define SET             0x11    /* 17: Constructed Set / Set Of */
64*4bff34e3Sthurlow #define NUMERICSTR      0x12    /* 18: Numeric String (digits only) */
65*4bff34e3Sthurlow #define PRINTABLESTR    0x13    /* 19: Printable String */
66*4bff34e3Sthurlow #define T61STR          0x14    /* 20: T61 String (Teletex) */
67*4bff34e3Sthurlow #define VIDEOTEXSTR     0x15    /* 21: Videotex String */
68*4bff34e3Sthurlow #define IA5STR          0x16    /* 22: IA5 String */
69*4bff34e3Sthurlow #define UTCTIME         0x17    /* 23: UTC Time */
70*4bff34e3Sthurlow #define GENERALIZEDTIME 0x18    /* 24: Generalized Time */
71*4bff34e3Sthurlow #define GRAPHICSTR      0x19    /* 25: Graphic String */
72*4bff34e3Sthurlow #define VISIBLESTR      0x1A    /* 26: Visible String (ISO 646) */
73*4bff34e3Sthurlow #define GENERALSTR      0x1B    /* 27: General String */
74*4bff34e3Sthurlow #define UNIVERSALSTR    0x1C    /* 28: Universal String */
75*4bff34e3Sthurlow #define BMPSTR          0x1E    /* 30: Basic Multilingual Plane String */
76*4bff34e3Sthurlow 
77*4bff34e3Sthurlow /* Length encoding */
78*4bff34e3Sthurlow 
79*4bff34e3Sthurlow #define LEN_XTND  0x80      /* Indefinite or long form */
80*4bff34e3Sthurlow #define LEN_MASK  0x7f      /* Bits 7 - 1 */
81*4bff34e3Sthurlow 
82*4bff34e3Sthurlow #define SEQ_ELM(n) (IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | ((n)&TAG_MASK))
83*4bff34e3Sthurlow 
84*4bff34e3Sthurlow //
85*4bff34e3Sthurlow // SPNEGO Token Parsing Constants
86*4bff34e3Sthurlow //
87*4bff34e3Sthurlow 
88*4bff34e3Sthurlow 
89*4bff34e3Sthurlow // Fixed Length of NegTokenInit ReqFlags field
90*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_MAXLEN_REQFLAGS   2
91*4bff34e3Sthurlow 
92*4bff34e3Sthurlow // Difference in bits for ReqFlags token
93*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_REQFLAGS_BITDIFF  1
94*4bff34e3Sthurlow 
95*4bff34e3Sthurlow // Fixed Length of NegTokenTarg NegResult field
96*4bff34e3Sthurlow #define  SPNEGO_NEGTARG_MAXLEN_NEGRESULT  1
97*4bff34e3Sthurlow 
98*4bff34e3Sthurlow // Application Specific Construct - Always at the start of a NegTokenInit
99*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_APP_CONSTRUCT     ( IDENTIFIER_APPLICATION | CONSTRUCTED ) // 0x60
100*4bff34e3Sthurlow 
101*4bff34e3Sthurlow // Constructed Sequence token - after the actual token identifier token
102*4bff34e3Sthurlow #define  SPNEGO_CONSTRUCTED_SEQUENCE      ( SEQUENCE | CONSTRUCTED )
103*4bff34e3Sthurlow 
104*4bff34e3Sthurlow // MechList Type Identifier
105*4bff34e3Sthurlow #define  SPNEGO_MECHLIST_TYPE      ( SEQUENCE | CONSTRUCTED | OID )
106*4bff34e3Sthurlow 
107*4bff34e3Sthurlow //
108*4bff34e3Sthurlow // NegTokenInit - Token Identifier and Elements
109*4bff34e3Sthurlow //
110*4bff34e3Sthurlow 
111*4bff34e3Sthurlow // NegTokenInit - 0xa0
112*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_TOKEN_IDENTIFIER  ( IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED |  \
113*4bff34e3Sthurlow                                              SPNEGO_TOKEN_INIT )
114*4bff34e3Sthurlow 
115*4bff34e3Sthurlow // Structure elements for NegTokenInit
116*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_MECHTYPES   0x0   // MechTypes is element 0
117*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_REQFLAGS    0x1   // ReqFlags is element 1
118*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_MECHTOKEN   0x2   // MechToken is element 2
119*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_MECHLISTMIC 0x3   // MechListMIC is element 3
120*4bff34e3Sthurlow 
121*4bff34e3Sthurlow // MechTypes element is 0xa0
122*4bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_MECHTYPES    SEQ_ELM(SPNEGO_NEGINIT_MECHTYPES)
123*4bff34e3Sthurlow // ReqFlags element is 0xa1
124*4bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_REQFLAGS     SEQ_ELM(SPNEGO_NEGINIT_REQFLAGS)
125*4bff34e3Sthurlow // MechToken element is 0xa2
126*4bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_MECHTOKEN    SEQ_ELM(SPNEGO_NEGINIT_MECHTOKEN)
127*4bff34e3Sthurlow // MechListMIC element is 0xa3
128*4bff34e3Sthurlow #define  SPNEGO_NEGINIT_ELEMENT_MECHLISTMIC SEQ_ELM(SPNEGO_NEGINIT_MECHLISTMIC)
129*4bff34e3Sthurlow 
130*4bff34e3Sthurlow //
131*4bff34e3Sthurlow // NegTokenTarg - Token Identifier and Elements
132*4bff34e3Sthurlow //
133*4bff34e3Sthurlow 
134*4bff34e3Sthurlow // NegTokenTarg - 0xa1
135*4bff34e3Sthurlow #define  SPNEGO_NEGTARG_TOKEN_IDENTIFIER  ( IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED |  \
136*4bff34e3Sthurlow                                              SPNEGO_TOKEN_TARG )
137*4bff34e3Sthurlow 
138*4bff34e3Sthurlow // Structure elements for NegTokenTarg
139*4bff34e3Sthurlow #define  SPNEGO_NEGTARG_NEGRESULT         0x0   // NegResult is element 0
140*4bff34e3Sthurlow #define  SPNEGO_NEGTARG_SUPPORTEDMECH     0x1   // SupportedMech is element 1
141*4bff34e3Sthurlow #define  SPNEGO_NEGTARG_RESPONSETOKEN     0x2   // ResponseToken is element 2
142*4bff34e3Sthurlow #define  SPNEGO_NEGTARG_MECHLISTMIC       0x3   // MechListMIC is element 3
143*4bff34e3Sthurlow 
144*4bff34e3Sthurlow // NegResult element is 0xa0
145*4bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_NEGRESULT     SEQ_ELM(SPNEGO_NEGTARG_NEGRESULT)
146*4bff34e3Sthurlow // SupportedMech element is 0xa1
147*4bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_SUPPORTEDMECH SEQ_ELM(SPNEGO_NEGTARG_SUPPORTEDMECH)
148*4bff34e3Sthurlow // ResponseToken element is 0xa2
149*4bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_RESPONSETOKEN SEQ_ELM(SPNEGO_NEGTARG_RESPONSETOKEN)
150*4bff34e3Sthurlow // MechListMIC element is 0xa3
151*4bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_MECHLISTMIC   SEQ_ELM(SPNEGO_NEGTARG_MECHLISTMIC)
152*4bff34e3Sthurlow 
153*4bff34e3Sthurlow //
154*4bff34e3Sthurlow // Defines a GSS Mechanism OID.  We keep a single static array
155*4bff34e3Sthurlow // of these which we'll use for validation/searches/parsing.
156*4bff34e3Sthurlow //
157*4bff34e3Sthurlow 
158*4bff34e3Sthurlow typedef struct _mechOID
159*4bff34e3Sthurlow {
160*4bff34e3Sthurlow    unsigned char*    ucOid;            // Byte representation of OID
161*4bff34e3Sthurlow    int               iLen;             // Length of the OID, length and identifier
162*4bff34e3Sthurlow    int               iActualDataLen;   // Length of the actual OID
163*4bff34e3Sthurlow    SPNEGO_MECH_OID   eMechanismOID;     // Which OID is this?
164*4bff34e3Sthurlow } MECH_OID;
165*4bff34e3Sthurlow 
166*4bff34e3Sthurlow 
167*4bff34e3Sthurlow //
168*4bff34e3Sthurlow // ASN Der functions
169*4bff34e3Sthurlow //
170*4bff34e3Sthurlow 
171*4bff34e3Sthurlow int ASNDerGetLength( unsigned char* pbLengthData, long nBoundaryLength, long* pnLength,
172*4bff34e3Sthurlow                     long* pnNumLengthBytes );
173*4bff34e3Sthurlow int ASNDerCheckToken( unsigned char* pbTokenData, unsigned char nToken,
174*4bff34e3Sthurlow                         long nCheckLength, long nBoundaryLength, long* pnLength,
175*4bff34e3Sthurlow                         long* pnTokenLength );
176*4bff34e3Sthurlow int ASNDerCheckOID( unsigned char* pbTokenData, SPNEGO_MECH_OID nMechOID, long nBoundaryLength,
177*4bff34e3Sthurlow                      long* pnTokenLength );
178*4bff34e3Sthurlow int ASNDerCalcNumLengthBytes( long nLength );
179*4bff34e3Sthurlow long ASNDerCalcTokenLength( long nLength, long nDataLength );
180*4bff34e3Sthurlow long ASNDerCalcElementLength( long nDataLength, long* pnInternalLength );
181*4bff34e3Sthurlow long ASNDerCalcMechListLength( SPNEGO_MECH_OID mechoid, long* pnInternalLength );
182*4bff34e3Sthurlow int ASNDerWriteLength( unsigned char* pbData, long nLength );
183*4bff34e3Sthurlow int ASNDerWriteToken( unsigned char* pbData, unsigned char ucType,
184*4bff34e3Sthurlow                      unsigned char* pbTokenValue, long nLength );
185*4bff34e3Sthurlow int ASNDerWriteOID( unsigned char* pbData, SPNEGO_MECH_OID eMechOID );
186*4bff34e3Sthurlow long ASNDerWriteMechList( unsigned char* pbData, SPNEGO_MECH_OID mechoid );
187*4bff34e3Sthurlow int ASNDerWriteElement( unsigned char* pbData, unsigned char ucElementSequence,
188*4bff34e3Sthurlow                         unsigned char ucType, unsigned char* pbTokenValue, long nLength );
189*4bff34e3Sthurlow 
190*4bff34e3Sthurlow 
191*4bff34e3Sthurlow    // C++ Specific
192*4bff34e3Sthurlow #if defined(__cplusplus)
193*4bff34e3Sthurlow }
194*4bff34e3Sthurlow #endif
195*4bff34e3Sthurlow 
196*4bff34e3Sthurlow #endif
197