sec_root.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <stdlib.h>
  32. #include <string.h>
  33. #include <video.h>
  34. #include <printf.h>
  35. #include <platform/sec_status.h>
  36. #include <arch/arm/mmu.h>
  37. #if defined(MTK_EMMC_SUPPORT) && defined(TRUSTONIC_TEE_SUPPORT)
  38. #include <platform/mmc_rpmb.h>
  39. extern int sec_query_device_lock(int *lock_state);
  40. extern u32 get_devinfo_with_index(u32 index);
  41. extern int32_t rpmb_init(void);
  42. extern int32_t rpmb_uninit(void);
  43. extern int compute_random_pattern(unsigned int *magic_pattern);
  44. #define DATA_LEN (8)
  45. #define BOOT_IMG_VERIFIED (1)
  46. #define ID_INDEX (12)
  47. unsigned int g_random_pattern;
  48. /* #define RPMB_DEBUG */
  49. void show_root_status(void)
  50. {
  51. int ret = 0;
  52. u32 *root_status = NULL;
  53. u32 data_buf[DATA_LEN] = {0};
  54. ret = mmc_rpmb_read_data(0x0, data_buf, DATA_LEN);
  55. if (ret) {
  56. dprintf(CRITICAL, "[%s] mmc_rpmb_read_data failed\n", __func__);
  57. video_printf(" => Software status: unable to read!!\n");
  58. return;
  59. }
  60. #if defined(RPMB_DEBUG)
  61. dprintf(INFO, "[%s] after readback, dump buf\n", __func__);
  62. dprintf(INFO,"%02x %02x %02x %02x %02x %02x %02x %02x \n",
  63. data_buf[0], data_buf[1], data_buf[2], data_buf[3],
  64. data_buf[4], data_buf[5], data_buf[6], data_buf[7]);
  65. #endif
  66. root_status = (u32*)data_buf;
  67. if ((*root_status) > 1) {
  68. video_printf(" => Software status: Modified(0x%x)\n", *root_status);
  69. dprintf(INFO," => Software status: Modified(0x%x)\n", *root_status);
  70. } else {
  71. video_printf(" => Software status: Official(0x%x)\n", *root_status);
  72. dprintf(INFO," => Software status: Official(0x%x)\n", *root_status);
  73. }
  74. }
  75. int reset_root_status(u32 sec_boot_check_status)
  76. {
  77. u32 data_buf[DATA_LEN] = {0};
  78. int ret = B_OK;
  79. if (BOOT_IMG_VERIFIED == sec_boot_check_status) {
  80. /* clear root status */
  81. ret = mmc_rpmb_write_data(0x0, data_buf, DATA_LEN);
  82. if (ret) {
  83. dprintf(CRITICAL, "[%s] mmc_rpmb_write_data failed\n", __func__);
  84. } else {
  85. dprintf(INFO, "[%s] mmc_rpmb_write_data succeed\n", __func__);
  86. ret = B_OK;
  87. }
  88. }
  89. return ret;
  90. }
  91. void root_status_check(u32 sec_boot_check_status)
  92. {
  93. int ret = B_OK;
  94. int lock_state;
  95. uint32_t start, size;
  96. /* map shared memory for rpmb */
  97. start = ROUNDDOWN((uint32_t)LK_SHARED_MEM_ADDR, PAGE_SIZE);
  98. size = PAGE_SIZE*2;
  99. arch_mmu_map((uint64_t)start, (uint32_t)start,
  100. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK | MMU_MEMORY_AP_P_RW_U_NA, ROUNDUP(size, PAGE_SIZE));
  101. rpmb_init();
  102. /* compute random pattern for rpmb driver */
  103. compute_random_pattern(&g_random_pattern);
  104. ret = sec_query_device_lock(&lock_state);
  105. if (ret == B_OK) {
  106. /*
  107. * if it's in lock state and boot image is verified pass,
  108. * reset the root status.
  109. */
  110. dprintf(INFO, "[%s] lock state:%d sec_boot_check:%d\n", __func__
  111. , lock_state, sec_boot_check_status);
  112. if ((1 == lock_state) && (1 == sec_boot_check_status)) {
  113. dprintf(INFO, "[%s] reset root status\n", __func__);
  114. ret = reset_root_status(sec_boot_check_status);
  115. if (ret == B_OK) {
  116. dprintf(INFO, "[%s] reset root status succeed!!\n", __func__);
  117. } else {
  118. dprintf(CRITICAL, "[%s] reset root status failed!!\n", __func__);
  119. }
  120. }
  121. } else {
  122. dprintf(CRITICAL, "[%s] query lock state failed!!\n", __func__);
  123. }
  124. show_root_status();
  125. /* clear random pattern */
  126. g_random_pattern = 0;
  127. /* mark leaving lk. */
  128. rpmb_uninit();
  129. }
  130. #ifdef RPMB_DEBUG
  131. void dump_buf(u8 *buf, uint32_t size)
  132. {
  133. unsigned int i;
  134. for (i = 0; i < size/8; i++) {
  135. dprintf(CRITICAL,"%02x %02x %02x %02x %02x %02x %02x %02x \n",
  136. buf[0+i*8], buf[1+i*8], buf[2+i*8], buf[3+i*8],
  137. buf[4+i*8], buf[5+i*8], buf[6+i*8], buf[7+i*8]);
  138. }
  139. for (i = 0; i < size%8; i++) {
  140. dprintf(CRITICAL,"%02x \n", buf[((size/8)*8) + i]);
  141. }
  142. return;
  143. }
  144. #endif //RPMB_DEBUG
  145. #endif //defined(MTK_EMMC_SUPPORT) && defined(TRUSTONIC_TEE_SUPPORT)