📄 spnegoparse.c
字号:
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 + -