InitializerConn.cpp 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. #include "stdafx2.h"
  2. #include "InitializerConn.h"
  3. #include "mod_Initializer.h"
  4. #include "GetDevInfoHelper.h"
  5. #include "fileutil.h"
  6. #include "array.h"
  7. #include "strutil.h"
  8. #include "..\EventCode.h"
  9. #pragma comment(lib, "crypt32.lib")
  10. #define PUKFILENAME_RSA "RVCPubKey.ini"
  11. #define PUKFILENAME_SM2 "RVCSM2PubKey.ini"
  12. #include "MyBase64.h"
  13. CInitializerConn::CInitializerConn(CEntityBase *pEntity)
  14. :SpSecureClient(pEntity)
  15. {
  16. }
  17. CInitializerConn::~CInitializerConn()
  18. {
  19. }
  20. DWORD CInitializerConn::SendLoginPackage(const char *pUserID, const char *pPwd)
  21. {
  22. LOG_FUNCTION();
  23. assert(IsConnectionOK());
  24. UserLoginReq req;
  25. memset(&req, 0, sizeof(req));
  26. CSystemStaticInfo si;
  27. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  28. Dbg("UserID[%s],PWD[%s], TerminalID[%s]",pUserID, pPwd, si.strTerminalID);
  29. // 设备号
  30. strncpy(&req.szTerminalNo[0], (const char*)si.strTerminalID, sizeof(req.szTerminalNo)-1);
  31. int nLen = strlen(pUserID);
  32. strncpy(req.szUser, pUserID, nLen > 16 ? 16 : nLen);
  33. nLen = strlen(pPwd);
  34. strncpy(req.szPassword, pPwd, nLen > 16 ? 16 : nLen);
  35. CSmartPointer<IPackage> package = CreateNewPackage("Login");
  36. package->AddStruct("LOGINREQ", false, false, (BYTE*)&req, sizeof(req));
  37. return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
  38. }
  39. DWORD CInitializerConn::SendInitMKPackage()
  40. {
  41. assert(IsConnectionOK());
  42. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  43. CSmartPointer<IPackage> package = CreateNewPackage("InitMK");
  44. auto pEntity = ((CInitializerEntity*)m_pEntity);
  45. // 如果有外置PinPad,则需要初始化主密钥
  46. if (pEntity->HasPinPad())
  47. {
  48. CSmartPointer<IConfigInfo> pConfig;
  49. DWORD rc = pFunc->OpenConfig(Config_CenterSetting, pConfig);
  50. if (rc != Error_Succeed)
  51. {
  52. LogWarn(Severity_Middle,(ErrorCodeEnum) rc, ERR_INITIALIZER_READ_WRITE_FILE,
  53. GetOutPutStr("%s%08X%s%s", "OpenConfig", rc,"File","Config_CenterSetting").c_str());
  54. rc = ERR_INITIALIZER_READ_WRITE_FILE;
  55. pEntity->m_strLastErrMsg = CSimpleStringA::Format("打开集中配置失败,请先下载集中配置!");
  56. return rc;
  57. }
  58. CSimpleStringA strSubBankNo, strBranchNo;
  59. rc = pConfig->ReadConfigValue("Initializer", "SubBankNo", strSubBankNo);
  60. if (rc == Error_Succeed)
  61. rc = pConfig->ReadConfigValue("Initializer", "BranchNo", strBranchNo);
  62. if (rc != Error_Succeed)
  63. {
  64. LogWarn(Severity_Low,(ErrorCodeEnum) rc, ERR_INITIALIZER_READ_WRITE_FILE,
  65. GetOutPutStr("%s%08X%s%s", "ReadConfigValue", rc, "File", "SubBankNo & BranchNo").c_str());
  66. pEntity->m_strLastErrMsg = CSimpleStringA::Format("集中配置Initializer节点下没有找到SubBankNo和BranchNo配置项,请联系分行技术部!");
  67. rc = ERR_INITIALIZER_READ_WRITE_FILE;
  68. return rc;
  69. }
  70. //国产化之后不再使用原方法获取KMC密钥
  71. /*
  72. {
  73. // 1:3des only; 2: sm4 only; 3: both 3des and sm4
  74. int nCapability = pEntity->GetPinPadCapability();
  75. Dbg("pinpad capability: %d", nCapability);
  76. if (nCapability == 1 || nCapability == 3)
  77. {
  78. // support des key
  79. char buf[632];
  80. memset(buf, 0, 632);
  81. MKDownloadReq2* pReq2 = (MKDownloadReq2*)buf;
  82. strncpy(pReq2->szSubBankNo, (const char*)strSubBankNo, sizeof(pReq2->szSubBankNo) - 1);
  83. strncpy(pReq2->szBranchNo, (const char*)strBranchNo, sizeof(pReq2->szBranchNo) - 1);
  84. CBlob blob;
  85. blob.Refer(pReq2->kmcData, 600);
  86. rc = pEntity->CreateInitMKData(blob, false);
  87. if (rc != Error_Succeed)
  88. {
  89. LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_CREATE_INIT_MK,
  90. GetOutPutStr("%s%d", "CreateInitTMK", rc).c_str());
  91. rc = ERR_INITIALIZER_CREATE_INIT_MK;
  92. pEntity->m_strLastErrMsg = CSimpleStringA::Format("调用KMC接口CreateInitTMKReq(0)失败,错误信息[%s],返回值[%d],请联系维护人员!",
  93. (const char*)pEntity->GetKMCLastErrMsg(), rc);
  94. return rc;
  95. }
  96. // 添加KMC信息
  97. package->AddStruct("MKD_REQ2", false, false, (BYTE*)buf, sizeof(MKDownloadReq2) + blob.m_iLength);
  98. }
  99. if (nCapability == 2 || nCapability == 3)
  100. {
  101. // support sm key
  102. char buf[632];
  103. memset(buf, 0, 632);
  104. SMMKDownloadReq2* pReq2 = (SMMKDownloadReq2*)buf;
  105. strncpy(pReq2->szSubBankNo, (const char*)strSubBankNo, sizeof(pReq2->szSubBankNo) - 1);
  106. strncpy(pReq2->szBranchNo, (const char*)strBranchNo, sizeof(pReq2->szBranchNo) - 1);
  107. CBlob blob;
  108. blob.Refer(pReq2->kmcData, 600);
  109. rc = pEntity->CreateInitMKData(blob, true);
  110. if (rc != Error_Succeed)
  111. {
  112. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CREATE_INIT_MK,
  113. GetOutPutStr("%s%d", "CreateInitTMK", rc).c_str());
  114. rc = ERR_INITIALIZER_CREATE_INIT_MK;
  115. pEntity->m_strLastErrMsg = CSimpleStringA::Format("调用KMC接口CreateInitTMKReq(0)失败,错误信息[%s],返回值[%d],请联系维护人员",
  116. (const char*)pEntity->GetKMCLastErrMsg(), rc);
  117. return rc;
  118. }
  119. // 添加KMC信息
  120. package->AddStruct("MKD_SMR2", false, false, (BYTE*)buf, sizeof(SMMKDownloadReq2) + blob.m_iLength);
  121. }
  122. }
  123. */
  124. }
  125. else
  126. {
  127. Dbg("has no pinpad, not need init MK");
  128. }
  129. CSimpleStringA strPinPadID = "", strDeviceID = "";
  130. int nRet = pEntity->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID);
  131. Dbg("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
  132. std::regex pattern(".+-[Ff][Ww][Bb]-.+");
  133. if (std::regex_match(strDeviceID.GetData(), pattern))
  134. {
  135. strDeviceID = "";
  136. strPinPadID = "";
  137. }
  138. Dbg("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
  139. // 从系统获取设备信息和硬件信息
  140. // 变长结构初始化
  141. char buf2[512];
  142. memset(buf2, 0, 512);
  143. MKDownloadNew1 *pReq1 = (MKDownloadNew1 *)buf2;
  144. CSystemStaticInfo si;
  145. pFunc->GetSystemStaticInfo(si);
  146. strncpy(pReq1->szTerminalNo, (const char*)si.strTerminalID, sizeof(pReq1->szTerminalNo)-1);
  147. if (nRet ==2 || nRet ==3)
  148. strncpy(pReq1->szPadDeviceID, (const char*)strDeviceID, sizeof(pReq1->szPadDeviceID) - 1);
  149. strncpy(pReq1->szMachineType, (const char*)si.strMachineType, sizeof(pReq1->szMachineType)-1);
  150. strncpy(pReq1->szSite, (const char*)si.strSite, sizeof(pReq1->szSite) - 1);
  151. hostent *ent = gethostbyname(NULL);
  152. if (ent && ent->h_addr_list[0] != NULL)
  153. {
  154. int i = 0;
  155. for (; ent->h_addr_list[i] != NULL; ++i)
  156. {
  157. struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  158. if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
  159. break;
  160. }
  161. if (ent->h_addr_list[i] == NULL)
  162. i = 0;
  163. auto in = (struct in_addr*)ent->h_addr_list[i];
  164. pReq1->ip[0] = in->S_un.S_un_b.s_b1;
  165. pReq1->ip[1] = in->S_un.S_un_b.s_b2;
  166. pReq1->ip[2] = in->S_un.S_un_b.s_b3;
  167. pReq1->ip[3] = in->S_un.S_un_b.s_b4;
  168. }
  169. si.EnrolGPS.GetBinaryLongitude(&pReq1->enrolGPS[0]);
  170. si.EnrolGPS.GetBinaryLatitude(&pReq1->enrolGPS[4]);
  171. Dbg("GPS=%s",(char*)&pReq1->enrolGPS);
  172. strcpy(pReq1->szEnrolAddr, (const char*)si.strEnrolAddr);
  173. int nStructLen = sizeof(MKDownloadNew1)+strlen(pReq1->szEnrolAddr); // 变长结构长度计算
  174. package->AddStruct("MKD_NEW1", false, false, (BYTE*)buf2, nStructLen);
  175. // 获取硬件信息
  176. CAutoArray<CSimpleStringA> devNames;
  177. DWORD rc = SpGetAllDevices(m_pEntity, devNames);
  178. if (rc != Error_Succeed)
  179. {
  180. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
  181. GetOutPutStr("%s%08X", "SpGetAllDevices", rc).c_str());
  182. rc = ERR_INITIALIZER_READ_WRITE_FILE;
  183. pEntity->m_strLastErrMsg = CSimpleStringA::Format("从root.ini读取硬件信息失败,错误码[0x%08X],请联系分行技术部", rc);
  184. return rc;
  185. }
  186. int nDevEntityCount = devNames.GetCount();
  187. if (nDevEntityCount >0)
  188. {
  189. int nBufLen = nDevEntityCount * sizeof(MKDownloadReq3);
  190. char *pBuf = new char[nBufLen];
  191. memset(pBuf, 0, nBufLen);
  192. MKDownloadReq3 *pDevInfo = (MKDownloadReq3*)pBuf;
  193. for(int i=0; i<nDevEntityCount; i++)
  194. {
  195. CSimpleStringA strVersion, strModel, strVendor;
  196. rc = SpGetDeviceInfo(m_pEntity, devNames[i], strModel, strVendor, strVersion);
  197. if (rc == Error_Succeed)
  198. {
  199. strncpy(pDevInfo->szType, (const char*)devNames[i], sizeof(pDevInfo->szType)-1);
  200. strncpy(pDevInfo->szModal, (const char*)strModel, sizeof(pDevInfo->szModal)-1);
  201. strncpy(pDevInfo->szFactory,(const char*)strVendor, sizeof(pDevInfo->szFactory)-1);
  202. if (strVersion.GetLength() >0)
  203. {
  204. CAutoArray<CSimpleStringA> arr = strVersion.Split('.');
  205. for(int i=0; i<4 && i<arr.GetCount(); i++)
  206. {
  207. WORD w = (WORD) atoi(arr[i]);
  208. ((BYTE*)pDevInfo->version)[i*2] = (w >> 8) & 0xFF;
  209. ((BYTE*)pDevInfo->version)[i*2+1] = w & 0xFF;
  210. }
  211. }
  212. }
  213. pDevInfo++;
  214. }
  215. package->AddStruct("MKD_REQ3", false, false, (BYTE*)pBuf, nBufLen, nDevEntityCount);
  216. delete[] pBuf;
  217. }
  218. // 获取硬件指纹和公钥信息
  219. MKDownloadReq4 req4 = {};
  220. BYTE fingerPrint[32] = { 0 };
  221. int nBufLen = sizeof(fingerPrint);
  222. if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen))
  223. {
  224. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_TERMINAL_FINGERPRINT,
  225. GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
  226. return ERR_INITIALIZER_GET_TERMINAL_FINGERPRINT;
  227. }
  228. memcpy(req4.FingerPrint,fingerPrint,16);
  229. memcpy(req4.FingerPrintSM, fingerPrint + 16, 16);
  230. nBufLen = sizeof(req4.PublicKey);
  231. Dbg("开始获取公钥。。。");
  232. memset(req4.PublicKey,0, nBufLen);
  233. Dbg("nBufLen=%d",nBufLen);
  234. if (!pEntity->GetTerminalPublicKey(req4.PublicKey, nBufLen))
  235. {
  236. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_TERMINAL_PUBKEY,
  237. GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
  238. return ERR_INITIALIZER_GET_TERMINAL_PUBKEY;
  239. }
  240. if (nRet == 1 || nRet == 3)
  241. strncpy(req4.PinPadID, (const char*)strPinPadID, sizeof(req4.PinPadID) - 1);
  242. package->AddStruct("MKD_REQ4", false, false, (BYTE*)&req4, sizeof(req4));
  243. //国密改造
  244. MKDownloadReq5 req5 = {};
  245. req5.isFirst = pEntity->GetOrSetIsFirstSM(0);
  246. req5.isSM = 1;
  247. package->AddStruct("MKD_REQ5", false, false, (BYTE*)& req5, sizeof(req5));
  248. Dbg("req5.isFirst=%d,req5.isSM=%d",req5.isFirst,req5.isSM);
  249. Dbg("send MK init request now");
  250. return SendPackage(package) != "" ? Error_Succeed : ERR_INITIALIZER_INIT_MK_SEND_PKG;
  251. }
  252. DWORD CInitializerConn::SendSyncPubKeyPackage()
  253. {
  254. assert(IsConnectionOK());
  255. PubKeySyncReq0 req;
  256. req.isSM = 1;
  257. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  258. CSmartPointer<IPackage> package = CreateNewPackage("SyncPK");
  259. package->AddStruct("PKSY_R0", false, false, (BYTE*)& req, sizeof(req));
  260. return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
  261. }
  262. DWORD CInitializerConn::SendGetKMCKey(string TerminalNo)
  263. {
  264. LOG_FUNCTION();
  265. assert(IsConnectionOK());
  266. KMCKeyReq req;
  267. memset(req.TerminalNo,0,sizeof(req.TerminalNo));
  268. strcpy(req.TerminalNo,TerminalNo.c_str());
  269. //req.TerminalNo = TerminalNo;
  270. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  271. CSmartPointer<IPackage> package = CreateNewPackage("KMCKey");
  272. package->AddStruct("KMCKeyReq", false, false, (BYTE*)& req, sizeof(req));
  273. return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
  274. }
  275. DWORD CInitializerConn::SendCloseTaskPackage(const char *pUserID)
  276. {
  277. LOG_FUNCTION();
  278. assert(IsConnectionOK());
  279. CloseTaskReq req;
  280. memset(&req, 0, sizeof(req));
  281. CSystemStaticInfo si;
  282. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  283. CSimpleStringA strUserID = pUserID;
  284. Dbg("TerminalNo[%s],UserID[%s]",si.strTerminalID.GetData(), strUserID.GetData());
  285. // 设备号
  286. strncpy(&req.szTerminalNo[0], (const char*)si.strTerminalID, sizeof(req.szTerminalNo)-1);
  287. int nLen = strlen(pUserID);
  288. strncpy(req.szUser, pUserID, nLen > 16 ? 16 : nLen);
  289. CSmartPointer<IPackage> package = CreateNewPackage("ClsTask");
  290. package->AddStruct("CLOSETASKREQ", false, false, (BYTE*)&req, sizeof(req));
  291. Dbg("send close task request now");
  292. return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
  293. }
  294. ErrorCodeEnum CInitializerConn::GetFileHash(const BYTE *pFileContent, int iFileLen, BYTE hash[16])
  295. {
  296. if ((NULL == pFileContent) || (0 == iFileLen))
  297. {
  298. return Error_Param;
  299. }
  300. HCRYPTPROV hCryptProv;
  301. int nReadLen = 0;
  302. ErrorCodeEnum rc = Error_Succeed;
  303. if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
  304. {
  305. HCRYPTHASH hHash;
  306. if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
  307. {
  308. if (!CryptHashData(hHash, pFileContent, iFileLen, 0))
  309. {
  310. rc = Error_Unexpect;
  311. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptHashData fail: %d", GetLastError()));
  312. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  313. GetOutPutStr("%s%s%s%d", "CryptHashData", "False", "GetLastError", GetLastError()).c_str());
  314. }
  315. if (rc == Error_Succeed)
  316. {
  317. DWORD dwLen = 16;
  318. if (!CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&hash[0], &dwLen, 0))
  319. {
  320. rc = Error_Unexpect;
  321. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptGetHashParam fail: %d", GetLastError()));
  322. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  323. GetOutPutStr("%s%s%s%d", "CryptGetHashParam", "False", "GetLastError", GetLastError()).c_str());
  324. }
  325. }
  326. CryptDestroyHash(hHash);
  327. }
  328. else
  329. {
  330. rc = Error_Unexpect;
  331. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptCreateHash fail: %d", GetLastError()));
  332. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  333. GetOutPutStr("%s%s%s%d", "CryptCreateHash", "False", "GetLastError", GetLastError()).c_str());
  334. }
  335. CryptReleaseContext(hCryptProv, 0);
  336. }
  337. else
  338. {
  339. rc = Error_Unexpect;
  340. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptAcquireContextA fail: %d", GetLastError()));
  341. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  342. GetOutPutStr("%s%s%s%d", "CryptAcquireContextA", "False", "GetLastError", GetLastError()).c_str());
  343. }
  344. return rc;
  345. }
  346. ErrorCodeEnum CInitializerConn::GetFileHashOld(const char *pFilePath, BYTE hash[16])
  347. {
  348. if (!ExistsFileA(pFilePath))
  349. return Error_NotExist;
  350. FILE *pFile = fopen(pFilePath, "r");
  351. if (pFile == NULL)
  352. return Error_Unexpect;
  353. BYTE tmp[4096];
  354. HCRYPTPROV hCryptProv;
  355. int nReadLen = 0;
  356. ErrorCodeEnum rc = Error_Succeed;
  357. if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
  358. {
  359. HCRYPTHASH hHash;
  360. if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
  361. {
  362. while ((nReadLen = fread(tmp, 1, sizeof(tmp), pFile)) > 0)
  363. {
  364. if (!CryptHashData(hHash, tmp, nReadLen, 0))
  365. {
  366. rc = Error_Unexpect;
  367. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptHashData fail: %d", GetLastError()));
  368. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  369. GetOutPutStr("%s%s%s%d", "CryptHashData", "False", "GetLastError", GetLastError()).c_str());
  370. break;
  371. }
  372. }
  373. if (rc == Error_Succeed)
  374. {
  375. DWORD dwLen = 16;
  376. if (!CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&hash[0], &dwLen, 0))
  377. {
  378. rc = Error_Unexpect;
  379. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptGetHashParam fail: %d", GetLastError()));
  380. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  381. GetOutPutStr("%s%s%s%d", "CryptGetHashParam", "False", "GetLastError", GetLastError()).c_str());
  382. }
  383. }
  384. CryptDestroyHash(hHash);
  385. }
  386. else
  387. {
  388. rc = Error_Unexpect;
  389. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptCreateHash fail: %d", GetLastError()));
  390. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  391. GetOutPutStr("%s%s%s%d", "CryptCreateHash", "False", "GetLastError", GetLastError()).c_str());
  392. }
  393. CryptReleaseContext(hCryptProv, 0);
  394. }
  395. else
  396. {
  397. rc = Error_Unexpect;
  398. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("CryptAcquireContextA fail: %d", GetLastError()));
  399. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_MD5_HASH,
  400. GetOutPutStr("%s%s%s%d", "CryptAcquireContextA", "False", "GetLastError", GetLastError()).c_str());
  401. }
  402. fclose(pFile);
  403. return rc;
  404. }
  405. void CInitializerConn::OnDisconnect()
  406. {
  407. Dbg("connection disconnected");
  408. auto pEntity = (CInitializerEntity*)m_pEntity;
  409. pEntity->OnSecureClientDisconnect();
  410. }
  411. void CInitializerConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  412. {
  413. LOG_FUNCTION();
  414. string serviceCode = pRecvPkg->GetServiceCode();
  415. Dbg("serviceCode=%s",serviceCode.c_str());
  416. if (serviceCode == "Login")
  417. {
  418. HandleLoginRet(pRecvPkg);
  419. }
  420. else if (serviceCode == "InitMK")
  421. {
  422. HandleInitMKRet(pRecvPkg);
  423. }
  424. else if (serviceCode == "SyncPK")
  425. {
  426. HandleSyncPubKeyRet(pRecvPkg);
  427. }
  428. else if (serviceCode == "RepState")
  429. {
  430. HandleReportStateRet(pRecvPkg);
  431. }
  432. else if (serviceCode == "ClsTask")
  433. {
  434. HandleCloseTaskRet(pRecvPkg);
  435. }
  436. else if (serviceCode == "KMCKey") {
  437. HandleGetKMCKey(pRecvPkg);
  438. }
  439. else
  440. {
  441. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_UNKOWN,
  442. GetOutPutStr("%s%s", "UnKown", serviceCode.c_str()).c_str());
  443. }
  444. }
  445. DWORD CInitializerConn::HandleLoginRet(const CSmartPointer<IPackage> &pRecvPkg)
  446. {
  447. LOG_FUNCTION();
  448. DWORD rc = Error_Succeed;
  449. DWORD dwSysCode, dwUserCode;
  450. string strErrMsg;
  451. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  452. {
  453. //在分行服务定义的错误码,值与EventCode.h中的对应
  454. LogWarn(Severity_Middle,(ErrorCodeEnum) dwSysCode, dwUserCode,
  455. GetOutPutStr("%s%08X%s%s", "GetErrMsg", dwSysCode,"strErrMsg", strErrMsg.c_str()).c_str());
  456. rc = dwUserCode;
  457. }
  458. ((CInitializerEntity*)m_pEntity)->EndLogin(rc, strErrMsg.c_str());
  459. return rc;
  460. }
  461. DWORD CInitializerConn::HandleCloseTaskRet(const CSmartPointer<IPackage> &pRecvPkg)
  462. {
  463. DWORD rc = Error_Succeed;
  464. DWORD dwSysCode, dwUserCode;
  465. string strErrMsg;
  466. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  467. {
  468. rc = dwUserCode;
  469. LogWarn(Severity_Middle, Error_Unexpect, rc,
  470. GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc, "strErrMsg", strErrMsg.c_str()).c_str());
  471. }
  472. ((CInitializerEntity*)m_pEntity)->SecureClientRelease();
  473. return rc;
  474. }
  475. DWORD CInitializerConn::HandleInitMKRet(const CSmartPointer<IPackage> &pRecvPkg)
  476. {
  477. DWORD rc = Error_Succeed;
  478. DWORD dwSysCode, dwUserCode;
  479. string strErrMsg;
  480. auto pEntity = (CInitializerEntity*)m_pEntity;
  481. CSimpleStringA strRetErrMsg;
  482. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  483. {
  484. rc = dwUserCode;
  485. LogWarn(Severity_Middle, (ErrorCodeEnum) rc, dwUserCode,
  486. GetOutPutStr("%s%08X%s%s", "dwSysCode", rc, "strErrMsg", strErrMsg).c_str());
  487. strRetErrMsg = strErrMsg.c_str();
  488. }
  489. else if (pEntity->HasPinPad()) // 有PinPad
  490. {
  491. //国产化不再使用原方法生成KMC密钥
  492. /*
  493. {
  494. // 主密钥初始返回
  495. int nRetLen = pRecvPkg->GetStructLen("MKD_RET");
  496. if (nRetLen > 0)
  497. {
  498. // support des key
  499. BYTE* pBuf = new BYTE[nRetLen];
  500. memset(pBuf, 0, nRetLen);
  501. int nArrayNum(0);
  502. pRecvPkg->GetStructData("MKD_RET", pBuf, &nRetLen, &nArrayNum);
  503. // 调用KMC解析返回
  504. CBlob blob;
  505. blob.Refer(pBuf, nRetLen);
  506. rc = pEntity->ParseInitMKResult(blob, false);
  507. delete pBuf;
  508. if (rc == Error_Succeed)
  509. {
  510. Dbg("parse des tmk succ");
  511. rc = pEntity->LoadKeysToPinPad(false);
  512. if (rc != Error_Succeed)
  513. {
  514. strRetErrMsg = "加载DES主密钥到密码键盘失败";
  515. LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
  516. GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
  517. //rc = ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD;
  518. }
  519. else
  520. strRetErrMsg = "加载DES主密钥成功。";
  521. }
  522. else
  523. {
  524. strRetErrMsg = "解析DES主密钥返回数据失败";
  525. LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_PARSE_INIT_MK,
  526. GetOutPutStr("%s%08X%s%s", "ParseInitMKResult", rc, "strRetErrMsg", strRetErrMsg).c_str());
  527. rc = ERR_INITIALIZER_PARSE_INIT_MK;
  528. }
  529. }
  530. nRetLen = pRecvPkg->GetStructLen("MKD_SMT");
  531. if (nRetLen > 0)
  532. {
  533. Dbg("正在加载国密密钥至pinpad");
  534. // support sm key
  535. BYTE* pBuf = new BYTE[nRetLen];
  536. memset(pBuf, 0, nRetLen);
  537. int nArrayNum(0);
  538. pRecvPkg->GetStructData("MKD_SMT", pBuf, &nRetLen, &nArrayNum);
  539. // 调用KMC解析返回
  540. CBlob blob;
  541. blob.Refer(pBuf, nRetLen);
  542. rc = pEntity->ParseInitMKResult(blob, true);
  543. delete pBuf;
  544. if (rc == Error_Succeed)
  545. {
  546. Dbg("parse sm4 tmk succ");
  547. rc = pEntity->LoadKeysToPinPad(true);
  548. if (rc != Error_Succeed)
  549. {
  550. strRetErrMsg = "加载SM主密钥到密码键盘失败";
  551. LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
  552. GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
  553. rc = ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD;
  554. }
  555. else
  556. strRetErrMsg += "加载SM主密钥成功。";
  557. }
  558. else
  559. {
  560. strRetErrMsg = "解析SM主密钥返回数据失败";
  561. LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_PARSE_INIT_MK,
  562. GetOutPutStr("%s%08X%s%s", "ParseInitMKResult", rc, "strRetErrMsg", strRetErrMsg).c_str());
  563. rc = ERR_INITIALIZER_PARSE_INIT_MK;
  564. }
  565. }
  566. }
  567. */
  568. //只支持国密
  569. rc = pEntity->LoadKeysToPinPad(true);
  570. if (rc != Error_Succeed)
  571. {
  572. strRetErrMsg = "加载SM密钥到密码键盘失败";
  573. LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
  574. GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
  575. }
  576. if (rc != Error_Succeed) {
  577. Dbg("%s", strRetErrMsg.GetData());
  578. //当为国密改造之后的第一次准入,直接认为初始化成功
  579. //因为自动初始化时,pinpad有可能没有准备好,但是初始化不能中断,只打日志,不上报错误
  580. if (pEntity->m_afterSMIsFirst) {
  581. Dbg("国密改造之后的第一次准入");
  582. rc = Error_Succeed;
  583. }
  584. }
  585. }
  586. if (!pEntity->GetOrSetIsFirstSM(1)) {
  587. rc = Error_Unexpect;
  588. strRetErrMsg = "设置IsFirstSM失败。。。";
  589. }
  590. pEntity->EndInitMK(rc, strRetErrMsg);
  591. return rc;
  592. }
  593. ErrorCodeEnum GetPukeyValue(BYTE* pPukeyContent, int nPuKeyContentLen, int nKeyType, BYTE* pPukeyValue, int* PukeyValueLen)
  594. {
  595. if (NULL == pPukeyContent || 0 == nPuKeyContentLen || (DES != nKeyType && SM4 != nKeyType) || NULL == pPukeyValue || NULL == PukeyValueLen)
  596. {
  597. return Error_Param;
  598. }
  599. ErrorCodeEnum rc = Error_Succeed;
  600. CSimpleStringA strContent((const char*)pPukeyContent, nPuKeyContentLen);
  601. Dbg("pukeyVule[%s]", strContent.GetData());
  602. int nStartPos = strContent.IndexOf("]");
  603. strContent = strContent.SubString(nStartPos+1, strContent.GetLength()-6);
  604. Dbg("pukeyVule[%s]", strContent.GetData());
  605. if (DES == nKeyType)
  606. {
  607. nStartPos = strContent.IndexOf("PublicKey=");
  608. strContent = strContent.SubString(nStartPos+10, strContent.GetLength()-10);
  609. }
  610. else if (SM4 == nKeyType)
  611. {
  612. nStartPos = strContent.IndexOf("PublicKeySM2=");
  613. strContent = strContent.SubString(nStartPos+13, strContent.GetLength()-13);
  614. }
  615. Dbg("pukeyVule[%s]", strContent.GetData());
  616. int nEndPos = strContent.IndexOf("[");
  617. strContent = strContent.SubString(0, nEndPos-1);
  618. Dbg("pukeyVule[%s]", strContent.GetData());
  619. memcpy(pPukeyValue, strContent.GetData(), strContent.GetLength());
  620. *PukeyValueLen = strContent.GetLength()-1;
  621. return rc;
  622. }
  623. DWORD CInitializerConn::HandleGetKMCKey(const CSmartPointer<IPackage>& pRecvPkg) {
  624. LOG_FUNCTION();
  625. DWORD rc = Error_Succeed;
  626. DWORD dwSysCode, dwUserCode;
  627. string strErrMsg;
  628. auto pEntity = (CInitializerEntity*)m_pEntity;
  629. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  630. {
  631. rc = dwUserCode;
  632. rc = dwUserCode;
  633. LogWarn(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode,
  634. GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc, "strErrMsg", strErrMsg).c_str());
  635. pEntity->m_bGetKMCKey = false;
  636. }
  637. else
  638. {
  639. int nLen = pRecvPkg->GetStructLen("KMCKeyRet");
  640. if (nLen <= 0)
  641. {
  642. strErrMsg = "KMCKeyRet返回数据为空。";
  643. Dbg("KMCKeyRet返回数据为空。");
  644. pEntity->m_bGetKMCKey = false;
  645. rc = ERR_INITIALIZER_GET_KMC_KEY_NULL;
  646. }
  647. else
  648. {
  649. pEntity->m_bGetKMCKey = true;
  650. BYTE* pBuf = new BYTE[nLen];
  651. memset(pBuf, 0, nLen);
  652. int nArrayNum = 0;
  653. bool bSuc = pRecvPkg->GetStructData("KMCKeyRet", (BYTE*)pBuf, &nLen, &nArrayNum);
  654. assert(bSuc);
  655. assert(nLen % sizeof(KMCKeyRet) == 0);
  656. KMCKeyRet* ret = (KMCKeyRet*)pBuf;
  657. pEntity->m_TMK = ret->TMK;
  658. pEntity->m_TPK = ret->TPK;
  659. pEntity->m_EDK = ret->EDK;
  660. pEntity->m_index = ret->Index;
  661. Dbg("TMK=%s", pEntity->m_TMK.c_str());
  662. Dbg("TPK=%s", pEntity->m_TPK.c_str());
  663. Dbg("EDK=%s", pEntity->m_EDK.c_str());
  664. Dbg("Index=%s", pEntity->m_index.c_str());
  665. }
  666. }
  667. pEntity->EndGetKMCKey(rc, strErrMsg.c_str());
  668. return rc;
  669. }
  670. DWORD CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage> &pRecvPkg)
  671. {
  672. DWORD rc = Error_Succeed;
  673. DWORD dwSysCode, dwUserCode;
  674. string strErrMsg;
  675. BOOL bSyncPK = FALSE;
  676. auto pEntity = (CInitializerEntity*)m_pEntity;
  677. pEntity->m_iTDESPukeyLen = 0;
  678. pEntity->m_iSM2Pukeylen = 0;
  679. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  680. {
  681. rc = dwUserCode;
  682. LogWarn(Severity_Middle,(ErrorCodeEnum) dwSysCode, dwUserCode,
  683. GetOutPutStr("%s%08X", "GetErrMsg", rc).c_str());
  684. }
  685. else
  686. {
  687. int nLen = pRecvPkg->GetStructLen("KEYSYN_A");
  688. if (nLen <= 0)
  689. {
  690. Dbg("key file all same");
  691. }
  692. else
  693. {
  694. Dbg("写入缓存。。。");
  695. assert(nLen % sizeof(PubKeySyncRet) == 0);
  696. BYTE *pBuf = new BYTE[nLen];
  697. memset(pBuf, 0, nLen);
  698. int nArrayNum = 0;
  699. bool bSuc = pRecvPkg->GetStructData("KEYSYN_A", (BYTE*)pBuf, &nLen, &nArrayNum);
  700. assert(bSuc);
  701. assert(nLen % sizeof(PubKeySyncRet) == 0);
  702. PubKeySyncRet *pRet = (PubKeySyncRet*)pBuf;
  703. //计算密钥校验码
  704. if (pEntity->HasCkCodeFlg())
  705. {
  706. Dbg("缓存公钥。。。");
  707. BYTE hash[32] = { 0 };
  708. //缓存存储公钥
  709. for (int i = 0; i < nArrayNum; i++)
  710. {
  711. Dbg("file %s not same, sync...", pRet[i].FileName);
  712. if (0 == strcmp(pRet[i].FileName, PUKFILENAME_RSA))
  713. {
  714. //if (GetFileHash(pRet[i].Content, pRet[i].FileLen, hash) != Error_Succeed)
  715. if(!SM3Hash(pRet[i].Content,pRet[i].FileLen,hash))
  716. {
  717. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_FILE_HASH,
  718. GetOutPutStr("%s%08X%s%s", "GetFileHash", Error_Unexpect,"File", pRet[i].FileName).c_str());
  719. strErrMsg = "RSA公钥文件摘要失败";
  720. rc = ERR_INITIALIZER_GET_FILE_HASH;
  721. break;
  722. }
  723. memset(pEntity->m_cTDESPukey, 0, 2048);
  724. GetPukeyValue(pRet[i].Content, pRet[i].FileLen, DES, pEntity->m_cTDESPukey, &(pEntity->m_iTDESPukeyLen));
  725. if (memcmp(hash, pRet[i].FileHash, 16) != 0 || memcmp(hash+16,pRet->FileHashSM,16) != 0)
  726. {
  727. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CHECK_HASH,GetOutPutStr("%s%s", "File", pRet[i].FileName).c_str());
  728. strErrMsg = "RSA公钥文件校验不通过";
  729. rc = ERR_INITIALIZER_CHECK_HASH;
  730. break;
  731. }
  732. bSyncPK = TRUE;
  733. }
  734. else if (0 == strcmp(pRet[i].FileName, PUKFILENAME_SM2))
  735. {
  736. //if (GetFileHash(pRet[i].Content, pRet[i].FileLen, hash) != Error_Succeed)
  737. if(!SM3Hash(pRet[i].Content,pRet[i].FileLen,hash))
  738. {
  739. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_FILE_HASH,
  740. GetOutPutStr("%s%08X%s%s", "GetFileHash", Error_Unexpect, "File", pRet[i].FileName).c_str());
  741. strErrMsg = "SM2公钥文件摘要失败";
  742. rc = ERR_INITIALIZER_GET_FILE_HASH;
  743. break;
  744. }
  745. memset(pEntity->m_cSM2Pukey, 0, 2048);
  746. GetPukeyValue(pRet[i].Content, pRet[i].FileLen, SM4, pEntity->m_cSM2Pukey, &(pEntity->m_iSM2Pukeylen));
  747. if (memcmp(hash, pRet[i].FileHash, 16) != 0 || memcmp(hash + 16, pRet[i].FileHashSM, 16) != 0)
  748. {
  749. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CHECK_HASH, GetOutPutStr("%s%s", "File", pRet[i].FileName).c_str());
  750. strErrMsg = "SM2公钥文件校验不通过";
  751. rc = ERR_INITIALIZER_CHECK_HASH;
  752. break;
  753. }
  754. bSyncPK = TRUE;
  755. }
  756. else
  757. {
  758. //从分行服务下载下来的其它密钥文件,直接忽略,不报错
  759. Dbg("其它密钥文件:%s", pRet[i].FileName);
  760. }
  761. Dbg("file %s sm2 check succ,save as buf", pRet[i].FileName);
  762. }
  763. if (!bSyncPK)
  764. {
  765. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_PUBKEY_FILE,
  766. GetOutPutStr("%s%s", "bSyncPK", "False").c_str());
  767. Dbg("分行服务KMC目录不存在正确的公钥文件");
  768. strErrMsg = "分行服务不存在正确的公钥文件";
  769. rc = ERR_INITIALIZER_PUBKEY_FILE;
  770. }
  771. }
  772. else
  773. {
  774. Dbg("保存公钥。。。");
  775. CSimpleStringA strPath;
  776. m_pEntity->GetFunction()->GetPath("RunInfo", strPath);
  777. strPath += "\\kmc\\";
  778. if (!ExistsDirA(strPath))
  779. CreateDirA(strPath, TRUE);
  780. for (int i = 0; i < nArrayNum; i++)
  781. {
  782. Dbg("file %s not same, sync...", pRet[i].FileName);
  783. CSimpleStringA strFilePath = strPath + pRet[i].FileName;
  784. FILE* pFile = fopen(strFilePath, "wb");
  785. if (pFile == NULL)
  786. {
  787. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
  788. GetOutPutStr("%s%s%s%s", "fopen", "w","strFilePath", strFilePath.GetData()).c_str());
  789. strErrMsg = "打开公钥文件失败";
  790. rc = ERR_INITIALIZER_READ_WRITE_FILE;
  791. break;
  792. }
  793. Dbg("pRet[i].Content=%s,%d",(char*) pRet[i].Content,pRet[i].FileLen);
  794. auto nWriteLen = fwrite(pRet[i].Content, 1, pRet[i].FileLen, pFile);
  795. if (nWriteLen != pRet[i].FileLen)
  796. {
  797. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
  798. GetOutPutStr("%s%d%s%s", "fwrite", nWriteLen, "FileName", pRet[i].FileName).c_str());
  799. //LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("write file %s fail", pRet[i].FileName));
  800. fclose(pFile);
  801. strErrMsg = "写入公钥文件失败";
  802. rc = ERR_INITIALIZER_READ_WRITE_FILE;
  803. break;
  804. }
  805. fclose(pFile);
  806. BYTE hash[32] = { 0 };
  807. //if (GetFileHashOld(strFilePath, hash) != Error_Succeed)
  808. if(!SM3File((char*)strFilePath.GetData(), hash))
  809. {
  810. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_FILE_HASH,
  811. GetOutPutStr("%s%08X%s%s", "GetFileHashOld", Error_Unexpect, "File", strFilePath).c_str());
  812. strErrMsg = "公钥文件摘要失败";
  813. rc = ERR_INITIALIZER_GET_FILE_HASH;
  814. break;
  815. }
  816. Dbg("strFilePath=%s", strFilePath.GetData());
  817. Dbg("file hash=%s", MyBase64::Str2Hex((char*)hash, 32));
  818. Dbg("hash=%s", MyBase64::Str2Hex((char*)pRet[i].FileHash, 16));
  819. Dbg("hashsm=%s", MyBase64::Str2Hex((char*)pRet[i].FileHashSM, 16));
  820. if (memcmp(hash, pRet[i].FileHash, 16) != 0 || memcmp(hash + 16, pRet[i].FileHashSM, 16) != 0)
  821. {
  822. LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CHECK_HASH, GetOutPutStr("%s%s", "File", pRet[i].FileName).c_str());
  823. strErrMsg = "公钥文件校验不通过";
  824. rc = ERR_INITIALIZER_CHECK_HASH;
  825. break;
  826. }
  827. Dbg("file %s sync succ", pRet[i].FileName);
  828. }
  829. }
  830. delete[] pBuf;
  831. }
  832. }
  833. // notify sync result to entity
  834. ((CInitializerEntity*)m_pEntity)->EndSyncPK(rc, strErrMsg.c_str());
  835. return rc;
  836. }
  837. DWORD CInitializerConn::SendReportStatePackage(const char*pszEventType, const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg)
  838. {
  839. auto pFunc = m_pEntity->GetFunction();
  840. CSystemStaticInfo ssInfo;
  841. pFunc->GetSystemStaticInfo(ssInfo);
  842. ReportStateReq req = {};
  843. strncpy(req.TerminalNo, ssInfo.strTerminalID, sizeof(req.TerminalNo) - 1);
  844. strncpy(req.EventType, pszEventType, sizeof(req.EventType) - 1);
  845. if (pszUserID != NULL)
  846. strncpy(req.UserID, pszUserID, sizeof(req.UserID) - 1);
  847. req.ErrorCode = dwErrCode;
  848. if (pszErrMsg != NULL)
  849. strncpy(req.ErrorMsg, pszErrMsg, sizeof(req.ErrorMsg) - 1);
  850. auto package = CreateNewPackage("RepState");
  851. package->AddStruct("REPSTA_R", false, false, (BYTE*)&req, sizeof(req));
  852. return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
  853. }
  854. DWORD CInitializerConn::HandleReportStateRet(const CSmartPointer<IPackage> &pRecvPkg)
  855. {
  856. DWORD rc = Error_Succeed;
  857. DWORD dwSysCode, dwUserCode;
  858. string strErrMsg;
  859. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  860. {
  861. rc = dwUserCode;
  862. LogWarn(Severity_Middle, Error_Unexpect, rc,
  863. GetOutPutStr("%s%08X", "GetErrMsg", rc).c_str());
  864. }
  865. return rc;
  866. }