int spnegoGetContextFlags( SPNEGO_TOKEN_HANDLE hSpnegoToken, unsigned char* pucContextFlags ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; // Check parameters if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != pucContextFlags && SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType ) { // Check if ContextFlags is available if ( pSpnegoToken->aElementArray[SPNEGO_INIT_REQFLAGS_ELEMENT].iElementPresent == SPNEGO_TOKEN_ELEMENT_AVAILABLE ) { // The length should be two, the value should show a 1 bit difference in the difference byte, and // the value must be valid if ( pSpnegoToken->aElementArray[SPNEGO_INIT_REQFLAGS_ELEMENT].nDatalength == SPNEGO_NEGINIT_MAXLEN_REQFLAGS && pSpnegoToken->aElementArray[SPNEGO_INIT_REQFLAGS_ELEMENT].pbData[0] == SPNEGO_NEGINIT_REQFLAGS_BITDIFF && IsValidContextFlags( pSpnegoToken->aElementArray[SPNEGO_INIT_REQFLAGS_ELEMENT].pbData[1] ) ) { *pucContextFlags = pSpnegoToken->aElementArray[SPNEGO_INIT_REQFLAGS_ELEMENT].pbData[1]; nReturn = SPNEGO_E_SUCCESS; } else { nReturn = SPNEGO_E_INVALID_ELEMENT; } } else { nReturn = SPNEGO_E_ELEMENT_UNAVAILABLE; } } // IF parameters OK LOG(("spnegoGetContextFlags returned %d\n",nReturn)); return nReturn;; }
int spnegoCreateNegTokenInit( SPNEGO_MECH_OID MechType, unsigned char ucContextFlags, unsigned char* pbMechToken, unsigned long ulMechTokenLen, unsigned char* pbMechListMIC, unsigned long ulMechListMICLen, SPNEGO_TOKEN_HANDLE* phSpnegoToken ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; long nTokenLength = 0L; long nInternalTokenLength = 0L; unsigned char* pbTokenData = NULL; SPNEGO_TOKEN** ppSpnegoToken = (SPNEGO_TOKEN**) phSpnegoToken; if ( NULL != ppSpnegoToken && IsValidMechOid( MechType ) && IsValidContextFlags( ucContextFlags ) ) { // Get the actual token size if ( ( nReturn = CalculateMinSpnegoInitTokenSize( ulMechTokenLen, ulMechListMICLen, &MechType, 1, ( ucContextFlags != 0L ), &nTokenLength, &nInternalTokenLength ) ) == SPNEGO_E_SUCCESS ) { // Allocate a buffer to hold the data. pbTokenData = calloc( 1, nTokenLength ); if ( NULL != pbTokenData ) { // Now write the token if ( ( nReturn = CreateSpnegoInitToken( &MechType, 1, ucContextFlags, pbMechToken, ulMechTokenLen, pbMechListMIC, ulMechListMICLen, pbTokenData, nTokenLength, nInternalTokenLength ) ) == SPNEGO_E_SUCCESS ) { // This will copy our allocated pointer, and ensure that the sructure cleans // up the data later nReturn = InitTokenFromBinary( SPNEGO_TOKEN_INTERNAL_COPYPTR, SPNEGO_TOKEN_INTERNAL_FLAGS_FREEDATA, pbTokenData, nTokenLength, ppSpnegoToken ); } // Cleanup on failure if ( SPNEGO_E_SUCCESS != nReturn ) { free( pbTokenData ); } } // IF alloc succeeded else { nReturn = SPNEGO_E_OUT_OF_MEMORY; } } // If calculated token size } // IF Valid Parameters return nReturn; }