Bläddra i källkod

Z991239-968 #comment other: 合并国密的集中配置代码

gifur 5 år sedan
förälder
incheckning
70b0eb1a96

+ 17 - 71
Module/mod_CenterSetting/CenterSettingConn.cpp

@@ -1,7 +1,4 @@
 #include "stdafx.h"
-#ifdef RVC_OS_WIN
-	#include <wincrypt.h>
-#endif // RVC_OS_WIN
 #include "CenterSettingConn.h"
 #include "Event.h"
 #include <map>
@@ -12,7 +9,6 @@ using namespace std;
 
 #include "fileutil.h"
 #include "iniutil.h"
-#include "md5.h"
 
 CCenterSettingConn::CCenterSettingConn(CEntityBase *pEntity)
 	: SpSecureClient(pEntity)
@@ -34,7 +30,7 @@ void CCenterSettingConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
 	string serviceCode = pRecvPkg->GetServiceCode();
 	auto pEntity = (CCenterSettingEntity*) m_pEntity;
 	
-	if (serviceCode == "PollCfg2")
+	if (serviceCode == "PollSM")
 	{	
 		auto rc = OnEndPollConfig(pRecvPkg);
 
@@ -101,13 +97,13 @@ ErrorCodeEnum CCenterSettingConn::BeginPollConfig()
 	auto rc = pFunc->GetSystemStaticInfo(info);
 	assert(rc == Error_Succeed);
 
-	auto pPackage = CreateNewPackage("PollCfg2");
+	auto pPackage = CreateNewPackage("PollSM");
 	auto &syncFiles = pEntity->m_SyncFileInfo;
 	int nArrayNum = syncFiles.size();
 	if (nArrayNum> 0)
 	{		
-		PollCfgReq *pReq = new PollCfgReq[nArrayNum];
-		memset(pReq, 0, sizeof(PollCfgReq)*nArrayNum);
+		PollSMR *pReq = new PollSMR[nArrayNum];
+		memset(pReq, 0, sizeof(PollSMR)*nArrayNum);
 		int nIndex = 0;
 		for (auto it = pEntity->m_SyncFileInfo.begin(); it != pEntity->m_SyncFileInfo.end(); it++)
 		{
@@ -128,12 +124,12 @@ ErrorCodeEnum CCenterSettingConn::BeginPollConfig()
 			nIndex++;
 		}
 
-		pPackage->AddStruct("PollReq", false, false, (BYTE*) pReq, sizeof(PollCfgReq)*nArrayNum, nArrayNum);
+		pPackage->AddStruct("PollSMR", false, false, (BYTE*) pReq, sizeof(PollSMR)*nArrayNum, nArrayNum);
 		delete[] pReq;
 	}
 	else
 	{
-		PollCfgReq req = {};
+		PollSMR req = {};
 #ifdef RVC_OS_WIN
 		strncpy_s(req.TerminalNo, sizeof(req.TerminalNo), info.strTerminalID, _TRUNCATE);
 		strncpy_s(req.MachineType, sizeof(req.MachineType), info.strMachineType, _TRUNCATE);
@@ -144,8 +140,7 @@ ErrorCodeEnum CCenterSettingConn::BeginPollConfig()
 		strncpy(req.Sites, info.strSite, strlen(info.strSite));
 #endif
 
-
-		pPackage->AddStruct("PollReq", false, false, (BYTE*)&req, sizeof(PollCfgReq));
+		pPackage->AddStruct("PollSMR", false, false, (BYTE*)&req, sizeof(PollSMR));
 	}
 
 	SendPackage(pPackage);
@@ -170,7 +165,7 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
 	int nIndex = 1;
 	while (true)
 	{
-		CSimpleStringA strCurStructName = CSimpleStringA::Format("PollRet%d", nIndex);
+		CSimpleStringA strCurStructName = CSimpleStringA::Format("PollSMA%d", nIndex);
 		
 		int nRetLen = pRecvPkg->GetStructLen(strCurStructName);
 		if (nRetLen == -1)
@@ -188,25 +183,22 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
 		int nBufLen = nRetLen;
 		bool bSuc = pRecvPkg->GetStructData(strCurStructName, pBuf, &nBufLen, &nArrayNum);
 		assert(bSuc && nRetLen == nBufLen);
-		PollCfgRet *pRet = (PollCfgRet*)pBuf;
+		PollSMA*pRet = (PollSMA*)pBuf;
 
 		Dbg("center config changed, hash: %s, file: %s", (const char*)pRet->FileHash, (const char*)pRet->FileName);
 
 		// 校验Hash是否匹配
-		//BYTE md5digest[16] = {};
-		//if(0 != md5(md5digest, (BYTE*)pRet->FileContent, nRetLen - sizeof(PollCfgRet)))
-
-		BYTE md5[16] = {};
-		if (!MD5Hash((BYTE*)pRet->FileContent, nRetLen - sizeof(PollCfgRet), md5))
+		BYTE sm3[32] = {};
+		if(!SM3Hash((BYTE*)pRet->FileContent, nRetLen - sizeof(PollSMA), sm3))
 		{
-			Dbg("compute md5 hash fail");
+			Dbg("compute sm3 hash fail");
 			delete[] pBuf;
 			return Error_Unexpect;
 		}
 
 		CSimpleStringA strHash;
-		for (int i = 0; i < 16; i++)
-			strHash += CSimpleStringA::Format("%02x", md5[i]);
+		for (int i = 0; i < 32; i++)
+			strHash += CSimpleStringA::Format("%02x", sm3[i]);
 
 		if (stricmp(strHash, pRet->FileHash) != 0)
 		{
@@ -224,13 +216,13 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
 		// 保存新配置文件
 		CSimpleStringA strNewFile = strCurFile + ".new";
 		auto hFile = fopen(strNewFile, "wb");
-		int nLen = fwrite(pRet->FileContent, 1, nRetLen - sizeof(PollCfgRet), hFile);
+		int nLen = fwrite(pRet->FileContent, 1, nRetLen - sizeof(PollSMA), hFile);
 		fflush(hFile);
 		fclose(hFile);
 
-		if (nLen < nRetLen - sizeof(PollCfgRet))
+		if (nLen < nRetLen - sizeof(PollSMA))
 		{
-			Dbg("save %s fail, fwrite len: %d, act len: %d", pRet->FileName, nLen, nRetLen - sizeof(PollCfgRet));
+			Dbg("save %s fail, fwrite len: %d, act len: %d", pRet->FileName, nLen, nRetLen - sizeof(PollSMA));
 			delete[] pBuf;
 			return Error_Unexpect;
 		}
@@ -327,49 +319,3 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
 
 	return Error_Succeed;
 }
-
-bool CCenterSettingConn::MD5Hash(BYTE *pData, int nDataLen, BYTE hash[16])
-{
-
-#if !defined(RVC_OS_WIN)
-	md5_ctx_t ctx;
-	md5_init(&ctx);
-	if (0 != md5_update(&ctx, pData, nDataLen))
-		return false;
-
-	if (0 != md5_final(hash, &ctx))
-		return false;
-
-	return true;
-#else
-	bool bRet = false;
-	HCRYPTPROV hCryptProv;
-	if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) {
-		int rc = Error_Unexpect;
-		HCRYPTHASH hHash;
-		if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) {
-			if (!CryptHashData(hHash, pData, nDataLen, 0))
-				Dbg("CryptHashData fail");
-			else {
-				DWORD dwLen = 16;
-				if (CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&hash[0], &dwLen, 0))
-					bRet = true;
-				else
-					Dbg("CryptGetHashParam fail");
-			}
-			CryptDestroyHash(hHash);
-		}
-		else {
-			Dbg("CryptCreateHash failed");
-		}
-		CryptReleaseContext(hCryptProv, 0);
-	}
-	else {
-		Dbg("CryptAcquireContextA failed");
-	}
-	return bRet;
-#endif // RVC_OS_WIN
-
-
-
-}

+ 34 - 1
Module/mod_CenterSetting/CenterSettingConn.h

@@ -1,3 +1,6 @@
+#ifndef RVC_MOD_CENTERSETTING_CONN_H_
+#define RVC_MOD_CENTERSETTING_CONN_H_
+
 #pragma once
 
 #include "SpSecureClient.h"
@@ -33,8 +36,38 @@ struct PollCfgRet
 	// 集中配置内容
 	char FileContent[0];
 };
+
+struct PollSMR
+{
+	//TerminalNo	终端号	
+	char TerminalNo[16];
+
+	//MachineType	设备型号	
+	char MachineType[32];
+
+	// 设备部署场所代码
+	char Sites[16];
+
+	// 当前配置指纹
+	char LastHash[80];
+};
+
+//[StructName("PollRet")]
+struct PollSMA
+{
+	// 配置文件名称
+	char FileName[32];
+
+	// 当前配置指纹
+	char FileHash[80];
+
+	// 集中配置内容
+	char FileContent[0];
+};
 #pragma pack()
 
+
+
 class CCenterSettingConn : public SpSecureClient
 {
 public:
@@ -51,6 +84,6 @@ private:
 	UINT64 ConvertBytesToUINT64(byte bytesData[8]);
 	bool IsServiceAvailable(const char *pszServiceAddr);
 	bool ParseIPAddress(const char *str, CSimpleStringA &ip, int &port);
-	bool MD5Hash(BYTE *pData, int nDataLen, BYTE hash[16]);	;
 };
 
+#endif //RVC_MOD_CENTERSETTING_CONN_H_

+ 1 - 1
Module/mod_CenterSetting/ChangeLog

@@ -1,2 +1,2 @@
-
+* 2020年10月27日 合并国密版本的代码
 * 2020-7-3 调通与分行服务进行通信的功能,双活机制中用到

+ 3 - 3
Module/mod_CenterSetting/mod_centersetting.cpp

@@ -36,11 +36,11 @@ CServerSessionBase *CCenterSettingEntity::OnNewSession(const char* /*pszRemoteEn
 			 CSimpleStringA strSite;
 			 if (TryExtractSiteFromFileName(pszFile, info.strFileName, strSite))
 			 {
-				 char szTmp[64];
-				 inifile_read_str_s("Main", "SyncHash", "", szTmp, 64, pszFile);
+				 char szTmp[80];
+				 inifile_read_str_s("Main", "SyncHash", "", szTmp, 80, pszFile);
 				 info.strFileHash = szTmp;
 
-				 inifile_read_str_s("Main", "SyncTime", "", szTmp, 64, pszFile);
+				 inifile_read_str_s("Main", "SyncTime", "", szTmp, 80, pszFile);
 				 DWORD nValue;
 				 sscanf(szTmp, "0x%X", &nValue);
 				 info.dwSyncTime = nValue;