34 #if defined(AES_COUNT) && (AES_COUNT > 0)
53 #define AES_BLOCKSIZE 16
132 uint32_t *_out = (uint32_t *)out;
133 const uint32_t *_in = (
const uint32_t *)in;
134 const uint32_t *_key = (
const uint32_t *)key;
135 const uint32_t *_iv = (
const uint32_t *)iv;
139 EFM_ASSERT(!(len % AES_BLOCKSIZE));
142 len /= AES_BLOCKSIZE;
144 #if defined( AES_CTRL_KEYBUFEN )
148 for (i = 3; i >= 0; i--)
150 AES->KEYHA = __REV(_key[i]);
158 #if defined( AES_CTRL_KEYBUFEN )
166 for (i = 3; i >= 0; i--)
168 AES->DATA = __REV(_iv[i]);
174 #if !defined( AES_CTRL_KEYBUFEN )
176 for (i = 3; i >= 0; i--)
178 AES->KEYLA = __REV(_key[i]);
183 for (i = 3; i >= 0; i--)
185 AES->XORDATA = __REV(_in[i]);
194 for (i = 3; i >= 0; i--)
196 _out[i] = __REV(
AES->DATA);
204 #if defined( AES_CTRL_KEYBUFEN )
211 for (i = 0; i < 4; i++)
219 #if !defined( AES_CTRL_KEYBUFEN )
221 for (i = 3; i >= 0; i--)
223 AES->KEYLA = __REV(_key[i]);
228 for (i = 3; i >= 0; i--)
230 AES->DATA = __REV(_in[i]);
239 for (i = 3; i >= 0; i--)
241 AES->XORDATA = __REV(prev[i]);
248 for (i = 3; i >= 0; i--)
250 _out[i] = __REV(
AES->DATA);
258 #if defined( AES_CTRL_AES256 )
289 void AES_CBC256(uint8_t *out,
298 uint32_t *_out = (uint32_t *)out;
299 const uint32_t *_in = (
const uint32_t *)in;
300 const uint32_t *_key = (
const uint32_t *)key;
301 const uint32_t *_iv = (
const uint32_t *)iv;
305 EFM_ASSERT(!(len % AES_BLOCKSIZE));
308 len /= AES_BLOCKSIZE;
317 for (i = 3; i >= 0; i--)
319 AES->DATA = __REV(_iv[i]);
326 for (i = 3, j = 7; i >= 0; i--, j--)
328 AES->KEYLA = __REV(_key[j]);
329 AES->KEYHA = __REV(_key[i]);
331 AES->XORDATA = __REV(_in[i]);
340 for (i = 3; i >= 0; i--)
342 _out[i] = __REV(
AES->DATA);
353 for (i = 0; i < 4; i++)
362 for (i = 3, j = 7; i >= 0; i--, j--)
364 AES->KEYLA = __REV(_key[j]);
365 AES->KEYHA = __REV(_key[i]);
367 AES->DATA = __REV(_in[i]);
375 for (i = 3; i >= 0; i--)
377 AES->XORDATA = __REV(prev[i]);
384 for (i = 3; i >= 0; i--)
386 _out[i] = __REV(
AES->DATA);
461 uint32_t *_out = (uint32_t *)out;
462 const uint32_t *_in = (
const uint32_t *)in;
463 const uint32_t *_key = (
const uint32_t *)key;
464 const uint32_t *_iv = (
const uint32_t *)iv;
465 const uint32_t *data;
468 EFM_ASSERT(!(len % AES_BLOCKSIZE));
470 #if defined( AES_CTRL_KEYBUFEN )
476 #if defined( AES_CTRL_KEYBUFEN )
478 for (i = 3; i >= 0; i--)
480 AES->KEYHA = __REV(_key[i]);
486 len /= AES_BLOCKSIZE;
489 #if !defined( AES_CTRL_KEYBUFEN )
491 for (i = 3; i >= 0; i--)
493 AES->KEYLA = __REV(_key[i]);
498 for (i = 3; i >= 0; i--)
500 AES->DATA = __REV(data[i]);
511 for (i = 0; i < 4; i++)
523 for (i = 3; i >= 0; i--)
525 _out[i] = __REV(
AES->DATA) ^ _in[i];
533 #if defined( AES_CTRL_AES256 )
562 void AES_CFB256(uint8_t *out,
571 uint32_t *_out = (uint32_t *)out;
572 const uint32_t *_in = (
const uint32_t *)in;
573 const uint32_t *_key = (
const uint32_t *)key;
574 const uint32_t *_iv = (
const uint32_t *)iv;
575 const uint32_t *data;
578 EFM_ASSERT(!(len % AES_BLOCKSIZE));
585 len /= AES_BLOCKSIZE;
589 for (i = 3, j = 7; i >= 0; i--, j--)
591 AES->KEYLA = __REV(_key[j]);
592 AES->KEYHA = __REV(_key[i]);
594 AES->DATA = __REV(data[i]);
605 for (i = 0; i < 4; i++)
616 for (i = 3; i >= 0; i--)
618 _out[i] = __REV(
AES->DATA) ^ _in[i];
695 uint32_t *_out = (uint32_t *)out;
696 const uint32_t *_in = (
const uint32_t *)in;
697 const uint32_t *_key = (
const uint32_t *)key;
698 uint32_t *_ctr = (uint32_t *)ctr;
700 EFM_ASSERT(!(len % AES_BLOCKSIZE));
703 #if defined( AES_CTRL_KEYBUFEN )
709 #if defined( AES_CTRL_KEYBUFEN )
713 for (i = 3; i >= 0; i--)
715 AES->KEYHA = __REV(_key[i]);
721 len /= AES_BLOCKSIZE;
724 #if !defined( AES_CTRL_KEYBUFEN )
726 for (i = 3; i >= 0; i--)
728 AES->KEYLA = __REV(_key[i]);
733 for (i = 3; i >= 0; i--)
735 AES->DATA = __REV(_ctr[i]);
745 for (i = 3; i >= 0; i--)
747 _out[i] = __REV(
AES->DATA) ^ _in[i];
755 #if defined( AES_CTRL_AES256 )
785 void AES_CTR256(uint8_t *out,
794 uint32_t *_out = (uint32_t *)out;
795 const uint32_t *_in = (
const uint32_t *)in;
796 const uint32_t *_key = (
const uint32_t *)key;
797 uint32_t *_ctr = (uint32_t *)ctr;
799 EFM_ASSERT(!(len % AES_BLOCKSIZE));
806 len /= AES_BLOCKSIZE;
810 for (i = 3, j = 7; i >= 0; i--, j--)
812 AES->KEYLA = __REV(_key[j]);
813 AES->KEYHA = __REV(_key[i]);
815 AES->DATA = __REV(_ctr[i]);
825 for (i = 3; i >= 0; i--)
827 _out[i] = __REV(
AES->DATA) ^ _in[i];
852 uint32_t *_ctr = (uint32_t *)ctr;
854 _ctr[3] = __REV(__REV(_ctr[3]) + 1);
876 uint32_t *_out = (uint32_t *)out;
877 const uint32_t *_in = (
const uint32_t *)in;
880 for (i = 3; i >= 0; i--)
882 AES->KEYLA = __REV(_in[i]);
895 for (i = 3; i >= 0; i--)
897 _out[i] = __REV(
AES->KEYLA);
902 #if defined( AES_CTRL_AES256 )
918 void AES_DecryptKey256(uint8_t *out,
const uint8_t *in)
922 uint32_t *_out = (uint32_t *)out;
923 const uint32_t *_in = (
const uint32_t *)in;
926 for (i = 3, j = 7; i >= 0; i--, j--)
928 AES->KEYLA = __REV(_in[j]);
929 AES->KEYHA = __REV(_in[i]);
933 AES->CTRL = AES_CTRL_AES256;
941 for (i = 3, j = 7; i >= 0; i--, j--)
943 _out[j] = __REV(
AES->KEYLA);
944 _out[i] = __REV(
AES->KEYHA);
1008 uint32_t *_out = (uint32_t *)out;
1009 const uint32_t *_in = (
const uint32_t *)in;
1010 const uint32_t *_key = (
const uint32_t *)key;
1012 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1014 #if defined( AES_CTRL_KEYBUFEN )
1016 for (i = 3; i >= 0; i--)
1018 AES->KEYHA = __REV(_key[i]);
1025 #if defined( AES_CTRL_KEYBUFEN )
1034 #if defined( AES_CTRL_KEYBUFEN )
1042 len /= AES_BLOCKSIZE;
1045 #if !defined( AES_CTRL_KEYBUFEN )
1047 for (i = 3; i >= 0; i--)
1049 AES->KEYLA = __REV(_key[i]);
1054 for (i = 3; i >= 0; i--)
1056 AES->DATA = __REV(_in[i]);
1065 for (i = 3; i >= 0; i--)
1067 _out[i] = __REV(
AES->DATA);
1074 #if defined( AES_CTRL_AES256 )
1102 void AES_ECB256(uint8_t *out,
1110 uint32_t *_out = (uint32_t *)out;
1111 const uint32_t *_in = (
const uint32_t *)in;
1112 const uint32_t *_key = (
const uint32_t *)key;
1114 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1128 len /= AES_BLOCKSIZE;
1132 for (i = 3, j = 7; i >= 0; i--, j--)
1134 AES->KEYLA = __REV(_key[j]);
1135 AES->KEYHA = __REV(_key[i]);
1137 AES->DATA = __REV(_in[i]);
1146 for (i = 3; i >= 0; i--)
1148 _out[i] = __REV(
AES->DATA);
1220 uint32_t *_out = (uint32_t *)out;
1221 const uint32_t *_in = (
const uint32_t *)in;
1222 const uint32_t *_key = (
const uint32_t *)key;
1223 const uint32_t *_iv = (
const uint32_t *)iv;
1225 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1228 #if defined( AES_CTRL_KEYBUFEN )
1229 AES->CTRL = AES_CTRL_KEYBUFEN;
1236 for (i = 3; i >= 0; i--)
1238 #if defined( AES_CTRL_KEYBUFEN )
1239 AES->KEYHA = __REV(_key[i]);
1241 AES->DATA = __REV(_iv[i]);
1245 len /= AES_BLOCKSIZE;
1248 #if !defined( AES_CTRL_KEYBUFEN )
1250 for (i = 3; i >= 0; i--)
1252 AES->KEYLA = __REV(_key[i]);
1263 for (i = 3; i >= 0; i--)
1265 _out[i] = __REV(
AES->DATA) ^ _in[i];
1273 #if defined( AES_CTRL_AES256 )
1299 void AES_OFB256(uint8_t *out,
1307 uint32_t *_out = (uint32_t *)out;
1308 const uint32_t *_in = (
const uint32_t *)in;
1309 const uint32_t *_key = (
const uint32_t *)key;
1310 const uint32_t *_iv = (
const uint32_t *)iv;
1312 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1315 AES->CTRL = AES_CTRL_AES256;
1318 for (i = 3; i >= 0; i--)
1320 AES->DATA = __REV(_iv[i]);
1324 len /= AES_BLOCKSIZE;
1328 for (i = 3, j = 7; i >= 0; i--, j--)
1330 AES->KEYLA = __REV(_key[j]);
1331 AES->KEYHA = __REV(_key[i]);
1341 for (i = 3; i >= 0; i--)
1343 _out[i] = __REV(
AES->DATA) ^ _in[i];
#define AES_STATUS_RUNNING
void AES_CTRUpdate32Bit(uint8_t *ctr)
Update last 32 bits of 128 bit counter, by incrementing with 1.
void AES_DecryptKey128(uint8_t *out, const uint8_t *in)
Generate 128 bit decryption key from 128 bit encryption key. The decryption key is used for some ciph...
Emlib peripheral API "assert" implementation.
__STATIC_INLINE void AES_IntClear(uint32_t flags)
Clear one or more pending AES interrupts.
#define AES_CTRL_DATASTART
void AES_CTR128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, uint8_t *ctr, AES_CtrFuncPtr_TypeDef ctrFunc)
Counter (CTR) cipher mode encryption/decryption, 128 bit key.
void AES_OFB128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv)
Output feedback (OFB) cipher mode encryption/decryption, 128 bit key.
#define AES_CTRL_XORSTART
void AES_CBC128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv, bool encrypt)
Cipher-block chaining (CBC) cipher mode encryption/decryption, 128 bit key.
void(* AES_CtrFuncPtr_TypeDef)(uint8_t *ctr)
AES counter modification function pointer.
Advanced encryption standard (AES) accelerator peripheral API.
void AES_ECB128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, bool encrypt)
Electronic Codebook (ECB) cipher mode encryption/decryption, 128 bit key.
void AES_CFB128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv, bool encrypt)
Cipher feedback (CFB) cipher mode encryption/decryption, 128 bit key.