#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mbedtls/aes.h"

#define RAWDATALEN 16
// uint8_t rawData[RAWDATALEN];
uint8_t aes_iv[16];

// aes key，加密和解密要用同样的key
uint8_t aes_key[16] = {0xFE, 0x63, 0x96, 0xF9, 0x5C, 0xEF, 0xB8, 0xF4, 0x07, 0x05, 0xD1, 0xB6, 0xEB, 0xAB, 0xEA, 0x07};
uint8_t aes_iv_original[16] = {0x3D, 0x27, 0x4E, 0x83, 0x43, 0x5D, 0x30, 0xEC, 0x62, 0xEB, 0x90, 0x3A, 0xAC, 0x60, 0x12, 0xF5};

mbedtls_aes_context aes;

void sb_aes_init()
{
    // 初始化aes上下文
    mbedtls_aes_init(&aes);
}

void reset_iv()
{
    // 该函数用于每次加密、解密前，重置iv值，iv值的内容是随意定的，只要起到不是随便就能猜中的IV值即可。
    // 加、解密所用的iv值必须相同。此处把iv值设置为0~15
    memcpy(aes_iv, aes_iv_original, 16);
}

int sb_aes_encrypt(uint8_t *crypt_data, int crypt_len, uint8_t *output_data)
{
    int ret;
    // 设置加密的key
    mbedtls_aes_setkey_enc(&aes, aes_key, 128);
    reset_iv(); // 因为调用mbedtls_aes_crypt_cbc后传入的iv值会有变化，重置iv值会有变化
    ret = mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, crypt_len, aes_iv, crypt_data, output_data);
    if (ret)
    {
        return -1;
    }

    return crypt_len;
}

int sb_aes_decrypt(uint8_t *crypt_data, int crypt_len, uint8_t *output_data)
{
    int ret;

    // 设置解密的key
    mbedtls_aes_setkey_dec(&aes, aes_key, 128);
    reset_iv(); // 因为调用mbedtls_aes_crypt_cbc后传入的iv值会有变化，重置iv值会有变化
    ret = mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, crypt_len, aes_iv, crypt_data, output_data);
    if (ret)
    {
        return -1;
    }

    return crypt_len;
}

// void app_main(void)
//{
//     uint8_t encData[RAWDATALEN] = { 0 };
//     uint8_t decData[RAWDATALEN] = { 0 };

//    sb_aes_init(); // 初始化aes上下文

//    // 打印原始数据
//    printf("rawData:\t");
//    for (int i = 0; i < RAWDATALEN; i++) {
//        printf("%02x, ", rawData[i]);
//    }
//    printf("\n");

//    // 加密
//    int encresult = sb_aes_encrypt(rawData, sizeof(rawData), encData);
//    printf("enc data(%d):\t", encresult);
//    for (int i = 0; i < RAWDATALEN; i++) {
//        printf("%02x, ", encData[i]);
//    }
//    printf("\n");

//    // 解密
//    int decresult = sb_aes_decrypt(encData, RAWDATALEN, decData);
//    printf("dec data(%d):\t", decresult);
//    for (int i = 0; i < RAWDATALEN; i++) {
//        printf("%02x, ", decData[i]);
//    }
//    printf("\n");
//}