InitializerConn.cpp 28 KB

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