|
|
@@ -18,6 +18,58 @@ using namespace AccessAuthorization;
|
|
|
#include <io.h>
|
|
|
#include "fileutil.h"
|
|
|
#include <regex>
|
|
|
+#include "RVCComm.h"
|
|
|
+
|
|
|
+namespace Task
|
|
|
+{
|
|
|
+ struct GetMD5Task : public ITaskSp
|
|
|
+ {
|
|
|
+ CUpgradeMgrEntity* Mgr;
|
|
|
+ explicit GetMD5Task(CUpgradeMgrEntity* e) : Mgr(e) {}
|
|
|
+ void Process(){
|
|
|
+ LOG_FUNCTION();
|
|
|
+ bool isSendHashList = false;
|
|
|
+ for(int i=0;i<3;i++){
|
|
|
+ Dbg("begin get MD5 list");
|
|
|
+ //尝试三次机会获取,如失败则不再获取hash文件,计算耗时时间
|
|
|
+
|
|
|
+ CSmallDateTime beginT = CSmallDateTime::GetNow();
|
|
|
+ CSimpleStringA tempSM3ListStr = "";
|
|
|
+ ErrorCodeEnum rc = Mgr->GetMD5List(tempSM3ListStr);
|
|
|
+ CSmallDateTime endT = CSmallDateTime::GetNow();
|
|
|
+ Dbg("get MD5 list 耗时%d秒",(DWORD)(endT-beginT));
|
|
|
+
|
|
|
+ if (rc != Error_Succeed)
|
|
|
+ {
|
|
|
+ LogError(Severity_Middle, rc, 0, "get MD5 list fail");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CSimpleStringA tempSM3HashStr = "";
|
|
|
+ if(Error_Succeed==Mgr->SM3DataToStr(tempSM3ListStr,tempSM3HashStr,true)){
|
|
|
+ //通知发送传hash值给服务器,并置获取hash码成功状态位
|
|
|
+ Mgr->m_strSM3Hash = tempSM3HashStr;
|
|
|
+ Dbg("get MD5 list success, len=%d, SM3 hash=%s", Mgr->m_strMD5List.GetLength(),Mgr->m_strSM3Hash.GetData());
|
|
|
+ isSendHashList = true;
|
|
|
+ break;
|
|
|
+ }else{
|
|
|
+ LogError(Severity_Middle, rc, 0, "get MD5 list hash fail");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isSendHashList){
|
|
|
+ Dbg("send MD5 list to ReportFSM");
|
|
|
+ Mgr->m_IsSM3listSucc=1;//获取sm3hash成功
|
|
|
+ Mgr->m_fsm.SendSM3ListEvent();
|
|
|
+ }else{
|
|
|
+ Mgr->m_IsSM3listSucc=-1;//获取sm3hash失败
|
|
|
+ Dbg("get MD5 list fail,don't send MD5 list to ReportFSM");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
|
|
|
// 升级管理 UpgradeManager 0x506
|
|
|
void CUpgradeMgrEntity::OnStarted()
|
|
|
@@ -48,16 +100,23 @@ void CUpgradeMgrEntity::OnStarted()
|
|
|
//}
|
|
|
|
|
|
//zl@20190311 每次启动时生成新的MD5List
|
|
|
- rc = GetMD5List(m_strMD5List);
|
|
|
+ //rc = GetMD5List(m_strMD5List);
|
|
|
+ //if (rc != Error_Succeed)
|
|
|
+ //{
|
|
|
+ // LogError(Severity_Middle, rc, 0, "GetMD5List fail");
|
|
|
+ //}
|
|
|
+ //else
|
|
|
+ //{
|
|
|
+ // Dbg("get MD5 list success, len=%d", m_strMD5List.GetLength());
|
|
|
+ //}
|
|
|
+ //计算时间太长,放入工作线程中
|
|
|
+ Task::GetMD5Task* task = new Task::GetMD5Task(this);
|
|
|
+ rc = this->GetFunction()->PostThreadPoolTask(task);
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
- LogError(Severity_Middle, rc, 0, "GetMD5List fail");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Dbg("get MD5 list success, len=%d", m_strMD5List.GetLength());
|
|
|
+ LogError(Severity_Middle, rc, 0, "Post GetMD5Task task to Thread is fail");
|
|
|
}
|
|
|
-
|
|
|
+ m_beginSM3HashTime = CSmallDateTime::GetNow();
|
|
|
// 由于准入未上线或可能不稳定,为了保持升级服务的可用性,一直保持可升级状态
|
|
|
m_fsm.PostEventFIFO(new FSMEvent(CUpgradeMgrFSM::Event_EntryPermit));
|
|
|
}
|
|
|
@@ -322,6 +381,93 @@ ErrorCodeEnum CUpgradeMgrEntity::MD5File(CSimpleStringA strFilePath, CSimpleStri
|
|
|
|
|
|
return Error_Succeed;
|
|
|
}
|
|
|
+
|
|
|
+ErrorCodeEnum CUpgradeMgrEntity::SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub){
|
|
|
+ if(SM3Byte == NULL){
|
|
|
+ return Error_Exception;
|
|
|
+ }
|
|
|
+ int SM3_len=64;
|
|
|
+ if(isSub){
|
|
|
+ SM3_len=32;
|
|
|
+ }
|
|
|
+ int i;
|
|
|
+ char* file_SM3 = (char*)malloc((SM3_len + 1) * sizeof(char));
|
|
|
+ if(file_SM3 == NULL)
|
|
|
+ {
|
|
|
+ fprintf(stderr, "SM3 malloc failed.\n");
|
|
|
+ return Error_Exception;
|
|
|
+ }
|
|
|
+ memset(file_SM3, 0, (SM3_len + 1));
|
|
|
+
|
|
|
+ if(SM3_len == 32)
|
|
|
+ {
|
|
|
+ for(i=0; i<16; i++)
|
|
|
+ { //SM3截取中间16位字节,8-24位字节数,小写
|
|
|
+ sprintf(&file_SM3[i*2], "%02x", SM3Byte[i+8]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(SM3_len == 64)
|
|
|
+ {
|
|
|
+ for(i=0; i<32; i++)
|
|
|
+ {
|
|
|
+ sprintf(&file_SM3[i*2], "%02x", SM3Byte[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strSM3=file_SM3;
|
|
|
+ free(file_SM3);
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+
|
|
|
+ErrorCodeEnum CUpgradeMgrEntity::SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub)
|
|
|
+{
|
|
|
+ if(strFilePath.IsNullOrEmpty()){
|
|
|
+ return Error_Null;
|
|
|
+ }
|
|
|
+ int nlen = strlen(strFilePath.GetData());
|
|
|
+ char* pchar = new char[nlen+1];
|
|
|
+ strcpy(pchar,strFilePath.GetData());
|
|
|
+ BYTE md5[32]={0};
|
|
|
+ //Dbg("进行国密加密,file=%s",strFilePath.GetData());
|
|
|
+ //if(SM3File(pchar,md5)){
|
|
|
+ // delete pchar;
|
|
|
+ // 获取16进制的字符串
|
|
|
+ // if(Error_Succeed!=SM3_Str(strSM3,md5,isSub)){
|
|
|
+ // Dbg("sm3国密转16进制字符串失败,file=%s",strFilePath.GetData());
|
|
|
+ // return Error_Unexpect;
|
|
|
+ // }
|
|
|
+ // return Error_Succeed;
|
|
|
+ //}else{
|
|
|
+ // delete pchar;
|
|
|
+ // Dbg("sm3国密加密失败,file=%s",strFilePath.GetData());
|
|
|
+ // return Error_Unexpect;
|
|
|
+ //}
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if(SM3File(pchar,md5)){
|
|
|
+ delete pchar;
|
|
|
+ //获取16进制的字符串
|
|
|
+ if(Error_Succeed!=SM3_Str(strSM3,md5,isSub)){
|
|
|
+ Dbg("sm3国密转16进制字符串失败,file=%s",strFilePath.GetData());
|
|
|
+ return Error_Unexpect;
|
|
|
+ }
|
|
|
+ return Error_Succeed;
|
|
|
+ }else{
|
|
|
+ delete pchar;
|
|
|
+ Dbg("sm3国密加密失败,file=%s",strFilePath.GetData());
|
|
|
+ return Error_Unexpect;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (...)
|
|
|
+ {
|
|
|
+ delete pchar;
|
|
|
+ Dbg("sm3国密加密异常失败,file=%s",strFilePath.GetData());
|
|
|
+ return Error_Exception;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
ErrorCodeEnum CUpgradeMgrEntity::MD5Data(CSimpleStringA strData, CSimpleStringA &strMD5)
|
|
|
{
|
|
|
char* pMd5 = MD5FILE::MD5_data((char*)strData.GetData(), 32);
|
|
|
@@ -335,6 +481,35 @@ ErrorCodeEnum CUpgradeMgrEntity::MD5Data(CSimpleStringA strData, CSimpleStringA
|
|
|
|
|
|
return Error_Succeed;
|
|
|
}
|
|
|
+
|
|
|
+ErrorCodeEnum CUpgradeMgrEntity::SM3DataToStr(CSimpleStringA strData, CSimpleStringA &strSM3,bool isSub)
|
|
|
+{
|
|
|
+ if(strData.IsNullOrEmpty()){
|
|
|
+ return Error_Null;
|
|
|
+ }
|
|
|
+ BYTE md5[32]={0};
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if(SM3Hash((BYTE*)strData.GetData(),strlen(strData.GetData()),md5)){
|
|
|
+ //获取16进制的字符串
|
|
|
+ if(Error_Succeed!=SM3_Str(strSM3,md5,isSub)){
|
|
|
+ Dbg("sm3国密转16进制字符串失败");
|
|
|
+ return Error_Unexpect;
|
|
|
+ }
|
|
|
+ return Error_Succeed;
|
|
|
+ }else{
|
|
|
+ Dbg("sm3国密加密失败");
|
|
|
+ return Error_Unexpect;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (...)
|
|
|
+ {
|
|
|
+ Dbg("sm3国密加密异常失败");
|
|
|
+ return Error_Exception;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+//修改成sm3加密
|
|
|
ErrorCodeEnum CUpgradeMgrEntity::MD5Folder(CSimpleStringA strFolderPath,bool isDepDIr)
|
|
|
{
|
|
|
if (strFolderPath.IsNullOrEmpty())
|
|
|
@@ -380,13 +555,21 @@ ErrorCodeEnum CUpgradeMgrEntity::MD5Folder(CSimpleStringA strFolderPath,bool isD
|
|
|
Dbg("BlackDir Filter don't add to md5 list, dir=[%s]", dirPath.GetData());
|
|
|
continue;//跳过文件夹
|
|
|
}else{
|
|
|
- //判断是否是dep文件夹
|
|
|
- if(strcmp(FileInfo.name, "dep") == 0){
|
|
|
+ //判断是否是dep文件夹或者是dep文件夹下面的子文件夹
|
|
|
+ if(strcmp(FileInfo.name, "dep") == 0||isDepDIr){
|
|
|
newPath = strFolderPath + "\\" + FileInfo.name;
|
|
|
- MD5Folder(newPath,true);
|
|
|
+ ErrorCodeEnum rc = MD5Folder(newPath,true);
|
|
|
+ if(Error_Succeed!=rc){
|
|
|
+ _findclose(Handle);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
}else{
|
|
|
newPath = strFolderPath + "\\" + FileInfo.name;
|
|
|
- MD5Folder(newPath);
|
|
|
+ ErrorCodeEnum rc = MD5Folder(newPath);
|
|
|
+ if(Error_Succeed!=rc){
|
|
|
+ _findclose(Handle);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -423,10 +606,6 @@ ErrorCodeEnum CUpgradeMgrEntity::MD5Folder(CSimpleStringA strFolderPath,bool isD
|
|
|
if(std::regex_match(strFindName.GetData(),e,regex_constants::match_default)){
|
|
|
continue;
|
|
|
}
|
|
|
- /*if(strFindName.IndexOf("CenterSetting.")>-1&&strFindName.IndexOf(".ini")>-1){
|
|
|
- continue;
|
|
|
- }*/
|
|
|
-
|
|
|
|
|
|
// 过滤install.ini,集中配置,log文件和cfg\certs目录
|
|
|
// TODO:改成配置
|
|
|
@@ -467,10 +646,13 @@ ErrorCodeEnum CUpgradeMgrEntity::MD5Folder(CSimpleStringA strFolderPath,bool isD
|
|
|
|
|
|
CSimpleStringA strFilePath = strFolderPath + "\\" + strFindName;
|
|
|
CSimpleStringA strMD5Val;
|
|
|
- ErrorCodeEnum rErrcode = MD5File(strFilePath, strMD5Val);
|
|
|
+ //ErrorCodeEnum rErrcode = MD5File(strFilePath, strMD5Val);
|
|
|
+ //修改为SM3进行哈希
|
|
|
+ ErrorCodeEnum rErrcode = SM3FileToStr(strFilePath, strMD5Val,false);
|
|
|
if (Error_Succeed != rErrcode)
|
|
|
{
|
|
|
Dbg("%s获取MD5失败,错误码:%d", strFilePath.GetData(), (int)rErrcode);
|
|
|
+ _findclose(Handle);
|
|
|
return rErrcode;
|
|
|
}
|
|
|
|