00001
00017 #include "includes.h"
00018
00019 #include "common.h"
00020 #include "aes.h"
00021 #include "aes_wrap.h"
00022
00036 int aes_128_eax_encrypt(const u8 *key, const u8 *nonce, size_t nonce_len,
00037 const u8 *hdr, size_t hdr_len,
00038 u8 *data, size_t data_len, u8 *tag)
00039 {
00040 u8 *buf;
00041 size_t buf_len;
00042 u8 nonce_mac[AES_BLOCK_SIZE], hdr_mac[AES_BLOCK_SIZE],
00043 data_mac[AES_BLOCK_SIZE];
00044 int i, ret = -1;
00045
00046 if (nonce_len > data_len)
00047 buf_len = nonce_len;
00048 else
00049 buf_len = data_len;
00050 if (hdr_len > buf_len)
00051 buf_len = hdr_len;
00052 buf_len += 16;
00053
00054 buf = os_malloc(buf_len);
00055 if (buf == NULL)
00056 return -1;
00057
00058 os_memset(buf, 0, 15);
00059
00060 buf[15] = 0;
00061 os_memcpy(buf + 16, nonce, nonce_len);
00062 if (omac1_aes_128(key, buf, 16 + nonce_len, nonce_mac))
00063 goto fail;
00064
00065 buf[15] = 1;
00066 os_memcpy(buf + 16, hdr, hdr_len);
00067 if (omac1_aes_128(key, buf, 16 + hdr_len, hdr_mac))
00068 goto fail;
00069
00070 if (aes_128_ctr_encrypt(key, nonce_mac, data, data_len))
00071 goto fail;
00072 buf[15] = 2;
00073 os_memcpy(buf + 16, data, data_len);
00074 if (omac1_aes_128(key, buf, 16 + data_len, data_mac))
00075 goto fail;
00076
00077 for (i = 0; i < AES_BLOCK_SIZE; i++)
00078 tag[i] = nonce_mac[i] ^ data_mac[i] ^ hdr_mac[i];
00079
00080 ret = 0;
00081 fail:
00082 os_free(buf);
00083
00084 return ret;
00085 }
00086
00087
00101 int aes_128_eax_decrypt(const u8 *key, const u8 *nonce, size_t nonce_len,
00102 const u8 *hdr, size_t hdr_len,
00103 u8 *data, size_t data_len, const u8 *tag)
00104 {
00105 u8 *buf;
00106 size_t buf_len;
00107 u8 nonce_mac[AES_BLOCK_SIZE], hdr_mac[AES_BLOCK_SIZE],
00108 data_mac[AES_BLOCK_SIZE];
00109 int i;
00110
00111 if (nonce_len > data_len)
00112 buf_len = nonce_len;
00113 else
00114 buf_len = data_len;
00115 if (hdr_len > buf_len)
00116 buf_len = hdr_len;
00117 buf_len += 16;
00118
00119 buf = os_malloc(buf_len);
00120 if (buf == NULL)
00121 return -1;
00122
00123 os_memset(buf, 0, 15);
00124
00125 buf[15] = 0;
00126 os_memcpy(buf + 16, nonce, nonce_len);
00127 if (omac1_aes_128(key, buf, 16 + nonce_len, nonce_mac)) {
00128 os_free(buf);
00129 return -1;
00130 }
00131
00132 buf[15] = 1;
00133 os_memcpy(buf + 16, hdr, hdr_len);
00134 if (omac1_aes_128(key, buf, 16 + hdr_len, hdr_mac)) {
00135 os_free(buf);
00136 return -1;
00137 }
00138
00139 buf[15] = 2;
00140 os_memcpy(buf + 16, data, data_len);
00141 if (omac1_aes_128(key, buf, 16 + data_len, data_mac)) {
00142 os_free(buf);
00143 return -1;
00144 }
00145
00146 os_free(buf);
00147
00148 for (i = 0; i < AES_BLOCK_SIZE; i++) {
00149 if (tag[i] != (nonce_mac[i] ^ data_mac[i] ^ hdr_mac[i]))
00150 return -2;
00151 }
00152
00153 return aes_128_ctr_encrypt(key, nonce_mac, data, data_len);
00154 }
00155