#include "stdafx.h" #include "rvcfileheader.h" #include "fileanalysis.h" #include int constrcut_rvc_file_header(char* pbuffer, uint32_t* ulen, const char* pfilename, const filecryption_callback_t* pcallback, eRvcCryptionVersion eversion) { int iret = -1; //1. 自定义文件头标识16位 size_t udatalen = strlen(rvc_header); memcpy(pbuffer, rvc_header, udatalen); //2. 自定义文件头长度4位 udatalen += sizeof(uint32_t); //3. 文件加密版本标识 const char* strheader = cryption_ver_flag_table[0]; if (eversion < sizeof(cryption_ver_flag_table)/sizeof(char*) && eversion >= 0){ strheader = cryption_ver_flag_table[eversion]; } if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strheader, strlen(strheader))){ udatalen += (strlen(strheader) + sizeof(uint32_t)); } //4. 源文件hash值 char strhash[RVC_FILE_HASH_LEN] = {0}; if (get_srcfile_hash(strhash, RVC_FILE_HASH_LEN, pfilename)){ safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s","get file hash failed!"); return iret; } if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strhash, RVC_FILE_HASH_LEN)){ udatalen += (RVC_FILE_HASH_LEN + sizeof(uint32_t)); } //5. 源文件文件大小 uint32_t usize = get_srcfile_size(pfilename); memcpy(pbuffer+udatalen, &usize, sizeof(uint32_t)); udatalen += sizeof(uint32_t); //6. 源文件文件名 char strname[MAX_PATH] = {0}; get_srcfile_name(strname, MAX_PATH, pfilename); if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strname, strlen(strname))){ udatalen += (strlen(strname) + sizeof(uint32_t)); } //7. 真实文件格式,后缀名 char strformat[MAX_PATH] = {0}; get_srcfile_format(strformat, MAX_PATH, pfilename); if (0 == fill_tag_buffer(pbuffer + udatalen, *ulen - udatalen, strformat, strlen(strformat))){ udatalen += (strlen(strformat) + sizeof(uint32_t)); } *ulen = udatalen; memcpy(pbuffer+RVC_FILE_HEADER_FLAG_LEN, &udatalen, sizeof(uint32_t)); iret = 0; return iret; } int get_rvc_file_header_info(rvc_fileheader_t* pdata, char* pheadbuffer, uint32_t ulen, const filecryption_callback_t* pcallback) { int iret = -1; if (NULL == pheadbuffer){ return iret; } //3. 文件加密版本标识 size_t uindex = 0; if (0 == get_tag_value_from_buffer(pdata->strcryptver, RVC_CRYPTION_VER_FLAG_LEN, pheadbuffer+uindex, ulen - uindex)){ uindex += (RVC_CRYPTION_VER_FLAG_LEN + sizeof(uint32_t)); } else{ return iret; } //4. 源文件hash值 if (0 == get_tag_value_from_buffer((char*)pdata->strhash, RVC_FILE_HASH_LEN, pheadbuffer+uindex, ulen - uindex)){ uindex += (RVC_FILE_HASH_LEN + sizeof(uint32_t)); } else{ return iret; } //5. 源文件文件大小 memcpy(&pdata->usrcfilelen, pheadbuffer+uindex, sizeof(uint32_t)); uindex += sizeof(uint32_t); //6. 源文件文件名 if (0 == get_tag_value_from_buffer((char*)pdata->strsrcfilename, MAX_PATH, pheadbuffer+uindex, ulen - uindex)){ uindex += (strlen(pdata->strsrcfilename) + sizeof(uint32_t)); } else{ return iret; } //7. 真实文件格式,后缀名 if (0 == get_tag_value_from_buffer((char*)pdata->strsrcfileformat, MAX_PATH, pheadbuffer+uindex, ulen - uindex)){ iret = 0; } return iret; } int fill_tag_buffer(char* pbuffer, uint32_t ubuffersize, const char* pdata, uint32_t udatalen) { int iret = -1; if (NULL == pdata || NULL == pbuffer){ return iret; } if (ubuffersize > udatalen + sizeof(uint32_t)){ memcpy(pbuffer, &udatalen, sizeof(uint32_t)); memcpy(pbuffer + sizeof(uint32_t), pdata, udatalen); iret = 0; } return iret; } int get_tag_value_from_buffer(char* pbuffer, uint32_t ubuffersize, const char* pdata, uint32_t udatalen) { int iret = -1; if (NULL == pdata || NULL == pbuffer || udatalen < sizeof(uint32_t)){ return iret; } int idatalen = 0; memcpy(&idatalen, pdata, sizeof(int)); if (udatalen >= idatalen + sizeof(uint32_t) && ubuffersize >= idatalen){ memcpy(pbuffer, pdata + sizeof(uint32_t), idatalen); iret = 0; } return iret; } int get_key_from_header_info(unsigned char* pkey, uint32_t ukeysize, char* pheader, uint32_t udatalen, const filecryption_callback_t* pcallback) { int iret = -1; rvc_fileheader_t t_param = {0}; if (0 != get_rvc_file_header_info(&t_param, pheader, udatalen, pcallback)){ safe_log(pcallback, FILECRYPT_LEVEL_ERROR, "%s", "get rvc file header infos failed!"); return iret; } if (0 == GenerateSM4Key(pkey, ukeysize, t_param.strhash, RVC_FILE_HASH_LEN, t_param.usrcfilelen)){ safe_log(pcallback, FILECRYPT_LEVEL_DEBUG, "%s", "Generate SM4Key success!"); iret = 0; } return iret; }