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