InitializerConn.cpp 27 KB

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