#include "SCP03_rspParser.h"
#include "dk_log.h"

#define LOGE DK_LOG_ERR

SCPSTATUS verifyRMAC(uint8_t* MCV, uint8_t* S_RMAC, p_secEse_7816_rpdu_t pRpdu) {
    uint8_t R_MAC[8] = {0,};
    uint8_t parsed_R_MAC[8] = {0,};
    int i;

    if ((pRpdu->len-8) < 0) {
        LOGE("Invaild Response Length");
        return SCP_RESPONSE_LENGTH_INVALID;
    }

    genApduR_MAC(S_RMAC, MCV, pRpdu, R_MAC); // calculate R-MAC
    memcpy(parsed_R_MAC, pRpdu->pdata + (pRpdu->len-8), 8);
    for (i = 0 ; i < 8 ; i++) { // compare calulated R-MAC and received R-MAC
        if (R_MAC[i] != parsed_R_MAC[i]) {
            return SCP_VERIFY_RMAC_FAIL;
        }
    }

    return SCP_SUCCESS;
}

void decryptRspDataField(uint8_t* S_ENC, int encryptionCounter, p_secEse_7816_rpdu_t pRpdu) {
    uint8_t encrypted_data[MAX_RSP_CIPHERED_TEXT_SIZE] = {0,};
    uint8_t plain_text[MAX_RSP_CIPHERED_TEXT_SIZE] = {0,};
    uint8_t ICV_RSP[16] = {0,};
    int plain_text_length = 0;
    uint16_t encrypted_data_length;

    if ((pRpdu->len-8) < 0) {
        TTY_LOG("Invaild Response Length");
        return;
    }
    encrypted_data_length = pRpdu->len-8;

    memcpy(encrypted_data, pRpdu->pdata, encrypted_data_length);
    genICV(ICV_RSP, S_ENC, encryptionCounter, ICVRSP); // generate ICV for decryption
    scp03_aes_decrypt (S_ENC, encrypted_data, encrypted_data_length, plain_text, &plain_text_length, ICV_RSP, PADDING); // decrypt response data
    pRpdu->len = plain_text_length;
    memset(pRpdu->pdata, 0x00, MAX_RSP_CIPHERED_TEXT_SIZE);
    memcpy(pRpdu->pdata, plain_text, plain_text_length);
}
