tz_secure_clock.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #include "tz_secure_clock.h"
  2. #ifdef TZ_SECURETIME_SUPPORT
  3. uint32_t TEE_update_gb_time_intee(KREE_SESSION_HANDLE session,
  4. KREE_SESSION_HANDLE mem_session)
  5. {
  6. MTEEC_PARAM param[4];
  7. uint32_t paramTypes;
  8. TZ_RESULT ret = TZ_RESULT_SUCCESS;
  9. uint32_t file_result = GB_TIME_FILE_OK_SIGN;
  10. struct file *file = NULL;
  11. UINT64 u8Offset = 0;
  12. int i = 0;
  13. int err = -ENODEV;
  14. struct rtc_time tm;
  15. DRM_UINT64 time_count64;
  16. unsigned long time_count;
  17. struct rtc_device *rtc;
  18. struct TZ_GB_SECURETIME_INFO secure_time;
  19. DRM_UINT64 cur_counter;
  20. pr_warn("enter TEE_update_gb_time_intee\n");
  21. rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
  22. if (rtc == NULL) {
  23. pr_warn("%s: unable to open rtc device (%s)\n",
  24. __FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
  25. goto err_open;
  26. }
  27. paramTypes = TZ_ParamTypes3(TZPT_MEM_INPUT, TZPT_MEM_INPUT,
  28. TZPT_VALUE_OUTPUT);
  29. param[0].mem.buffer = (void *) &secure_time;
  30. param[0].mem.size = sizeof(struct TZ_GB_SECURETIME_INFO);
  31. param[1].mem.buffer = (void *) &cur_counter;
  32. param[1].mem.size = sizeof(DRM_UINT64);
  33. file = FILE_Open(GB_TIME_FILE_SAVE_PATH, O_RDWR, S_IRWXU);
  34. if (file) {
  35. FILE_Read(file, (void *) &secure_time,
  36. sizeof(struct TZ_GB_SECURETIME_INFO), &u8Offset);
  37. filp_close(file, NULL);
  38. } else {
  39. file_result = GB_NO_SECURETD_FILE;
  40. goto err_read;
  41. }
  42. for (i = 0; i < sizeof(struct TZ_GB_SECURETIME_INFO); i++)
  43. pr_warn("%02x", ((char *)&secure_time)[i]);
  44. pr_warn("\n");
  45. err = rtc_read_time(rtc, &tm);
  46. if (err) {
  47. dev_err(rtc->dev.parent,
  48. "hctosys: unable to read the hardware clock\n");
  49. goto err_read;
  50. }
  51. err = rtc_valid_tm(&tm);
  52. if (err) {
  53. dev_err(rtc->dev.parent, "hctosys: invalid date/time\n");
  54. goto err_invalid;
  55. }
  56. rtc_tm_to_time(&tm, &time_count);
  57. time_count64 = (DRM_UINT64)time_count;
  58. memcpy((char *) &cur_counter,
  59. (char *) &time_count64,
  60. sizeof(DRM_UINT64));
  61. ret = KREE_TeeServiceCall(session,
  62. TZCMD_SECURETIME_SET_CURRENT_COUNTER,
  63. paramTypes, param);
  64. if (ret != TZ_RESULT_SUCCESS)
  65. pr_warn("ServiceCall TZCMD_SECURETIME_SET_CURRENT_COUNTER error %d\n",
  66. ret);
  67. if (param[2].value.a == GB_TIME_FILE_ERROR_SIGN) {
  68. file_result = GB_TIME_FILE_ERROR_SIGN;
  69. pr_warn("ServiceCall TZCMD_SECURETIME_SET_CURRENT_COUNTER file_result %d\n",
  70. file_result);
  71. } else if (param[2].value.a == GB_TIME_FILE_OK_SIGN) {
  72. file_result = GB_TIME_FILE_OK_SIGN;
  73. pr_warn("ServiceCall TZCMD_SECURETIME_SET_CURRENT_COUNTER file_result %d\n",
  74. file_result);
  75. }
  76. err_invalid:
  77. err_read:
  78. rtc_class_close(rtc);
  79. err_open:
  80. if (file_result == GB_TIME_FILE_OK_SIGN)
  81. return ret;
  82. else
  83. return file_result;
  84. }
  85. uint32_t TEE_update_gb_time_infile(KREE_SESSION_HANDLE session,
  86. KREE_SESSION_HANDLE mem_session)
  87. {
  88. uint32_t *shm_p;
  89. MTEEC_PARAM param[4];
  90. uint32_t paramTypes;
  91. TZ_RESULT ret = TZ_RESULT_SUCCESS;
  92. struct file *file = NULL;
  93. UINT64 u8Offset = 0;
  94. pr_warn("enter TEE_update_gb_time_infile\n");
  95. shm_p = kmalloc(sizeof(struct TZ_GB_SECURETIME_INFO), GFP_KERNEL);
  96. paramTypes = TZ_ParamTypes3(TZPT_MEM_OUTPUT, TZPT_VALUE_INPUT,
  97. TZPT_VALUE_OUTPUT);
  98. param[0].mem.buffer = shm_p;
  99. param[0].mem.size = sizeof(struct TZ_GB_SECURETIME_INFO);
  100. param[1].value.a = 0;
  101. ret = KREE_TeeServiceCall(session, TZCMD_SECURETIME_GET_CURRENT_COUNTER,
  102. paramTypes, param);
  103. if (ret != TZ_RESULT_SUCCESS) {
  104. pr_warn("ServiceCall error %d\n", ret);
  105. goto tz_error;
  106. }
  107. file = FILE_Open(GB_TIME_FILE_SAVE_PATH, O_RDWR|O_CREAT, S_IRWXU);
  108. if (file) {
  109. FILE_Write(file, (void *)shm_p,
  110. sizeof(struct TZ_GB_SECURETIME_INFO), &u8Offset);
  111. filp_close(file, NULL);
  112. } else {
  113. pr_warn("FILE_Open GB_TIME_FILE_SAVE_PATH return NULL\n");
  114. }
  115. tz_error:
  116. if (shm_p != NULL)
  117. kfree(shm_p);
  118. return ret;
  119. }
  120. uint32_t TEE_Icnt_time(KREE_SESSION_HANDLE session,
  121. KREE_SESSION_HANDLE mem_session)
  122. {
  123. uint32_t *shm_p;
  124. /*KREE_SHAREDMEM_PARAM shm_param;*/
  125. /*KREE_SHAREDMEM_HANDLE shm_handle;*/
  126. MTEEC_PARAM param[4];
  127. uint32_t paramTypes;
  128. TZ_RESULT ret;
  129. unsigned long time_count = 1392967151;
  130. struct rtc_device *rtc = NULL;
  131. struct rtc_time tm;
  132. int err = -ENODEV;
  133. ret = err;
  134. shm_p = kmalloc(sizeof(struct TM_GB), GFP_KERNEL);
  135. param[1].mem.buffer = shm_p;
  136. param[1].mem.size = sizeof(struct TM_GB);
  137. paramTypes = TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_MEM_OUTPUT);
  138. rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
  139. if (rtc == NULL) {
  140. pr_warn("%s: unable to open rtc device (%s)\n",
  141. __FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
  142. goto err_open;
  143. }
  144. err = rtc_read_time(rtc, &tm);
  145. if (err) {
  146. dev_err(rtc->dev.parent,
  147. "hctosys: unable to read the hardware clock\n");
  148. goto err_read;
  149. }
  150. err = rtc_valid_tm(&tm);
  151. if (err) {
  152. dev_err(rtc->dev.parent,
  153. "hctosys: invalid date/time\n");
  154. goto err_invalid;
  155. }
  156. rtc_tm_to_time(&tm, &time_count);
  157. #if 1
  158. pr_debug("securetime increase result: %d %d %d %d %d %d %d\n",
  159. tm.tm_yday, tm.tm_year, tm.tm_mon, tm.tm_mday,
  160. tm.tm_hour, tm.tm_min, tm.tm_sec);
  161. #endif
  162. param[0].value.a = time_count;
  163. ret = KREE_TeeServiceCall(session, TZCMD_SECURETIME_INC_CURRENT_COUNTER,
  164. paramTypes, param);
  165. if (ret != TZ_RESULT_SUCCESS)
  166. pr_warn("ServiceCall error %d\n", ret);
  167. #if 1
  168. pr_debug("securetime increase result: %d %d %d %d %d %d %d\n",
  169. ((struct TM_GB *) shm_p)->tm_yday,
  170. ((struct TM_GB *) shm_p)->tm_year,
  171. ((struct TM_GB *) shm_p)->tm_mon,
  172. ((struct TM_GB *) shm_p)->tm_mday,
  173. ((struct TM_GB *) shm_p)->tm_hour,
  174. ((struct TM_GB *) shm_p)->tm_min,
  175. ((struct TM_GB *) shm_p)->tm_sec);
  176. #endif
  177. err_read:
  178. err_invalid:
  179. rtc_class_close(rtc);
  180. err_open:
  181. if (shm_p != NULL)
  182. kfree(shm_p);
  183. return ret;
  184. }
  185. #define THREAD_COUNT_FREQ 5
  186. #define THREAD_SAVEFILE_VALUE (10*60) /* store secure time per minute */
  187. static int check_count;
  188. static KREE_SESSION_HANDLE icnt_session;
  189. static KREE_SESSION_HANDLE mem_session;
  190. #ifdef CONFIG_HAS_EARLYSUSPEND_GB
  191. static int securetime_savefile_gb(void)
  192. {
  193. int ret = 0;
  194. KREE_SESSION_HANDLE securetime_session = 0;
  195. KREE_SESSION_HANDLE mem_session = 0;
  196. ret = KREE_CreateSession(TZ_TA_SECURETIME_UUID, &securetime_session);
  197. if (ret != TZ_RESULT_SUCCESS) {
  198. pr_warn("[securetime]CreateSession error %d\n", ret);
  199. } else {
  200. ret = KREE_CreateSession(TZ_TA_MEM_UUID, &mem_session);
  201. TEE_update_gb_time_infile(securetime_session, mem_session);
  202. ret = KREE_CloseSession(securetime_session);
  203. if (ret != TZ_RESULT_SUCCESS)
  204. pr_warn("CloseSession error %d\n", ret);
  205. ret = KREE_CloseSession(mem_session);
  206. if (ret != TZ_RESULT_SUCCESS)
  207. pr_warn("[securetime]CloseMEMSession error %d\n", ret);
  208. }
  209. return ret;
  210. }
  211. static void st_early_suspend_gb(struct early_suspend *h)
  212. {
  213. pr_debug("[securetime]st_early_suspend_gb error\n");
  214. /*pr_debug("st_early_suspend: start\n"); */
  215. securetime_savefile_gb();
  216. }
  217. static void st_late_resume_gb(struct early_suspend *h)
  218. {
  219. int ret = 0;
  220. KREE_SESSION_HANDLE securetime_session = 0;
  221. KREE_SESSION_HANDLE mem_session = 0;
  222. ret = KREE_CreateSession(TZ_TA_SECURETIME_UUID, &securetime_session);
  223. if (ret != TZ_RESULT_SUCCESS) {
  224. pr_warn("[securetime]CreateSession error %d\n", ret);
  225. } else {
  226. ret = KREE_CreateSession(TZ_TA_MEM_UUID, &mem_session);
  227. TEE_update_gb_time_intee(securetime_session, mem_session);
  228. ret = KREE_CloseSession(securetime_session);
  229. if (ret != TZ_RESULT_SUCCESS)
  230. pr_warn("[securetime]CloseSession error %d\n", ret);
  231. ret = KREE_CloseSession(mem_session);
  232. if (ret != TZ_RESULT_SUCCESS)
  233. pr_warn("[securetime]CloseMEMSession error %d\n", ret);
  234. }
  235. }
  236. static struct early_suspend securetime_early_suspend_gb = {
  237. .level = 258,
  238. .suspend = st_early_suspend_gb,
  239. .resume = st_late_resume_gb,
  240. };
  241. #endif
  242. int update_securetime_thread_gb(void *data)
  243. {
  244. TZ_RESULT ret;
  245. unsigned int update_ret = 0;
  246. uint32_t nsec = THREAD_COUNT_FREQ;
  247. ret = KREE_CreateSession(TZ_TA_SECURETIME_UUID, &icnt_session);
  248. if (ret != TZ_RESULT_SUCCESS) {
  249. pr_warn("update_securetime_thread_gb CreateSession error %d\n", ret);
  250. return 1;
  251. }
  252. ret = KREE_CreateSession(TZ_TA_MEM_UUID, &mem_session);
  253. if (ret != TZ_RESULT_SUCCESS) {
  254. pr_warn("update_securetime_thread_gb Create memory session error %d\n",
  255. ret);
  256. ret = KREE_CloseSession(icnt_session);
  257. return ret;
  258. }
  259. set_freezable();
  260. schedule_timeout_interruptible(HZ * 6 * 2 * 10);
  261. update_ret = TEE_update_gb_time_intee(icnt_session, mem_session);
  262. if (update_ret == GB_NO_SECURETD_FILE ||
  263. update_ret == GB_TIME_FILE_ERROR_SIGN) {
  264. TEE_update_gb_time_infile(icnt_session, mem_session);
  265. TEE_update_gb_time_intee(icnt_session, mem_session);
  266. }
  267. #ifdef CONFIG_HAS_EARLYSUSPEND_GB
  268. register_early_suspend(&securetime_early_suspend_gb);
  269. #endif
  270. for (;;) {
  271. if (kthread_should_stop())
  272. break;
  273. if (try_to_freeze())
  274. continue;
  275. schedule_timeout_interruptible(HZ * nsec);
  276. if (icnt_session && mem_session) {
  277. TEE_Icnt_time(icnt_session, mem_session);
  278. check_count += THREAD_COUNT_FREQ;
  279. if ((check_count < 0) ||
  280. (check_count > THREAD_SAVEFILE_VALUE)) {
  281. TEE_update_gb_time_infile(icnt_session, mem_session);
  282. check_count = 0;
  283. }
  284. }
  285. }
  286. ret = KREE_CloseSession(icnt_session);
  287. if (ret != TZ_RESULT_SUCCESS)
  288. pr_warn("update_securetime_thread_gb CloseSession error %d\n", ret);
  289. ret = KREE_CloseSession(mem_session);
  290. if (ret != TZ_RESULT_SUCCESS)
  291. pr_warn("update_securetime_thread_gb Close memory session error %d\n",
  292. ret);
  293. return 0;
  294. }
  295. #endif