34 #if defined(AES_COUNT) && (AES_COUNT > 0)
86 #define AES_BLOCKSIZE 16
165 uint32_t *_out = (uint32_t *)out;
166 const uint32_t *_in = (
const uint32_t *)in;
167 const uint32_t *_key = (
const uint32_t *)key;
168 const uint32_t *_iv = (
const uint32_t *)iv;
172 EFM_ASSERT(!(len % AES_BLOCKSIZE));
175 len /= AES_BLOCKSIZE;
177 #if defined( AES_CTRL_KEYBUFEN )
181 for (i = 3; i >= 0; i--)
183 AES->KEYHA = __REV(_key[i]);
191 #if defined( AES_CTRL_KEYBUFEN )
192 AES->CTRL = AES_CTRL_KEYBUFEN | AES_CTRL_XORSTART;
194 AES->CTRL = AES_CTRL_XORSTART;
199 for (i = 3; i >= 0; i--)
201 AES->DATA = __REV(_iv[i]);
207 #if !defined( AES_CTRL_KEYBUFEN )
209 for (i = 3; i >= 0; i--)
211 AES->KEYLA = __REV(_key[i]);
216 for (i = 3; i >= 0; i--)
218 AES->XORDATA = __REV(_in[i]);
223 while (AES->STATUS & AES_STATUS_RUNNING)
227 for (i = 3; i >= 0; i--)
229 _out[i] = __REV(AES->DATA);
237 #if defined( AES_CTRL_KEYBUFEN )
238 AES->CTRL = AES_CTRL_DECRYPT | AES_CTRL_KEYBUFEN | AES_CTRL_DATASTART;
240 AES->CTRL = AES_CTRL_DECRYPT | AES_CTRL_DATASTART;
244 for (i = 0; i < 4; i++)
252 #if !defined( AES_CTRL_KEYBUFEN )
254 for (i = 3; i >= 0; i--)
256 AES->KEYLA = __REV(_key[i]);
261 for (i = 3; i >= 0; i--)
263 AES->DATA = __REV(_in[i]);
267 while (AES->STATUS & AES_STATUS_RUNNING)
272 for (i = 3; i >= 0; i--)
274 AES->XORDATA = __REV(prev[i]);
281 for (i = 3; i >= 0; i--)
283 _out[i] = __REV(AES->DATA);
291 #if defined( AES_CTRL_AES256 )
331 uint32_t *_out = (uint32_t *)out;
332 const uint32_t *_in = (
const uint32_t *)in;
333 const uint32_t *_key = (
const uint32_t *)key;
334 const uint32_t *_iv = (
const uint32_t *)iv;
338 EFM_ASSERT(!(len % AES_BLOCKSIZE));
341 len /= AES_BLOCKSIZE;
346 AES->CTRL = AES_CTRL_AES256 | AES_CTRL_XORSTART;
350 for (i = 3; i >= 0; i--)
352 AES->DATA = __REV(_iv[i]);
359 for (i = 3, j = 7; i >= 0; i--, j--)
361 AES->KEYLA = __REV(_key[j]);
362 AES->KEYHA = __REV(_key[i]);
364 AES->XORDATA = __REV(_in[i]);
369 while (AES->STATUS & AES_STATUS_RUNNING)
373 for (i = 3; i >= 0; i--)
375 _out[i] = __REV(AES->DATA);
383 AES->CTRL = AES_CTRL_AES256 | AES_CTRL_DECRYPT | AES_CTRL_DATASTART;
386 for (i = 0; i < 4; i++)
395 for (i = 3, j = 7; i >= 0; i--, j--)
397 AES->KEYLA = __REV(_key[j]);
398 AES->KEYHA = __REV(_key[i]);
400 AES->DATA = __REV(_in[i]);
404 while (AES->STATUS & AES_STATUS_RUNNING)
408 for (i = 3; i >= 0; i--)
410 AES->XORDATA = __REV(prev[i]);
417 for (i = 3; i >= 0; i--)
419 _out[i] = __REV(AES->DATA);
494 uint32_t *_out = (uint32_t *)out;
495 const uint32_t *_in = (
const uint32_t *)in;
496 const uint32_t *_key = (
const uint32_t *)key;
497 const uint32_t *_iv = (
const uint32_t *)iv;
498 const uint32_t *data;
501 EFM_ASSERT(!(len % AES_BLOCKSIZE));
503 #if defined( AES_CTRL_KEYBUFEN )
504 AES->CTRL = AES_CTRL_KEYBUFEN | AES_CTRL_DATASTART;
506 AES->CTRL = AES_CTRL_DATASTART;
509 #if defined( AES_CTRL_KEYBUFEN )
511 for (i = 3; i >= 0; i--)
513 AES->KEYHA = __REV(_key[i]);
519 len /= AES_BLOCKSIZE;
522 #if !defined( AES_CTRL_KEYBUFEN )
524 for (i = 3; i >= 0; i--)
526 AES->KEYLA = __REV(_key[i]);
531 for (i = 3; i >= 0; i--)
533 AES->DATA = __REV(data[i]);
544 for (i = 0; i < 4; i++)
552 while (AES->STATUS & AES_STATUS_RUNNING)
556 for (i = 3; i >= 0; i--)
558 _out[i] = __REV(AES->DATA) ^ _in[i];
566 #if defined( AES_CTRL_AES256 )
604 uint32_t *_out = (uint32_t *)out;
605 const uint32_t *_in = (
const uint32_t *)in;
606 const uint32_t *_key = (
const uint32_t *)key;
607 const uint32_t *_iv = (
const uint32_t *)iv;
608 const uint32_t *data;
611 EFM_ASSERT(!(len % AES_BLOCKSIZE));
614 AES->CTRL = AES_CTRL_AES256 | AES_CTRL_DATASTART;
618 len /= AES_BLOCKSIZE;
622 for (i = 3, j = 7; i >= 0; i--, j--)
624 AES->KEYLA = __REV(_key[j]);
625 AES->KEYHA = __REV(_key[i]);
627 AES->DATA = __REV(data[i]);
638 for (i = 0; i < 4; i++)
645 while (AES->STATUS & AES_STATUS_RUNNING)
649 for (i = 3; i >= 0; i--)
651 _out[i] = __REV(AES->DATA) ^ _in[i];
725 AES_CtrFuncPtr_TypeDef ctrFunc)
728 uint32_t *_out = (uint32_t *)out;
729 const uint32_t *_in = (
const uint32_t *)in;
730 const uint32_t *_key = (
const uint32_t *)key;
731 uint32_t *_ctr = (uint32_t *)ctr;
733 EFM_ASSERT(!(len % AES_BLOCKSIZE));
736 #if defined( AES_CTRL_KEYBUFEN )
737 AES->CTRL = AES_CTRL_KEYBUFEN | AES_CTRL_DATASTART;
739 AES->CTRL = AES_CTRL_DATASTART;
742 #if defined( AES_CTRL_KEYBUFEN )
746 for (i = 3; i >= 0; i--)
748 AES->KEYHA = __REV(_key[i]);
754 len /= AES_BLOCKSIZE;
757 #if !defined( AES_CTRL_KEYBUFEN )
759 for (i = 3; i >= 0; i--)
761 AES->KEYLA = __REV(_key[i]);
766 for (i = 3; i >= 0; i--)
768 AES->DATA = __REV(_ctr[i]);
774 while (AES->STATUS & AES_STATUS_RUNNING)
778 for (i = 3; i >= 0; i--)
780 _out[i] = __REV(AES->DATA) ^ _in[i];
788 #if defined( AES_CTRL_AES256 )
823 AES_CtrFuncPtr_TypeDef ctrFunc)
827 uint32_t *_out = (uint32_t *)out;
828 const uint32_t *_in = (
const uint32_t *)in;
829 const uint32_t *_key = (
const uint32_t *)key;
830 uint32_t *_ctr = (uint32_t *)ctr;
832 EFM_ASSERT(!(len % AES_BLOCKSIZE));
836 AES->CTRL = AES_CTRL_AES256 | AES_CTRL_DATASTART;
839 len /= AES_BLOCKSIZE;
843 for (i = 3, j = 7; i >= 0; i--, j--)
845 AES->KEYLA = __REV(_key[j]);
846 AES->KEYHA = __REV(_key[i]);
848 AES->DATA = __REV(_ctr[i]);
854 while (AES->STATUS & AES_STATUS_RUNNING)
858 for (i = 3; i >= 0; i--)
860 _out[i] = __REV(AES->DATA) ^ _in[i];
885 uint32_t *_ctr = (uint32_t *)ctr;
887 _ctr[3] = __REV(__REV(_ctr[3]) + 1);
909 uint32_t *_out = (uint32_t *)out;
910 const uint32_t *_in = (
const uint32_t *)in;
913 for (i = 3; i >= 0; i--)
915 AES->KEYLA = __REV(_in[i]);
920 AES_IntClear(AES_IF_DONE);
921 AES->CMD = AES_CMD_START;
924 while (AES->STATUS & AES_STATUS_RUNNING)
928 for (i = 3; i >= 0; i--)
930 _out[i] = __REV(AES->KEYLA);
935 #if defined( AES_CTRL_AES256 )
955 uint32_t *_out = (uint32_t *)out;
956 const uint32_t *_in = (
const uint32_t *)in;
959 for (i = 3, j = 7; i >= 0; i--, j--)
961 AES->KEYLA = __REV(_in[j]);
962 AES->KEYHA = __REV(_in[i]);
966 AES->CTRL = AES_CTRL_AES256;
967 AES->CMD = AES_CMD_START;
970 while (AES->STATUS & AES_STATUS_RUNNING)
974 for (i = 3, j = 7; i >= 0; i--, j--)
976 _out[j] = __REV(AES->KEYLA);
977 _out[i] = __REV(AES->KEYHA);
1041 uint32_t *_out = (uint32_t *)out;
1042 const uint32_t *_in = (
const uint32_t *)in;
1043 const uint32_t *_key = (
const uint32_t *)key;
1045 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1047 #if defined( AES_CTRL_KEYBUFEN )
1049 for (i = 3; i >= 0; i--)
1051 AES->KEYHA = __REV(_key[i]);
1058 #if defined( AES_CTRL_KEYBUFEN )
1059 AES->CTRL = AES_CTRL_KEYBUFEN | AES_CTRL_DATASTART;
1061 AES->CTRL = AES_CTRL_DATASTART;
1067 #if defined( AES_CTRL_KEYBUFEN )
1068 AES->CTRL = AES_CTRL_DECRYPT | AES_CTRL_KEYBUFEN | AES_CTRL_DATASTART;
1070 AES->CTRL = AES_CTRL_DECRYPT | AES_CTRL_DATASTART;
1075 len /= AES_BLOCKSIZE;
1078 #if !defined( AES_CTRL_KEYBUFEN )
1080 for (i = 3; i >= 0; i--)
1082 AES->KEYLA = __REV(_key[i]);
1087 for (i = 3; i >= 0; i--)
1089 AES->DATA = __REV(_in[i]);
1094 while (AES->STATUS & AES_STATUS_RUNNING)
1098 for (i = 3; i >= 0; i--)
1100 _out[i] = __REV(AES->DATA);
1107 #if defined( AES_CTRL_AES256 )
1143 uint32_t *_out = (uint32_t *)out;
1144 const uint32_t *_in = (
const uint32_t *)in;
1145 const uint32_t *_key = (
const uint32_t *)key;
1147 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1152 AES->CTRL = AES_CTRL_AES256 | AES_CTRL_DATASTART;
1157 AES->CTRL = AES_CTRL_DECRYPT | AES_CTRL_AES256 | AES_CTRL_DATASTART;
1161 len /= AES_BLOCKSIZE;
1165 for (i = 3, j = 7; i >= 0; i--, j--)
1167 AES->KEYLA = __REV(_key[j]);
1168 AES->KEYHA = __REV(_key[i]);
1170 AES->DATA = __REV(_in[i]);
1175 while (AES->STATUS & AES_STATUS_RUNNING)
1179 for (i = 3; i >= 0; i--)
1181 _out[i] = __REV(AES->DATA);
1253 uint32_t *_out = (uint32_t *)out;
1254 const uint32_t *_in = (
const uint32_t *)in;
1255 const uint32_t *_key = (
const uint32_t *)key;
1256 const uint32_t *_iv = (
const uint32_t *)iv;
1258 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1261 #if defined( AES_CTRL_KEYBUFEN )
1262 AES->CTRL = AES_CTRL_KEYBUFEN;
1269 for (i = 3; i >= 0; i--)
1271 #if defined( AES_CTRL_KEYBUFEN )
1272 AES->KEYHA = __REV(_key[i]);
1274 AES->DATA = __REV(_iv[i]);
1278 len /= AES_BLOCKSIZE;
1281 #if !defined( AES_CTRL_KEYBUFEN )
1283 for (i = 3; i >= 0; i--)
1285 AES->KEYLA = __REV(_key[i]);
1289 AES->CMD = AES_CMD_START;
1292 while (AES->STATUS & AES_STATUS_RUNNING)
1296 for (i = 3; i >= 0; i--)
1298 _out[i] = __REV(AES->DATA) ^ _in[i];
1306 #if defined( AES_CTRL_AES256 )
1340 uint32_t *_out = (uint32_t *)out;
1341 const uint32_t *_in = (
const uint32_t *)in;
1342 const uint32_t *_key = (
const uint32_t *)key;
1343 const uint32_t *_iv = (
const uint32_t *)iv;
1345 EFM_ASSERT(!(len % AES_BLOCKSIZE));
1348 AES->CTRL = AES_CTRL_AES256;
1351 for (i = 3; i >= 0; i--)
1353 AES->DATA = __REV(_iv[i]);
1357 len /= AES_BLOCKSIZE;
1361 for (i = 3, j = 7; i >= 0; i--, j--)
1363 AES->KEYLA = __REV(_key[j]);
1364 AES->KEYHA = __REV(_key[i]);
1367 AES->CMD = AES_CMD_START;
1370 while (AES->STATUS & AES_STATUS_RUNNING)
1374 for (i = 3; i >= 0; i--)
1376 _out[i] = __REV(AES->DATA) ^ _in[i];
Emlib peripheral API "assert" implementation.
__STATIC_INLINE void AES_CTR256(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, uint8_t *ctr, CRYPTO_AES_CtrFuncPtr_TypeDef ctrFunc)
AES Counter (CTR) cipher mode encryption/decryption, 256 bit key.
__STATIC_INLINE void AES_ECB128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, bool encrypt)
AES Electronic Codebook (ECB) cipher mode encryption/decryption, 128 bit key.
__STATIC_INLINE void AES_CFB256(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv, bool encrypt)
AES Cipher feedback (CFB) cipher mode encryption/decryption, 256 bit key.
__STATIC_INLINE void AES_CFB128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv, bool encrypt)
AES Cipher feedback (CFB) cipher mode encryption/decryption, 128 bit key.
__STATIC_INLINE void AES_CBC128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv, bool encrypt)
AES Cipher-block chaining (CBC) cipher mode encryption/decryption, 128 bit key.
__STATIC_INLINE void AES_OFB256(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv)
AES Output feedback (OFB) cipher mode encryption/decryption, 256 bit key.
__STATIC_INLINE void AES_OFB128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv)
AES Output feedback (OFB) cipher mode encryption/decryption, 128 bit key.
__STATIC_INLINE void AES_CTRUpdate32Bit(uint8_t *ctr)
Update last 32 bits of 128 bit counter, by incrementing with 1.
Advanced encryption standard (AES) accelerator peripheral API.
__STATIC_INLINE void AES_ECB256(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, bool encrypt)
AES Electronic Codebook (ECB) cipher mode encryption/decryption, 256 bit key.
__STATIC_INLINE void AES_DecryptKey128(uint8_t *out, const uint8_t *in)
Generate 128 bit AES decryption key from 128 bit encryption key. The decryption key is used for some ...
__STATIC_INLINE void AES_DecryptKey256(uint8_t *out, const uint8_t *in)
Generate 256 bit AES decryption key from 256 bit encryption key. The decryption key is used for some ...
__STATIC_INLINE void AES_CTR128(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, uint8_t *ctr, CRYPTO_AES_CtrFuncPtr_TypeDef ctrFunc)
AES Counter (CTR) cipher mode encryption/decryption, 128 bit key.
__STATIC_INLINE void AES_CBC256(uint8_t *out, const uint8_t *in, unsigned int len, const uint8_t *key, const uint8_t *iv, bool encrypt)
AES Cipher-block chaining (CBC) cipher mode encryption/decryption, 256 bit key.