auth.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: auth.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2016-04-21
  7. 功能说明: 装置授权管理
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #include "base64.h"
  15. /*------------------------------- 宏定义 --------------------------------------
  16. */
  17. #define AUTH_BUF_LEN 64
  18. /*------------------------------ 类型结构 -------------------------------------
  19. */
  20. /*------------------------------ 全局变量 -------------------------------------
  21. */
  22. u8 g_auth_id[AUTH_ID_LEN];
  23. /*------------------------------ 函数声明 -------------------------------------
  24. */
  25. int read_unique_id(unsigned char *id);
  26. /*------------------------------ 外部函数 -------------------------------------
  27. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  28. */
  29. int auth_verify(u8 * data,int len)
  30. {
  31. return 0;
  32. }
  33. int auth_get_status(void)
  34. {
  35. return 0;
  36. }
  37. int auth_master_index(void)
  38. {
  39. return 0;
  40. }
  41. int auth_encrypt(u8 * id,u8 * id0,u8 * data,int len)
  42. {
  43. return 0;
  44. }
  45. int auth_get_encrypt_id(u8 * id,int len)
  46. {
  47. #define ID_ENCRPT_LEN 32
  48. return ID_ENCRPT_LEN;
  49. }
  50. int auth_init(void)
  51. {
  52. int ret=0;
  53. #ifndef CPU_FUXI
  54. printk("HZ = %d\n", HZ);
  55. #endif
  56. ret = read_unique_id(g_auth_id);
  57. if(ret != 0)
  58. {
  59. return -1;
  60. }
  61. #ifndef BSP_DTU2
  62. if(auth_master_index() >= 0)
  63. {
  64. return 0;
  65. }
  66. ret = auth_check();
  67. if(ret != 0)
  68. {
  69. u8 buf[AUTH_LICENSE_LEN];
  70. char sz[AUTH_BUF_LEN];
  71. auth_get_encrypt_id(buf,AUTH_LICENSE_LEN);
  72. encode_base64(sz,buf,AUTH_LICENSE_LEN);
  73. //print_mem("id:",buf,32);
  74. rt_printf("授权标识码:%s\r\n",sz);
  75. }
  76. #endif
  77. return ret;
  78. }
  79. int auth_exit(void)
  80. {
  81. return 0;
  82. }
  83. //int auth_get_encrypt_id(u8 *id,
  84. #define BASE64_LENGTH(len) (4 * ((len + 2) / 3))
  85. int auth_save(u8 *buf,u32 len)
  86. {
  87. char sz[AUTH_BUF_LEN];
  88. int ret;
  89. ret = auth_verify(buf,AUTH_LICENSE_LEN);
  90. if(ret != 0)
  91. {
  92. rt_err_set(ERR_CODE_AUTH,0);
  93. rt_printf("auth_verify:ret=%d.\r\n",ret);
  94. return -1;
  95. }
  96. else
  97. {
  98. rt_err_clr(ERR_CODE_AUTH,0);
  99. }
  100. if(BASE64_LENGTH(len) >= AUTH_BUF_LEN)
  101. {
  102. return -1;
  103. }
  104. print_mem("auth_save:",buf,len);
  105. encode_base64(sz,buf,len);
  106. env_setenv("auth",sz);
  107. return 0;
  108. }
  109. int auth_check(void)
  110. {
  111. char * sz;
  112. char buf[64],*p;
  113. int ret;
  114. sz = env_get_info(ENV_AUTH);
  115. if(sz == NULL)
  116. {
  117. rt_err_set(ERR_CODE_AUTH,0);
  118. rt_printf("没有授权信息!\r\n");
  119. return -11;
  120. }
  121. p = buf;
  122. decode_base64(&p,sz);
  123. //print_mem("auth_check:",buf,32);
  124. ret = auth_verify(buf,AUTH_LICENSE_LEN);
  125. if(ret != 0)
  126. {
  127. rt_err_set(ERR_CODE_AUTH,0);
  128. rt_printf("auth_verify:ret=%d.\r\n",ret);
  129. }
  130. else
  131. {
  132. rt_printf("装置通过授权检查!\r\n");
  133. }
  134. return ret;
  135. }
  136. int auth_license(u8 * id ,struct rtc_time_t *p_tm,u8* license)
  137. {
  138. char log[128];
  139. u8 id0[32];
  140. int len,i,ret;
  141. struct rtc_time_t tm;
  142. // 如果不是授权机,返回
  143. if(auth_master_index() < 0)
  144. {
  145. return -1;
  146. }
  147. // 如果授权文件已满,停止授权
  148. if(log_file_is_overrun(LOG_AUTH))
  149. {
  150. return -2;
  151. }
  152. // 授权
  153. //print_mem(" id:",id,32);
  154. ret = auth_encrypt(id,id0,license,32);
  155. if(ret < 0)
  156. {
  157. rt_printf("auth_encrypt error:ret=%d.\r\n",ret);
  158. print_mem(" id:",id,32);
  159. print_mem(" id0:",id0,32);
  160. print_mem("license:",license,32);
  161. return ret;
  162. }
  163. //print_mem("license:",license,32);
  164. // 如果授权成功,记录授权数据
  165. memcpy(&tm,p_tm,sizeof(tm));
  166. sprintf(log,"20%02hu-%02hu-%02hu %02hu:%02hu:%02hu.%06u 授权成功[%02d]:",tm.year,tm.month,tm.day,tm.hour,tm.min,tm.ms/1000,tm.ms%1000*1000,ret);
  167. len = strlen(log);
  168. for(i=0;i<8;i++)
  169. {
  170. sprintf(log+len+i*3,"%02x-",id0[i]);
  171. }
  172. len = strlen(log);
  173. log[len-1] = 0;
  174. log_str(LOG_AUTH,log);
  175. return 0;
  176. }
  177. int auth_test(void)
  178. {
  179. u8 id[32],id0[32],license[32];
  180. int ret;
  181. auth_get_encrypt_id(id,32);
  182. print_mem(" id:",id,24);
  183. ret = auth_encrypt(id,id0,license,32);
  184. rt_printf("auth_encrypt:ret=%d.\r\n",ret);
  185. print_mem(" id:",id,24);
  186. print_mem(" id0:",id0,24);
  187. print_mem("license:",license,32);
  188. ret = auth_verify(license,32);
  189. rt_printf("auth_verify:ret=%d.\r\n",ret);
  190. return 0;
  191. }
  192. extern char * gCmdArg[32];
  193. extern int gCmdArgCount;
  194. int auth_info_printf(void)
  195. {
  196. int i,ret;
  197. u8 id[64],license[64];
  198. char *p;
  199. char sz[64];
  200. struct timespec ts;
  201. struct rtc_time_t rt;
  202. if(gCmdArgCount == 2)
  203. {
  204. p = (char *)id;
  205. //rt_printf("sz=%s\r\n",gCmdArg[1]);
  206. decode_base64(&p,gCmdArg[1]);
  207. clk_time_get(&ts);
  208. timespec_to_rtc(ts, &rt, 1);
  209. ret = auth_license(id,&rt,license);
  210. if(ret == 0)
  211. {
  212. encode_base64(sz,license,AUTH_LICENSE_LEN);
  213. rt_printf("授权成功:auth=%s\r\n",sz);
  214. }
  215. else
  216. {
  217. rt_printf("授权失败:ret=%d\r\n",ret);
  218. }
  219. }
  220. else
  221. {
  222. rt_printf(" 授权状态:%d.\r\n",auth_get_status());
  223. rt_printf("授权标识码:");
  224. for(i=0;i<8;i++)
  225. {
  226. rt_printf("%02x",g_auth_id[i]);
  227. if(i<7)
  228. {
  229. rt_printf("-");
  230. }
  231. }
  232. rt_printf("\r\n授权机索引:%d.\r\n",auth_master_index());
  233. }
  234. // auth_test();
  235. return 0;
  236. }
  237. #ifdef BSP_DTU2
  238. int auth_get_status(void)
  239. {
  240. return 0;
  241. }
  242. int auth_get_encrypt_id(u8 * id,int len)
  243. {
  244. return -1;
  245. }
  246. int auth_master_index(void)
  247. {
  248. return -1;
  249. }
  250. int auth_encrypt(u8 * id,u8 * id0,u8 * data,int len)
  251. {
  252. return -1;
  253. }
  254. int auth_verify(u8 * data,int len)
  255. {
  256. return -1;
  257. }
  258. #endif
  259. /*------------------------------ 内部函数 -------------------------------------
  260. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  261. */
  262. /*------------------------------ 测试函数 -------------------------------------
  263. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  264. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  265. */
  266. /*------------------------------ 文件结束 -------------------------------------
  267. */