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