#include "aes_core.h" #include #include #include #include static int xor (unsigned char *a, unsigned char *b, unsigned char *c) { int i = 0; if (a == NULL || b == NULL || c == NULL) return -1; for (i = 0; i < 16; i++) { *c = *a ^ *b; c++; b++; a++; } return 0; } static int rk_aes_cbc_mac_encrypt(const unsigned char *in, unsigned long length, unsigned char *out, const RK_AES_KEY *ks1, const int enc) { unsigned long i = 0; int ret = 0; unsigned char tmp[16]; memset(out, 0x00, 16); memset(tmp, 0x00, 16); for (i = 0; i < (length / 16); i++) { xor((unsigned char *)in + 16 * i, out, out); rk_aes_encrypt(out, out, ks1); }; if (length % 16) { memcpy(tmp, in + 16 * i, length % 16); xor(tmp, out, out); rk_aes_encrypt(out, out, ks1); } return ret; } static int compare_string(unsigned char *a, unsigned char *b, unsigned int len) { unsigned int i; if ((a == NULL) || (b == NULL)) return -1; for (i = 0; i < len; i++) { if (*a != *b) return -1; a++; b++; } return 0; } int rk_aes_cbc_mac_op(const unsigned char *in, unsigned char *out, unsigned long length, const unsigned char *key, const int key_len, const int enc) { RK_AES_KEY ks1; int ret = 0; unsigned char tmp_out[16] = {0}; unsigned int out_len = 16; if (in == NULL || out == NULL || key == NULL) return -1; if (key_len != 128 / 8 && key_len != 192 / 8 && key_len != 256 / 8) return -2; if (length == 0) return -3; ret = rk_aes_set_encrypt_key(key, key_len * 8, &ks1); if (ret != 0) return ret; ret = rk_aes_cbc_mac_encrypt(in, length, tmp_out, &ks1, enc); if (ret != 0) return ret; if (enc) memcpy(out, tmp_out, out_len); else ret = compare_string(out, tmp_out, out_len); return ret; }