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

📄 spnegoparse.c

📁 代理服务器 squid-2.6.STABLE16
💻 C
📖 第 1 页 / 共 5 页
字号:
   if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )   {      goto xEndWriteNegTokenInit;   }   // SPNEGO OID Token   nTempLength = g_stcMechOIDList[spnego_mech_oid_Spnego].iLen;   // Decrease the pbWriteTokenData, now we know the length and   // write it out.   pbWriteTokenData -= nTempLength;   nTempLength = ASNDerWriteOID( pbWriteTokenData, spnego_mech_oid_Spnego );   // Adjust Values and sanity check   nTotalBytesWritten += nTempLength;   nInternalTokenLength -= nTempLength;   if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )   {      goto xEndWriteNegTokenInit;   }   // App Constructed Token   nTempLength = ASNDerCalcTokenLength( nTotalBytesWritten, 0L );      // Decrease the pbWriteTokenData, now we know the length and   // write it out.   pbWriteTokenData -= nTempLength;   nTempLength = ASNDerWriteToken( pbWriteTokenData, SPNEGO_NEGINIT_APP_CONSTRUCT,                                    NULL, nTotalBytesWritten );   // Adjust Values and sanity check   nTotalBytesWritten += nTempLength;   // Don't adjust the internal token length here, it doesn't account   // the initial bytes written out (we really don't need to keep   // a running count here, but for debugging, it helps to be able   // to see the total number of bytes written out as well as the   // number of bytes left to write).   if ( nTotalBytesWritten == nTokenLength && nInternalTokenLength == 0 &&         pbWriteTokenData == pbTokenData )   {      nReturn = SPNEGO_E_SUCCESS;   }xEndWriteNegTokenInit:   LOG(("CreateSpnegoInitToken returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    CalculateMinSpnegoTargTokenSize//// Parameters://    [in]  MechType                -  Supported MechType//    [in]  spnegoNegResult         -  Neg Result//    [in]  nMechTokenLength        -  Length of the MechToken Element//    [in]  nMechListMICLength      -  Length of the MechListMIC Element//    [out] pnTokenSize             -  Filled out with total size of token//    [out] pnInternalTokenLength   -  Filled out with length minus length//                                     for initial token.//// Returns://    int   Success - SPNEGO_E_SUCCESS//          Failure - SPNEGO API Error code//// Comments ://    Calculates the required length for a SPNEGO NegTokenTarg token based//    on the supplied variable length values and which elements are present.//    Note that because the lengths can be represented by an arbitrary//    number of bytes in DER encodings, we actually calculate the lengths//    backwards, so we always know how many bytes we will potentially be//    writing out.//////////////////////////////////////////////////////////////////////////////int CalculateMinSpnegoTargTokenSize( SPNEGO_MECH_OID MechType,                                    SPNEGO_NEGRESULT spnegoNegResult, long nMechTokenLen,                                    long nMechListMICLen, long* pnTokenSize,                                    long* pnInternalTokenLength ){   int   nReturn = SPNEGO_E_INVALID_LENGTH;   // Start at 0.   long  nTotalLength = 0;   long  nTempLength= 0L;   // We will calculate this by walking the token backwards   // Start with MIC Element   if ( nMechListMICLen > 0L )   {      nTempLength = ASNDerCalcElementLength( nMechListMICLen, NULL );      // Check for rollover error      if ( nTempLength < nMechListMICLen )      {         goto xEndTokenTargLength;      }      nTotalLength += nTempLength;   }   // Next is the MechToken   if ( nMechTokenLen > 0L )   {      nTempLength += ASNDerCalcElementLength( nMechTokenLen, NULL );      // Check for rollover error      if ( nTempLength < nTotalLength )      {         goto xEndTokenTargLength;      }      nTotalLength = nTempLength;   }   // Supported MechType   if ( spnego_mech_oid_NotUsed != MechType )   {      // Supported MechOID element - we use the token function since      // we already know the size of the OID token and value      nTempLength += ASNDerCalcElementLength( g_stcMechOIDList[MechType].iActualDataLen,                                             NULL );      // Check for rollover error      if ( nTempLength < nTotalLength )      {         goto xEndTokenTargLength;      }      nTotalLength = nTempLength;   }  // IF MechType is available   // NegResult Element   if ( spnego_negresult_NotUsed != spnegoNegResult )   {      nTempLength += ASNDerCalcElementLength( SPNEGO_NEGTARG_MAXLEN_NEGRESULT, NULL );      // Check for rollover error      if ( nTempLength < nTotalLength )      {         goto xEndTokenTargLength;      }      nTotalLength = nTempLength;   }  // IF negResult is available   // Following two fields are the basic header tokens   // Sequence Token   nTempLength += ASNDerCalcTokenLength( nTotalLength, 0L );   // Check for rollover error   if ( nTempLength < nTotalLength )   {      goto xEndTokenTargLength;   }   nTotalLength = nTempLength;   // Neg Token Identifier Token   nTempLength += ASNDerCalcTokenLength( nTotalLength, 0L );   // Check for rollover error   if ( nTempLength < nTotalLength )   {      goto xEndTokenTargLength;   }   // The internal length doesn't include the number of bytes   // for the initial token   *pnInternalTokenLength = nTotalLength;   nTotalLength = nTempLength;   // We're done   *pnTokenSize = nTotalLength;   nReturn = SPNEGO_E_SUCCESS;xEndTokenTargLength:   LOG(("CalculateMinSpnegoTargTokenSize returned %d\n",nReturn));   return nReturn;}///////////////////////////////////////////////////////////////////////////////// Function://    CreateSpnegoTargToken//// Parameters://    [in]  MechType                -  Supported MechType//    [in]  eNegResult              -  NegResult value//    [in]  pbMechToken             -  Mech Token Binary Data//    [in]  ulMechTokenLen          -  Length of Mech Token//    [in]  pbMechListMIC           -  MechListMIC Binary Data//    [in]  ulMechListMICn          -  Length of MechListMIC//    [out] pbTokenData             -  Buffer to write token into.//    [in]  nTokenLength            -  Length of pbTokenData buffer//    [in]  nInternalTokenLength    -  Length of full token without leading//                                     token bytes.//// Returns://    int   Success - SPNEGO_E_SUCCESS//          Failure - SPNEGO API Error code//// Comments ://    Uses DER to fill out pbTokenData with a SPNEGO NegTokenTarg Token//    Note that because the lengths can be represented by an arbitrary//    number of bytes in DER encodings, we actually calculate the lengths//    backwards, so we always know how many bytes we will potentially be//    writing out.//////////////////////////////////////////////////////////////////////////////int CreateSpnegoTargToken( SPNEGO_MECH_OID MechType,          SPNEGO_NEGRESULT eNegResult, unsigned char* pbMechToken,          unsigned long ulMechTokenLen, unsigned char* pbMechListMIC,          unsigned long ulMechListMICLen, unsigned char* pbTokenData,          long nTokenLength, long nInternalTokenLength ){   int   nReturn = SPNEGO_E_INVALID_LENGTH;   // Start at 0.   long  nTempLength= 0L;   long  nTotalBytesWritten = 0L;   long  nInternalLength = 0L;   unsigned char  ucTemp = 0;   // We will write the token out backwards to properly handle the cases   // where the length bytes become adjustable, so the write location   // is initialized to point *just* past the end of the buffer.   unsigned char* pbWriteTokenData = pbTokenData + nTokenLength;   // Start with MIC Element   if ( ulMechListMICLen > 0L )   {      nTempLength = ASNDerCalcElementLength( ulMechListMICLen, &nInternalLength );      // Decrease the pbWriteTokenData, now we know the length and      // write it out.      pbWriteTokenData -= nTempLength;      nTempLength = ASNDerWriteElement( pbWriteTokenData, SPNEGO_NEGTARG_ELEMENT_MECHLISTMIC,                              OCTETSTRING, pbMechListMIC, ulMechListMICLen );      // Adjust Values and sanity check      nTotalBytesWritten += nTempLength;      nInternalTokenLength -= nTempLength;      if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )      {         goto xEndWriteNegTokenTarg;      }   }  // IF MechListMIC is present   // Next is the MechToken   if ( ulMechTokenLen > 0L )   {      nTempLength = ASNDerCalcElementLength( ulMechTokenLen, &nInternalLength );      // Decrease the pbWriteTokenData, now we know the length and      // write it out.      pbWriteTokenData -= nTempLength;      nTempLength = ASNDerWriteElement( pbWriteTokenData, SPNEGO_NEGTARG_ELEMENT_RESPONSETOKEN,                              OCTETSTRING, pbMechToken, ulMechTokenLen );      // Adjust Values and sanity check      nTotalBytesWritten += nTempLength;      nInternalTokenLength -= nTempLength;      if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )      {         goto xEndWriteNegTokenTarg;      }     }  // IF MechToken Length is present   // Supported Mech Type   if ( spnego_mech_oid_NotUsed != MechType )   {      nTempLength = ASNDerCalcElementLength( g_stcMechOIDList[MechType].iActualDataLen,                                             &nInternalLength );      // Decrease the pbWriteTokenData, now we know the length and      // write it out.      pbWriteTokenData -= nTempLength;      nTempLength = ASNDerWriteToken( pbWriteTokenData, SPNEGO_NEGTARG_ELEMENT_SUPPORTEDMECH,                                       g_stcMechOIDList[MechType].ucOid,                                       g_stcMechOIDList[MechType].iLen );      // Adjust Values and sanity check      nTotalBytesWritten += nTempLength;      nInternalTokenLength -= nTempLength;      if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )      {         goto xEndWriteNegTokenTarg;      }   }  // IF MechType is present   // Neg Result   // NegResult Element   if ( spnego_negresult_NotUsed != eNegResult )   {      ucTemp = (unsigned char) eNegResult;      nTempLength = ASNDerCalcElementLength( SPNEGO_NEGTARG_MAXLEN_NEGRESULT, &nInternalLength );      // Decrease the pbWriteTokenData, now we know the length and      // write it out.      pbWriteTokenData -= nTempLength;      nTempLength = ASNDerWriteElement( pbWriteTokenData, SPNEGO_NEGTARG_ELEMENT_NEGRESULT,                              ENUMERATED, &ucTemp, SPNEGO_NEGTARG_MAXLEN_NEGRESULT );      // Adjust Values and sanity check      nTotalBytesWritten += nTempLength;      nInternalTokenLength -= nTempLength;      if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )      {         goto xEndWriteNegTokenTarg;      }   }  // If eNegResult is available   // The next tokens we're writing out reflect the total number of bytes   // we have actually written out.   // Sequence Token   nTempLength = ASNDerCalcTokenLength( nTotalBytesWritten, 0L );   // Decrease the pbWriteTokenData, now we know the length and   // write it out.   pbWriteTokenData -= nTempLength;   nTempLength = ASNDerWriteToken( pbWriteTokenData, SPNEGO_CONSTRUCTED_SEQUENCE,                                    NULL, nTotalBytesWritten );   // Adjust Values and sanity check   nTotalBytesWritten += nTempLength;   nInternalTokenLength -= nTempLength;   if ( nTotalBytesWritten > nTokenLength || nInternalTokenLength < 0 )   {      goto xEndWriteNegTokenTarg;   }   // Neg Targ Token Identifier Token   nTempLength = ASNDerCalcTokenLength( nTotalBytesWritten, 0L );   // Decrease the pbWriteTokenData, now we know the length and   // write it out.   pbWriteTokenData -= nTempLength;   nTempLength = ASNDerWriteToken( pbWriteTokenData, SPNEGO_NEGTARG_TOKEN_IDENTIFIER,                                    NULL, nTotalBytesWritten );   // Adjust Values and sanity check   nTotalBytesWritten += nTempLength;   // Don't adjust the internal token length here, it doesn't account   // the initial bytes written out (we really don't need to keep   // a running count here, but for debugging, it helps to be able   // to see the total number of bytes written out as well as the

⌨️ 快捷键说明

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