filecryption.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. #include "stdafx.h"
  2. #include "filecryption.h"
  3. #include "fileanalysis.h"
  4. #include "rvcfileheader.h"
  5. #include "asf.h"
  6. #include "mp4info.h"
  7. #include <string.h>
  8. #include <iostream>
  9. using namespace std;
  10. #ifndef RVC_MAX_HEADER_LEN
  11. #define RVC_MAX_HEADER_LEN 512
  12. #endif
  13. #ifndef RVC_FILE_INT_LEN
  14. #define RVC_FILE_INT_LEN 4
  15. #endif
  16. #ifndef RVC_READ_BUFFER_SIZE
  17. #define RVC_READ_BUFFER_SIZE 1024
  18. #endif
  19. #ifndef safe_free
  20. #define safe_free(x) \
  21. do{\
  22. if(x) { free(x); x = NULL; }\
  23. }while(0)
  24. #endif
  25. static int encrypt_asf_file(char* poutfilename, char* phead, uint32_t uheaderlen, unsigned char* pstrkey, uint32_t ukeylen, FILE * pSrcFile, const filecryption_callback_t * pcallback)
  26. {
  27. int iret = -1;
  28. FILE* pDestFile = fopen(poutfilename, "wb");
  29. if (NULL == pDestFile) {
  30. fclose(pSrcFile);
  31. return iret;
  32. }
  33. //1. 新增自定义文件头
  34. fwrite(phead, 1, uheaderlen, pDestFile);
  35. //获取加密前文件头GUID
  36. char strGuid[HEADER_OBJECT_GUID_LEN] = { 0 };
  37. fread(strGuid, 1, HEADER_OBJECT_GUID_LEN, pSrcFile);
  38. if (0 != memcmp(strGuid, ASF_Header_GUID, HEADER_OBJECT_GUID_LEN)) {
  39. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s", "math guid failed, current format is not surpport!");
  40. fclose(pDestFile);
  41. return iret;
  42. }
  43. //2. 拷贝原文件头guid
  44. fwrite(strGuid, 1, HEADER_OBJECT_GUID_LEN, pDestFile);
  45. char strheadsize[ASF_HEADER_SIZE_LEN] = { 0 };
  46. fread(strheadsize, 1, ASF_HEADER_SIZE_LEN, pSrcFile);
  47. uint64_t uheadlen = get_asf_headsize(strheadsize, ASF_HEADER_SIZE_LEN);
  48. uint64_t uheadobjlen = uheadlen - HEADER_OBJECT_GUID_LEN - ASF_HEADER_SIZE_LEN;
  49. unsigned char* pobjdata = (unsigned char*)malloc(uheadobjlen);
  50. fread(pobjdata, 1, uheadobjlen, pSrcFile);
  51. int iencdatalen = uheadobjlen + SM4ENC_BLOCK_SIZE;
  52. unsigned char* pobjdataenc = (unsigned char*)malloc(iencdatalen);
  53. SM4EncECBMode(pstrkey, pobjdata, uheadobjlen, pobjdataenc, &iencdatalen);
  54. char strdatalen[ASF_HEADER_SIZE_LEN] = { 0 };
  55. construct_asf_headsize(strdatalen, ASF_HEADER_SIZE_LEN, iencdatalen + HEADER_OBJECT_GUID_LEN + ASF_HEADER_SIZE_LEN);
  56. //3. 填充加密后文件头长度
  57. fwrite(strdatalen, 1, ASF_HEADER_SIZE_LEN, pDestFile);
  58. //4. 填充加密后文件头内容
  59. fwrite(pobjdataenc, 1, iencdatalen, pDestFile);
  60. char* data_buffer = (char*)malloc(RVC_READ_BUFFER_SIZE);
  61. size_t udatalen = 0;
  62. while (udatalen = fread(data_buffer, 1, RVC_READ_BUFFER_SIZE, pSrcFile)) {
  63. fwrite(data_buffer, 1, udatalen, pDestFile);
  64. }
  65. fclose(pDestFile);
  66. safe_free(pobjdata);
  67. safe_free(pobjdataenc);
  68. safe_free(data_buffer);
  69. iret = 0;
  70. return iret;
  71. }
  72. static int encrypt_mp4_file(char* poutfilename, char* phead, uint32_t uheaderlen, unsigned char* pstrkey, uint32_t ukeylen, FILE* pSrcFile, const filecryption_callback_t* pcallback)
  73. {
  74. int iret = -1;
  75. unsigned int unoencryptlen = get_noencrypt_boxs_size(pSrcFile, pcallback, true);
  76. if (0 == unoencryptlen) {
  77. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "get not encrypt boxs size failed.");
  78. return iret;
  79. }
  80. //safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "not encrypt file length is %u.", unoencryptlen);
  81. FILE* pDestFile = fopen(poutfilename, "wb");
  82. if (NULL == pDestFile) {
  83. fclose(pSrcFile);
  84. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "open output file failed.");
  85. return iret;
  86. }
  87. fseek(pSrcFile, 0, SEEK_END);
  88. uint32_t usrcfilelen = (uint32_t)ftell(pSrcFile);
  89. rewind(pSrcFile);
  90. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "src file length is %u.", usrcfilelen);
  91. //1. 新增自定义文件头
  92. fwrite(phead, 1, uheaderlen, pDestFile);
  93. //2. 填充ftyp, free, mdat box
  94. char* data_buffer = (char*)malloc(RVC_READ_BUFFER_SIZE);
  95. unsigned int uleftfilelen = unoencryptlen;
  96. do {
  97. if (RVC_READ_BUFFER_SIZE == fread(data_buffer, 1, RVC_READ_BUFFER_SIZE, pSrcFile)) {
  98. fwrite(data_buffer, 1, RVC_READ_BUFFER_SIZE, pDestFile);
  99. }
  100. uleftfilelen -= RVC_READ_BUFFER_SIZE;
  101. } while (uleftfilelen >= RVC_READ_BUFFER_SIZE);
  102. if (uleftfilelen > 0) {
  103. if (uleftfilelen == fread(data_buffer, 1, uleftfilelen, pSrcFile)) {
  104. fwrite(data_buffer, 1, uleftfilelen, pDestFile);
  105. }
  106. }
  107. //3. 读取moov box信息
  108. //size_t udatalen = 0;
  109. //while (udatalen = fread(data_buffer, 1, RVC_READ_BUFFER_SIZE, pSrcFile)) {
  110. // fwrite(data_buffer, 1, udatalen, pDestFile);
  111. //}
  112. uint32_t umoovboxlen = usrcfilelen - unoencryptlen;
  113. unsigned char* pmoovboxdata = (unsigned char*)malloc(umoovboxlen);
  114. fread(pmoovboxdata, 1, umoovboxlen, pSrcFile);
  115. int32_t iencdatalen = umoovboxlen + SM4ENC_BLOCK_SIZE;
  116. unsigned char* pobjdataenc = (unsigned char*)malloc(iencdatalen);
  117. if (0 == SM4EncECBMode(pstrkey, pmoovboxdata, umoovboxlen, pobjdataenc, &iencdatalen)) {
  118. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "after encode, moov box length is %u.", iencdatalen);
  119. if (iencdatalen > 0) {
  120. //3. 填充加密后的moov box长度
  121. fwrite(&iencdatalen, 1, sizeof(uint32_t), pDestFile);
  122. //4. 填充加密后的moov box内容
  123. fwrite(pobjdataenc, 1, iencdatalen, pDestFile);
  124. iret = 0;
  125. }
  126. }
  127. if(0 != iret){
  128. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "SM4 encrypt moovbox failed, and src moovbox len is %d.", umoovboxlen);
  129. }
  130. fclose(pDestFile);
  131. safe_free(data_buffer);
  132. safe_free(pmoovboxdata);
  133. safe_free(pobjdataenc);
  134. return iret;
  135. }
  136. int encryption_file(char* poutfile, uint32_t uoutlen, const char* pfilename, const filecryption_callback_t* pcallback, eRvcCryptionVersion eversion)
  137. {
  138. int iret = -1;
  139. if (NULL == pfilename){
  140. return iret;
  141. }
  142. char pbuffer[RVC_MAX_HEADER_LEN] = {0};
  143. uint32_t uheaderlen = RVC_MAX_HEADER_LEN;
  144. int ilen = constrcut_rvc_file_header(pbuffer, &uheaderlen, pfilename, pcallback, eversion);
  145. if (0 != ilen){
  146. return iret;
  147. }
  148. unsigned char strkey[SM4ENC_BLOCK_SIZE] = {0};
  149. uint32_t uindex = (RVC_FILE_HEADER_FLAG_LEN + sizeof(uint32_t));
  150. if (get_key_from_header_info(strkey, SM4ENC_BLOCK_SIZE, pbuffer + uindex, uheaderlen - uindex, pcallback)){
  151. return iret;
  152. }
  153. if (get_encrytion_filename(poutfile, uoutlen, false, RVC_FILEENC_STR, strlen(RVC_FILEENC_STR), pfilename)){
  154. return iret;
  155. }
  156. FILE* pSrcFile = fopen(pfilename, "rb");
  157. if (NULL == pSrcFile) {
  158. return iret;
  159. }
  160. if (eVerA == eversion) {
  161. iret = encrypt_asf_file(poutfile, pbuffer, uheaderlen, strkey, SM4ENC_BLOCK_SIZE, pSrcFile, pcallback);
  162. }
  163. else {
  164. iret = encrypt_mp4_file(poutfile, pbuffer, uheaderlen, strkey, SM4ENC_BLOCK_SIZE, pSrcFile, pcallback);
  165. }
  166. fclose(pSrcFile);
  167. return iret;
  168. }
  169. static int decrypt_asf_file(char* poutfilename, FILE* pSrcFile, unsigned char* pstrkey, uint32_t ukeylen, const filecryption_callback_t* pcallback)
  170. {
  171. int iret = -1;
  172. FILE* pDestFile = fopen(poutfilename, "wb");
  173. if (NULL == pDestFile) {
  174. return iret;
  175. }
  176. char strasfheader[ASF_HEADER_GUID_LEN] = { 0 };
  177. if (ASF_HEADER_GUID_LEN == fread(strasfheader, 1, ASF_HEADER_GUID_LEN, pSrcFile)) {
  178. fwrite(strasfheader, 1, ASF_HEADER_GUID_LEN, pDestFile);
  179. }
  180. char strheadlen[ASF_HEADER_SIZE_LEN] = { 0 };
  181. fread(strheadlen, 1, ASF_HEADER_SIZE_LEN, pSrcFile);
  182. uint64_t uheadlen = get_asf_headsize(strheadlen, ASF_HEADER_SIZE_LEN);
  183. unsigned char* pheaddata = (unsigned char*)malloc(uheadlen);
  184. unsigned char* pdecheaddata = (unsigned char*)malloc(uheadlen);
  185. int ioutlen = uheadlen;
  186. fread(pheaddata, 1, uheadlen - ASF_HEADER_GUID_LEN - ASF_HEADER_SIZE_LEN, pSrcFile);
  187. SM4DecECBMode(pstrkey, pheaddata, uheadlen - ASF_HEADER_GUID_LEN - ASF_HEADER_SIZE_LEN, pdecheaddata, &ioutlen);
  188. construct_asf_headsize(strheadlen, ASF_HEADER_SIZE_LEN, ioutlen + ASF_HEADER_GUID_LEN + ASF_HEADER_SIZE_LEN);
  189. fwrite(strheadlen, 1, ASF_HEADER_SIZE_LEN, pDestFile);
  190. fwrite(pdecheaddata, 1, ioutlen, pDestFile);
  191. char* data_buffer = (char*)malloc(RVC_READ_BUFFER_SIZE);
  192. size_t udatalen = 0;
  193. while (udatalen = fread(data_buffer, 1, RVC_READ_BUFFER_SIZE, pSrcFile)) {
  194. fwrite(data_buffer, 1, udatalen, pDestFile);
  195. }
  196. fclose(pDestFile);
  197. safe_free(data_buffer);
  198. safe_free(pdecheaddata);
  199. safe_free(pheaddata);
  200. return iret;
  201. }
  202. static int decrypt_mp4_file(char* poutfilename, FILE* pSrcFile, unsigned char* pstrkey, uint32_t ukeylen, const filecryption_callback_t* pcallback)
  203. {
  204. int iret = -1;
  205. FILE* pDestFile = fopen(poutfilename, "wb");
  206. if (NULL == pDestFile) {
  207. return iret;
  208. }
  209. unsigned int unoencryptlen = get_noencrypt_boxs_size(pSrcFile, pcallback, false);
  210. if (0 == unoencryptlen) {
  211. return iret;
  212. }
  213. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "not encrypt file length is %u.", unoencryptlen);
  214. //1. 填充ftyp, free, mdat box
  215. char* data_buffer = (char*)malloc(RVC_READ_BUFFER_SIZE);
  216. unsigned int uleftfilelen = unoencryptlen;
  217. do {
  218. if (RVC_READ_BUFFER_SIZE == fread(data_buffer, 1, RVC_READ_BUFFER_SIZE, pSrcFile)) {
  219. fwrite(data_buffer, 1, RVC_READ_BUFFER_SIZE, pDestFile);
  220. }
  221. uleftfilelen -= RVC_READ_BUFFER_SIZE;
  222. } while (uleftfilelen >= RVC_READ_BUFFER_SIZE);
  223. if (uleftfilelen > 0) {
  224. if (uleftfilelen == fread(data_buffer, 1, uleftfilelen, pSrcFile)) {
  225. fwrite(data_buffer, 1, uleftfilelen, pDestFile);
  226. }
  227. }
  228. //2. 获取加密后的moov box大小
  229. uint32_t uencryptboxsize = 0;
  230. fread(&uencryptboxsize, 1, sizeof(uint32_t), pSrcFile);
  231. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "encrypt moov box size is = %d.", uencryptboxsize);
  232. if (uencryptboxsize > 0) {
  233. //3. 读取加密后的moov box
  234. unsigned char* pmoovboxdata = (unsigned char*)malloc(uencryptboxsize);
  235. unsigned char* pdecmoovboxdata = (unsigned char*)malloc(uencryptboxsize);
  236. int ioutlen = uencryptboxsize;
  237. fread(pmoovboxdata, 1, uencryptboxsize, pSrcFile);
  238. //4. 解密moov box
  239. SM4DecECBMode(pstrkey, pmoovboxdata, uencryptboxsize, pdecmoovboxdata, &ioutlen);
  240. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "decrypt moov box size is = %d.", ioutlen);
  241. //5. 填充解密后的moov box
  242. fwrite(pdecmoovboxdata, 1, ioutlen, pDestFile);
  243. safe_free(pdecmoovboxdata);
  244. safe_free(pmoovboxdata);
  245. iret = 0;
  246. }
  247. else {
  248. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "get encrypt moovbox failed, decrypt failed!");
  249. }
  250. fclose(pDestFile);
  251. safe_free(data_buffer);
  252. return iret;
  253. }
  254. int decryption_file(char* poutfile, uint32_t uoutlen, const char* pfilename, const filecryption_callback_t* pcallback, eRvcCryptionVersion eversion)
  255. {
  256. int iret = -1;
  257. if (NULL == pfilename || eversion >= sizeof(cryption_ver_flag_table)/sizeof(char*) || eversion < 0){
  258. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s","invalid encryption version param.");
  259. return iret;
  260. }
  261. FILE* pSrcFile = fopen(pfilename, "rb");
  262. if (NULL == pSrcFile){
  263. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "open file %s failed!",pfilename);
  264. return iret;
  265. }
  266. char strrvcflag[RVC_FILE_HEADER_FLAG_LEN] = {0};
  267. fread(strrvcflag,1, RVC_FILE_HEADER_FLAG_LEN, pSrcFile);
  268. if (0 != memcmp(strrvcflag, rvc_header, RVC_FILE_HEADER_FLAG_LEN)){
  269. safe_log(pcallback, FILECRYPT_LEVEL_INFO, "file %s is not encryption!",pfilename);
  270. fclose(pSrcFile);
  271. return iret;
  272. }
  273. uint32_t irvcheadlen = 0;
  274. fread(&irvcheadlen, 1, sizeof(uint32_t), pSrcFile);
  275. char* prvcbuffer = (char*)malloc(irvcheadlen);
  276. memset(prvcbuffer, 0, irvcheadlen);
  277. fread(prvcbuffer, 1, irvcheadlen - RVC_FILE_HEADER_FLAG_LEN - sizeof(uint32_t), pSrcFile);
  278. if (0 != memcmp(prvcbuffer+sizeof(uint32_t), cryption_ver_flag_table[eversion], RVC_CRYPTION_VER_FLAG_LEN)){
  279. if (0 == memcmp(prvcbuffer+sizeof(uint32_t), cryption_ver_flag_table[eversion], RVC_CRYPTION_VER_FLAG_LEN-1)){
  280. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "file %s is encrypt but decrypt version is not matched!",pfilename);
  281. }
  282. fclose(pSrcFile);
  283. safe_free(prvcbuffer);
  284. return iret;
  285. }
  286. unsigned char strkey[SM4ENC_BLOCK_SIZE] = {0};
  287. if (get_key_from_header_info(strkey, SM4ENC_BLOCK_SIZE, prvcbuffer, irvcheadlen - RVC_FILE_HEADER_FLAG_LEN - sizeof(uint32_t), pcallback)){
  288. safe_free(prvcbuffer);
  289. return iret;
  290. }
  291. if (get_decrytion_filename(poutfile, uoutlen, RVC_FILEDEC_STR, strlen(RVC_FILEDEC_STR), pfilename)){
  292. safe_free(prvcbuffer);
  293. return iret;
  294. }
  295. if (eVerA == eversion) {
  296. iret = decrypt_asf_file(poutfile, pSrcFile, strkey, SM4ENC_BLOCK_SIZE, pcallback);
  297. }
  298. else {
  299. iret = decrypt_mp4_file(poutfile, pSrcFile, strkey, SM4ENC_BLOCK_SIZE, pcallback);
  300. }
  301. fclose(pSrcFile);
  302. safe_free(prvcbuffer);
  303. return iret;
  304. }
  305. bool is_file_encrypted(const char* pfilename, const filecryption_callback_t* pcallback)
  306. {
  307. bool bret = false;
  308. if (NULL == pfilename){
  309. return bret;
  310. }
  311. FILE* pSrcFile = fopen(pfilename, "rb");
  312. if (NULL == pSrcFile){
  313. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "open file %s failed!",pfilename);
  314. return bret;
  315. }
  316. char strrvcheader[RVC_FILE_HEADER_FLAG_LEN] = {0};
  317. if (RVC_FILE_HEADER_FLAG_LEN == fread(strrvcheader, 1, RVC_FILE_HEADER_FLAG_LEN, pSrcFile)){
  318. if (0 == strncmp(strrvcheader, rvc_header, RVC_FILE_HEADER_FLAG_LEN)){
  319. bret = true;
  320. }
  321. else{
  322. safe_log(pcallback, FILECRYPT_LEVEL_INFO, "file %s is not encryption!",pfilename);
  323. }
  324. }
  325. fclose(pSrcFile);
  326. return bret;
  327. }
  328. /*
  329. 文件解密功能;
  330. 输入:文件路径
  331. 输出:文件明文头数据,文件明文头长度,加解密前后文件偏移量,自定义头文件头信息
  332. */
  333. int rvc_file_decrypt(unsigned char** pdechead, uint32_t* udecheadlen, int* ioffset, char** pstrjson, uint32_t* ujsonlen, const char* pfilename, const filecryption_callback_t* pcallback, eRvcCryptionVersion eversion)
  334. {
  335. int iret = -1;
  336. if (NULL == pfilename || eversion >= sizeof(cryption_ver_flag_table)/sizeof(char*) || eversion < 0){
  337. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s","invalid cryption version param.");
  338. return iret;
  339. }
  340. FILE* pSrcFile = fopen(pfilename, "rb");
  341. if (NULL == pSrcFile){
  342. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "open file %s failed!",pfilename);
  343. return iret;
  344. }
  345. unsigned char strkey[SM4ENC_BLOCK_SIZE] = {0};
  346. int irvcheadlen = 0;
  347. char strrvcflag[RVC_FILE_HEADER_FLAG_LEN] = {0};
  348. fread(strrvcflag,1, RVC_FILE_HEADER_FLAG_LEN, pSrcFile);
  349. if (0 != memcmp(strrvcflag, rvc_header, RVC_FILE_HEADER_FLAG_LEN)){
  350. safe_log(pcallback, FILECRYPT_LEVEL_INFO, "file %s is not encrypted!",pfilename);
  351. *pdechead = NULL;
  352. *udecheadlen = 0;
  353. *ioffset = 0;
  354. fclose(pSrcFile);
  355. iret = 0;
  356. return iret;
  357. }
  358. else{
  359. //safe_log(pcallback,"file %s is encrypted!",pfilename);
  360. fread(&irvcheadlen, 1, sizeof(uint32_t), pSrcFile);
  361. char* prvcbuffer = (char*)malloc(irvcheadlen);
  362. memset(prvcbuffer, 0, irvcheadlen);
  363. fread(prvcbuffer, 1, irvcheadlen - RVC_FILE_HEADER_FLAG_LEN - sizeof(uint32_t), pSrcFile);
  364. if (0 != memcmp(prvcbuffer+sizeof(uint32_t), cryption_ver_flag_table[eversion], RVC_CRYPTION_VER_FLAG_LEN)){
  365. if (0 == memcmp(prvcbuffer+sizeof(uint32_t), cryption_ver_flag_table[eversion], RVC_CRYPTION_VER_FLAG_LEN-1)){
  366. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "file %s encryption and decrption version is not matched!",pfilename);
  367. }
  368. safe_free(prvcbuffer);
  369. fclose(pSrcFile);
  370. return iret;
  371. }
  372. if (get_key_from_header_info(strkey, SM4ENC_BLOCK_SIZE, prvcbuffer, irvcheadlen - RVC_FILE_HEADER_FLAG_LEN - sizeof(uint32_t), pcallback)){
  373. safe_free(prvcbuffer);
  374. fclose(pSrcFile);
  375. return iret;
  376. }
  377. int ijson = get_file_json_infos_from_rvc_header(pstrjson, ujsonlen, prvcbuffer, irvcheadlen - RVC_FILE_HEADER_FLAG_LEN - sizeof(uint32_t));
  378. if (0 == ijson){
  379. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "get_file_json_infos_from_rvc_header success!");
  380. }
  381. safe_free(prvcbuffer);
  382. }
  383. char strasfheader[ASF_HEADER_GUID_LEN] = {0};
  384. if (ASF_HEADER_GUID_LEN == fread(strasfheader, 1, ASF_HEADER_GUID_LEN, pSrcFile)){
  385. if (0 != memcmp(strasfheader, ASF_Header_GUID, ASF_HEADER_GUID_LEN)){
  386. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "file %s is current not surrport format!",pfilename);
  387. fclose(pSrcFile);
  388. return iret;
  389. }
  390. }
  391. else{
  392. fclose(pSrcFile);
  393. return iret;
  394. }
  395. char strheadlen[ASF_HEADER_SIZE_LEN] = {0};
  396. fread(strheadlen, 1, ASF_HEADER_SIZE_LEN, pSrcFile);
  397. uint64_t uheadlen = get_asf_headsize(strheadlen, ASF_HEADER_SIZE_LEN);
  398. unsigned char* pheaddata = (unsigned char*)malloc(uheadlen);
  399. fread(pheaddata+ ASF_HEADER_GUID_LEN + ASF_HEADER_SIZE_LEN, 1, uheadlen - ASF_HEADER_GUID_LEN - ASF_HEADER_SIZE_LEN, pSrcFile);
  400. unsigned char* pdecheaddata = (unsigned char*)malloc(uheadlen);
  401. int ioutlen = uheadlen - ASF_HEADER_GUID_LEN - ASF_HEADER_SIZE_LEN ;
  402. SM4DecECBMode(strkey, pheaddata + ASF_HEADER_GUID_LEN + ASF_HEADER_SIZE_LEN, uheadlen - ASF_HEADER_GUID_LEN - ASF_HEADER_SIZE_LEN, pdecheaddata + ASF_HEADER_GUID_LEN + ASF_HEADER_SIZE_LEN, &ioutlen);
  403. construct_asf_headsize(strheadlen,ASF_HEADER_SIZE_LEN,ioutlen + ASF_HEADER_GUID_LEN + ASF_HEADER_SIZE_LEN);
  404. memcpy(pdecheaddata, strasfheader, ASF_HEADER_GUID_LEN);
  405. memcpy(pdecheaddata + ASF_HEADER_GUID_LEN, strheadlen, ASF_HEADER_SIZE_LEN);
  406. *pdechead = pdecheaddata;
  407. *udecheadlen = ioutlen + ASF_HEADER_GUID_LEN + ASF_HEADER_SIZE_LEN;
  408. *ioffset = (irvcheadlen + uheadlen - (*udecheadlen));
  409. safe_free(pheaddata);
  410. fclose(pSrcFile);
  411. iret = 0;
  412. return iret;
  413. }
  414. int rvc_free_data(void** pdechead)
  415. {
  416. int iret = -1;
  417. safe_free(*pdechead);
  418. iret = 0;
  419. return iret;
  420. }
  421. bool is_file_completed(const char* pfilename, const filecryption_callback_t* pcallback)
  422. {
  423. return is_mp4file_completed(pfilename, pcallback);
  424. }
  425. int get_file_sm3digest(char* strbuf, uint32_t ubuflen, const char* pfilename)
  426. {
  427. return get_file_hashstring(strbuf, ubuflen, pfilename);
  428. }