hacc_hk.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * (c) MediaTek Inc. 2011
  3. */
  4. #include "sec_hal.h"
  5. #include "sec_error.h"
  6. #include "sec_typedef.h"
  7. #include "hacc_mach.h"
  8. /******************************************************************************
  9. * DEBUG
  10. ******************************************************************************/
  11. #define SEC_DEBUG (FALSE)
  12. #define SMSG DBG_MSG
  13. #if SEC_DEBUG
  14. #define DMSG DBG_MSG
  15. #else
  16. #define DMSG
  17. #endif
  18. static const unsigned int g_CFG_RANDOM_PATTERN[3][4] = {
  19. {0x2D44BB70, 0xA744D227, 0xD0A9864B, 0x83FFC244},
  20. {0x7EC8266B, 0x43E80FB2, 0x01A6348A, 0x2067F9A0},
  21. {0x54536405, 0xD546A6B1, 0x1CC3EC3A, 0xDE377A83}
  22. };
  23. /******************************************************************************
  24. * HACC HW internal function
  25. ******************************************************************************/
  26. void HACC_V3_Init(bool encode, const unsigned int g_AC_CFG[])
  27. {
  28. unsigned int i, j;
  29. const unsigned int *p1;
  30. /* const unsigned int *p2; */
  31. unsigned int acon_setting;
  32. /* -------------------------- */
  33. /* Power On HACC */
  34. /* -------------------------- */
  35. masp_hal_secure_algo_init();
  36. /* -------------------------- */
  37. /* Configuration */
  38. /* -------------------------- */
  39. /* set little endian */
  40. acon_setting = HACC_AES_CHG_BO_OFF;
  41. /* set mode */
  42. acon_setting |= HACC_AES_CBC;
  43. /* type */
  44. acon_setting |= HACC_AES_128;
  45. /* operation */
  46. if (encode)
  47. acon_setting |= HACC_AES_ENC;
  48. else
  49. acon_setting |= HACC_AES_DEC;
  50. /* -------------------------- */
  51. /* Set Key */
  52. /* -------------------------- */
  53. /* clear key */
  54. for (i = 0; i < 8; i++)
  55. *(((volatile unsigned int *)HACC_AKEY0) + i) = 0;
  56. /* -------------------------- */
  57. /* Generate META Key */
  58. /* -------------------------- */
  59. *((volatile unsigned int *)HACC_ACON) =
  60. (HACC_AES_CHG_BO_OFF | HACC_AES_128 | HACC_AES_CBC | HACC_AES_DEC);
  61. /* init ACONK
  62. B2C: bind HUID/HUK to HACC */
  63. *((volatile unsigned int *)HACC_ACONK) = HACC_AES_BK2C;
  64. /* enable R2K, so that output data is feedback to key by HACC internal algorithm */
  65. *((volatile unsigned int *)HACC_ACONK) |= HACC_AES_R2K;
  66. /* clear HACC_ASRC/HACC_ACFG/HACC_AOUT */
  67. *((volatile unsigned int *)HACC_ACON2) = HACC_AES_CLR;
  68. /* set cfg */
  69. p1 = &g_AC_CFG[0];
  70. for (i = 0; i < 4; i++)
  71. *(((volatile unsigned int *)HACC_ACFG0) + i) = *(p1 + i);
  72. /* encrypt fix pattern 3 rounds to generate a pattern from HUID/HUK */
  73. for (i = 0; i < 3; i++) {
  74. /* set fixed pattern into source */
  75. p1 = g_CFG_RANDOM_PATTERN[i];
  76. for (j = 0; j < 4; j++)
  77. *(((volatile unsigned int *)HACC_ASRC0) + j) = *(p1 + j);
  78. /* start decryption */
  79. *((volatile unsigned int *)HACC_ACON2) = HACC_AES_START;
  80. /* polling ready */
  81. while (0 == ((*((volatile unsigned int *)HACC_ACON2)) & HACC_AES_RDY))
  82. ;
  83. }
  84. /* -------------------------- */
  85. /* Set CFG */
  86. /* -------------------------- */
  87. /* clear HACC_ASRC/HACC_ACFG/HACC_AOUT */
  88. *((volatile unsigned int *)HACC_ACON2) = HACC_AES_CLR;
  89. /* set cfg */
  90. p1 = &g_AC_CFG[0];
  91. for (i = 0; i < 4; i++)
  92. *(((volatile unsigned int *)HACC_ACFG0) + i) = *(p1 + i);
  93. /* set config without R2K */
  94. *((volatile unsigned int *)HACC_ACON) = acon_setting;
  95. *((volatile unsigned int *)HACC_ACONK) = 0;
  96. }
  97. void HACC_V3_Run(volatile unsigned int *p_src, unsigned int src_len, volatile unsigned int *p_dst)
  98. {
  99. unsigned int i, j;
  100. /* config src/dst addr and len */
  101. unsigned int len = src_len;
  102. /* fo operation */
  103. for (i = 0; i < len; i += 16, p_src += 4, p_dst += 4) {
  104. /* set fixed pattern into source */
  105. for (j = 0; j < 4; j++)
  106. *(((volatile unsigned int *)HACC_ASRC0) + j) = *(p_src + j);
  107. /* start encryption */
  108. *((volatile unsigned int *)HACC_ACON2) = HACC_AES_START;
  109. /* polling ready */
  110. while (0 == ((*((volatile unsigned int *)HACC_ACON2)) & HACC_AES_RDY))
  111. ;
  112. /* read out data */
  113. for (j = 0; j < 4; j++)
  114. *(p_dst + j) = *(((volatile unsigned int *)HACC_AOUT0) + j);
  115. }
  116. }
  117. void HACC_V3_Terminate(void)
  118. {
  119. unsigned int i;
  120. /* clear HACC_ASRC/HACC_ACFG/HACC_AOUT */
  121. *((volatile unsigned int *)HACC_ACON2) = HACC_AES_CLR;
  122. /* -------------------------- */
  123. /* Clear Key */
  124. /* -------------------------- */
  125. /* clear key */
  126. for (i = 0; i < 8; i++)
  127. *(((volatile unsigned int *)HACC_AKEY0) + i) = 0;
  128. masp_hal_secure_algo_deinit();
  129. }