avb_RoT_teei.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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) 2019 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. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver\'s
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. #include <pal_typedefs.h>
  36. #include <pal_log.h>
  37. #include <load_vfy_boot.h>
  38. #include <verified_boot_common.h>
  39. #include <avb_slot_verify.h>
  40. #include <avb_ops.h>
  41. #define SHA256_LENGTH 32
  42. #define MTK_SIP_LK_ROOT_OF_TRUST_AARCH32 0x82000120
  43. #define AVB_ROT_DEBUG (0)
  44. #define OS_VERSION_KEY_IDX (0)
  45. #define OS_PATCHLEVEL_KEY_IDX (1)
  46. #define VENDOR_PATCHLEVEL_KEY_IDX (2)
  47. #define BOOT_PATCHLEVEL_KEY_IDX (3)
  48. #define NUM_AVB_VERSIONS (4)
  49. /* query verified boot state - g_boot_state */
  50. extern uint32_t g_boot_state;
  51. int sha256(uint8_t *data, unsigned long data_len, uint8_t *output_hash);
  52. int sec_query_device_lock(int *lock_state);
  53. struct vb_version {
  54. uint32_t os_version;
  55. uint32_t os_patchlevel;
  56. uint32_t vendor_patchlevel;
  57. uint32_t boot_patchlevel;
  58. };
  59. static struct vb_version g_vb_version;
  60. static uint8_t g_vbmeta_digest_sha256[SHA256_LENGTH] = {0};
  61. static const char *avb_version_key[NUM_AVB_VERSIONS] = {
  62. "com.android.build.system.os_version",
  63. "com.android.build.system.security_patch",
  64. "com.android.build.vendor.security_patch",
  65. "com.android.build.boot.security_patch",
  66. NULL
  67. };
  68. static const char *avb_version_str[NUM_AVB_VERSIONS] = {NULL};
  69. static uint32_t smc_call(uint32_t function_id, uint32_t arg0, uint32_t arg1,
  70. uint32_t arg2, uint32_t arg3)
  71. {
  72. uint32_t ret = 0;
  73. register uint32_t reg0 __asm__("r0") = function_id;
  74. register uint32_t reg1 __asm__("r1") = arg0;
  75. register uint32_t reg2 __asm__("r2") = arg1;
  76. register uint32_t reg3 __asm__("r3") = arg2;
  77. register uint32_t reg4 __asm__("r4") = arg3;
  78. __asm__ volatile("smc 0" : "+r"(reg0),
  79. "+r"(reg1), "+r"(reg2), "+r"(reg3), "+r"(reg4));
  80. ret = reg0;
  81. return ret;
  82. }
  83. static uint32_t version_str_to_uint(uint32_t ver_type, char *str,
  84. uint32_t str_sz)
  85. {
  86. #define MAX_OS_VER_NUM (3)
  87. uint32_t val = 0;
  88. uint32_t i = 0;
  89. uint32_t idx = 0;
  90. uint32_t xx[MAX_OS_VER_NUM] = {0};
  91. uint32_t yyyy = 0;
  92. uint32_t mm = 0;
  93. uint32_t dd = 0;
  94. /* return 0 for invalid version string */
  95. if (str == NULL || str_sz == 0)
  96. return 0;
  97. switch (ver_type) {
  98. case OS_VERSION_KEY_IDX:
  99. /* assume os_version format is
  100. * xx[0] or
  101. * xx[0].xx[1] or
  102. * xx[0].xx[1].xx[2]
  103. */
  104. for (i = 0; i < str_sz; i++) {
  105. if (str[i] == '.') {
  106. idx++;
  107. if (idx == MAX_OS_VER_NUM)
  108. break;
  109. } else if (str[i] < '0' || str[i] > '9') {
  110. pal_log_err("[%s] invalid os_version\n", __func__);
  111. return 0;
  112. }
  113. xx[idx] = xx[idx] * 10 + (str[i] - '0');
  114. }
  115. /* version overflow */
  116. for (idx = 0; idx < MAX_OS_VER_NUM; idx++)
  117. if (xx[idx] >= 100)
  118. xx[idx] = 99;
  119. val = 10000 * xx[0] + 100 * xx[1] + xx[2];
  120. break;
  121. case VENDOR_PATCHLEVEL_KEY_IDX:
  122. case BOOT_PATCHLEVEL_KEY_IDX:
  123. case OS_PATCHLEVEL_KEY_IDX:
  124. /* assume its format is YYYY-MM or YYYY-MM-DD */
  125. if (str_sz != 7 && str_sz != 10) {
  126. val = 0;
  127. break;
  128. }
  129. /* str_sz = 7 or 10 */
  130. for (i = 0; i < 4; i++) {
  131. if (str[i] < '0' && str[i] > '9')
  132. return 0;
  133. yyyy = yyyy * 10 + (uint32_t)(str[i] - '0');
  134. }
  135. val = yyyy;
  136. if (str[4] != '-')
  137. return 0;
  138. for (i = 5; i < 7; i++) {
  139. if (str[i] < '0' && str[i] > '9')
  140. return 0;
  141. mm = mm * 10 + (uint32_t)(str[i] - '0');
  142. }
  143. val = val * 100 + mm;
  144. if (str_sz == 10) {
  145. if (str[7] != '-')
  146. return 0;
  147. for (i = 8; i < 10; i++) {
  148. if (str[i] < '0' && str[i] > '9')
  149. return 0;
  150. dd = dd * 10 + (uint32_t)(str[i] - '0');
  151. }
  152. val = val * 100 + dd;
  153. }
  154. break;
  155. default:
  156. return 0;
  157. }
  158. if (ver_type == OS_PATCHLEVEL_KEY_IDX && val >= 1000000) {
  159. /* DD is ignored for os_patchlevel */
  160. val /= 100;
  161. }
  162. return val;
  163. }
  164. uint32_t collect_rot_info(AvbSlotVerifyData *slot_data)
  165. {
  166. uint32_t ret = 0;
  167. uint32_t i = 0;
  168. uint32_t j = 0;
  169. size_t out_val_size = 0;
  170. for (i = 0; i < slot_data->num_vbmeta_images; i++) {
  171. for (j = 0; j < NUM_AVB_VERSIONS; j++) {
  172. const char *val;
  173. if (avb_version_str[j])
  174. continue;
  175. val = avb_property_lookup(slot_data->vbmeta_images[i].vbmeta_data,
  176. slot_data->vbmeta_images[i].vbmeta_size,
  177. avb_version_key[j],
  178. 0,
  179. &out_val_size);
  180. if (out_val_size) {
  181. pal_log_err("%s is found in idx 0x%x, val = %s\n", avb_version_key[j], i, val);
  182. avb_version_str[j] = val;
  183. }
  184. out_val_size = 0;
  185. }
  186. }
  187. /* if os_version is not found, set it to "10" */
  188. if (avb_version_str[OS_VERSION_KEY_IDX] == NULL)
  189. avb_version_str[OS_VERSION_KEY_IDX] = "10";
  190. if (avb_version_str[OS_VERSION_KEY_IDX]) {
  191. g_vb_version.os_version = version_str_to_uint(OS_VERSION_KEY_IDX,
  192. avb_version_str[OS_VERSION_KEY_IDX],
  193. strlen(avb_version_str[OS_VERSION_KEY_IDX]));
  194. }
  195. if (avb_version_str[OS_PATCHLEVEL_KEY_IDX]) {
  196. g_vb_version.os_patchlevel = version_str_to_uint(OS_PATCHLEVEL_KEY_IDX,
  197. avb_version_str[OS_PATCHLEVEL_KEY_IDX],
  198. strlen(avb_version_str[OS_PATCHLEVEL_KEY_IDX]));
  199. }
  200. if (avb_version_str[VENDOR_PATCHLEVEL_KEY_IDX]) {
  201. g_vb_version.vendor_patchlevel = version_str_to_uint(VENDOR_PATCHLEVEL_KEY_IDX,
  202. avb_version_str[VENDOR_PATCHLEVEL_KEY_IDX],
  203. strlen(avb_version_str[VENDOR_PATCHLEVEL_KEY_IDX]));
  204. }
  205. if (avb_version_str[BOOT_PATCHLEVEL_KEY_IDX]) {
  206. g_vb_version.boot_patchlevel = version_str_to_uint(BOOT_PATCHLEVEL_KEY_IDX,
  207. avb_version_str[BOOT_PATCHLEVEL_KEY_IDX],
  208. strlen(avb_version_str[BOOT_PATCHLEVEL_KEY_IDX]));
  209. }
  210. avb_slot_verify_data_calculate_vbmeta_digest(
  211. slot_data, AVB_DIGEST_TYPE_SHA256, g_vbmeta_digest_sha256);
  212. #if AVB_ROT_DEBUG
  213. for (i = 0; i < NUM_AVB_VERSIONS; i++)
  214. pal_log_err("avb version str[%s] = %s\n", avb_version_key[i],
  215. avb_version_str[i] == NULL ? "NOT FOUND" : avb_version_str[i]);
  216. pal_log_err("os_version = %u\n", g_vb_version.os_version);
  217. pal_log_err("os_patchlevel = %u\n", g_vb_version.os_patchlevel);
  218. pal_log_err("vendor_patchlevel = %u\n", g_vb_version.vendor_patchlevel);
  219. pal_log_err("boot_patchlevel = %u\n", g_vb_version.boot_patchlevel);
  220. pal_log_err("vbmeta_digest =\n");
  221. for (i = 0; i < AVB_SHA256_DIGEST_SIZE; i++)
  222. pal_log_err("0x%x\n", g_vbmeta_digest_sha256[i]);
  223. #endif /* AVB_ROT_DEBUG */
  224. return ret;
  225. }
  226. static inline void smc_out(uint32_t id,
  227. uint32_t p0,
  228. uint32_t p1,
  229. uint32_t p2)
  230. {
  231. uint32_t fun_id = (uint32_t)id;
  232. uint32_t temp[3];
  233. temp[0] = p0;
  234. temp[1] = p1;
  235. temp[2] = p2;
  236. __asm__ volatile(
  237. ".arch_extension sec\n"
  238. "mov r0, %[fun_id]\n\t"
  239. "ldr r1, [%[temp], #0]\n\t"
  240. "ldr r2, [%[temp], #4]\n\t"
  241. "ldr r3, [%[temp], #8]\n\t"
  242. "smc 0\n\t"
  243. "nop\n\t"
  244. "nop\n\t"
  245. "nop"
  246. : :
  247. [fun_id] "r" (fun_id), [temp] "r" (temp)
  248. : "r0", "r1", "r2", "r3", "memory");
  249. }
  250. /*This field id is fixed by arm*/
  251. #define ID_FIELD_F_FAST_SMC_CALL 1
  252. #define ID_FIELD_F_STANDARD_SMC_CALL 0
  253. #define ID_FIELD_W_64 1
  254. #define ID_FIELD_W_32 0
  255. #define ID_FIELD_T_ARM_SERVICE 0
  256. #define ID_FIELD_T_CPU_SERVICE 1
  257. #define ID_FIELD_T_SIP_SERVICE 2
  258. #define ID_FIELD_T_OEM_SERVICE 3
  259. #define ID_FIELD_T_STANDARD_SERVICE 4
  260. /*TA Call 48-49*/
  261. #define ID_FIELD_T_TA_SERVICE0 48
  262. #define ID_FIELD_T_TA_SERVICE1 49
  263. /*TOS Call 50-63*/
  264. #define ID_FIELD_T_TRUSTED_OS_SERVICE0 50
  265. #define ID_FIELD_T_TRUSTED_OS_SERVICE1 51
  266. #define ID_FIELD_T_TRUSTED_OS_SERVICE2 52
  267. #define ID_FIELD_T_TRUSTED_OS_SERVICE3 53
  268. #define TEEI_CORE_COUNT PLATFORM_CORE_COUNT
  269. #define MAKE_SMC_CALL_ID(F, W, T, FN) (((F)<<31)|((W)<<30)|((T)<<24)|(FN))
  270. void send_root_of_trust_info(void)
  271. {
  272. uint8_t public_key[PUBK_LEN] = {0};
  273. uint8_t public_key_hash[SHA256_LENGTH] = {0};
  274. int device_lock_state = 0;
  275. pal_log_info("sending root of trust info...\n");
  276. /* read public key and generate SHA256(pubk) */
  277. if (sec_get_pubk(public_key, PUBK_LEN))
  278. pal_log_err("fail to get public key info\n");
  279. if (sha256(public_key, PUBK_LEN, public_key_hash))
  280. pal_log_err("fail to calculate public key hash\n");
  281. /* query device lock */
  282. if (sec_query_device_lock(&device_lock_state))
  283. pal_log_err("fail to get device lock state\n");
  284. pal_log_err("device lock state %d\n", device_lock_state);
  285. /* send to ARM-TF via SMC call */
  286. uint32_t *p_hash = (uint32_t *)public_key_hash;
  287. uint32_t *p_vbmeta_digest = (uint32_t *)g_vbmeta_digest_sha256;
  288. uint32_t smc_ret = 0;
  289. #define MTK_SIP_LK_ROOT_OF_TRUST_AARCH32 MAKE_SMC_CALL_ID(ID_FIELD_F_FAST_SMC_CALL, ID_FIELD_W_32, ID_FIELD_T_TRUSTED_OS_SERVICE2, 10)
  290. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash), *(p_hash+1), *(p_hash+2));
  291. pal_log_err("%x, %x, %x\n\n", *(p_hash), *(p_hash+1), *(p_hash+2));
  292. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash+3), *(p_hash+4), *(p_hash+5));
  293. pal_log_err("%x, %x, %x\n\n", *(p_hash+3), *(p_hash+4), *(p_hash+5));
  294. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash+6), *(p_hash+7), device_lock_state);
  295. pal_log_err("%x, %x, %x\n\n", *(p_hash+6), *(p_hash+7), device_lock_state);
  296. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, g_boot_state, g_vb_version.os_version, g_vb_version.os_patchlevel);
  297. pal_log_err("%x, %x, %x\n\n", g_boot_state, g_vb_version.os_version, g_vb_version.os_patchlevel);
  298. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_vbmeta_digest), *(p_vbmeta_digest+1), *(p_vbmeta_digest+2));
  299. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_vbmeta_digest+3), *(p_vbmeta_digest+4), *(p_vbmeta_digest+5));
  300. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_vbmeta_digest+6), *(p_vbmeta_digest+7), g_vb_version.vendor_patchlevel);
  301. smc_out(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, g_vb_version.boot_patchlevel, 0, 0);
  302. }