static int writeRsnKeyInfo(tAniPacket *packet, tAniRsnKeyInfo *info) { int retVal; v_U16_t tmp; v_U16_t infoValue; infoValue = 0; tmp = (v_U16_t)info->keyDescVers; tmp = tmp << ANI_SSM_RSN_KEY_DESC_VERS_OFFSET; infoValue |= (tmp & ANI_SSM_RSN_KEY_DESC_VERS_MASK); if (info->unicastFlag) infoValue |= ANI_SSM_RSN_UNICAST_MASK; tmp = info->keyId; tmp = tmp << ANI_SSM_RSN_KEY_INDEX_OFFSET; infoValue |= (tmp & ANI_SSM_RSN_KEY_INDEX_MASK); if (info->installFlag) infoValue |= ANI_SSM_RSN_INSTALL_MASK; if (info->ackFlag) infoValue |= ANI_SSM_RSN_ACK_MASK; if (info->micFlag) infoValue |= ANI_SSM_RSN_MIC_MASK; if (info->secureFlag) infoValue |= ANI_SSM_RSN_SECURE_MASK; if (info->errorFlag) infoValue |= ANI_SSM_RSN_ERROR_MASK; if (info->requestFlag) infoValue |= ANI_SSM_RSN_REQUEST_MASK; if (info->encKeyDataFlag) infoValue |= ANI_SSM_RSN_ENC_KEY_DATA_MASK; retVal = aniAsfPacketAppend16(packet, infoValue); return retVal; }
static int writeRsnKeyDesc(tAniPacket *packet, tAniEapolRsnKeyDesc *rsnDesc, v_U8_t keyDescType) { int retVal; do { // This can be either ANI_EAPOL_KEY_DESC_TYPE_RSN // or ANI_EAPOL_KEY_DESC_TYPE_RSN_NEW retVal = aniAsfPacketAppend8(packet, keyDescType); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = writeRsnKeyInfo(packet, &rsnDesc->info); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppend16(packet, rsnDesc->keyLen); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->replayCounter, sizeof(rsnDesc->replayCounter)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyNonce, sizeof(rsnDesc->keyNonce)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyIv, sizeof(rsnDesc->keyIv)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyRecvSeqCounter, sizeof(rsnDesc->keyRecvSeqCounter)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyId, sizeof(rsnDesc->keyId)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; // Zero out the key MIC retVal = aniAsfPacketAppendBuffer(packet, ZERO_BYTES, sizeof(rsnDesc->keyMic)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppend16(packet, rsnDesc->keyDataLen); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; if (rsnDesc->keyDataLen != 0) { retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyData, rsnDesc->keyDataLen); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; } }while( 0 ); return retVal; }
static int writeRsnKeyDesc(tAniPacket *packet, tAniEapolRsnKeyDesc *rsnDesc, v_U8_t keyDescType) { int retVal; do { retVal = aniAsfPacketAppend8(packet, keyDescType); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = writeRsnKeyInfo(packet, &rsnDesc->info); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppend16(packet, rsnDesc->keyLen); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->replayCounter, sizeof(rsnDesc->replayCounter)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyNonce, sizeof(rsnDesc->keyNonce)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyIv, sizeof(rsnDesc->keyIv)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyRecvSeqCounter, sizeof(rsnDesc->keyRecvSeqCounter)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyId, sizeof(rsnDesc->keyId)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppendBuffer(packet, ZERO_BYTES, sizeof(rsnDesc->keyMic)); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; retVal = aniAsfPacketAppend16(packet, rsnDesc->keyDataLen); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; if (rsnDesc->keyDataLen != 0) { retVal = aniAsfPacketAppendBuffer(packet, rsnDesc->keyData, rsnDesc->keyDataLen); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break; } }while( 0 ); return retVal; }