123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #include "stdafx.h"
- #include "rvcfileheader.h"
- #include "fileanalysis.h"
- #include <string.h>
- 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;
- }
|