1*12b65585SGordon Ross // Copyright 2012 Nexenta Systems, Inc. All rights reserved. 24bff34e3Sthurlow // Copyright (C) 2002 Microsoft Corporation 34bff34e3Sthurlow // All rights reserved. 44bff34e3Sthurlow // 54bff34e3Sthurlow // THIS CODE AND INFORMATION IS PROVIDED "AS IS" 64bff34e3Sthurlow // WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 74bff34e3Sthurlow // OR IMPLIED, INCLUDING BUT NOT LIMITED 84bff34e3Sthurlow // TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY 94bff34e3Sthurlow // AND/OR FITNESS FOR A PARTICULAR PURPOSE. 104bff34e3Sthurlow // 114bff34e3Sthurlow // Date - 10/08/2002 124bff34e3Sthurlow // Author - Sanj Surati 134bff34e3Sthurlow 144bff34e3Sthurlow ///////////////////////////////////////////////////////////// 154bff34e3Sthurlow // 164bff34e3Sthurlow // SPNEGOPARSE.H 174bff34e3Sthurlow // 184bff34e3Sthurlow // SPNEGO Token Parser Header File 194bff34e3Sthurlow // 204bff34e3Sthurlow // Contains the definitions required to properly parse a 214bff34e3Sthurlow // SPNEGO token using ASN.1 DER helpers. 224bff34e3Sthurlow // 234bff34e3Sthurlow ///////////////////////////////////////////////////////////// 244bff34e3Sthurlow 254bff34e3Sthurlow #ifndef __SPNEGOPARSE_H__ 264bff34e3Sthurlow #define __SPNEGOPARSE_H__ 274bff34e3Sthurlow 284bff34e3Sthurlow // C++ Specific 294bff34e3Sthurlow #if defined(__cplusplus) 304bff34e3Sthurlow extern "C" 314bff34e3Sthurlow { 324bff34e3Sthurlow #endif 334bff34e3Sthurlow 344bff34e3Sthurlow // Indicates if we copy data when creating a SPNEGO_TOKEN structure or not 354bff34e3Sthurlow #define SPNEGO_TOKEN_INTERNAL_COPYPTR 0 364bff34e3Sthurlow #define SPNEGO_TOKEN_INTERNAL_COPYDATA 0x1 374bff34e3Sthurlow 384bff34e3Sthurlow // Internal flag dictates whether or not we will free the binary data when 394bff34e3Sthurlow // the SPNEG_TOKEN structure is destroyed 404bff34e3Sthurlow #define SPNEGO_TOKEN_INTERNAL_FLAGS_FREEDATA 0x1 414bff34e3Sthurlow 424bff34e3Sthurlow // 434bff34e3Sthurlow // Each SPNEGO Token Type can be broken down into a 444bff34e3Sthurlow // maximum of 4 separate elements. 454bff34e3Sthurlow // 464bff34e3Sthurlow 474bff34e3Sthurlow #define MAX_NUM_TOKEN_ELEMENTS 4 484bff34e3Sthurlow 494bff34e3Sthurlow // 504bff34e3Sthurlow // Element offsets in the array 514bff34e3Sthurlow // 524bff34e3Sthurlow 534bff34e3Sthurlow // INIT elements 544bff34e3Sthurlow #define SPNEGO_INIT_MECHTYPES_ELEMENT 0 554bff34e3Sthurlow #define SPNEGO_INIT_REQFLAGS_ELEMENT 1 564bff34e3Sthurlow #define SPNEGO_INIT_MECHTOKEN_ELEMENT 2 574bff34e3Sthurlow #define SPNEGO_INIT_MECHLISTMIC_ELEMENT 3 584bff34e3Sthurlow 594bff34e3Sthurlow // Response elements 604bff34e3Sthurlow #define SPNEGO_TARG_NEGRESULT_ELEMENT 0 614bff34e3Sthurlow #define SPNEGO_TARG_SUPPMECH_ELEMENT 1 624bff34e3Sthurlow #define SPNEGO_TARG_RESPTOKEN_ELEMENT 2 634bff34e3Sthurlow #define SPNEGO_TARG_MECHLISTMIC_ELEMENT 3 644bff34e3Sthurlow 654bff34e3Sthurlow // 664bff34e3Sthurlow // Defines an individual SPNEGO Token Element. 674bff34e3Sthurlow // 684bff34e3Sthurlow 694bff34e3Sthurlow typedef struct SpnegoElement 704bff34e3Sthurlow { 714bff34e3Sthurlow size_t nStructSize; // Size of the element structure 724bff34e3Sthurlow int iElementPresent; // Is the field present? Must be either 734bff34e3Sthurlow // SPNEGO_TOKEN_ELEMENT_UNAVAILABLE or 744bff34e3Sthurlow // SPNEGO_TOKEN_ELEMENT_AVAILABLE 754bff34e3Sthurlow 764bff34e3Sthurlow SPNEGO_ELEMENT_TYPE eElementType; // The Element Type 774bff34e3Sthurlow 784bff34e3Sthurlow unsigned char type; // Data Type 794bff34e3Sthurlow 804bff34e3Sthurlow unsigned char* pbData; // Points to actual Data 814bff34e3Sthurlow 824bff34e3Sthurlow unsigned long nDatalength; // Actual Data Length 834bff34e3Sthurlow 844bff34e3Sthurlow } SPNEGO_ELEMENT; 854bff34e3Sthurlow 864bff34e3Sthurlow // Structure size in case we later choose to extend the structure 874bff34e3Sthurlow #define SPNEGO_ELEMENT_SIZE sizeof(SPNEGO_ELEMENT) 884bff34e3Sthurlow 894bff34e3Sthurlow // 904bff34e3Sthurlow // Packages a SPNEGO Token Encoding. There are two types of 914bff34e3Sthurlow // encodings: NegTokenInit and NegTokenTarg. Each encoding can 924bff34e3Sthurlow // contain up to four distinct, optional elements. 934bff34e3Sthurlow // 944bff34e3Sthurlow 954bff34e3Sthurlow typedef struct SpnegoToken 964bff34e3Sthurlow { 974bff34e3Sthurlow size_t nStructSize; // Size of the Token structure 984bff34e3Sthurlow unsigned long ulFlags; // Internal Structure Flags - Reserved! 994bff34e3Sthurlow int ucTokenType; // Token Type - Must be 1004bff34e3Sthurlow // SPNEGO_TOKEN_INIT or 1014bff34e3Sthurlow // SPNEGO_TOKEN_TARG 1024bff34e3Sthurlow 1034bff34e3Sthurlow unsigned char* pbBinaryData; // Points to binary token data 1044bff34e3Sthurlow 1054bff34e3Sthurlow unsigned long ulBinaryDataLen; // Length of the actual binary data 1064bff34e3Sthurlow int nNumElements; // Number of elements 1074bff34e3Sthurlow SPNEGO_ELEMENT aElementArray [MAX_NUM_TOKEN_ELEMENTS]; // Holds the elements for the token 1084bff34e3Sthurlow } SPNEGO_TOKEN; 1094bff34e3Sthurlow 1104bff34e3Sthurlow // Structure size in case we later choose to extend the structure 1114bff34e3Sthurlow #define SPNEGO_TOKEN_SIZE sizeof(SPNEGO_TOKEN) 1124bff34e3Sthurlow 1134bff34e3Sthurlow // 1144bff34e3Sthurlow // Function definitions 1154bff34e3Sthurlow // 1164bff34e3Sthurlow 1174bff34e3Sthurlow SPNEGO_TOKEN* AllocEmptySpnegoToken( unsigned char ucCopyData, unsigned long ulFlags, 1184bff34e3Sthurlow unsigned char * pbTokenData, unsigned long ulTokenSize ); 1194bff34e3Sthurlow void FreeSpnegoToken( SPNEGO_TOKEN* pSpnegoToken ); 1204bff34e3Sthurlow void InitSpnegoTokenElementArray( SPNEGO_TOKEN* pSpnegoToken ); 1214bff34e3Sthurlow int InitSpnegoTokenType( SPNEGO_TOKEN* pSpnegoToken, long* pnTokenLength, 1224bff34e3Sthurlow long* pnRemainingTokenLength, unsigned char** ppbFirstElement ); 1234bff34e3Sthurlow int InitSpnegoTokenElements( SPNEGO_TOKEN* pSpnegoToken, unsigned char* pbTokenData, 1244bff34e3Sthurlow long nRemainingTokenLength ); 1254bff34e3Sthurlow int GetSpnegoInitTokenMechList( unsigned char* pbTokenData, int nMechListLength, 1264bff34e3Sthurlow SPNEGO_ELEMENT* pSpnegoElement ); 1274bff34e3Sthurlow int InitSpnegoTokenElementFromBasicType( unsigned char* pbTokenData, int nElementLength, 1284bff34e3Sthurlow unsigned char ucExpectedType, 1294bff34e3Sthurlow SPNEGO_ELEMENT_TYPE spnegoElementType, 1304bff34e3Sthurlow SPNEGO_ELEMENT* pSpnegoElement ); 1314bff34e3Sthurlow int InitSpnegoTokenElementFromOID( unsigned char* pbTokenData, int nElementLength, 1324bff34e3Sthurlow SPNEGO_ELEMENT_TYPE spnegoElementType, 1334bff34e3Sthurlow SPNEGO_ELEMENT* pSpnegoElement ); 1344bff34e3Sthurlow int FindMechOIDInMechList( SPNEGO_ELEMENT* pSpnegoElement, SPNEGO_MECH_OID MechOID, 1354bff34e3Sthurlow int * piMechTypeIndex ); 1364bff34e3Sthurlow int ValidateMechList( unsigned char* pbMechListData, long nBoundaryLength ); 1374bff34e3Sthurlow int CalculateMinSpnegoInitTokenSize( long nMechTokenLength, long nMechListMICLength, 138*12b65585SGordon Ross SPNEGO_MECH_OID *mechOid, int mechOidCnt, int nReqFlagsAvailable, 1394bff34e3Sthurlow long* plTokenSize, long* plInternalLength ); 1404bff34e3Sthurlow int CalculateMinSpnegoTargTokenSize( SPNEGO_MECH_OID MechType, SPNEGO_NEGRESULT spnegoNegResult, 1414bff34e3Sthurlow long nMechTokenLen, 1424bff34e3Sthurlow long nMechTokenMIC, long* pnTokenSize, 1434bff34e3Sthurlow long* pnInternalTokenLength ); 144*12b65585SGordon Ross int CreateSpnegoInitToken( SPNEGO_MECH_OID *MechTypeList, long nMechTypes, 1454bff34e3Sthurlow unsigned char ucContextFlags, unsigned char* pbMechToken, 1464bff34e3Sthurlow unsigned long ulMechTokenLen, unsigned char* pbMechListMIC, 1474bff34e3Sthurlow unsigned long ulMechListMICLen, unsigned char* pbTokenData, 1484bff34e3Sthurlow long nTokenLength, long nInternalTokenLength ); 1494bff34e3Sthurlow int CreateSpnegoTargToken( SPNEGO_MECH_OID MechType, 1504bff34e3Sthurlow SPNEGO_NEGRESULT eNegResult, unsigned char* pbMechToken, 1514bff34e3Sthurlow unsigned long ulMechTokenLen, unsigned char* pbMechListMIC, 1524bff34e3Sthurlow unsigned long ulMechListMICLen, unsigned char* pbTokenData, 1534bff34e3Sthurlow long nTokenLength, long nInternalTokenLength ); 1544bff34e3Sthurlow int IsValidMechOid( SPNEGO_MECH_OID mechOid ); 1554bff34e3Sthurlow int IsValidContextFlags( unsigned char ucContextFlags ); 1564bff34e3Sthurlow int IsValidNegResult( SPNEGO_NEGRESULT negResult ); 1574bff34e3Sthurlow int IsValidSpnegoToken( SPNEGO_TOKEN* pSpnegoToken ); 1584bff34e3Sthurlow int IsValidSpnegoElement( SPNEGO_TOKEN* pSpnegoToken,SPNEGO_ELEMENT_TYPE spnegoElement ); 1594bff34e3Sthurlow int CalculateElementArrayIndex( SPNEGO_TOKEN* pSpnegoToken,SPNEGO_ELEMENT_TYPE spnegoElement ); 1604bff34e3Sthurlow int InitTokenFromBinary( unsigned char ucCopyData, unsigned long ulFlags, 1614bff34e3Sthurlow unsigned char* pbTokenData, unsigned long ulLength, 1624bff34e3Sthurlow SPNEGO_TOKEN** ppSpnegoToken ); 1634bff34e3Sthurlow 1644bff34e3Sthurlow // C++ Specific 1654bff34e3Sthurlow #if defined(__cplusplus) 1664bff34e3Sthurlow } 1674bff34e3Sthurlow #endif 1684bff34e3Sthurlow 1694bff34e3Sthurlow #endif 170