sec_root.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. #if defined(MTK_EMMC_SUPPORT) && defined(TRUSTONIC_TEE_SUPPORT)
  37. #include <platform/mmc_rpmb.h>
  38. extern int sec_query_device_lock(int *lock_state);
  39. extern u32 get_devinfo_with_index(u32 index);
  40. extern int32_t rpmb_init(void);
  41. extern int32_t rpmb_uninit(void);
  42. extern int compute_random_pattern(unsigned int *magic_pattern);
  43. #define DATA_LEN (8)
  44. #define BOOT_IMG_VERIFIED (1)
  45. #define ID_INDEX (12)
  46. unsigned int g_random_pattern;
  47. /* #define RPMB_DEBUG */
  48. void show_root_status(void)
  49. {
  50. int ret = 0;
  51. u32 *root_status = NULL;
  52. u32 data_buf[DATA_LEN] = {0};
  53. ret = mmc_rpmb_read_data(0x0, data_buf, DATA_LEN);
  54. if (ret) {
  55. dprintf(CRITICAL, "[%s] mmc_rpmb_read_data failed\n", __func__);
  56. video_printf(" => Software status: unable to read!!\n");
  57. return;
  58. }
  59. #if defined(RPMB_DEBUG)
  60. dprintf(INFO, "[%s] after readback, dump buf\n", __func__);
  61. dprintf(INFO,"%02x %02x %02x %02x %02x %02x %02x %02x \n",
  62. data_buf[0], data_buf[1], data_buf[2], data_buf[3],
  63. data_buf[4], data_buf[5], data_buf[6], data_buf[7]);
  64. #endif
  65. root_status = (u32*)data_buf;
  66. if ((*root_status) > 1) {
  67. video_printf(" => Software status: Modified(0x%x)\n", *root_status);
  68. dprintf(INFO," => Software status: Modified(0x%x)\n", *root_status);
  69. } else {
  70. video_printf(" => Software status: Official(0x%x)\n", *root_status);
  71. dprintf(INFO," => Software status: Official(0x%x)\n", *root_status);
  72. }
  73. }
  74. int reset_root_status(u32 sec_boot_check_status)
  75. {
  76. u32 data_buf[DATA_LEN] = {0};
  77. int ret = B_OK;
  78. if (BOOT_IMG_VERIFIED == sec_boot_check_status) {
  79. /* clear root status */
  80. ret = mmc_rpmb_write_data(0x0, data_buf, DATA_LEN);
  81. if (ret) {
  82. dprintf(CRITICAL, "[%s] mmc_rpmb_write_data failed\n", __func__);
  83. } else {
  84. dprintf(INFO, "[%s] mmc_rpmb_write_data succeed\n", __func__);
  85. ret = B_OK;
  86. }
  87. }
  88. return ret;
  89. }
  90. void root_status_check(u32 sec_boot_check_status)
  91. {
  92. int ret = B_OK;
  93. int lock_state;
  94. rpmb_init();
  95. /* compute random pattern for rpmb driver */
  96. compute_random_pattern(&g_random_pattern);
  97. ret = sec_query_device_lock(&lock_state);
  98. if (ret == B_OK) {
  99. /*
  100. * if it's in lock state and boot image is verified pass,
  101. * reset the root status.
  102. */
  103. dprintf(INFO, "[%s] lock state:%d sec_boot_check:%d\n", __func__
  104. , lock_state, sec_boot_check_status);
  105. if ((1 == lock_state) && (1 == sec_boot_check_status)) {
  106. dprintf(INFO, "[%s] reset root status\n", __func__);
  107. ret = reset_root_status(sec_boot_check_status);
  108. if (ret == B_OK) {
  109. dprintf(INFO, "[%s] reset root status succeed!!\n", __func__);
  110. } else {
  111. dprintf(CRITICAL, "[%s] reset root status failed!!\n", __func__);
  112. }
  113. }
  114. } else {
  115. dprintf(CRITICAL, "[%s] query lock state failed!!\n", __func__);
  116. }
  117. show_root_status();
  118. /* clear random pattern */
  119. g_random_pattern = 0;
  120. /* mark leaving lk. */
  121. rpmb_uninit();
  122. }
  123. #ifdef RPMB_DEBUG
  124. void dump_buf(u8 *buf, uint32_t size)
  125. {
  126. unsigned int i;
  127. for (i = 0; i < size/8; i++) {
  128. dprintf(CRITICAL,"%02x %02x %02x %02x %02x %02x %02x %02x \n",
  129. buf[0+i*8], buf[1+i*8], buf[2+i*8], buf[3+i*8],
  130. buf[4+i*8], buf[5+i*8], buf[6+i*8], buf[7+i*8]);
  131. }
  132. for (i = 0; i < size%8; i++) {
  133. dprintf(CRITICAL,"%02x \n", buf[((size/8)*8) + i]);
  134. }
  135. return;
  136. }
  137. #endif //RPMB_DEBUG
  138. #endif //defined(MTK_EMMC_SUPPORT) && defined(TRUSTONIC_TEE_SUPPORT)