#include <stdlib.h>
#include <string.h>
#include "api.h"
#include "aes128.h"
#include "aes_cmac.h"
#include "driver.h"
static u128 buf[AES_BUFSIZE+1];
////// key table real
// (KEY_TABLE[15] is for error indication should be always 0 )
KEY_TABLE key_table[16];
////// Error Handling
//
int ERROR_FLAG = 0;
static void error_on(int val)
{
ERROR_FLAG |= val;
}
static void error_off(int val)
{
ERROR_FLAG &= ~val;
}
////// utils
//
static KEY_TABLE *key_entry(KEY_ID keyid)
{
return &key_table[keyid];
}
static KEY128 *key(KEY_ID keyid)
{
if ((keyid == RAMKEY &&
key_table[keyid].key_flag== RAM_PLAIN_KEY) ||
key_table[keyid].key_flag & KEY_PRESENT) {
return &key_table[keyid].key;
} else {
error_on(ERC_KEY_EMPTY);
return &key_table[ERROR].key;
}
}
static void xor(u128 *p, u128 *q)
{
for (int i = 0; i< 4; i++)
p->ul[i] ^= q->ul[i];
}
void SB_B_SET_WORKMEM()
{
// dummy for future extension
}
//////// APIs
//
ODAT* SB_B_ENC_ECB(int n, KEY_ID keyid, u128 *idat)
{
memcpy(buf, idat, n*sizeof(u128));
for (int i =0; i< n; i++) {
drv_AES_crypt((uint *)(&buf[i]), (uint8*)key(keyid));
}
return buf;
};
ODAT* SB_B_DEC_ECB(int n, KEY_ID keyid, u128 *idat)
{
memcpy(buf, idat, n*sizeof(u128));
for (int i =0; i< n; i++) {
drv_AES_decrypt((uint *)(&buf[i]), (uint8*)key(keyid));
}
return buf;
};
ODAT* SB_B_ENC_CBC(int n, KEY_ID keyid, u128 iv, u128 *idat)
{
memcpy(buf, idat, n*sizeof(u128));
for (int i =0; i< n; i++) {
if (i == 0)
xor(&buf[i], &iv);
else
xor(&buf[i], &buf[i-1]);
AES128_crypt((uint *)(&buf[i]), (uint8*)key(keyid));
}
return buf;
};
ODAT* SB_B_DEC_CBC(int n, KEY_ID keyid, u128 iv, u128 *idat)
{
memcpy(buf, idat, n*sizeof(u128));
for (int i =0; i< n; i++) {
AES128_decrypt((uint *)(&buf[i]), (uint8*)key(keyid));
if (i == 0)
xor(&buf[i], &iv);
else
xor(&buf[i], &idat[i-1]);
}
return buf;
};
ODAT* SB_B_GENERATE_MAC(int n, KEY_ID keyid, u128 *idat)
{
return (ODAT*)drv_AES_cmac(key(keyid), idat, n);
}
uint SB_B_VERIFY_MAC(int n, int nbits, KEY_ID keyid, u128 *idat3, u128 *idat4)
{
uint8 *p =
(uint8*)drv_AES_cmac(key(keyid), idat3, n);
uint8 *q = (uint8*) idat4;
for (int i = 0; i< nbits/8; i++) {
if (*p++ != *q++) return 1;
}
int r = (nbits & 0x7);
if (r) {
int mask = ((1<<r)-1)<<(8-r);
if ((mask & *p) != (mask & *q)) return 1;
}
return 0;
}
void SB_B_LOAD_KEY(u128 M1, u256 M2, u128 M3)
{
}
// plain key to RAMKEY(15) entry
void SB_B_LOAD_PLAIN_KEY(KEY128 key)
{
key_table[RAMKEY].key = key;
key_table[RAMKEY].key_flag |= RAM_PLAIN_KEY;
}
KEY128 SB_B_EXPORT_RAM_KEY()
{
return *key(RAMKEY);
}
ODAT* SB_B_INIT_RNG()
{
uint8 *val;
drv_reset(DRV_RST_PRNG|DRV_RST_MD5);
val = drv_rtc_get_bin();
// -> md5
//md5( val);
//*/
return NULL;
}
//SB_B_EXTEND_SEED
//SB_B_RND()
//{
//return 0;
//}
//SB_B_GET_STATUS
//SB_B_GET_ID
void SB_B_CANCEL()
{
//dummy
}
void SB_B_IMPORT_KEY()
{
}
void SB_B_EXPORT_KEY()
{
}
// vi:expandtab:foldmethod=syntax sw=2 ts=2