RoT.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* MediaTek Inc. (C) 2015. All rights reserved.
  2. *
  3. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  4. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  5. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  6. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  7. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  8. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  9. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  10. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  11. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  12. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  13. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  14. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  15. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  16. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  17. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  18. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  19. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  20. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  21. */
  22. #include <stdint.h>
  23. #include <debug.h>
  24. #include <load_vfy_boot.h>
  25. #include <verified_boot_common.h>
  26. #define SHA256_LENGTH 32
  27. #define MTK_SIP_LK_ROOT_OF_TRUST_AARCH32 0x82000120
  28. /* query verified boot state - g_boot_state */
  29. extern unsigned int g_boot_state;
  30. int sha256(unsigned char *data, unsigned long data_len, unsigned char *output_hash);
  31. int sec_query_device_lock(int *lock_state);
  32. static unsigned int smc_call(uint32_t function_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3)
  33. {
  34. unsigned int ret = 0;
  35. register uint32_t reg0 __asm__("r0") = function_id;
  36. register uint32_t reg1 __asm__("r1") = arg0;
  37. register uint32_t reg2 __asm__("r2") = arg1;
  38. register uint32_t reg3 __asm__("r3") = arg2;
  39. register uint32_t reg4 __asm__("r4") = arg3;
  40. __asm__ volatile ("smc 0" : "+r"(reg0),
  41. "+r"(reg1), "+r"(reg2), "+r"(reg3), "+r"(reg4));
  42. ret = reg0;
  43. return ret;
  44. }
  45. void send_root_of_trust_info(void)
  46. {
  47. unsigned char public_key[PUBK_LEN] = {0};
  48. unsigned char public_key_hash[SHA256_LENGTH] = {0};
  49. int device_lock_state = 0;
  50. unsigned int os_version = 0;
  51. dprintf(INFO,"sending root of trust info...\n");
  52. /* read public key and generate SHA256(pubk) */
  53. if(sec_get_pubk(public_key, PUBK_LEN))
  54. dprintf(CRITICAL,"fail to get public key info\n");
  55. if(sha256(public_key, PUBK_LEN, public_key_hash))
  56. dprintf(CRITICAL,"fail to calculate public key hash\n");
  57. /* query device lock */
  58. if(sec_query_device_lock(&device_lock_state))
  59. dprintf(CRITICAL,"fail to get device lock state\n");
  60. /* query os version and patch level */
  61. os_version = get_os_version();
  62. if(os_version == 0)
  63. dprintf(CRITICAL,"fail to get os version and patch level\n");
  64. #if 0
  65. for(int i=0; i<PUBK_LEN; i+=8)
  66. dprintf(CRITICAL,"public key [%d-%d] = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
  67. i, i+7, public_key[i], public_key[i+1], public_key[i+2], public_key[i+3],
  68. public_key[i+4], public_key[i+5], public_key[i+6], public_key[i+7]);
  69. for(int i=0; i<SHA256_LENGTH; i+=8)
  70. dprintf(CRITICAL,"hash [%d-%d] = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
  71. i, i+7, public_key_hash[i], public_key_hash[i+1], public_key_hash[i+2], public_key_hash[i+3],
  72. public_key_hash[i+4], public_key_hash[i+5], public_key_hash[i+6], public_key_hash[i+7]);
  73. dprintf(CRITICAL,"device lock state : %d\n", device_lock_state);
  74. dprintf(CRITICAL,"verified boot state : %d\n", g_boot_state);
  75. dprintf(CRITICAL,"os version : 0x%x\n", os_version);
  76. #endif
  77. /* send to ARM-TF via SMC call */
  78. unsigned int *p_hash = (unsigned int *)public_key_hash;
  79. unsigned int smc_ret = 0;
  80. /* send info. and the sequence : pubk(32B), device state(4B), boot state(4B), os version(4B) */
  81. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash), *(p_hash+1), *(p_hash+2), *(p_hash+3));
  82. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash+4), *(p_hash+5), *(p_hash+6), *(p_hash+7));
  83. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, device_lock_state, g_boot_state, os_version, 0x0);
  84. if(smc_ret)
  85. dprintf(CRITICAL,"fail to send root of trust info. : 0x%x\n", smc_ret);
  86. /* to test if SMC call is locked after previous 3 calls */
  87. smc_ret = smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, 0x0, 0x0, 0x0, 0x0);
  88. if(!smc_ret)
  89. dprintf(CRITICAL,"Warning! root of trust smc call is not locked : 0x%x\n", smc_ret);
  90. }