tz_playready.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "tz_playready.h"
  2. #ifdef TZ_PLAYREADY_SECURETIME_SUPPORT
  3. uint32_t TEE_update_pr_time_intee(KREE_SESSION_HANDLE session)
  4. {
  5. MTEEC_PARAM param[4];
  6. uint32_t paramTypes;
  7. TZ_RESULT ret = TZ_RESULT_SUCCESS;
  8. uint32_t file_result = PR_TIME_FILE_OK_SIGN;
  9. struct file *file = NULL;
  10. UINT64 u8Offset = 0;
  11. int err = -ENODEV;
  12. struct rtc_time tm;
  13. DRM_UINT64 time_count64;
  14. unsigned long time_count;
  15. struct rtc_device *rtc;
  16. struct TZ_JG_SECURECLOCK_INFO secure_time;
  17. DRM_UINT64 cur_counter;
  18. rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
  19. if (rtc == NULL) {
  20. pr_warn("%s: unable to open rtc device (%s)\n",
  21. __FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
  22. goto err_open;
  23. }
  24. paramTypes = TZ_ParamTypes3(TZPT_MEM_INPUT, TZPT_MEM_INPUT, TZPT_VALUE_OUTPUT);
  25. param[0].mem.buffer = (void *) &secure_time;
  26. param[0].mem.size = sizeof(struct TZ_JG_SECURECLOCK_INFO);
  27. param[1].mem.buffer = (void *) &cur_counter;
  28. param[1].mem.size = sizeof(DRM_UINT64);
  29. file = FILE_Open(PR_TIME_FILE_SAVE_PATH, O_RDWR, S_IRWXU);
  30. if (file) {
  31. FILE_Read(file, (void *) &secure_time,
  32. sizeof(struct TZ_JG_SECURECLOCK_INFO), &u8Offset);
  33. filp_close(file, NULL);
  34. } else {
  35. file_result = NO_SECURETD_FILE;
  36. goto err_read;
  37. }
  38. err = rtc_read_time(rtc, &tm);
  39. if (err) {
  40. dev_err(rtc->dev.parent,
  41. "hctosys: unable to read the hardware clock\n");
  42. goto err_read;
  43. }
  44. err = rtc_valid_tm(&tm);
  45. if (err) {
  46. dev_err(rtc->dev.parent, "hctosys: invalid date/time\n");
  47. goto err_invalid;
  48. }
  49. rtc_tm_to_time(&tm, &time_count);
  50. time_count64 = (DRM_UINT64)time_count;
  51. memcpy((char *) &cur_counter, (char *) &time_count64, sizeof(DRM_UINT64));
  52. ret = KREE_TeeServiceCall(session, TZCMD_PLAYREADY_SET_CURRENT_COUNTER,
  53. paramTypes, param);
  54. if (ret != TZ_RESULT_SUCCESS)
  55. pr_warn("ServiceCall TZCMD_PLAYREADY_SET_CURRENT_COUNTER error %d\n",
  56. ret);
  57. if (param[2].value.a == PR_TIME_FILE_ERROR_SIGN) {
  58. file_result = PR_TIME_FILE_ERROR_SIGN;
  59. pr_warn("ServiceCall TZCMD_PLAYREADY_SET_CURRENT_COUNTER file_result %d\n",
  60. file_result);
  61. } else if (param[2].value.a == PR_TIME_FILE_OK_SIGN) {
  62. file_result = PR_TIME_FILE_OK_SIGN;
  63. pr_warn("ServiceCall TZCMD_PLAYREADY_SET_CURRENT_COUNTER file_result %d\n",
  64. file_result);
  65. }
  66. err_invalid:
  67. err_read:
  68. rtc_class_close(rtc);
  69. err_open:
  70. if (file_result == PR_TIME_FILE_OK_SIGN)
  71. return ret;
  72. else
  73. return file_result;
  74. }
  75. uint32_t TEE_update_pr_time_infile(KREE_SESSION_HANDLE session)
  76. {
  77. MTEEC_PARAM param[4];
  78. uint32_t paramTypes;
  79. TZ_RESULT ret = TZ_RESULT_SUCCESS;
  80. struct file *file = NULL;
  81. UINT64 u8Offset = 0;
  82. struct TZ_JG_SECURECLOCK_INFO secure_time;
  83. paramTypes = TZ_ParamTypes3(TZPT_MEM_OUTPUT, TZPT_VALUE_INPUT,
  84. TZPT_VALUE_OUTPUT);
  85. param[0].mem.buffer = (void *) &secure_time;
  86. param[0].mem.size = sizeof(struct TZ_JG_SECURECLOCK_INFO);
  87. param[1].value.a = 0;
  88. ret = KREE_TeeServiceCall(session, TZCMD_PLAYREADY_GET_CURRENT_COUNTER,
  89. paramTypes, param);
  90. if (ret != TZ_RESULT_SUCCESS) {
  91. pr_warn("ServiceCall error %d\n", ret);
  92. goto tz_error;
  93. }
  94. file = FILE_Open(PR_TIME_FILE_SAVE_PATH, O_RDWR|O_CREAT, S_IRWXU);
  95. if (file) {
  96. FILE_Write(file, (void *) &secure_time,
  97. sizeof(struct TZ_JG_SECURECLOCK_INFO), &u8Offset);
  98. filp_close(file, NULL);
  99. } else {
  100. pr_warn("FILE_Open PR_TIME_FILE_SAVE_PATH return NULL\n");
  101. }
  102. tz_error:
  103. return ret;
  104. }
  105. uint32_t TEE_Icnt_pr_time(KREE_SESSION_HANDLE session)
  106. {
  107. MTEEC_PARAM param[4];
  108. uint32_t paramTypes;
  109. TZ_RESULT ret = TZ_RESULT_SUCCESS;
  110. unsigned long time_count = 1392967151;
  111. struct rtc_device *rtc = NULL;
  112. struct rtc_time tm;
  113. int err = -ENODEV;
  114. struct TM_PR secure_TM;
  115. paramTypes = TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_MEM_OUTPUT);
  116. param[1].mem.buffer = (void *) &secure_TM;
  117. param[1].mem.size = sizeof(struct TM_PR);
  118. rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
  119. if (rtc == NULL) {
  120. pr_warn("%s: unable to open rtc device (%s)\n",
  121. __FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
  122. goto err_open;
  123. }
  124. err = rtc_read_time(rtc, &tm);
  125. if (err) {
  126. dev_err(rtc->dev.parent,
  127. "hctosys: unable to read the hardware clock\n");
  128. goto err_read;
  129. }
  130. err = rtc_valid_tm(&tm);
  131. if (err) {
  132. dev_err(rtc->dev.parent,
  133. "hctosys: invalid date/time\n");
  134. goto err_invalid;
  135. }
  136. rtc_tm_to_time(&tm, &time_count);
  137. #if 0
  138. pr_debug("securetime increase result: %d %d %d %d %d %d %d\n",
  139. tm.tm_yday, tm.tm_year, tm.tm_mon, tm.tm_mday,
  140. tm.tm_hour, tm.tm_min, tm.tm_sec);
  141. #endif
  142. param[0].value.a = time_count;
  143. ret = KREE_TeeServiceCall(session, TZCMD_PLAYREADY_INC_CURRENT_COUNTER,
  144. paramTypes, param);
  145. if (ret != TZ_RESULT_SUCCESS)
  146. pr_warn("ServiceCall error %d\n", ret);
  147. #if 0
  148. pr_debug("securetime increase result: %d %d %d %d %d %d %d\n", secure_TM.tm_yday
  149. , secure_TM.tm_year, secure_TM.tm_mon, secure_TM.tm_mday
  150. , secure_TM.tm_hour, secure_TM.tm_min, secure_TM.tm_sec);
  151. #endif
  152. err_read:
  153. err_invalid:
  154. rtc_class_close(rtc);
  155. err_open:
  156. return ret;
  157. }
  158. #define THREAD_COUNT_FREQ 10
  159. #define THREAD_SAVEFILE_VALUE (1*60*60)
  160. static int check_count;
  161. static KREE_SESSION_HANDLE icnt_session;
  162. int update_securetime_thread(void *data)
  163. {
  164. TZ_RESULT ret;
  165. unsigned int update_ret = 0;
  166. uint32_t nsec = THREAD_COUNT_FREQ;
  167. ret = KREE_CreateSession(TZ_TA_PLAYREADY_UUID, &icnt_session);
  168. if (ret != TZ_RESULT_SUCCESS) {
  169. pr_warn("CreateSession error %d\n", ret);
  170. return 1;
  171. }
  172. set_freezable();
  173. schedule_timeout_interruptible(HZ * nsec);
  174. update_ret = TEE_update_pr_time_intee(icnt_session);
  175. if (update_ret == NO_SECURETD_FILE || update_ret == PR_TIME_FILE_ERROR_SIGN) {
  176. TEE_update_pr_time_infile(icnt_session);
  177. TEE_update_pr_time_intee(icnt_session);
  178. }
  179. for (;;) {
  180. if (kthread_should_stop())
  181. break;
  182. if (try_to_freeze())
  183. continue;
  184. schedule_timeout_interruptible(HZ * nsec);
  185. if (icnt_session) {
  186. TEE_Icnt_pr_time(icnt_session);
  187. check_count += THREAD_COUNT_FREQ;
  188. if ((check_count < 0) || (check_count > THREAD_SAVEFILE_VALUE)) {
  189. TEE_update_pr_time_infile(icnt_session);
  190. check_count = 0;
  191. }
  192. }
  193. }
  194. ret = KREE_CloseSession(icnt_session);
  195. if (ret != TZ_RESULT_SUCCESS)
  196. pr_warn("CloseSession error %d\n", ret);
  197. return 0;
  198. }
  199. #endif