aes.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. /* Copyright 2018 Canaan Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include "aes.h"
  18. #include "sysctl.h"
  19. #include "utils.h"
  20. volatile aes_t *const aes = (volatile aes_t *)AES_BASE_ADDR;
  21. static void aes_clk_init()
  22. {
  23. sysctl_clock_enable(SYSCTL_CLOCK_AES);
  24. sysctl_reset(SYSCTL_RESET_AES);
  25. }
  26. static void aes_write_aad(uint32_t aad_data)
  27. {
  28. aes->aes_aad_data = aad_data;
  29. }
  30. static void aes_write_text(uint32_t text_data)
  31. {
  32. aes->aes_text_data = text_data;
  33. }
  34. static void gcm_write_tag(uint32_t *tag)
  35. {
  36. aes->gcm_in_tag[0] = tag[3];
  37. aes->gcm_in_tag[1] = tag[2];
  38. aes->gcm_in_tag[2] = tag[1];
  39. aes->gcm_in_tag[3] = tag[0];
  40. }
  41. static uint32_t aes_get_data_in_flag(void)
  42. {
  43. return aes->data_in_flag;
  44. }
  45. static uint32_t aes_get_data_out_flag(void)
  46. {
  47. return aes->data_out_flag;
  48. }
  49. static uint32_t gcm_get_tag_in_flag(void)
  50. {
  51. return aes->tag_in_flag;
  52. }
  53. static uint32_t aes_read_out_data(void)
  54. {
  55. return aes->aes_out_data;
  56. }
  57. static uint32_t gcm_get_tag_chk(void)
  58. {
  59. return aes->tag_chk;
  60. }
  61. static void gcm_clear_chk_tag(void)
  62. {
  63. aes->tag_clear = 0;
  64. }
  65. static uint32_t gcm_check_tag(uint32_t *gcm_tag)
  66. {
  67. while(!gcm_get_tag_in_flag())
  68. ;
  69. gcm_write_tag(gcm_tag);
  70. while(!gcm_get_tag_chk())
  71. ;
  72. if(gcm_get_tag_chk() == 0x2)
  73. {
  74. gcm_clear_chk_tag();
  75. return 1;
  76. } else
  77. {
  78. gcm_clear_chk_tag();
  79. return 0;
  80. }
  81. }
  82. void gcm_get_tag(uint8_t *gcm_tag)
  83. {
  84. uint32_t uint32_tag;
  85. uint8_t i = 0;
  86. uint32_tag = aes->gcm_out_tag[3];
  87. gcm_tag[i++] = (uint8_t)((uint32_tag >> 24) & 0xff);
  88. gcm_tag[i++] = (uint8_t)((uint32_tag >> 16) & 0xff);
  89. gcm_tag[i++] = (uint8_t)((uint32_tag >> 8) & 0xff);
  90. gcm_tag[i++] = (uint8_t)((uint32_tag)&0xff);
  91. uint32_tag = aes->gcm_out_tag[2];
  92. gcm_tag[i++] = (uint8_t)((uint32_tag >> 24) & 0xff);
  93. gcm_tag[i++] = (uint8_t)((uint32_tag >> 16) & 0xff);
  94. gcm_tag[i++] = (uint8_t)((uint32_tag >> 8) & 0xff);
  95. gcm_tag[i++] = (uint8_t)((uint32_tag)&0xff);
  96. uint32_tag = aes->gcm_out_tag[1];
  97. gcm_tag[i++] = (uint8_t)((uint32_tag >> 24) & 0xff);
  98. gcm_tag[i++] = (uint8_t)((uint32_tag >> 16) & 0xff);
  99. gcm_tag[i++] = (uint8_t)((uint32_tag >> 8) & 0xff);
  100. gcm_tag[i++] = (uint8_t)((uint32_tag)&0xff);
  101. uint32_tag = aes->gcm_out_tag[0];
  102. gcm_tag[i++] = (uint8_t)((uint32_tag >> 24) & 0xff);
  103. gcm_tag[i++] = (uint8_t)((uint32_tag >> 16) & 0xff);
  104. gcm_tag[i++] = (uint8_t)((uint32_tag >> 8) & 0xff);
  105. gcm_tag[i++] = (uint8_t)((uint32_tag)&0xff);
  106. gcm_check_tag((uint32_t *)gcm_tag);
  107. }
  108. void aes_init(uint8_t *input_key, size_t input_key_len, uint8_t *iv, size_t iv_len, uint8_t *gcm_aad,
  109. aes_cipher_mode_t cipher_mode, aes_encrypt_sel_t encrypt_sel, size_t gcm_aad_len, size_t input_data_len)
  110. {
  111. size_t remainder, uint32_num, uint8_num, i;
  112. uint32_t uint32_data;
  113. uint8_t uint8_data[4] = {0};
  114. size_t padding_len = input_data_len;
  115. aes_clk_init();
  116. if((cipher_mode == AES_ECB) || (cipher_mode == AES_CBC))
  117. padding_len = ((input_data_len + 15) / 16) * 16;
  118. aes->aes_endian |= 1;
  119. uint32_num = input_key_len / 4;
  120. for(i = 0; i < uint32_num; i++)
  121. {
  122. if(i < 4)
  123. aes->aes_key[i] = *((uint32_t *)(&input_key[input_key_len - (4 * i) - 4]));
  124. else
  125. aes->aes_key_ext[i - 4] = *((uint32_t *)(&input_key[input_key_len - (4 * i) - 4]));
  126. }
  127. uint32_num = iv_len / 4;
  128. for(i = 0; i < uint32_num; i++)
  129. aes->aes_iv[i] = *((uint32_t *)(&iv[iv_len - (4 * i) - 4]));
  130. aes->mode_ctl.kmode = input_key_len / 8 - 2; /* b'00:AES_128 b'01:AES_192 b'10:AES_256 b'11:RESERVED */
  131. aes->mode_ctl.cipher_mode = cipher_mode;
  132. aes->encrypt_sel = encrypt_sel;
  133. aes->gb_aad_num = gcm_aad_len - 1;
  134. aes->gb_pc_num = padding_len - 1;
  135. aes->gb_aes_en |= 1;
  136. if(cipher_mode == AES_GCM)
  137. {
  138. uint32_num = gcm_aad_len / 4;
  139. for(i = 0; i < uint32_num; i++)
  140. {
  141. uint32_data = *((uint32_t *)(&gcm_aad[i * 4]));
  142. while(!aes_get_data_in_flag())
  143. ;
  144. aes_write_aad(uint32_data);
  145. }
  146. uint8_num = 4 * uint32_num;
  147. remainder = gcm_aad_len % 4;
  148. if(remainder)
  149. {
  150. switch(remainder)
  151. {
  152. case 1:
  153. uint8_data[0] = gcm_aad[uint8_num];
  154. break;
  155. case 2:
  156. uint8_data[0] = gcm_aad[uint8_num];
  157. uint8_data[1] = gcm_aad[uint8_num + 1];
  158. break;
  159. case 3:
  160. uint8_data[0] = gcm_aad[uint8_num];
  161. uint8_data[1] = gcm_aad[uint8_num + 1];
  162. uint8_data[2] = gcm_aad[uint8_num + 2];
  163. break;
  164. default:
  165. break;
  166. }
  167. uint32_data = *((uint32_t *)(&uint8_data[0]));
  168. while(!aes_get_data_in_flag())
  169. ;
  170. aes_write_aad(uint32_data);
  171. }
  172. }
  173. }
  174. static void aes_input_bytes(const uint8_t *input_data, size_t input_data_len, aes_cipher_mode_t cipher_mode)
  175. {
  176. size_t padding_len, uint32_num, uint8_num, remainder, i;
  177. uint32_t uint32_data;
  178. uint8_t uint8_data[4] = {0};
  179. padding_len = ((input_data_len + 15) / 16) * 16;
  180. uint32_num = input_data_len / 4;
  181. for(i = 0; i < uint32_num; i++)
  182. {
  183. uint32_data = *((uint32_t *)(&input_data[i * 4]));
  184. while(!aes_get_data_in_flag())
  185. ;
  186. aes_write_text(uint32_data);
  187. }
  188. uint8_num = 4 * uint32_num;
  189. remainder = input_data_len % 4;
  190. if(remainder)
  191. {
  192. switch(remainder)
  193. {
  194. case 1:
  195. uint8_data[0] = input_data[uint8_num];
  196. break;
  197. case 2:
  198. uint8_data[0] = input_data[uint8_num];
  199. uint8_data[1] = input_data[uint8_num + 1];
  200. break;
  201. case 3:
  202. uint8_data[0] = input_data[uint8_num];
  203. uint8_data[1] = input_data[uint8_num + 1];
  204. uint8_data[2] = input_data[uint8_num + 2];
  205. break;
  206. default:
  207. break;
  208. }
  209. uint32_data = *((uint32_t *)(&uint8_data[0]));
  210. while(!aes_get_data_in_flag())
  211. ;
  212. aes_write_text(uint32_data);
  213. }
  214. if((cipher_mode == AES_ECB) || (cipher_mode == AES_CBC))
  215. {
  216. uint32_num = (padding_len - input_data_len) / 4;
  217. for(i = 0; i < uint32_num; i++)
  218. {
  219. while(!aes_get_data_in_flag())
  220. ;
  221. aes_write_text(0);
  222. }
  223. uint32_num = padding_len / 4;
  224. }
  225. }
  226. static void process_less_80_bytes(uint8_t *input_data, uint8_t *output_data, size_t input_data_len, aes_cipher_mode_t cipher_mode)
  227. {
  228. size_t padding_len, uint32_num, uint8_num, remainder, i;
  229. uint32_t uint32_data;
  230. uint8_t uint8_data[4] = {0};
  231. padding_len = ((input_data_len + 15) / 16) * 16;
  232. uint32_num = input_data_len / 4;
  233. for(i = 0; i < uint32_num; i++)
  234. {
  235. uint32_data = *((uint32_t *)(&input_data[i * 4]));
  236. while(!aes_get_data_in_flag())
  237. ;
  238. aes_write_text(uint32_data);
  239. }
  240. uint8_num = 4 * uint32_num;
  241. remainder = input_data_len % 4;
  242. if(remainder)
  243. {
  244. switch(remainder)
  245. {
  246. case 1:
  247. uint8_data[0] = input_data[uint8_num];
  248. break;
  249. case 2:
  250. uint8_data[0] = input_data[uint8_num];
  251. uint8_data[1] = input_data[uint8_num + 1];
  252. break;
  253. case 3:
  254. uint8_data[0] = input_data[uint8_num];
  255. uint8_data[1] = input_data[uint8_num + 1];
  256. uint8_data[2] = input_data[uint8_num + 2];
  257. break;
  258. default:
  259. break;
  260. }
  261. uint32_data = *((uint32_t *)(&uint8_data[0]));
  262. while(!aes_get_data_in_flag())
  263. ;
  264. aes_write_text(uint32_data);
  265. }
  266. if((cipher_mode == AES_ECB) || (cipher_mode == AES_CBC))
  267. {
  268. uint32_num = (padding_len - input_data_len) / 4;
  269. for(i = 0; i < uint32_num; i++)
  270. {
  271. while(!aes_get_data_in_flag())
  272. ;
  273. aes_write_text(0);
  274. }
  275. uint32_num = padding_len / 4;
  276. }
  277. for(i = 0; i < uint32_num; i++)
  278. {
  279. while(!aes_get_data_out_flag())
  280. ;
  281. *((uint32_t *)(&output_data[i * 4])) = aes_read_out_data();
  282. }
  283. if((cipher_mode == AES_GCM) && (remainder))
  284. {
  285. while(!aes_get_data_out_flag())
  286. ;
  287. *((uint32_t *)(&uint8_data[0])) = aes_read_out_data();
  288. switch(remainder)
  289. {
  290. case 1:
  291. output_data[uint32_num * 4] = uint8_data[0];
  292. break;
  293. case 2:
  294. output_data[uint32_num * 4] = uint8_data[0];
  295. output_data[(i * 4) + 1] = uint8_data[1];
  296. break;
  297. case 3:
  298. output_data[uint32_num * 4] = uint8_data[0];
  299. output_data[(i * 4) + 1] = uint8_data[1];
  300. output_data[(i * 4) + 2] = uint8_data[2];
  301. break;
  302. default:
  303. break;
  304. }
  305. }
  306. }
  307. void aes_process(uint8_t *input_data, uint8_t *output_data, size_t input_data_len, aes_cipher_mode_t cipher_mode)
  308. {
  309. size_t temp_len = 0;
  310. uint32_t i = 0;
  311. if(input_data_len >= 80)
  312. {
  313. for(i = 0; i < (input_data_len / 80); i++)
  314. process_less_80_bytes(&input_data[i * 80], &output_data[i * 80], 80, cipher_mode);
  315. }
  316. temp_len = input_data_len % 80;
  317. if(temp_len)
  318. process_less_80_bytes(&input_data[i * 80], &output_data[i * 80], temp_len, cipher_mode);
  319. }
  320. void aes_ecb128_hard_decrypt(uint8_t *input_key, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  321. {
  322. size_t padding_len = ((input_len + 15) / 16) * 16;
  323. aes_init(input_key, AES_128, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
  324. aes_process(input_data, output_data, padding_len, AES_ECB);
  325. }
  326. void aes_ecb128_hard_encrypt(uint8_t *input_key, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  327. {
  328. aes_init(input_key, AES_128, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
  329. aes_process(input_data, output_data, input_len, AES_ECB);
  330. }
  331. void aes_ecb192_hard_decrypt(uint8_t *input_key, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  332. {
  333. size_t padding_len = ((input_len + 15) / 16) * 16;
  334. aes_init(input_key, AES_192, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
  335. aes_process(input_data, output_data, padding_len, AES_ECB);
  336. }
  337. void aes_ecb192_hard_encrypt(uint8_t *input_key, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  338. {
  339. aes_init(input_key, AES_192, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
  340. aes_process(input_data, output_data, input_len, AES_ECB);
  341. }
  342. void aes_ecb256_hard_decrypt(uint8_t *input_key, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  343. {
  344. size_t padding_len = ((input_len + 15) / 16) * 16;
  345. aes_init(input_key, AES_256, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
  346. aes_process(input_data, output_data, padding_len, AES_ECB);
  347. }
  348. void aes_ecb256_hard_encrypt(uint8_t *input_key, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  349. {
  350. aes_init(input_key, AES_256, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
  351. aes_process(input_data, output_data, input_len, AES_ECB);
  352. }
  353. void aes_cbc128_hard_decrypt(cbc_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  354. {
  355. size_t padding_len = ((input_len + 15) / 16) * 16;
  356. aes_init(context->input_key, AES_128, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
  357. aes_process(input_data, output_data, padding_len, AES_CBC);
  358. }
  359. void aes_cbc128_hard_encrypt(cbc_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  360. {
  361. aes_init(context->input_key, AES_128, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
  362. aes_process(input_data, output_data, input_len, AES_CBC);
  363. }
  364. void aes_cbc192_hard_decrypt(cbc_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  365. {
  366. size_t padding_len = ((input_len + 15) / 16) * 16;
  367. aes_init(context->input_key, AES_192, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
  368. aes_process(input_data, output_data, padding_len, AES_CBC);
  369. }
  370. void aes_cbc192_hard_encrypt(cbc_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  371. {
  372. aes_init(context->input_key, AES_192, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
  373. aes_process(input_data, output_data, input_len, AES_CBC);
  374. }
  375. void aes_cbc256_hard_decrypt(cbc_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  376. {
  377. size_t padding_len = ((input_len + 15) / 16) * 16;
  378. aes_init(context->input_key, AES_256, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
  379. aes_process(input_data, output_data, padding_len, AES_CBC);
  380. }
  381. void aes_cbc256_hard_encrypt(cbc_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data)
  382. {
  383. aes_init(context->input_key, AES_256, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
  384. aes_process(input_data, output_data, input_len, AES_CBC);
  385. }
  386. void aes_gcm128_hard_decrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag)
  387. {
  388. aes_init(context->input_key, AES_128, context->iv, IV_LEN_96, context->gcm_aad,
  389. AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
  390. aes_process(input_data, output_data, input_len, AES_GCM);
  391. gcm_get_tag(gcm_tag);
  392. }
  393. void aes_gcm128_hard_encrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag)
  394. {
  395. aes_init(context->input_key, AES_128, context->iv, IV_LEN_96, context->gcm_aad,
  396. AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
  397. aes_process(input_data, output_data, input_len, AES_GCM);
  398. gcm_get_tag(gcm_tag);
  399. }
  400. void aes_gcm192_hard_decrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag)
  401. {
  402. aes_init(context->input_key, AES_192, context->iv, IV_LEN_96, context->gcm_aad,
  403. AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
  404. aes_process(input_data, output_data, input_len, AES_GCM);
  405. gcm_get_tag(gcm_tag);
  406. }
  407. void aes_gcm192_hard_encrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag)
  408. {
  409. aes_init(context->input_key, AES_192, context->iv, IV_LEN_96, context->gcm_aad,
  410. AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
  411. aes_process(input_data, output_data, input_len, AES_GCM);
  412. gcm_get_tag(gcm_tag);
  413. }
  414. void aes_gcm256_hard_decrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag)
  415. {
  416. aes_init(context->input_key, AES_256, context->iv, IV_LEN_96, context->gcm_aad,
  417. AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
  418. aes_process(input_data, output_data, input_len, AES_GCM);
  419. gcm_get_tag(gcm_tag);
  420. }
  421. void aes_gcm256_hard_encrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag)
  422. {
  423. aes_init(context->input_key, AES_256, context->iv, IV_LEN_96, context->gcm_aad,
  424. AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
  425. aes_process(input_data, output_data, input_len, AES_GCM);
  426. gcm_get_tag(gcm_tag);
  427. }
  428. void aes_ecb128_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  429. uint8_t *input_key,
  430. uint8_t *input_data,
  431. size_t input_len,
  432. uint8_t *output_data)
  433. {
  434. size_t padding_len = ((input_len + 15) / 16) * 16;
  435. aes_init(input_key, AES_128, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
  436. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  437. aes->dma_sel = 1;
  438. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  439. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  440. aes_input_bytes(input_data, input_len, AES_ECB);
  441. dmac_wait_done(dma_receive_channel_num);
  442. }
  443. void aes_ecb128_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  444. uint8_t *input_key,
  445. uint8_t *input_data,
  446. size_t input_len,
  447. uint8_t *output_data)
  448. {
  449. aes_init(input_key, AES_128, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
  450. size_t padding_len = ((input_len + 15) / 16) * 16;
  451. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  452. aes->dma_sel = 1;
  453. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  454. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  455. aes_input_bytes(input_data, input_len, AES_ECB);
  456. dmac_wait_done(dma_receive_channel_num);
  457. }
  458. void aes_ecb192_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  459. uint8_t *input_key,
  460. uint8_t *input_data,
  461. size_t input_len,
  462. uint8_t *output_data)
  463. {
  464. size_t padding_len = ((input_len + 15) / 16) * 16;
  465. aes_init(input_key, AES_192, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
  466. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  467. aes->dma_sel = 1;
  468. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  469. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  470. aes_input_bytes(input_data, input_len, AES_ECB);
  471. dmac_wait_done(dma_receive_channel_num);
  472. }
  473. void aes_ecb192_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  474. uint8_t *input_key,
  475. uint8_t *input_data,
  476. size_t input_len,
  477. uint8_t *output_data)
  478. {
  479. aes_init(input_key, AES_192, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
  480. size_t padding_len = ((input_len + 15) / 16) * 16;
  481. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  482. aes->dma_sel = 1;
  483. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  484. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  485. aes_input_bytes(input_data, input_len, AES_ECB);
  486. dmac_wait_done(dma_receive_channel_num);
  487. }
  488. void aes_ecb256_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  489. uint8_t *input_key,
  490. uint8_t *input_data,
  491. size_t input_len,
  492. uint8_t *output_data)
  493. {
  494. size_t padding_len = ((input_len + 15) / 16) * 16;
  495. aes_init(input_key, AES_256, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
  496. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  497. aes->dma_sel = 1;
  498. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  499. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  500. aes_input_bytes(input_data, input_len, AES_ECB);
  501. dmac_wait_done(dma_receive_channel_num);
  502. }
  503. void aes_ecb256_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  504. uint8_t *input_key,
  505. uint8_t *input_data,
  506. size_t input_len,
  507. uint8_t *output_data)
  508. {
  509. aes_init(input_key, AES_256, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
  510. size_t padding_len = ((input_len + 15) / 16) * 16;
  511. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  512. aes->dma_sel = 1;
  513. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  514. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  515. aes_input_bytes(input_data, input_len, AES_ECB);
  516. dmac_wait_done(dma_receive_channel_num);
  517. }
  518. void aes_cbc128_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  519. cbc_context_t *context,
  520. uint8_t *input_data,
  521. size_t input_len,
  522. uint8_t *output_data)
  523. {
  524. size_t padding_len = ((input_len + 15) / 16) * 16;
  525. aes_init(context->input_key, AES_128, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
  526. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  527. aes->dma_sel = 1;
  528. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  529. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  530. aes_input_bytes(input_data, input_len, AES_CBC);
  531. dmac_wait_done(dma_receive_channel_num);
  532. }
  533. void aes_cbc128_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  534. cbc_context_t *context,
  535. uint8_t *input_data,
  536. size_t input_len,
  537. uint8_t *output_data)
  538. {
  539. aes_init(context->input_key, AES_128, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
  540. size_t padding_len = ((input_len + 15) / 16) * 16;
  541. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  542. aes->dma_sel = 1;
  543. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  544. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  545. aes_input_bytes(input_data, input_len, AES_CBC);
  546. dmac_wait_done(dma_receive_channel_num);
  547. }
  548. void aes_cbc192_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  549. cbc_context_t *context,
  550. uint8_t *input_data,
  551. size_t input_len,
  552. uint8_t *output_data)
  553. {
  554. size_t padding_len = ((input_len + 15) / 16) * 16;
  555. aes_init(context->input_key, AES_192, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
  556. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  557. aes->dma_sel = 1;
  558. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  559. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  560. aes_input_bytes(input_data, input_len, AES_CBC);
  561. dmac_wait_done(dma_receive_channel_num);
  562. }
  563. void aes_cbc192_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  564. cbc_context_t *context,
  565. uint8_t *input_data,
  566. size_t input_len,
  567. uint8_t *output_data)
  568. {
  569. aes_init(context->input_key, AES_192, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
  570. size_t padding_len = ((input_len + 15) / 16) * 16;
  571. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  572. aes->dma_sel = 1;
  573. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  574. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  575. aes_input_bytes(input_data, input_len, AES_CBC);
  576. dmac_wait_done(dma_receive_channel_num);
  577. }
  578. void aes_cbc256_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  579. cbc_context_t *context,
  580. uint8_t *input_data,
  581. size_t input_len,
  582. uint8_t *output_data)
  583. {
  584. size_t padding_len = ((input_len + 15) / 16) * 16;
  585. aes_init(context->input_key, AES_256, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
  586. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  587. aes->dma_sel = 1;
  588. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  589. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  590. aes_input_bytes(input_data, input_len, AES_CBC);
  591. dmac_wait_done(dma_receive_channel_num);
  592. }
  593. void aes_cbc256_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  594. cbc_context_t *context,
  595. uint8_t *input_data,
  596. size_t input_len,
  597. uint8_t *output_data)
  598. {
  599. aes_init(context->input_key, AES_256, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
  600. size_t padding_len = ((input_len + 15) / 16) * 16;
  601. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  602. aes->dma_sel = 1;
  603. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  604. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, padding_len >> 2);
  605. aes_input_bytes(input_data, input_len, AES_CBC);
  606. dmac_wait_done(dma_receive_channel_num);
  607. }
  608. void aes_gcm128_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  609. gcm_context_t *context,
  610. uint8_t *input_data,
  611. size_t input_len,
  612. uint8_t *output_data,
  613. uint8_t *gcm_tag)
  614. {
  615. aes_init(context->input_key, AES_128, context->iv, IV_LEN_96, context->gcm_aad,
  616. AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
  617. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  618. aes->dma_sel = 1;
  619. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  620. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, (input_len + 3) >> 2);
  621. aes_input_bytes(input_data, input_len, AES_GCM);
  622. dmac_wait_done(dma_receive_channel_num);
  623. gcm_get_tag(gcm_tag);
  624. }
  625. void aes_gcm128_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  626. gcm_context_t *context,
  627. uint8_t *input_data,
  628. size_t input_len,
  629. uint8_t *output_data,
  630. uint8_t *gcm_tag)
  631. {
  632. aes_init(context->input_key, AES_128, context->iv, IV_LEN_96, context->gcm_aad,
  633. AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
  634. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  635. aes->dma_sel = 1;
  636. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  637. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, (input_len + 3) >> 2);
  638. aes_input_bytes(input_data, input_len, AES_GCM);
  639. dmac_wait_done(dma_receive_channel_num);
  640. gcm_get_tag(gcm_tag);
  641. }
  642. void aes_gcm192_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  643. gcm_context_t *context,
  644. uint8_t *input_data,
  645. size_t input_len,
  646. uint8_t *output_data,
  647. uint8_t *gcm_tag)
  648. {
  649. aes_init(context->input_key, AES_192, context->iv, IV_LEN_96, context->gcm_aad,
  650. AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
  651. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  652. aes->dma_sel = 1;
  653. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  654. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, (input_len + 3) >> 2);
  655. aes_input_bytes(input_data, input_len, AES_GCM);
  656. dmac_wait_done(dma_receive_channel_num);
  657. gcm_get_tag(gcm_tag);
  658. }
  659. void aes_gcm192_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  660. gcm_context_t *context,
  661. uint8_t *input_data,
  662. size_t input_len,
  663. uint8_t *output_data,
  664. uint8_t *gcm_tag)
  665. {
  666. aes_init(context->input_key, AES_192, context->iv, IV_LEN_96, context->gcm_aad,
  667. AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
  668. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  669. aes->dma_sel = 1;
  670. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  671. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, (input_len + 3) >> 2);
  672. aes_input_bytes(input_data, input_len, AES_GCM);
  673. dmac_wait_done(dma_receive_channel_num);
  674. gcm_get_tag(gcm_tag);
  675. }
  676. void aes_gcm256_hard_decrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  677. gcm_context_t *context,
  678. uint8_t *input_data,
  679. size_t input_len,
  680. uint8_t *output_data,
  681. uint8_t *gcm_tag)
  682. {
  683. aes_init(context->input_key, AES_256, context->iv, IV_LEN_96, context->gcm_aad,
  684. AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
  685. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  686. aes->dma_sel = 1;
  687. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  688. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, (input_len + 3) >> 2);
  689. aes_input_bytes(input_data, input_len, AES_GCM);
  690. dmac_wait_done(dma_receive_channel_num);
  691. gcm_get_tag(gcm_tag);
  692. }
  693. void aes_gcm256_hard_encrypt_dma(dmac_channel_number_t dma_receive_channel_num,
  694. gcm_context_t *context,
  695. uint8_t *input_data,
  696. size_t input_len,
  697. uint8_t *output_data,
  698. uint8_t *gcm_tag)
  699. {
  700. aes_init(context->input_key, AES_256, context->iv, IV_LEN_96, context->gcm_aad,
  701. AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
  702. sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
  703. aes->dma_sel = 1;
  704. dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
  705. DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, (input_len + 3) >> 2);
  706. aes_input_bytes(input_data, input_len, AES_GCM);
  707. dmac_wait_done(dma_receive_channel_num);
  708. gcm_get_tag(gcm_tag);
  709. }