EE445M RTOS
Taken at the University of Texas Spring 2015
aes.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
3 // aes.c - Driver for the AES module.
4 //
5 // Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved.
6 // Software License Agreement
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions
10 // are met:
11 //
12 // Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright
16 // notice, this list of conditions and the following disclaimer in the
17 // documentation and/or other materials provided with the
18 // distribution.
19 //
20 // Neither the name of Texas Instruments Incorporated nor the names of
21 // its contributors may be used to endorse or promote products derived
22 // from this software without specific prior written permission.
23 //
24 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 //
36 // This is part of revision 2.1.0.12573 of the Tiva Peripheral Driver Library.
37 //
38 //*****************************************************************************
39 
40 //*****************************************************************************
41 //
44 //
45 //*****************************************************************************
46 
47 #include <stdint.h>
48 #include <stdbool.h>
49 #include <stdint.h>
50 #include "inc/hw_aes.h"
51 #include "inc/hw_ccm.h"
52 #include "inc/hw_ints.h"
53 #include "inc/hw_memmap.h"
54 #include "inc/hw_nvic.h"
55 #include "inc/hw_types.h"
56 #include "driverlib/aes.h"
57 #include "driverlib/debug.h"
58 #include "driverlib/interrupt.h"
59 
60 //*****************************************************************************
61 //
69 //
70 //*****************************************************************************
71 void
72 AESReset(uint32_t ui32Base)
73 {
74  //
75  // Check the arguments.
76  //
77  ASSERT(ui32Base == AES_BASE);
78 
79  //
80  // Trigger the reset.
81  //
83 
84  //
85  // Wait for the reset to finish.
86  //
87  while((HWREG(ui32Base + AES_O_SYSSTATUS) &
89  {
90  }
91 }
92 
93 //*****************************************************************************
94 //
180 //
181 //*****************************************************************************
182 void
183 AESConfigSet(uint32_t ui32Base, uint32_t ui32Config)
184 {
185  //
186  // Check the arguments.
187  //
188  ASSERT(ui32Base == AES_BASE);
189  ASSERT((ui32Config & AES_CFG_DIR_ENCRYPT) ||
190  (ui32Config & AES_CFG_DIR_DECRYPT));
191  ASSERT((ui32Config & AES_CFG_KEY_SIZE_128BIT) ||
192  (ui32Config & AES_CFG_KEY_SIZE_192BIT) ||
193  (ui32Config & AES_CFG_KEY_SIZE_256BIT));
194  ASSERT((ui32Config & AES_CFG_MODE_ECB) ||
195  (ui32Config & AES_CFG_MODE_CBC) ||
196  (ui32Config & AES_CFG_MODE_CTR) ||
197  (ui32Config & AES_CFG_MODE_ICM) ||
198  (ui32Config & AES_CFG_MODE_CFB) ||
199  (ui32Config & AES_CFG_MODE_XTS_TWEAKJL) ||
200  (ui32Config & AES_CFG_MODE_XTS_K2IJL) ||
201  (ui32Config & AES_CFG_MODE_XTS_K2ILJ0) ||
202  (ui32Config & AES_CFG_MODE_F8) ||
203  (ui32Config & AES_CFG_MODE_F9) ||
204  (ui32Config & AES_CFG_MODE_CTR) ||
205  (ui32Config & AES_CFG_MODE_CBCMAC) ||
206  (ui32Config & AES_CFG_MODE_GCM_HLY0ZERO) ||
207  (ui32Config & AES_CFG_MODE_GCM_HLY0CALC) ||
208  (ui32Config & AES_CFG_MODE_GCM_HY0CALC) ||
209  (ui32Config & AES_CFG_MODE_CCM));
210  ASSERT(((ui32Config & AES_CFG_MODE_CTR) ||
211  (ui32Config & AES_CFG_MODE_GCM_HLY0ZERO) ||
212  (ui32Config & AES_CFG_MODE_GCM_HLY0CALC) ||
213  (ui32Config & AES_CFG_MODE_GCM_HY0CALC) ||
214  (ui32Config & AES_CFG_MODE_CCM)) &&
215  ((ui32Config & AES_CFG_CTR_WIDTH_32) ||
216  (ui32Config & AES_CFG_CTR_WIDTH_64) ||
217  (ui32Config & AES_CFG_CTR_WIDTH_96) ||
218  (ui32Config & AES_CFG_CTR_WIDTH_128)));
219  ASSERT((ui32Config & AES_CFG_MODE_CCM) &&
220  ((ui32Config & AES_CFG_CCM_L_1) ||
221  (ui32Config & AES_CFG_CCM_L_2) ||
222  (ui32Config & AES_CFG_CCM_L_3) ||
223  (ui32Config & AES_CFG_CCM_L_4) ||
224  (ui32Config & AES_CFG_CCM_L_5) ||
225  (ui32Config & AES_CFG_CCM_L_6) ||
226  (ui32Config & AES_CFG_CCM_L_7) ||
227  (ui32Config & AES_CFG_CCM_L_8)) &&
228  ((ui32Config & AES_CFG_CCM_M_4) ||
229  (ui32Config & AES_CFG_CCM_M_6) ||
230  (ui32Config & AES_CFG_CCM_M_8) ||
231  (ui32Config & AES_CFG_CCM_M_10) ||
232  (ui32Config & AES_CFG_CCM_M_12) ||
233  (ui32Config & AES_CFG_CCM_M_14) ||
234  (ui32Config & AES_CFG_CCM_M_16)));
235 
236  //
237  // Backup the save context field before updating the register.
238  //
239  if(HWREG(ui32Base + AES_O_CTRL) & AES_CTRL_SAVE_CONTEXT)
240  {
241  ui32Config |= AES_CTRL_SAVE_CONTEXT;
242  }
243 
244  //
245  // Write the CTRL register with the new value
246  //
247  HWREG(ui32Base + AES_O_CTRL) = ui32Config;
248 }
249 
250 //*****************************************************************************
251 //
266 //
267 //*****************************************************************************
268 void
269 AESKey1Set(uint32_t ui32Base, uint32_t *pui32Key, uint32_t ui32Keysize)
270 {
271  //
272  // Check the arguments.
273  //
274  ASSERT(ui32Base == AES_BASE);
275  ASSERT((ui32Keysize == AES_CFG_KEY_SIZE_128BIT) ||
276  (ui32Keysize == AES_CFG_KEY_SIZE_192BIT) ||
277  (ui32Keysize == AES_CFG_KEY_SIZE_256BIT));
278 
279  //
280  // With all key sizes, the first 4 words are written.
281  //
282  HWREG(ui32Base + AES_O_KEY1_0) = pui32Key[0];
283  HWREG(ui32Base + AES_O_KEY1_1) = pui32Key[1];
284  HWREG(ui32Base + AES_O_KEY1_2) = pui32Key[2];
285  HWREG(ui32Base + AES_O_KEY1_3) = pui32Key[3];
286 
287  //
288  // The key is 192 or 256 bits. Write the next 2 words.
289  //
290  if(ui32Keysize != AES_CFG_KEY_SIZE_128BIT)
291  {
292  HWREG(ui32Base + AES_O_KEY1_4) = pui32Key[4];
293  HWREG(ui32Base + AES_O_KEY1_5) = pui32Key[5];
294  }
295 
296  //
297  // The key is 256 bits. Write the last 2 words.
298  //
299  if(ui32Keysize == AES_CFG_KEY_SIZE_256BIT)
300  {
301  HWREG(ui32Base + AES_O_KEY1_6) = pui32Key[6];
302  HWREG(ui32Base + AES_O_KEY1_7) = pui32Key[7];
303  }
304 }
305 
306 //*****************************************************************************
307 //
322 //
323 //*****************************************************************************
324 void
325 AESKey2Set(uint32_t ui32Base, uint32_t *pui32Key, uint32_t ui32Keysize)
326 {
327  //
328  // Check the arguments.
329  //
330  ASSERT(ui32Base == AES_BASE);
331  ASSERT((ui32Keysize == AES_CFG_KEY_SIZE_128BIT) ||
332  (ui32Keysize == AES_CFG_KEY_SIZE_192BIT) ||
333  (ui32Keysize == AES_CFG_KEY_SIZE_256BIT));
334 
335  //
336  // With all key sizes, the first 4 words are written.
337  //
338  HWREG(ui32Base + AES_O_KEY2_0) = pui32Key[0];
339  HWREG(ui32Base + AES_O_KEY2_1) = pui32Key[1];
340  HWREG(ui32Base + AES_O_KEY2_2) = pui32Key[2];
341  HWREG(ui32Base + AES_O_KEY2_3) = pui32Key[3];
342 
343  //
344  // The key is 192 or 256 bits. Write the next 2 words.
345  //
346  if(ui32Keysize != AES_CFG_KEY_SIZE_128BIT)
347  {
348  HWREG(ui32Base + AES_O_KEY2_4) = pui32Key[4];
349  HWREG(ui32Base + AES_O_KEY2_5) = pui32Key[5];
350  }
351 
352  //
353  // The key is 256 bits. Write the last 2 words.
354  //
355  if(ui32Keysize == AES_CFG_KEY_SIZE_256BIT)
356  {
357  HWREG(ui32Base + AES_O_KEY2_6) = pui32Key[6];
358  HWREG(ui32Base + AES_O_KEY2_7) = pui32Key[7];
359  }
360 }
361 
362 //*****************************************************************************
363 //
375 //
376 //*****************************************************************************
377 void
378 AESKey3Set(uint32_t ui32Base, uint32_t *pui32Key)
379 {
380  //
381  // Check the arguments.
382  //
383  ASSERT(ui32Base == AES_BASE);
384 
385  //
386  // Write the key into the upper 4 key registers
387  //
388  HWREG(ui32Base + AES_O_KEY2_4) = pui32Key[0];
389  HWREG(ui32Base + AES_O_KEY2_5) = pui32Key[1];
390  HWREG(ui32Base + AES_O_KEY2_6) = pui32Key[2];
391  HWREG(ui32Base + AES_O_KEY2_7) = pui32Key[3];
392 }
393 
394 //*****************************************************************************
395 //
405 //
406 //*****************************************************************************
407 void
408 AESIVSet(uint32_t ui32Base, uint32_t *pui32IVdata)
409 {
410  //
411  // Check the arguments.
412  //
413  ASSERT(ui32Base == AES_BASE);
414 
415  //
416  // Write the initial vector registers.
417  //
418  HWREG(ui32Base + AES_O_IV_IN_0) = pui32IVdata[0];
419  HWREG(ui32Base + AES_O_IV_IN_1) = pui32IVdata[1];
420  HWREG(ui32Base + AES_O_IV_IN_2) = pui32IVdata[2];
421  HWREG(ui32Base + AES_O_IV_IN_3) = pui32IVdata[3];
422 }
423 
424 //*****************************************************************************
425 //
436 //
437 //*****************************************************************************
438 void
439 AESIVRead(uint32_t ui32Base, uint32_t *pui32IVData)
440 {
441  //
442  // Check the arguments.
443  //
444  ASSERT(ui32Base == AES_BASE);
445 
446  //
447  // Wait for the output context to be ready.
448  //
449  while((AES_CTRL_SVCTXTRDY & (HWREG(ui32Base + AES_O_CTRL))) == 0)
450  {
451  }
452 
453  //
454  // Read the tag data.
455  //
456  pui32IVData[0] = HWREG((ui32Base + AES_O_IV_IN_0));
457  pui32IVData[1] = HWREG((ui32Base + AES_O_IV_IN_1));
458  pui32IVData[2] = HWREG((ui32Base + AES_O_IV_IN_2));
459  pui32IVData[3] = HWREG((ui32Base + AES_O_IV_IN_3));
460 }
461 
462 //*****************************************************************************
463 //
474 //
475 //*****************************************************************************
476 void
477 AESTagRead(uint32_t ui32Base, uint32_t *pui32TagData)
478 {
479  //
480  // Check the arguments.
481  //
482  ASSERT(ui32Base == AES_BASE);
483 
484  //
485  // Wait for the output context to be ready.
486  //
487  while((AES_CTRL_SVCTXTRDY & (HWREG(ui32Base + AES_O_CTRL))) == 0)
488  {
489  }
490 
491  //
492  // Read the tag data.
493  //
494  pui32TagData[0] = HWREG((ui32Base + AES_O_TAG_OUT_0));
495  pui32TagData[1] = HWREG((ui32Base + AES_O_TAG_OUT_1));
496  pui32TagData[2] = HWREG((ui32Base + AES_O_TAG_OUT_2));
497  pui32TagData[3] = HWREG((ui32Base + AES_O_TAG_OUT_3));
498 }
499 
500 //*****************************************************************************
501 //
521 //
522 //*****************************************************************************
523 void
524 AESLengthSet(uint32_t ui32Base, uint64_t ui64Length)
525 {
526  //
527  // Check the arguments.
528  //
529  ASSERT(ui32Base == AES_BASE);
530 
531  //
532  // Write the length register by shifting the 64-bit ui64Length.
533  //
534  HWREG(ui32Base + AES_O_C_LENGTH_0) = (uint32_t)(ui64Length);
535  HWREG(ui32Base + AES_O_C_LENGTH_1) = (uint32_t)(ui64Length >> 32);
536 }
537 
538 //*****************************************************************************
539 //
558 //
559 //*****************************************************************************
560 void
561 AESAuthLengthSet(uint32_t ui32Base, uint32_t ui32Length)
562 {
563  //
564  // Check the arguments.
565  //
566  ASSERT(ui32Base == AES_BASE);
567 
568  //
569  // Write the length into the register.
570  //
571  HWREG(ui32Base + AES_O_AUTH_LENGTH) = ui32Length;
572 }
573 
574 //*****************************************************************************
575 //
587 //
588 //*****************************************************************************
589 bool
590 AESDataReadNonBlocking(uint32_t ui32Base, uint32_t *pui32Dest)
591 {
592  //
593  // Check the arguments.
594  //
595  ASSERT(ui32Base == AES_BASE);
596 
597  //
598  // Check if the output is ready before reading the data. If it not ready,
599  // return false.
600  //
601  if((AES_CTRL_OUTPUT_READY & (HWREG(ui32Base + AES_O_CTRL))) == 0)
602  {
603  return(false);
604  }
605 
606  //
607  // Read a block of data from the data registers
608  //
609  pui32Dest[0] = HWREG(ui32Base + AES_O_DATA_IN_3);
610  pui32Dest[1] = HWREG(ui32Base + AES_O_DATA_IN_2);
611  pui32Dest[2] = HWREG(ui32Base + AES_O_DATA_IN_1);
612  pui32Dest[3] = HWREG(ui32Base + AES_O_DATA_IN_0);
613 
614  //
615  // Read successful, return true.
616  //
617  return(true);
618 }
619 
620 //*****************************************************************************
621 //
632 //
633 //*****************************************************************************
634 void
635 AESDataRead(uint32_t ui32Base, uint32_t *pui32Dest)
636 {
637  //
638  // Check the arguments.
639  //
640  ASSERT(ui32Base == AES_BASE);
641 
642  //
643  // Wait for the output to be ready before reading the data.
644  //
645  while((AES_CTRL_OUTPUT_READY & (HWREG(ui32Base + AES_O_CTRL))) == 0)
646  {
647  }
648 
649  //
650  // Read a block of data from the data registers
651  //
652  pui32Dest[0] = HWREG(ui32Base + AES_O_DATA_IN_3);
653  pui32Dest[1] = HWREG(ui32Base + AES_O_DATA_IN_2);
654  pui32Dest[2] = HWREG(ui32Base + AES_O_DATA_IN_1);
655  pui32Dest[3] = HWREG(ui32Base + AES_O_DATA_IN_0);
656 }
657 
658 //*****************************************************************************
659 //
671 //
672 //*****************************************************************************
673 bool
674 AESDataWriteNonBlocking(uint32_t ui32Base, uint32_t *pui32Src)
675 {
676  //
677  // Check the arguments.
678  //
679  ASSERT(ui32Base == AES_BASE);
680 
681  //
682  // Check if the input is ready. If not, then return false.
683  //
684  if(!(AES_CTRL_INPUT_READY & (HWREG(ui32Base + AES_O_CTRL))))
685  {
686  return(false);
687  }
688 
689  //
690  // Write a block of data into the data registers.
691  //
692  HWREG(ui32Base + AES_O_DATA_IN_3) = pui32Src[0];
693  HWREG(ui32Base + AES_O_DATA_IN_2) = pui32Src[1];
694  HWREG(ui32Base + AES_O_DATA_IN_1) = pui32Src[2];
695  HWREG(ui32Base + AES_O_DATA_IN_0) = pui32Src[3];
696 
697  //
698  // Write successful, return true.
699  //
700  return(true);
701 }
702 
703 //*****************************************************************************
704 //
715 //
716 //*****************************************************************************
717 void
718 AESDataWrite(uint32_t ui32Base, uint32_t *pui32Src)
719 {
720  //
721  // Check the arguments.
722  //
723  ASSERT(ui32Base == AES_BASE);
724 
725  //
726  // Wait for input ready.
727  //
728  while((AES_CTRL_INPUT_READY & (HWREG(ui32Base + AES_O_CTRL))) == 0)
729  {
730  }
731 
732  //
733  // Write a block of data into the data registers.
734  //
735  HWREG(ui32Base + AES_O_DATA_IN_3) = pui32Src[0];
736  HWREG(ui32Base + AES_O_DATA_IN_2) = pui32Src[1];
737  HWREG(ui32Base + AES_O_DATA_IN_1) = pui32Src[2];
738  HWREG(ui32Base + AES_O_DATA_IN_0) = pui32Src[3];
739 }
740 
741 //*****************************************************************************
742 //
763 //
764 //*****************************************************************************
765 bool
766 AESDataProcess(uint32_t ui32Base, uint32_t *pui32Src, uint32_t *pui32Dest,
767  uint32_t ui32Length)
768 {
769  uint32_t ui32Count;
770 
771  //
772  // Check the arguments.
773  //
774  ASSERT(ui32Base == AES_BASE);
775 
776  //
777  // Write the length register first, which triggers the engine to start
778  // using this context.
779  //
780  AESLengthSet(AES_BASE, (uint64_t)ui32Length);
781 
782  //
783  // Now loop until the blocks are written.
784  //
785  for(ui32Count = 0; ui32Count < ui32Length; ui32Count += 16)
786  {
787  //
788  // Write the data registers.
789  //
790  AESDataWrite(ui32Base, pui32Src + (ui32Count / 4));
791 
792  //
793  // Read the data registers.
794  //
795  AESDataRead(ui32Base, pui32Dest + (ui32Count / 4));
796  }
797 
798  //
799  // Return true to indicate successful completion of the function.
800  //
801  return(true);
802 }
803 
804 //*****************************************************************************
805 //
822 //
823 //*****************************************************************************
824 bool
825 AESDataAuth(uint32_t ui32Base, uint32_t *pui32Src, uint32_t ui32Length,
826  uint32_t *pui32Tag)
827 {
828  uint32_t ui32Count;
829 
830  //
831  // Check the arguments.
832  //
833  ASSERT(ui32Base == AES_BASE);
834 
835  //
836  // Write the length register first, which triggers the engine to start
837  // using this context.
838  //
839  AESLengthSet(ui32Base, (uint64_t)ui32Length);
840 
841  //
842  // Now loop until the blocks are written.
843  //
844  for(ui32Count = 0; ui32Count < ui32Length; ui32Count += 16)
845  {
846  //
847  // Write the data registers.
848  //
849  AESDataWrite(ui32Base, pui32Src + (ui32Count / 4));
850  }
851 
852  //
853  // Read the hash tag value.
854  //
855  AESTagRead(ui32Base, pui32Tag);
856 
857  //
858  // Return true to indicate successful completion of the function.
859  //
860  return(true);
861 }
862 
863 //*****************************************************************************
864 //
889 //
890 //*****************************************************************************
891 bool
892 AESDataProcessAuth(uint32_t ui32Base, uint32_t *pui32Src,
893  uint32_t *pui32Dest, uint32_t ui32Length,
894  uint32_t *pui32AuthSrc, uint32_t ui32AuthLength,
895  uint32_t *pui32Tag)
896 {
897  uint32_t ui32Count;
898 
899  //
900  // Check the arguments.
901  //
902  ASSERT(ui32Base == AES_BASE);
903 
904  //
905  // Set the data length.
906  //
907  AESLengthSet(ui32Base, (uint64_t)ui32Length);
908 
909  //
910  // Set the additional authentication data length.
911  //
912  AESAuthLengthSet(ui32Base, ui32AuthLength);
913 
914  //
915  // Now loop until the authentication data blocks are written.
916  //
917  for(ui32Count = 0; ui32Count < ui32AuthLength; ui32Count += 16)
918  {
919  //
920  // Write the data registers.
921  //
922  AESDataWrite(ui32Base, pui32AuthSrc + (ui32Count / 4));
923  }
924 
925  //
926  // Now loop until the data blocks are written.
927  //
928  for(ui32Count = 0; ui32Count < ui32Length; ui32Count += 16)
929  {
930  //
931  // Write the data registers.
932  //
933  AESDataWrite(ui32Base, pui32Src + (ui32Count / 4));
934 
935  //
936  //
937  // Read the data registers.
938  //
939  AESDataRead(ui32Base, pui32Dest + (ui32Count / 4));
940  }
941 
942  //
943  // Read the hash tag value.
944  //
945  AESTagRead(ui32Base, pui32Tag);
946 
947  //
948  // Return true to indicate successful completion of the function.
949  //
950  return(true);
951 }
952 
953 //*****************************************************************************
954 //
973 //
974 //*****************************************************************************
975 uint32_t
976 AESIntStatus(uint32_t ui32Base, bool bMasked)
977 {
978  uint32_t ui32Status, ui32Enable, ui32Temp;
979 
980  //
981  // Check the arguments.
982  //
983  ASSERT(ui32Base == AES_BASE);
984 
985  //
986  // Read the IRQ status register and return the value.
987  //
988  ui32Status = HWREG(ui32Base + AES_O_IRQSTATUS);
989  if(bMasked)
990  {
991  ui32Enable = HWREG(ui32Base + AES_O_IRQENABLE);
992  ui32Temp = HWREG(ui32Base + AES_O_DMAMIS);
993  return((ui32Status & ui32Enable) |
994  (((ui32Temp & 0x00000001) << 16) |
995  ((ui32Temp & 0x00000002) << 18) |
996  ((ui32Temp & 0x0000000c) << 15)));
997  }
998  else
999  {
1000  ui32Temp = HWREG(ui32Base + AES_O_DMARIS);
1001  return(ui32Status |
1002  (((ui32Temp & 0x00000001) << 16) |
1003  ((ui32Temp & 0x00000002) << 18) |
1004  ((ui32Temp & 0x0000000c) << 15)));
1005  }
1006 }
1007 
1008 //*****************************************************************************
1009 //
1032 //
1033 //*****************************************************************************
1034 void
1035 AESIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)
1036 {
1037  //
1038  // Check the arguments.
1039  //
1040  ASSERT(ui32Base == AES_BASE);
1041  ASSERT((ui32IntFlags == AES_INT_CONTEXT_IN) ||
1042  (ui32IntFlags == AES_INT_CONTEXT_OUT) ||
1043  (ui32IntFlags == AES_INT_DATA_IN) ||
1044  (ui32IntFlags == AES_INT_DATA_OUT) ||
1045  (ui32IntFlags == AES_INT_DMA_CONTEXT_IN) ||
1046  (ui32IntFlags == AES_INT_DMA_CONTEXT_OUT) ||
1047  (ui32IntFlags == AES_INT_DMA_DATA_IN) ||
1048  (ui32IntFlags == AES_INT_DMA_DATA_OUT));
1049 
1050  //
1051  // Set the flags.
1052  //
1053  HWREG(ui32Base + AES_O_DMAIM) |= (((ui32IntFlags & 0x00010000) >> 16) |
1054  ((ui32IntFlags & 0x00060000) >> 15) |
1055  ((ui32IntFlags & 0x00080000) >> 18));
1056  HWREG(ui32Base + AES_O_IRQENABLE) |= ui32IntFlags & 0x0000ffff;
1057 }
1058 
1059 //*****************************************************************************
1060 //
1083 //
1084 //*****************************************************************************
1085 void
1086 AESIntDisable(uint32_t ui32Base, uint32_t ui32IntFlags)
1087 {
1088  //
1089  // Check the arguments.
1090  //
1091  ASSERT(ui32Base == AES_BASE);
1092  ASSERT((ui32IntFlags == AES_INT_CONTEXT_IN) ||
1093  (ui32IntFlags == AES_INT_CONTEXT_OUT) ||
1094  (ui32IntFlags == AES_INT_DATA_IN) ||
1095  (ui32IntFlags == AES_INT_DATA_OUT) ||
1096  (ui32IntFlags == AES_INT_DMA_CONTEXT_IN) ||
1097  (ui32IntFlags == AES_INT_DMA_CONTEXT_OUT) ||
1098  (ui32IntFlags == AES_INT_DMA_DATA_IN) ||
1099  (ui32IntFlags == AES_INT_DMA_DATA_OUT));
1100 
1101  //
1102  // Clear the flags.
1103  //
1104  HWREG(ui32Base + AES_O_DMAIM) &= ~(((ui32IntFlags & 0x00010000) >> 16) |
1105  ((ui32IntFlags & 0x00060000) >> 15) |
1106  ((ui32IntFlags & 0x00080000) >> 18));
1107  HWREG(ui32Base + AES_O_IRQENABLE) &= ~(ui32IntFlags & 0x0000ffff);
1108 }
1109 
1110 //*****************************************************************************
1111 //
1130 //
1131 //*****************************************************************************
1132 void
1133 AESIntClear(uint32_t ui32Base, uint32_t ui32IntFlags)
1134 {
1135  //
1136  // Check the arguments.
1137  //
1138  ASSERT(ui32Base == AES_BASE);
1139  ASSERT((ui32IntFlags == AES_INT_DMA_CONTEXT_IN) ||
1140  (ui32IntFlags == AES_INT_DMA_CONTEXT_OUT) ||
1141  (ui32IntFlags == AES_INT_DMA_DATA_IN) ||
1142  (ui32IntFlags == AES_INT_DMA_DATA_OUT));
1143 
1144  HWREG(ui32Base + AES_O_DMAIC) = (((ui32IntFlags & 0x00010000) >> 16) |
1145  ((ui32IntFlags & 0x00060000) >> 15) |
1146  ((ui32IntFlags & 0x00080000) >> 18));
1147 }
1148 
1149 //*****************************************************************************
1150 //
1172 //
1173 //*****************************************************************************
1174 void
1175 AESIntRegister(uint32_t ui32Base, void (*pfnHandler)(void))
1176 {
1177  //
1178  // Check the arguments.
1179  //
1180  ASSERT(ui32Base == AES_BASE);
1181 
1182  //
1183  // Register the interrupt handler.
1184  //
1185  IntRegister(INT_AES0_TM4C129, pfnHandler);
1186 
1187  //
1188  // Enable the interrupt
1189  //
1191 }
1192 
1193 //*****************************************************************************
1194 //
1206 //
1207 //*****************************************************************************
1208 void
1209 AESIntUnregister(uint32_t ui32Base)
1210 {
1211  //
1212  // Check the arguments.
1213  //
1214  ASSERT(ui32Base == AES_BASE);
1215 
1216  //
1217  // Disable the interrupt.
1218  //
1220 
1221  //
1222  // Unregister the interrupt handler.
1223  //
1225 }
1226 
1227 //*****************************************************************************
1228 //
1243 //
1244 //*****************************************************************************
1245 void
1246 AESDMAEnable(uint32_t ui32Base, uint32_t ui32Flags)
1247 {
1248  //
1249  // Check the arguments.
1250  //
1251  ASSERT(ui32Base == AES_BASE);
1252  ASSERT((ui32Flags == AES_DMA_DATA_IN) ||
1253  (ui32Flags == AES_DMA_DATA_OUT) ||
1254  (ui32Flags == AES_DMA_CONTEXT_IN) ||
1255  (ui32Flags == AES_DMA_CONTEXT_OUT));
1256 
1257  //
1258  // Set the flags in the current register value.
1259  //
1260  HWREG(ui32Base + AES_O_SYSCONFIG) |= ui32Flags;
1261 }
1262 
1263 //*****************************************************************************
1264 //
1280 //
1281 //*****************************************************************************
1282 void
1283 AESDMADisable(uint32_t ui32Base, uint32_t ui32Flags)
1284 {
1285  //
1286  // Check the arguments.
1287  //
1288  ASSERT(ui32Base == AES_BASE);
1289  ASSERT((ui32Flags == AES_DMA_DATA_IN) ||
1290  (ui32Flags == AES_DMA_DATA_OUT) ||
1291  (ui32Flags == AES_DMA_CONTEXT_IN) ||
1292  (ui32Flags == AES_DMA_CONTEXT_OUT));
1293 
1294  //
1295  // Clear the flags in the current register value.
1296  //
1297  HWREG(ui32Base + AES_O_SYSCONFIG) &= ~ui32Flags;
1298 }
1299 
1300 //*****************************************************************************
1301 //
1302 // Close the Doxygen group.
1304 //
1305 //*****************************************************************************
#define AES_CFG_CCM_M_10
Definition: aes.h:140
#define AES_CFG_MODE_CTR
Definition: aes.h:82
void AESDMAEnable(uint32_t ui32Base, uint32_t ui32Flags)
Definition: aes.c:1246
#define AES_CFG_KEY_SIZE_128BIT
Definition: aes.h:69
#define AES_O_KEY2_2
Definition: hw_aes.h:52
#define AES_CFG_MODE_ECB
Definition: aes.h:80
#define AES_CFG_MODE_CFB
Definition: aes.h:84
#define AES_INT_DATA_OUT
Definition: aes.h:154
void AESIntDisable(uint32_t ui32Base, uint32_t ui32IntFlags)
Definition: aes.c:1086
#define AES_O_TAG_OUT_2
Definition: hw_aes.h:86
#define AES_CFG_MODE_F9
Definition: aes.h:92
#define AES_O_IRQSTATUS
Definition: hw_aes.h:91
#define AES_O_AUTH_LENGTH
Definition: hw_aes.h:75
void AESKey1Set(uint32_t ui32Base, uint32_t *pui32Key, uint32_t ui32Keysize)
Definition: aes.c:269
#define HWREG(x)
Definition: hw_types.h:48
#define AES_INT_DMA_DATA_OUT
Definition: aes.h:158
#define AES_CFG_MODE_XTS_K2ILJ0
Definition: aes.h:89
#define AES_CFG_MODE_CBC
Definition: aes.h:81
#define AES_CFG_MODE_XTS_K2IJL
Definition: aes.h:87
void AESLengthSet(uint32_t ui32Base, uint64_t ui64Length)
Definition: aes.c:524
#define AES_INT_DMA_CONTEXT_IN
Definition: aes.h:155
#define AES_O_KEY2_7
Definition: hw_aes.h:49
#define AES_CFG_MODE_CBCMAC
Definition: aes.h:93
void AESIntRegister(uint32_t ui32Base, void(*pfnHandler)(void))
Definition: aes.c:1175
#define AES_CFG_MODE_GCM_HY0CALC
Definition: aes.h:98
void AESConfigSet(uint32_t ui32Base, uint32_t ui32Config)
Definition: aes.c:183
#define AES_CFG_CCM_L_4
Definition: aes.h:124
#define AES_CTRL_INPUT_READY
Definition: hw_aes.h:313
#define AES_CFG_CCM_M_12
Definition: aes.h:141
#define AES_O_TAG_OUT_3
Definition: hw_aes.h:87
#define AES_O_TAG_OUT_1
Definition: hw_aes.h:85
void AESAuthLengthSet(uint32_t ui32Base, uint32_t ui32Length)
Definition: aes.c:561
#define AES_CFG_MODE_ICM
Definition: aes.h:83
#define AES_O_KEY1_7
Definition: hw_aes.h:57
#define ASSERT(expr)
Definition: debug.h:67
#define AES_O_DATA_IN_0
Definition: hw_aes.h:76
#define AES_CTRL_SVCTXTRDY
Definition: hw_aes.h:265
#define AES_O_KEY2_0
Definition: hw_aes.h:54
void AESKey2Set(uint32_t ui32Base, uint32_t *pui32Key, uint32_t ui32Keysize)
Definition: aes.c:325
#define AES_CFG_CCM_L_8
Definition: aes.h:128
#define AES_DMA_DATA_OUT
Definition: aes.h:167
#define AES_O_KEY1_5
Definition: hw_aes.h:59
#define AES_CFG_MODE_CCM
Definition: aes.h:100
#define AES_INT_CONTEXT_IN
Definition: aes.h:151
#define AES_O_TAG_OUT_0
Definition: hw_aes.h:84
bool AESDataProcessAuth(uint32_t ui32Base, uint32_t *pui32Src, uint32_t *pui32Dest, uint32_t ui32Length, uint32_t *pui32AuthSrc, uint32_t ui32AuthLength, uint32_t *pui32Tag)
Definition: aes.c:892
#define AES_CFG_CCM_L_1
Definition: aes.h:121
#define AES_O_KEY1_1
Definition: hw_aes.h:63
#define AES_CTRL_OUTPUT_READY
Definition: hw_aes.h:314
#define AES_O_DATA_IN_2
Definition: hw_aes.h:80
#define INT_AES0_TM4C129
Definition: hw_ints.h:269
void AESReset(uint32_t ui32Base)
Definition: aes.c:72
#define AES_CFG_CTR_WIDTH_32
Definition: aes.h:109
#define AES_DMA_CONTEXT_IN
Definition: aes.h:168
bool AESDataReadNonBlocking(uint32_t ui32Base, uint32_t *pui32Dest)
Definition: aes.c:590
#define AES_O_KEY2_5
Definition: hw_aes.h:51
#define AES_INT_DMA_CONTEXT_OUT
Definition: aes.h:156
#define AES_O_CTRL
Definition: hw_aes.h:72
void AESIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)
Definition: aes.c:1035
#define AES_CFG_CCM_M_4
Definition: aes.h:137
void AESDataRead(uint32_t ui32Base, uint32_t *pui32Dest)
Definition: aes.c:635
#define AES_O_DATA_IN_1
Definition: hw_aes.h:78
#define AES_DMA_DATA_IN
Definition: aes.h:166
#define AES_O_DMAIC
Definition: hw_aes.h:97
#define AES_SYSCONFIG_SOFTRESET
Definition: hw_aes.h:447
#define AES_CTRL_SAVE_CONTEXT
Definition: hw_aes.h:266
#define AES_O_KEY2_3
Definition: hw_aes.h:53
#define AES_CFG_CTR_WIDTH_128
Definition: aes.h:112
#define AES_CFG_CCM_L_5
Definition: aes.h:125
#define AES_CFG_CCM_M_16
Definition: aes.h:143
#define AES_CFG_KEY_SIZE_256BIT
Definition: aes.h:71
#define AES_O_IV_IN_1
Definition: hw_aes.h:66
#define AES_CFG_CCM_L_7
Definition: aes.h:127
#define AES_O_DMAIM
Definition: hw_aes.h:94
#define AES_O_SYSCONFIG
Definition: hw_aes.h:89
#define AES_INT_DATA_IN
Definition: aes.h:153
#define AES_O_KEY1_3
Definition: hw_aes.h:61
bool AESDataWriteNonBlocking(uint32_t ui32Base, uint32_t *pui32Src)
Definition: aes.c:674
void AESTagRead(uint32_t ui32Base, uint32_t *pui32TagData)
Definition: aes.c:477
void AESIntClear(uint32_t ui32Base, uint32_t ui32IntFlags)
Definition: aes.c:1133
#define AES_SYSSTATUS_RESETDONE
Definition: hw_aes.h:455
#define AES_O_C_LENGTH_1
Definition: hw_aes.h:74
#define AES_O_C_LENGTH_0
Definition: hw_aes.h:73
void AESIVSet(uint32_t ui32Base, uint32_t *pui32IVdata)
Definition: aes.c:408
#define AES_O_KEY1_4
Definition: hw_aes.h:58
#define AES_O_IV_IN_2
Definition: hw_aes.h:68
#define AES_O_DATA_IN_3
Definition: hw_aes.h:82
#define AES_O_DMAMIS
Definition: hw_aes.h:96
void AESDataWrite(uint32_t ui32Base, uint32_t *pui32Src)
Definition: aes.c:718
void IntUnregister(uint32_t ui32Interrupt)
Definition: interrupt.c:381
#define AES_CFG_CCM_L_6
Definition: aes.h:126
#define AES_CFG_CCM_L_2
Definition: aes.h:122
#define AES_CFG_CCM_M_14
Definition: aes.h:142
#define AES_CFG_MODE_GCM_HLY0ZERO
Definition: aes.h:94
#define AES_CFG_CTR_WIDTH_64
Definition: aes.h:110
void AESIntUnregister(uint32_t ui32Base)
Definition: aes.c:1209
#define AES_CFG_MODE_F8
Definition: aes.h:91
#define AES_CFG_CCM_L_3
Definition: aes.h:123
#define AES_DMA_CONTEXT_OUT
Definition: aes.h:169
void AESDMADisable(uint32_t ui32Base, uint32_t ui32Flags)
Definition: aes.c:1283
#define AES_O_KEY1_0
Definition: hw_aes.h:62
#define AES_O_KEY2_4
Definition: hw_aes.h:50
#define AES_O_KEY2_1
Definition: hw_aes.h:55
#define AES_CFG_KEY_SIZE_192BIT
Definition: aes.h:70
#define AES_INT_CONTEXT_OUT
Definition: aes.h:152
#define AES_INT_DMA_DATA_IN
Definition: aes.h:157
void AESIVRead(uint32_t ui32Base, uint32_t *pui32IVData)
Definition: aes.c:439
#define AES_BASE
Definition: hw_memmap.h:140
#define AES_O_KEY1_6
Definition: hw_aes.h:56
#define AES_CFG_CCM_M_6
Definition: aes.h:138
#define AES_O_DMARIS
Definition: hw_aes.h:95
#define AES_CFG_CTR_WIDTH_96
Definition: aes.h:111
uint32_t AESIntStatus(uint32_t ui32Base, bool bMasked)
Definition: aes.c:976
#define AES_O_KEY1_2
Definition: hw_aes.h:60
#define AES_CFG_DIR_DECRYPT
Definition: aes.h:61
#define AES_CFG_MODE_XTS_TWEAKJL
Definition: aes.h:85
#define AES_CFG_CCM_M_8
Definition: aes.h:139
bool AESDataAuth(uint32_t ui32Base, uint32_t *pui32Src, uint32_t ui32Length, uint32_t *pui32Tag)
Definition: aes.c:825
#define AES_O_IV_IN_0
Definition: hw_aes.h:64
#define AES_O_IV_IN_3
Definition: hw_aes.h:70
bool AESDataProcess(uint32_t ui32Base, uint32_t *pui32Src, uint32_t *pui32Dest, uint32_t ui32Length)
Definition: aes.c:766
void IntDisable(uint32_t ui32Interrupt)
Definition: interrupt.c:684
#define AES_CFG_DIR_ENCRYPT
Definition: aes.h:60
void IntRegister(uint32_t ui32Interrupt, void(*pfnHandler)(void))
Definition: interrupt.c:309
#define AES_CFG_MODE_GCM_HLY0CALC
Definition: aes.h:96
void IntEnable(uint32_t ui32Interrupt)
Definition: interrupt.c:610
#define AES_O_SYSSTATUS
Definition: hw_aes.h:90
#define AES_O_KEY2_6
Definition: hw_aes.h:48
void AESKey3Set(uint32_t ui32Base, uint32_t *pui32Key)
Definition: aes.c:378
#define AES_O_IRQENABLE
Definition: hw_aes.h:92