xref: /titanic_51/usr/src/lib/libsmbfs/smb/spnegoparse.h (revision 12b65585e720714b31036daaa2b30eb76014048e)
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