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