⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spnegoparse.c

📁 代理服务器 squid-2.6.STABLE16
💻 C
📖 第 1 页 / 共 5 页
字号:
int FindMechOIDInMechList( SPNEGO_ELEMENT* pSpnegoElement, SPNEGO_MECH_OID MechOID,                          int * piMechTypeIndex ){   int   nReturn = SPNEGO_E_NOT_FOUND;   int   nCtr = 0;   long  nLength = 0L;   long  nBoundaryLength = pSpnegoElement->nDatalength;   unsigned char* pbMechListData = pSpnegoElement->pbData;   while( SPNEGO_E_SUCCESS != nReturn && nBoundaryLength > 0L )   {            // Use the helper function to check the OID      if ( ( nReturn = ASNDerCheckOID( pbMechListData, MechOID, nBoundaryLength, &nLength ) )                     == SPNEGO_E_SUCCESS )      {         *piMechTypeIndex = nCtr;      }      // Adjust for the current OID      pbMechListData += nLength;      nBoundaryLength -= nLength;      nCtr++;   }  // WHILE enuming OIDs   LOG(("FindMechOIDInMechList returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    ValidateMechList//// Parameters://    [in]  pbMechListData          -  Pointer to binary MechList data//    [in]  nBoundaryLength         -  Length we must not exceed//// Returns://    int   Success - SPNEGO_E_SUCCESS//          Failure - SPNEGO API Error code//// Comments ://    Checks the data at pbMechListData to see if it looks like a MechList.//    As part of this, we walk the list and ensure that none of the OIDs//    have a length that takes us outside of nBoundaryLength.//////////////////////////////////////////////////////////////////////////////int ValidateMechList( unsigned char* pbMechListData, long nBoundaryLength ){   int   nReturn = SPNEGO_E_SUCCESS;   long  nLength = 0L;   long  nTokenLength = 0L;   while( SPNEGO_E_SUCCESS == nReturn && nBoundaryLength > 0L )   {      // Verify that we have something that at least *looks* like an OID - in other      // words it has an OID identifier and specifies a length that doesn't go beyond      // the size of the list.      nReturn = ASNDerCheckToken( pbMechListData, OID, 0L, nBoundaryLength,                                   &nLength, &nTokenLength );            // Adjust for the current OID      pbMechListData += ( nLength + nTokenLength );      nBoundaryLength -= ( nLength + nTokenLength );   }  // WHILE enuming OIDs   LOG(("ValidateMechList returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    IsValidMechOid//// Parameters://    [in]  mechOid  -  mechOID id enumeration//// Returns://    int   Success - 1//          Failure - 0//// Comments ://    Checks for a valid mechOid value.//////////////////////////////////////////////////////////////////////////////int IsValidMechOid( SPNEGO_MECH_OID mechOid ){   LOG(("IsValidMechOid returned %d\n",mechOid >= spnego_mech_oid_Kerberos_V5_Legacy &&            mechOid <= spnego_mech_oid_Spnego));   return ( mechOid >= spnego_mech_oid_Kerberos_V5_Legacy &&            mechOid <= spnego_mech_oid_Spnego );}///////////////////////////////////////////////////////////////////////////////// Function://    IsValidContextFlags//// Parameters://    [in]  ucContextFlags -  ContextFlags value//// Returns://    int   Success - 1//          Failure - 0//// Comments ://    Checks for a valid ContextFlags value.//////////////////////////////////////////////////////////////////////////////int IsValidContextFlags( unsigned char ucContextFlags ){   // Mask out our valid bits.  If there is anything leftover, this   // is not a valid value for Context Flags   LOG(("IsValidContextFlags returned %d\n",(( ucContextFlags & ~SPNEGO_NEGINIT_CONTEXT_MASK ) == 0)));   return ( ( ucContextFlags & ~SPNEGO_NEGINIT_CONTEXT_MASK ) == 0 );}///////////////////////////////////////////////////////////////////////////////// Function://    IsValidNegResult//// Parameters://    [in]  negResult   -  NegResult value//// Returns://    int   Success - 1//          Failure - 0//// Comments ://    Checks for a valid NegResult value.//////////////////////////////////////////////////////////////////////////////int IsValidNegResult( SPNEGO_NEGRESULT negResult ){   LOG(("IsValidNegResult returned %d\n",negResult >= spnego_negresult_success &&            negResult <= spnego_negresult_rejected ));   return ( negResult >= spnego_negresult_success &&            negResult <= spnego_negresult_rejected );}///////////////////////////////////////////////////////////////////////////////// Function://    IsValidSpnegoToken//// Parameters://    [in]  pSpnegoToken   -  Points to SPNEGO_TOKEN data structure//// Returns://    int   Success - 1//          Failure - 0//// Comments ://    Performs simple heuristic on location pointed to by pSpnegoToken.//////////////////////////////////////////////////////////////////////////////int IsValidSpnegoToken( SPNEGO_TOKEN* pSpnegoToken ){   int   nReturn = 0;   // Parameter should be non-NULL   if ( NULL != pSpnegoToken )   {      // Length should be at least the size defined in the header      if ( pSpnegoToken->nStructSize >= SPNEGO_TOKEN_SIZE )      {         // Number of elements should be >= our maximum - if it's greater, that's         // okay, since we'll only be accessing the elements up to MAX_NUM_TOKEN_ELEMENTS         if ( pSpnegoToken->nNumElements >= MAX_NUM_TOKEN_ELEMENTS )         {            // Check for proper token type            if ( SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType ||               SPNEGO_TOKEN_TARG == pSpnegoToken->ucTokenType )            {               nReturn = 1;            }         }      }  // IF struct size makes sense   }  // IF non-NULL spnego Token   LOG(("IsValidSpnegoToken returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    IsValidSpnegoElement//// Parameters://    [in]  pSpnegoToken   -  Points to SPNEGO_TOKEN data structure//    [in]  spnegoElement  -  spnegoElement Type from enumeration//// Returns://    int   Success - 1//          Failure - 0//// Comments ://    Checks that spnegoElement has a valid value and is appropriate for//    the SPNEGO token encapsulated by pSpnegoToken.//////////////////////////////////////////////////////////////////////////////int IsValidSpnegoElement( SPNEGO_TOKEN* pSpnegoToken,SPNEGO_ELEMENT_TYPE spnegoElement ){   int   nReturn = 0;   // Check boundaries   if ( spnegoElement > spnego_element_min &&      spnegoElement < spnego_element_max )   {      // Check for appropriateness to token type      if ( SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType )      {         nReturn = ( spnegoElement >= spnego_init_mechtypes &&                     spnegoElement <= spnego_init_mechListMIC );      }      else      {         nReturn = ( spnegoElement >= spnego_targ_negResult &&                     spnegoElement <= spnego_targ_mechListMIC );      }   }  // IF boundary conditions are met   LOG(("IsValidSpnegoElement returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    CalculateElementArrayIndex//// Parameters://    [in]  pSpnegoToken   -  Points to SPNEGO_TOKEN data structure//    [in]  spnegoElement  -  spnegoElement Type from enumeration//// Returns://    int   index in the SPNEGO_TOKEN element array that the element can//          can be found//// Comments ://    Based on the Token Type, calculates the index in the element array//    at which the specified element can be found.//////////////////////////////////////////////////////////////////////////////int CalculateElementArrayIndex( SPNEGO_TOKEN* pSpnegoToken,SPNEGO_ELEMENT_TYPE spnegoElement ){   int   nReturn = 0;   // Offset is difference between value and initial element identifier   // (these differ based on ucTokenType)   if ( SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType )   {      nReturn = spnegoElement - spnego_init_mechtypes;   }   else   {      nReturn = spnegoElement - spnego_targ_negResult;   }   LOG(("CalculateElementArrayIndex returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    InitTokenFromBinary//// Parameters://    [in]  ucCopyData     -  Flag indicating if data should be copied//    [in]  ulFlags        -  Flags value for structure//    [in]  pnTokenData    -  Binary Token Data//    [in]  ulLength       -  Length of the data//    [out] ppSpnegoToken  -  Pointer to call allocated SPNEGO Token//                            data structure//// Returns://    int   Success - SPNEGO_E_SUCCESS//          Failure - SPNEGO API Error code//// Comments ://    Allocates a SPNEGO_TOKEN data structure and fills it out as//    appropriate based in the flags passed into the function.//////////////////////////////////////////////////////////////////////////////// Initializes SPNEGO_TOKEN structure from DER encoded binary dataint InitTokenFromBinary( unsigned char ucCopyData, unsigned long ulFlags,                        unsigned char* pbTokenData, unsigned long ulLength,                        SPNEGO_TOKEN** ppSpnegoToken ){   int            nReturn = SPNEGO_E_INVALID_PARAMETER;   SPNEGO_TOKEN*  pSpnegoToken = NULL;   unsigned char* pbFirstElement = NULL;   long           nTokenLength = 0L;   long           nRemainingTokenLength = 0L;      // Basic Parameter Validation   if (  NULL != pbTokenData &&         NULL != ppSpnegoToken &&         0L != ulLength )   {      //      // Allocate the empty token, then initialize the data structure.      //      pSpnegoToken = AllocEmptySpnegoToken( ucCopyData, ulFlags, pbTokenData, ulLength );      if ( NULL != pSpnegoToken )      {         // Copy the binary data locally                    // Initialize the token type         if ( ( nReturn = InitSpnegoTokenType( pSpnegoToken, &nTokenLength,                                                &nRemainingTokenLength, &pbFirstElement ) )                        == SPNEGO_E_SUCCESS )         {            // Initialize the element array            if ( ( nReturn = InitSpnegoTokenElements( pSpnegoToken, pbFirstElement,                                                      nRemainingTokenLength ) )                           == SPNEGO_E_SUCCESS )            {               *ppSpnegoToken = pSpnegoToken;            }         }  // IF Init Token Type         // Cleanup on error condition         if ( SPNEGO_E_SUCCESS != nReturn )         {            spnegoFreeData( pSpnegoToken );         }      }      else      {         nReturn = SPNEGO_E_OUT_OF_MEMORY;      }   }  // IF Valid parameters   LOG(("InitTokenFromBinary returned %d\n",nReturn));   return nReturn;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -