int spnegoTokenGetBinary( SPNEGO_TOKEN_HANDLE hSpnegoToken, unsigned char* pbTokenData, unsigned long * pulDataLen ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; // Check parameters - pbTokenData is optional if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != pulDataLen ) { // Check for Buffer too small conditions if ( NULL == pbTokenData || pSpnegoToken->ulBinaryDataLen > *pulDataLen ) { *pulDataLen = pSpnegoToken->ulBinaryDataLen; nReturn = SPNEGO_E_BUFFER_TOO_SMALL; } else { memcpy( pbTokenData, pSpnegoToken->pbBinaryData, pSpnegoToken->ulBinaryDataLen ); *pulDataLen = pSpnegoToken->ulBinaryDataLen; nReturn = SPNEGO_E_SUCCESS; } } // IF parameters OK return nReturn;; }
// Returns the Initial Mech Type in the MechList element in the NegInitToken. int spnegoIsMechTypeAvailable( SPNEGO_TOKEN_HANDLE hSpnegoToken, SPNEGO_MECH_OID MechOID, int * piMechTypeIndex ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; // Check parameters if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != piMechTypeIndex && IsValidMechOid( MechOID ) && SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType ) { // Check if MechList is available if ( pSpnegoToken->aElementArray[SPNEGO_INIT_MECHTYPES_ELEMENT].iElementPresent == SPNEGO_TOKEN_ELEMENT_AVAILABLE ) { // Locate the MechOID in the list element nReturn = FindMechOIDInMechList( &pSpnegoToken->aElementArray[SPNEGO_INIT_MECHTYPES_ELEMENT], MechOID, piMechTypeIndex ); } else { nReturn = SPNEGO_E_ELEMENT_UNAVAILABLE; } } // IF parameters OK return nReturn;; }
int spnegoGetMechListMIC( SPNEGO_TOKEN_HANDLE hSpnegoToken, unsigned char* pbMICData, unsigned long* pulDataLen ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; SPNEGO_ELEMENT* pSpnegoElement = NULL; // Check parameters if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != pulDataLen ) { // Point at the proper Element if ( SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType ) { pSpnegoElement = &pSpnegoToken->aElementArray[SPNEGO_INIT_MECHLISTMIC_ELEMENT]; } else { pSpnegoElement = &pSpnegoToken->aElementArray[SPNEGO_TARG_MECHLISTMIC_ELEMENT]; } // Check if MechType is available if ( SPNEGO_TOKEN_ELEMENT_AVAILABLE == pSpnegoElement->iElementPresent ) { // Check for Buffer too small conditions if ( NULL == pbMICData || pSpnegoElement->nDatalength > *pulDataLen ) { *pulDataLen = pSpnegoElement->nDatalength; nReturn = SPNEGO_E_BUFFER_TOO_SMALL; } else { // Copy Memory memcpy( pbMICData, pSpnegoElement->pbData, pSpnegoElement->nDatalength ); *pulDataLen = pSpnegoElement->nDatalength; nReturn = SPNEGO_E_SUCCESS; } } else { nReturn = SPNEGO_E_ELEMENT_UNAVAILABLE; } } // IF parameters OK LOG(("spnegoGetMechListMIC returned %d\n",nReturn)); return nReturn;; }
int spnegoGetSupportedMechType( SPNEGO_TOKEN_HANDLE hSpnegoToken, SPNEGO_MECH_OID* pMechOID ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; int nCtr = 0L; long nLength = 0L; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; // Check parameters if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != pMechOID && SPNEGO_TOKEN_TARG == pSpnegoToken->ucTokenType ) { // Check if MechList is available if ( pSpnegoToken->aElementArray[SPNEGO_TARG_SUPPMECH_ELEMENT].iElementPresent == SPNEGO_TOKEN_ELEMENT_AVAILABLE ) { for ( nCtr = 0; nReturn != SPNEGO_E_SUCCESS && g_stcMechOIDList[nCtr].eMechanismOID != spnego_mech_oid_NotUsed; nCtr++ ) { if ( ( nReturn = ASNDerCheckOID( pSpnegoToken->aElementArray[SPNEGO_TARG_SUPPMECH_ELEMENT].pbData, nCtr, pSpnegoToken->aElementArray[SPNEGO_TARG_SUPPMECH_ELEMENT].nDatalength, &nLength ) ) == SPNEGO_E_SUCCESS ) { *pMechOID = nCtr; } } // For enum MechOIDs } else { nReturn = SPNEGO_E_ELEMENT_UNAVAILABLE; } } // IF parameters OK LOG(("spnegoGetSupportedMechType returned %d\n",nReturn)); return nReturn;; }
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 spnegoGetTokenType( SPNEGO_TOKEN_HANDLE hSpnegoToken, int * piTokenType ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; // Check parameters if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != piTokenType && pSpnegoToken) { // Check that the type in the structure makes sense if ( SPNEGO_TOKEN_INIT == pSpnegoToken->ucTokenType || SPNEGO_TOKEN_TARG == pSpnegoToken->ucTokenType ) { *piTokenType = pSpnegoToken->ucTokenType; nReturn = SPNEGO_E_SUCCESS; } } // IF parameters OK return nReturn; }
int spnegoGetNegotiationResult( SPNEGO_TOKEN_HANDLE hSpnegoToken, SPNEGO_NEGRESULT* pnegResult ) { int nReturn = SPNEGO_E_INVALID_PARAMETER; SPNEGO_TOKEN* pSpnegoToken = (SPNEGO_TOKEN*) hSpnegoToken; // Check parameters if ( IsValidSpnegoToken( pSpnegoToken ) && NULL != pnegResult && SPNEGO_TOKEN_TARG == pSpnegoToken->ucTokenType ) { // Check if NegResult is available if ( pSpnegoToken->aElementArray[SPNEGO_TARG_NEGRESULT_ELEMENT].iElementPresent == SPNEGO_TOKEN_ELEMENT_AVAILABLE ) { // Must be 1 byte long and a valid value if ( pSpnegoToken->aElementArray[SPNEGO_TARG_NEGRESULT_ELEMENT].nDatalength == SPNEGO_NEGTARG_MAXLEN_NEGRESULT && IsValidNegResult( *pSpnegoToken->aElementArray[SPNEGO_TARG_NEGRESULT_ELEMENT].pbData ) ) { *pnegResult = *pSpnegoToken->aElementArray[SPNEGO_TARG_NEGRESULT_ELEMENT].pbData; nReturn = SPNEGO_E_SUCCESS; } else { nReturn = SPNEGO_E_INVALID_ELEMENT; } } else { nReturn = SPNEGO_E_ELEMENT_UNAVAILABLE; } } // IF parameters OK LOG(("spnegoGetNegotiationResult returned %d\n",nReturn)); return nReturn;; }