static int checkRsnKeyMic(v_U32_t cryptHandle, tAniPacket *eapolFrame, tAniEapolRsnKeyDesc *rsnDesc, v_U8_t *micKey, v_U32_t micKeyLen) { int retVal = ANI_ERROR; int len; v_U8_t *ptr = NULL; v_U8_t *micPos = NULL; v_U8_t result[VOS_DIGEST_SHA1_SIZE]; // Larger of the two v_U8_t incomingMic[ANI_EAPOL_KEY_RSN_MIC_SIZE]; if (!rsnDesc->info.micFlag) { VOS_ASSERT( 0 ); return ANI_E_ILLEGAL_ARG; } len = aniAsfPacketGetBytes(eapolFrame, &ptr); if( ANI_IS_STATUS_SUCCESS( len ) ) { micPos = ptr + ANI_SSM_RSN_KEY_MIC_OFFSET; // Skip to the EAPOL version field for MIC computation ptr += EAPOL_VERSION_POS; len -= EAPOL_VERSION_POS; // Copy existing MIC to temporary location and zero it out vos_mem_copy( incomingMic, micPos, ANI_EAPOL_KEY_RSN_MIC_SIZE ); vos_mem_zero( micPos, ANI_EAPOL_KEY_RSN_MIC_SIZE ); if (rsnDesc->info.keyDescVers == ANI_EAPOL_KEY_DESC_VERS_AES) { if( VOS_IS_STATUS_SUCCESS( vos_sha1_hmac_str(cryptHandle, ptr, len, micKey, micKeyLen, result) ) ) { retVal = ANI_OK; } } else { VOS_ASSERT( 0 ); retVal = ANI_E_ILLEGAL_ARG; } if (retVal == ANI_OK) { if ( !vos_mem_compare(incomingMic, result, ANI_EAPOL_KEY_RSN_MIC_SIZE)) { retVal = ANI_E_MIC_FAILED; } } } return retVal; }
int aagPrf(v_U32_t cryptHandle, v_U8_t result[AAG_PRF_MAX_OUTPUT_SIZE], v_U8_t *key, v_U8_t keyLen, v_U8_t *a, v_U8_t aLen, v_U8_t *b, v_U8_t bLen, v_U32_t prfLen) { static v_U8_t y; v_U8_t *hmacText = NULL; v_U8_t *resultOffset = result; int numLoops; int loopCtrPos; int i, retVal=0; hmacText = vos_mem_malloc( aLen + bLen + 2 ); if( NULL == hmacText ) { return ANI_E_NULL_VALUE; } vos_mem_copy(hmacText + 0, a, aLen); hmacText[aLen] = y; vos_mem_copy(hmacText + aLen + 1, b, bLen); loopCtrPos = aLen + 1 + bLen; numLoops = prfLen + AAG_PTK_PRF_ADD_PARAM; numLoops /= AAG_PTK_PRF_DIV_PARAM; for (i = 0; i < numLoops; i++) { VOS_ASSERT((resultOffset - result + VOS_DIGEST_SHA1_SIZE) <= AAG_PRF_MAX_OUTPUT_SIZE); hmacText[loopCtrPos] = i; if( VOS_IS_STATUS_SUCCESS( vos_sha1_hmac_str(cryptHandle, hmacText, loopCtrPos + 1, key, keyLen, resultOffset) ) ) { resultOffset += VOS_DIGEST_SHA1_SIZE; retVal = ANI_OK; } else { retVal = ANI_ERROR; } } vos_mem_free(hmacText); return retVal; }
static int writeRsnKeyMic(v_U32_t cryptHandle, tAniPacket *eapolFrame, tAniEapolRsnKeyDesc *rsnDesc, v_U8_t *micKey, v_U32_t micKeyLen) { int retVal = ANI_OK; int len; v_U8_t *ptr = NULL; v_U8_t *micPos = NULL; v_U8_t result[VOS_DIGEST_SHA1_SIZE]; // Larger of the two // Sanity check the arguments and return if no MIC generation is // needed if (micKey != NULL) { if (micKeyLen == 0 || !rsnDesc->info.micFlag) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Supp MIC key provided but micKeyLen or micFlag is not set!\n"); VOS_ASSERT( 0 ); return ANI_E_ILLEGAL_ARG; } } else { if (rsnDesc->info.micFlag) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Supp micFlag is set but MIC key not provided!\n"); VOS_ASSERT( 0 ); return ANI_E_ILLEGAL_ARG; } // Normal condition where MIC is not desired by the caller return ANI_OK; } len = aniAsfPacketGetBytes(eapolFrame, &ptr); if( !ANI_IS_STATUS_SUCCESS( len ) ) { return len; } micPos = ptr + ANI_SSM_RSN_KEY_MIC_OFFSET + SNAP_HEADER_SIZE; // Clear the MIC field in the packet before the MIC computation vos_mem_zero( micPos, VOS_DIGEST_MD5_SIZE); // Skip to the EAPOL version field for MIC computation ptr += EAPOL_VERSION_POS + SNAP_HEADER_SIZE; len -= (EAPOL_VERSION_POS + SNAP_HEADER_SIZE); if (rsnDesc->info.keyDescVers == ANI_EAPOL_KEY_DESC_VERS_AES) { if( VOS_IS_STATUS_SUCCESS( vos_sha1_hmac_str(cryptHandle, ptr, len, micKey, micKeyLen, result) ) ) { retVal = ANI_OK; } else { retVal = ANI_ERROR; } } else { VOS_ASSERT( 0 ); retVal = ANI_E_ILLEGAL_ARG; } if (retVal == ANI_OK) { // Copy only 16B which is the smaller of the two and the same as // ANI_EAPOL_KEY_RSN_MIC_SIZE vos_mem_copy(micPos, result, VOS_DIGEST_MD5_SIZE); } return retVal; }
static int writeRsnKeyMic(v_U32_t cryptHandle, tAniPacket *eapolFrame, tAniEapolRsnKeyDesc *rsnDesc, v_U8_t *micKey, v_U32_t micKeyLen) { int retVal = ANI_OK; int len; v_U8_t *ptr = NULL; v_U8_t *micPos = NULL; v_U8_t result[VOS_DIGEST_SHA1_SIZE]; if (micKey != NULL) { if (micKeyLen == 0 || !rsnDesc->info.micFlag) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Supp MIC key provided but micKeyLen or micFlag is not set!\n"); VOS_ASSERT( 0 ); return ANI_E_ILLEGAL_ARG; } } else { if (rsnDesc->info.micFlag) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Supp micFlag is set but MIC key not provided!\n"); VOS_ASSERT( 0 ); return ANI_E_ILLEGAL_ARG; } return ANI_OK; } len = aniAsfPacketGetBytes(eapolFrame, &ptr); if( !ANI_IS_STATUS_SUCCESS( len ) ) { return len; } micPos = ptr + ANI_SSM_RSN_KEY_MIC_OFFSET + SNAP_HEADER_SIZE; vos_mem_zero( micPos, VOS_DIGEST_MD5_SIZE); ptr += EAPOL_VERSION_POS + SNAP_HEADER_SIZE; len -= (EAPOL_VERSION_POS + SNAP_HEADER_SIZE); if (rsnDesc->info.keyDescVers == ANI_EAPOL_KEY_DESC_VERS_AES) { if( VOS_IS_STATUS_SUCCESS( vos_sha1_hmac_str(cryptHandle, ptr, len, micKey, micKeyLen, result) ) ) { retVal = ANI_OK; } else { retVal = ANI_ERROR; } } else { VOS_ASSERT( 0 ); retVal = ANI_E_ILLEGAL_ARG; } if (retVal == ANI_OK) { vos_mem_copy(micPos, result, VOS_DIGEST_MD5_SIZE); } return retVal; }