avb_RoT_tkcore.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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 <string.h>
  38. #include <load_vfy_boot.h>
  39. #include <verified_boot_common.h>
  40. #include <avb_slot_verify.h>
  41. #include <avb_ops.h>
  42. #include <avb_property_descriptor.h>
  43. #define SHA256_LENGTH 32
  44. #define MTK_SIP_LK_ROOT_OF_TRUST_AARCH32 0x82000120
  45. #define AVB_ROT_DEBUG (0)
  46. #define OS_VERSION_KEY_IDX (0)
  47. #define OS_PATCHLEVEL_KEY_IDX (1)
  48. #define VENDOR_PATCHLEVEL_KEY_IDX (2)
  49. #define BOOT_PATCHLEVEL_KEY_IDX (3)
  50. #define NUM_AVB_VERSIONS (4)
  51. /* query verified boot state - g_boot_state */
  52. extern uint32_t g_boot_state;
  53. int sha256(uint8_t *data, unsigned long data_len, uint8_t *output_hash);
  54. int sec_query_device_lock(int *lock_state);
  55. struct vb_version {
  56. uint32_t os_version;
  57. uint32_t os_patchlevel;
  58. uint32_t vendor_patchlevel;
  59. uint32_t boot_patchlevel;
  60. };
  61. static struct vb_version g_vb_version;
  62. static uint8_t g_vbmeta_digest_sha256[SHA256_LENGTH] = {0};
  63. static const char *avb_version_key[NUM_AVB_VERSIONS] = {
  64. "com.android.build.system.os_version",
  65. "com.android.build.system.security_patch",
  66. "com.android.build.vendor.security_patch",
  67. "com.android.build.boot.security_patch",
  68. };
  69. static const char *avb_version_str[NUM_AVB_VERSIONS] = {NULL};
  70. static uint32_t smc_call(uint32_t function_id, uint32_t arg0, uint32_t arg1,
  71. uint32_t arg2, uint32_t arg3)
  72. {
  73. uint32_t ret = 0;
  74. register uint32_t reg0 __asm__("r0") = function_id;
  75. register uint32_t reg1 __asm__("r1") = arg0;
  76. register uint32_t reg2 __asm__("r2") = arg1;
  77. register uint32_t reg3 __asm__("r3") = arg2;
  78. register uint32_t reg4 __asm__("r4") = arg3;
  79. __asm__ volatile("smc 0" : "+r"(reg0),
  80. "+r"(reg1), "+r"(reg2), "+r"(reg3), "+r"(reg4));
  81. ret = reg0;
  82. return ret;
  83. }
  84. static uint32_t version_str_to_uint(uint32_t ver_type, const char *str,
  85. uint32_t str_sz)
  86. {
  87. #define MAX_OS_VER_NUM (3)
  88. uint32_t val = 0;
  89. uint32_t i = 0;
  90. uint32_t idx = 0;
  91. uint32_t xx[MAX_OS_VER_NUM] = {0};
  92. uint32_t yyyy = 0;
  93. uint32_t mm = 0;
  94. uint32_t dd = 0;
  95. /* return 0 for invalid version string */
  96. if (str == NULL || str_sz == 0)
  97. return 0;
  98. switch (ver_type) {
  99. case OS_VERSION_KEY_IDX:
  100. /* assume os_version format is
  101. * xx[0] or
  102. * xx[0].xx[1] or
  103. * xx[0].xx[1].xx[2]
  104. */
  105. if (str_sz == 1 && (str[0] >= 'M' && str[0] <= 'Z')) {
  106. xx[0] = str[0] - 'M' + 6;
  107. } else {
  108. for (i = 0; i < str_sz; i++) {
  109. if (str[i] == '.') {
  110. idx++;
  111. if (idx == MAX_OS_VER_NUM)
  112. break;
  113. } else if (str[i] < '0' || str[i] > '9') {
  114. pal_log_err("[%s] invalid os_version\n", __func__);
  115. return 0;
  116. }
  117. xx[idx] = xx[idx] * 10 + (str[i] - '0');
  118. }
  119. }
  120. /* version overflow */
  121. for (idx = 0; idx < MAX_OS_VER_NUM; idx++)
  122. if (xx[idx] >= 100)
  123. xx[idx] = 99;
  124. val = 10000 * xx[0] + 100 * xx[1] + xx[2];
  125. break;
  126. case VENDOR_PATCHLEVEL_KEY_IDX:
  127. case BOOT_PATCHLEVEL_KEY_IDX:
  128. case OS_PATCHLEVEL_KEY_IDX:
  129. /* assume its format is YYYY-MM or YYYY-MM-DD */
  130. if (str_sz != 7 && str_sz != 10) {
  131. val = 0;
  132. break;
  133. }
  134. /* str_sz = 7 or 10 */
  135. for (i = 0; i < 4; i++) {
  136. if (str[i] < '0' && str[i] > '9')
  137. return 0;
  138. yyyy = yyyy * 10 + (uint32_t)(str[i] - '0');
  139. }
  140. val = yyyy;
  141. if (str[4] != '-')
  142. return 0;
  143. for (i = 5; i < 7; i++) {
  144. if (str[i] < '0' && str[i] > '9')
  145. return 0;
  146. mm = mm * 10 + (uint32_t)(str[i] - '0');
  147. }
  148. val = val * 100 + mm;
  149. if (str_sz == 10) {
  150. if (str[7] != '-')
  151. return 0;
  152. for (i = 8; i < 10; i++) {
  153. if (str[i] < '0' && str[i] > '9')
  154. return 0;
  155. dd = dd * 10 + (uint32_t)(str[i] - '0');
  156. }
  157. val = val * 100 + dd;
  158. }
  159. break;
  160. default:
  161. return 0;
  162. }
  163. if (ver_type == OS_PATCHLEVEL_KEY_IDX && val >= 1000000) {
  164. /* DD is ignored for os_patchlevel */
  165. val /= 100;
  166. }
  167. return val;
  168. }
  169. uint32_t collect_rot_info(AvbSlotVerifyData *slot_data)
  170. {
  171. uint32_t ret = 0;
  172. uint32_t i = 0;
  173. uint32_t j = 0;
  174. size_t out_val_size = 0;
  175. for (i = 0; i < slot_data->num_vbmeta_images; i++) {
  176. for (j = 0; j < NUM_AVB_VERSIONS; j++) {
  177. const char *val;
  178. if (avb_version_str[j])
  179. continue;
  180. val = avb_property_lookup(slot_data->vbmeta_images[i].vbmeta_data,
  181. slot_data->vbmeta_images[i].vbmeta_size,
  182. avb_version_key[j],
  183. 0,
  184. &out_val_size);
  185. if (out_val_size) {
  186. pal_log_err("%s is found in idx 0x%x, val = %s\n", avb_version_key[j], i, val);
  187. avb_version_str[j] = val;
  188. }
  189. out_val_size = 0;
  190. }
  191. }
  192. /* if os_version is not found, set it to "10" */
  193. if (avb_version_str[OS_VERSION_KEY_IDX] == NULL)
  194. avb_version_str[OS_VERSION_KEY_IDX] = "10";
  195. if (avb_version_str[OS_VERSION_KEY_IDX]) {
  196. g_vb_version.os_version = version_str_to_uint(OS_VERSION_KEY_IDX,
  197. avb_version_str[OS_VERSION_KEY_IDX],
  198. strlen(avb_version_str[OS_VERSION_KEY_IDX]));
  199. }
  200. if (avb_version_str[OS_PATCHLEVEL_KEY_IDX]) {
  201. g_vb_version.os_patchlevel = version_str_to_uint(OS_PATCHLEVEL_KEY_IDX,
  202. avb_version_str[OS_PATCHLEVEL_KEY_IDX],
  203. strlen(avb_version_str[OS_PATCHLEVEL_KEY_IDX]));
  204. }
  205. if (avb_version_str[VENDOR_PATCHLEVEL_KEY_IDX]) {
  206. g_vb_version.vendor_patchlevel = version_str_to_uint(VENDOR_PATCHLEVEL_KEY_IDX,
  207. avb_version_str[VENDOR_PATCHLEVEL_KEY_IDX],
  208. strlen(avb_version_str[VENDOR_PATCHLEVEL_KEY_IDX]));
  209. }
  210. if (avb_version_str[BOOT_PATCHLEVEL_KEY_IDX]) {
  211. g_vb_version.boot_patchlevel = version_str_to_uint(BOOT_PATCHLEVEL_KEY_IDX,
  212. avb_version_str[BOOT_PATCHLEVEL_KEY_IDX],
  213. strlen(avb_version_str[BOOT_PATCHLEVEL_KEY_IDX]));
  214. }
  215. avb_slot_verify_data_calculate_vbmeta_digest(
  216. slot_data, AVB_DIGEST_TYPE_SHA256, g_vbmeta_digest_sha256);
  217. #if AVB_ROT_DEBUG
  218. for (i = 0; i < NUM_AVB_VERSIONS; i++)
  219. pal_log_err("avb version str[%s] = %s\n", avb_version_key[i],
  220. avb_version_str[i] == NULL ? "NOT FOUND" : avb_version_str[i]);
  221. pal_log_err("os_version = %u\n", g_vb_version.os_version);
  222. pal_log_err("os_patchlevel = %u\n", g_vb_version.os_patchlevel);
  223. pal_log_err("vendor_patchlevel = %u\n", g_vb_version.vendor_patchlevel);
  224. pal_log_err("boot_patchlevel = %u\n", g_vb_version.boot_patchlevel);
  225. pal_log_err("vbmeta_digest =\n");
  226. for (i = 0; i < AVB_SHA256_DIGEST_SIZE; i++)
  227. pal_log_err("0x%x\n", g_vbmeta_digest_sha256[i]);
  228. #endif /* AVB_ROT_DEBUG */
  229. return ret;
  230. }
  231. void send_root_of_trust_info(void)
  232. {
  233. uint8_t public_key[PUBK_LEN] = {0};
  234. uint8_t public_key_hash[SHA256_LENGTH] = {0};
  235. int device_lock_state = 0;
  236. pal_log_info("sending root of trust info...\n");
  237. /* read public key and generate SHA256(pubk) */
  238. if (sec_get_pubk(public_key, PUBK_LEN))
  239. pal_log_err("fail to get public key info\n");
  240. if (sha256(public_key, PUBK_LEN, public_key_hash))
  241. pal_log_err("fail to calculate public key hash\n");
  242. /* query device lock */
  243. if (sec_query_device_lock(&device_lock_state))
  244. pal_log_err("fail to get device lock state\n");
  245. /* send to ARM-TF via SMC call */
  246. uint32_t *p_hash = (uint32_t *)public_key_hash;
  247. uint32_t *p_vbmeta_digest = (uint32_t *)g_vbmeta_digest_sha256;
  248. uint32_t smc_ret = 0;
  249. /* send info. and the sequence : pubk(32B), device state(4B), boot state(4B), os version(4B) */
  250. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash), *(p_hash + 1),
  251. *(p_hash + 2), *(p_hash + 3));
  252. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_hash + 4),
  253. *(p_hash + 5), *(p_hash + 6), *(p_hash + 7));
  254. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, device_lock_state,
  255. g_boot_state, g_vb_version.os_version, g_vb_version.os_patchlevel);
  256. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_vbmeta_digest),
  257. *(p_vbmeta_digest + 1), *(p_vbmeta_digest + 2), *(p_vbmeta_digest + 3));
  258. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, *(p_vbmeta_digest + 4),
  259. *(p_vbmeta_digest + 5), *(p_vbmeta_digest + 6), *(p_vbmeta_digest + 7));
  260. smc_ret |= smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32,
  261. g_vb_version.vendor_patchlevel, g_vb_version.boot_patchlevel, 0, 0);
  262. if (smc_ret)
  263. pal_log_err("fail to send root of trust info. : 0x%x\n", smc_ret);
  264. /* to test if SMC call is locked after previous 6 calls */
  265. smc_ret = smc_call(MTK_SIP_LK_ROOT_OF_TRUST_AARCH32, 0x0, 0x0, 0x0, 0x0);
  266. if (!smc_ret)
  267. pal_log_err("Warning! root of trust smc call is not locked : 0x%x\n", smc_ret);
  268. }