rvcfileheader.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "stdafx.h"
  2. #include "rvcfileheader.h"
  3. #include "fileanalysis.h"
  4. #include <string.h>
  5. int constrcut_rvc_file_header(char* pbuffer, uint32_t* ulen, const char* pfilename, const filecryption_callback_t* pcallback, eRvcCryptionVersion eversion)
  6. {
  7. int iret = -1;
  8. //1. 自定义文件头标识16位
  9. size_t udatalen = strlen(rvc_header);
  10. memcpy(pbuffer, rvc_header, udatalen);
  11. //2. 自定义文件头长度4位
  12. udatalen += sizeof(uint32_t);
  13. //3. 文件加密版本标识
  14. const char* strheader = cryption_ver_flag_table[0];
  15. if (eversion < sizeof(cryption_ver_flag_table)/sizeof(char*) && eversion >= 0){
  16. strheader = cryption_ver_flag_table[eversion];
  17. }
  18. if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strheader, strlen(strheader))){
  19. udatalen += (strlen(strheader) + sizeof(uint32_t));
  20. }
  21. //4. 源文件hash值
  22. char strhash[RVC_FILE_HASH_LEN] = {0};
  23. if (get_srcfile_hash(strhash, RVC_FILE_HASH_LEN, pfilename)){
  24. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s","get file hash failed!");
  25. return iret;
  26. }
  27. if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strhash, RVC_FILE_HASH_LEN)){
  28. udatalen += (RVC_FILE_HASH_LEN + sizeof(uint32_t));
  29. }
  30. //5. 源文件文件大小
  31. uint32_t usize = get_srcfile_size(pfilename);
  32. memcpy(pbuffer+udatalen, &usize, sizeof(uint32_t));
  33. udatalen += sizeof(uint32_t);
  34. //6. 源文件文件名
  35. char strname[MAX_PATH] = {0};
  36. get_srcfile_name(strname, MAX_PATH, pfilename);
  37. if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strname, strlen(strname))){
  38. udatalen += (strlen(strname) + sizeof(uint32_t));
  39. }
  40. //7. 真实文件格式,后缀名
  41. char strformat[MAX_PATH] = {0};
  42. get_srcfile_format(strformat, MAX_PATH, pfilename);
  43. if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strformat, strlen(strformat))){
  44. udatalen += (strlen(strformat) + sizeof(uint32_t));
  45. }
  46. *ulen = udatalen;
  47. memcpy(pbuffer+RVC_FILE_HEADER_FLAG_LEN, &udatalen, sizeof(uint32_t));
  48. iret = 0;
  49. return iret;
  50. }
  51. int get_rvc_file_header_info(rvc_fileheader_t* pdata, char* pheadbuffer, uint32_t ulen, const filecryption_callback_t* pcallback)
  52. {
  53. int iret = -1;
  54. if (NULL == pheadbuffer){
  55. return iret;
  56. }
  57. //3. 文件加密版本标识
  58. size_t uindex = 0;
  59. if (0 == get_tag_value_from_buffer(pdata->strcryptver, RVC_CRYPTION_VER_FLAG_LEN, pheadbuffer+uindex, ulen - uindex)){
  60. uindex += (RVC_CRYPTION_VER_FLAG_LEN + sizeof(uint32_t));
  61. }
  62. else{
  63. return iret;
  64. }
  65. //4. 源文件hash值
  66. if (0 == get_tag_value_from_buffer((char*)pdata->strhash, RVC_FILE_HASH_LEN, pheadbuffer+uindex, ulen - uindex)){
  67. uindex += (RVC_FILE_HASH_LEN + sizeof(uint32_t));
  68. }
  69. else{
  70. return iret;
  71. }
  72. //5. 源文件文件大小
  73. memcpy(&pdata->usrcfilelen, pheadbuffer+uindex, sizeof(uint32_t));
  74. uindex += sizeof(uint32_t);
  75. //6. 源文件文件名
  76. if (0 == get_tag_value_from_buffer((char*)pdata->strsrcfilename, MAX_PATH, pheadbuffer+uindex, ulen - uindex)){
  77. uindex += (strlen(pdata->strsrcfilename) + sizeof(uint32_t));
  78. }
  79. else{
  80. return iret;
  81. }
  82. //7. 真实文件格式,后缀名
  83. if (0 == get_tag_value_from_buffer((char*)pdata->strsrcfileformat, MAX_PATH, pheadbuffer+uindex, ulen - uindex)){
  84. iret = 0;
  85. }
  86. return iret;
  87. }
  88. int fill_tag_buffer(char* pbuffer, uint32_t ubuffersize, const char* pdata, uint32_t udatalen)
  89. {
  90. int iret = -1;
  91. if (NULL == pdata || NULL == pbuffer){
  92. return iret;
  93. }
  94. if (ubuffersize > udatalen + sizeof(uint32_t)){
  95. memcpy(pbuffer, &udatalen, sizeof(uint32_t));
  96. memcpy(pbuffer + sizeof(uint32_t), pdata, udatalen);
  97. iret = 0;
  98. }
  99. return iret;
  100. }
  101. int get_tag_value_from_buffer(char* pbuffer, uint32_t ubuffersize, const char* pdata, uint32_t udatalen)
  102. {
  103. int iret = -1;
  104. if (NULL == pdata || NULL == pbuffer || udatalen < sizeof(uint32_t)){
  105. return iret;
  106. }
  107. int idatalen = 0;
  108. memcpy(&idatalen, pdata, sizeof(int));
  109. if (udatalen >= idatalen + sizeof(uint32_t) && ubuffersize >= idatalen){
  110. memcpy(pbuffer, pdata + sizeof(uint32_t), idatalen);
  111. iret = 0;
  112. }
  113. return iret;
  114. }
  115. int get_key_from_header_info(unsigned char* pkey, uint32_t ukeysize, char* pheader, uint32_t udatalen, const filecryption_callback_t* pcallback)
  116. {
  117. int iret = -1;
  118. rvc_fileheader_t t_param = {0};
  119. if (0 != get_rvc_file_header_info(&t_param, pheader, udatalen, pcallback)){
  120. safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s", "get rvc file header infos failed!");
  121. return iret;
  122. }
  123. if (0 == GenerateSM4Key(pkey, ukeysize, t_param.strhash, RVC_FILE_HASH_LEN, t_param.usrcfilelen)){
  124. safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "%s", "Generate SM4Key success!");
  125. iret = 0;
  126. }
  127. return iret;
  128. }