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