mod_AccessAuth.cpp 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "mod_AccessAuth.h"
  4. //#include "PinPadClass.h"
  5. #include "RvcComm.h"
  6. #include "WMIDeviceQuery.h"
  7. #include <fileutil.h>
  8. #include <Strsafe.h>
  9. #include <wincrypt.h>
  10. #include "TokenKeeper_client_g.h"
  11. using namespace TokenKeeper;
  12. #include "PinPad_client_g.h"
  13. using namespace PinPad;
  14. #include "DeviceBaseClass.h"
  15. //#define IGNORE_PINPAD
  16. typedef struct _REG_TZI_FORMAT
  17. {
  18. LONG Bias;
  19. LONG StandardBias;
  20. LONG DaylightBias;
  21. SYSTEMTIME StandardDate;
  22. SYSTEMTIME DaylightDate;
  23. } REG_TZI_FORMAT;
  24. void CAccessAuthSession::Handle_Regist(SpOnewayCallContext<AccessAuthService_Regist_Info>::Pointer ctx)
  25. {
  26. m_pEntity->Regist();
  27. }
  28. void CAccessAuthSession::Handle_Unregist(SpOnewayCallContext<AccessAuthService_Unregist_Info>::Pointer ctx)
  29. {
  30. m_pEntity->Unregist(ctx->Info.nReason, ctx->Info.nWay);
  31. }
  32. void CAccessAuthSession::Handle_Reregist(SpOnewayCallContext<AccessAuthService_Reregist_Info>::Pointer ctx)
  33. {
  34. m_pEntity->Reregist();
  35. }
  36. void CAccessAuthSession::Handle_PushTerminalStage(SpOnewayCallContext<AccessAuthService_PushTerminalStage_Info>::Pointer ctx)
  37. {
  38. m_pEntity->PushTerminalStage(ctx->Info.cNewStage, ctx->Info.dwNewStageTime, ctx->Info.cOldStage, ctx->Info.dwOldStageTime);
  39. }
  40. void CAccessAuthSession::Handle_InitDev(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer ctx)
  41. {
  42. m_pEntity->InitDevice(ctx);
  43. }
  44. void CAccessAuthSession::Handle_SyncTime(SpOnewayCallContext<AccessAuthService_SyncTime_Info>::Pointer ctx)
  45. {
  46. m_pEntity->SyncTime();
  47. }
  48. void CAccessAuthEntity::OnStarted()
  49. {
  50. //设置时区为北京标准时区
  51. if (!SetLocalTimeZoneByKeyName("China Standard Time", FALSE))
  52. {
  53. //LogError(Severity_Middle, Error_Unexpect, ERROR_ACCESSAUTH_SETTIMEZONE, "设置标准时区失败");
  54. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SETTIMEZONE,GetOutPutStr("%s%s","SetLocalTimeZoneByKeyName","False").c_str());
  55. }
  56. m_FSM.Init(this);
  57. }
  58. void CAccessAuthEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  59. {
  60. ErrorCodeEnum Error = Error_Succeed;
  61. pTransactionContext->SendAnswer(Error) ;
  62. }
  63. void CAccessAuthEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  64. {
  65. m_FSM.PostExitEvent();
  66. pTransactionContext->SendAnswer(Error_Succeed);
  67. }
  68. void CAccessAuthEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  69. {
  70. }
  71. // 开始准入
  72. ErrorCodeEnum CAccessAuthEntity::Regist()
  73. {
  74. m_FSM.PostEventFIFO(new FSMEvent(CAccessAuthFSM::Event_StartRegist));
  75. return Error_Succeed;
  76. }
  77. // 重新准入
  78. ErrorCodeEnum CAccessAuthEntity::Reregist()
  79. {
  80. m_FSM.PostEventFIFO(new FSMEvent(CAccessAuthFSM::Event_StartReregist));
  81. return Error_Succeed;
  82. }
  83. // 准入退出
  84. ErrorCodeEnum CAccessAuthEntity::Unregist(int nReason, int nWay)
  85. {
  86. FSMEvent *pEvent = new FSMEvent(CAccessAuthFSM::Event_StartUnregist);
  87. pEvent->param1 = nReason;
  88. pEvent->param2 = nWay;
  89. m_FSM.PostEventFIFO(pEvent);
  90. return Error_Succeed;
  91. }
  92. ErrorCodeEnum CAccessAuthEntity::SyncTime()
  93. {
  94. return m_FSM.SyncTime();
  95. }
  96. ErrorCodeEnum CAccessAuthEntity::PushTerminalStage(char cNewStage, DWORD dwNewStageTime, char cOldStage, DWORD dwOldStageTime)
  97. {
  98. Dbg("on PushTerminalStage, cNewStage: %c", cNewStage);
  99. CAccessAuthFSM::ReportStateEvent *pEvent = new CAccessAuthFSM::ReportStateEvent(cNewStage, dwNewStageTime, cOldStage, dwOldStageTime);
  100. m_FSM.PostEventFIFO(pEvent);
  101. return Error_Succeed;
  102. }
  103. // KMC初始化
  104. ErrorCodeEnum CAccessAuthEntity::InitKMC()
  105. {
  106. CSimpleStringA strErrMsg;
  107. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  108. CSimpleStringA strPath;
  109. int nRet = 0;
  110. CSystemStaticInfo si;
  111. ErrorCodeEnum rc = GetFunction()->GetSystemStaticInfo(si);
  112. if (rc != Error_Succeed)
  113. {
  114. strErrMsg = "InitKMC()=>GetSystemStaticInfo() fail";
  115. SetAuthErrMsg((const char*)strErrMsg);
  116. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  117. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETSTATICINFO, (const char*)strErrMsg);
  118. LogWarn(Severity_Middle,Error_Unexpect, ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO,
  119. GetOutPutStr("%s%08X%s%s", "GetSystemStaticInfo",rc,"strErrMsg", (const char*)strErrMsg).c_str());
  120. return rc;
  121. }
  122. if (HasCkCodeFlg())
  123. {
  124. rc = GetFunction()->GetPath("Dbg", strPath);
  125. LOG_ASSERT(rc == Error_Succeed);
  126. strPath.Append("\\kmc");
  127. nRet = ::RvcInit(NULL, 0, NULL, 0, (char*)strPath.GetData(), NO_ALG);
  128. Dbg("has checkcode,RvcInit return %d",nRet);
  129. }
  130. else
  131. {
  132. rc = GetFunction()->GetPath("RunInfo", strPath);
  133. LOG_ASSERT(rc == Error_Succeed);
  134. strPath.Append("\\kmc");
  135. int nPinPadCapability = GetPinPadCapability();
  136. nRet = ::Init((const char*) strPath, strPath.GetLength(), nPinPadCapability);
  137. Dbg("not has checkcode,Init strPath=%s, nPinPadCapability=%d, return nPinPadCapability=,%d", strPath,nPinPadCapability,nRet);
  138. }
  139. if (nRet == 1)
  140. {
  141. Dbg("DES WK need update, kmc init ret = %d", nRet);
  142. return Error_Succeed;
  143. }
  144. else if (nRet == 2)
  145. {
  146. Dbg("DES MK need init, kmc init ret = %d", nRet);
  147. return Error_Succeed;
  148. }
  149. else if (nRet == 11 || nRet == 12)
  150. {
  151. Dbg("SM WK need update, kmc init ret = %d", nRet);
  152. return Error_Succeed;
  153. }
  154. else if (nRet == 20 || nRet == 22 || nRet == 21)
  155. {
  156. Dbg("SM MK need init, kmc init ret = %d", nRet);
  157. return Error_Succeed;
  158. }
  159. else if (nRet != 0)
  160. {
  161. strErrMsg = CSimpleStringA::Format("kmc init fail, GetKMCLastErrMsg[%s], Init return[%d]", (const char*)GetKMCLastErrMsg(), nRet);
  162. SetAuthErrMsg((const char*)strErrMsg);
  163. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  164. //LogError(Severity_Middle, Error_Unexpect, ERROR_ACCESSAUTH_INITKMC, (const char*)strErrMsg);
  165. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_RVC_INIT,
  166. GetOutPutStr("%s%d%s%s", "RvcInit", nRet, "strErrMsg", (const char*)strErrMsg).c_str());
  167. return Error_Succeed; // xkm@20161214: 返回失败会强制使用密码键盘准入, 为了保持流程兼容改为成功
  168. }
  169. Dbg("kmc init succ");
  170. return Error_Succeed;
  171. }
  172. // 获取WK更新请求包
  173. // @nAlgFlag: 1:3des only; 2: sm4 only; 3: both 3des and sm4
  174. ErrorCodeEnum CAccessAuthEntity::GetKmcWKUpdateData(char *pBuf, int &nLen, int nAlgFlag)
  175. {
  176. Dbg("CreateUpdateReq, algflag: %d", nAlgFlag);
  177. CSimpleStringA strErrMsg;
  178. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  179. if (HasCkCodeFlg())
  180. {
  181. //此处调用新接口,先调用pinpad接口生成mk校验码,并把校验码当成参数传入
  182. CAutoArray<CSimpleStringA> TmkChk;
  183. TmkChk.Init(1);
  184. Dbg("get Tmk check code from pinpad...");
  185. PinPadService_ClientBase *pPinPad = new PinPadService_ClientBase(this);
  186. auto rc = pPinPad->Connect();
  187. if (rc == Error_Succeed)
  188. {
  189. PinPadService_GetCheckCode_Req req;
  190. PinPadService_GetCheckCode_Ans ans;
  191. req.mSN.Init(1);
  192. req.wSN.Init(1);
  193. req.wSN[0] = 99;
  194. if (1 == nAlgFlag)
  195. {
  196. req.mSN[0] = 0;
  197. rc = pPinPad->GetCheckCode(req,ans,10000);
  198. }
  199. else if (2 == nAlgFlag)
  200. {
  201. req.mSN[0] = 1;
  202. rc = pPinPad->GetCheckCode(req,ans,10000);
  203. }
  204. else
  205. {
  206. //LogError(Severity_Low, rc, 0, "GetKmcWKUpdateData参数错误,nAlgFlag必须为0或1");
  207. Dbg("GetKmcWKUpdateData参数错误,nAlgFlag必须为0或1");
  208. }
  209. if (rc == Error_Succeed)
  210. {
  211. TmkChk[0] = ans.checkcode[0];
  212. Dbg("GetTmkCheck from pinpad succ, nAlgFlag[%d], Tmk:[%s]", nAlgFlag, ans.checkcode[0].GetData());
  213. }
  214. else
  215. {
  216. strErrMsg = "从PinPad获取主密钥校验码失败,请联系密码键盘厂商维护";
  217. SetAuthErrMsg((const char*)strErrMsg);
  218. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  219. //LogError(Severity_Low, rc, 0, "get tmk check code from pinpad fail");
  220. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  221. GetOutPutStr("%s%08X%s%s", "GetCheckCode", rc, "AuthErrMsg", strErrMsg).c_str());
  222. }
  223. pPinPad->GetFunction()->CloseSession();
  224. }
  225. else
  226. {
  227. strErrMsg = "连接PinPad实体失败";
  228. SetAuthErrMsg((const char*)strErrMsg);
  229. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  230. //LogError(Severity_Low, rc, 0, "connect to pinpad entity fail");
  231. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  232. GetOutPutStr("%s%s%s%s", "Connect", "False", "AuthErrMsg", strErrMsg).c_str());
  233. }
  234. pPinPad->SafeDelete();
  235. CSimpleStringA strTmk = TmkChk[0].SubString(0,16);
  236. int nRet = RvcCreateUpdateReq((char*)strTmk.GetData(), nAlgFlag-1, pBuf, &nLen);
  237. if (nRet != 0)
  238. {
  239. strErrMsg = CSimpleStringA::Format("调用KMC接口RvcCreateUpdateReq失败, 错误信息[%s], 返回值[%d]", (const char*)GetKMCLastErrMsg(), nRet);
  240. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_CREATEUPDATEREQ, (const char*)strErrMsg);
  241. SetAuthErrMsg((const char*)strErrMsg);
  242. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  243. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CREATE_UPDATE_WK_REQ,
  244. GetOutPutStr("%s%d%s%s", "RvcCreateUpdateReq", nRet, "AuthErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  245. return Error_Unexpect;
  246. }
  247. }
  248. else
  249. {
  250. int nRet = CreateUpdateReq(pBuf, &nLen, nAlgFlag);
  251. if (nRet != 0)
  252. {
  253. strErrMsg = CSimpleStringA::Format("调用KMC接口CreateUpdateReq失败, 错误信息[%s], 返回值[%d]", (const char*)GetKMCLastErrMsg(), nRet);
  254. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_CREATEUPDATEREQ, (const char*)strErrMsg);
  255. SetAuthErrMsg((const char*)strErrMsg);
  256. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  257. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CREATE_UPDATE_WK_REQ,
  258. GetOutPutStr("%s%d%s%s", "CreateUpdateReq", nRet, "AuthErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  259. return Error_Unexpect;
  260. }
  261. }
  262. return Error_Succeed;
  263. }
  264. ErrorCodeEnum CAccessAuthEntity::ParseWKUpdateResult(char *pBuf, int nLen, int nAlgFlag)
  265. {
  266. // 调用KMC解析返回
  267. Dbg("ParseUpdateRes: [%s], len: %d, alg: %d", pBuf, nLen, nAlgFlag);
  268. CSimpleStringA strErrMsg;
  269. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  270. int nRet = RvcParseUpdateRes(pBuf, nLen, nAlgFlag-1, &m_pkeys);
  271. if (nRet != 0)
  272. {
  273. strErrMsg = CSimpleStringA::Format("调用KMC接口RvcParseUpdateRes失败, 错误信息[%s], 返回值[%d]", (const char*)GetKMCLastErrMsg(), nRet);
  274. SetAuthErrMsg((const char*)strErrMsg);
  275. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  276. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_RVCPARSEUPDATERES, (const char*)strErrMsg);
  277. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_PARSE_UPDATE_RES,
  278. GetOutPutStr("%s%d%s%s", "RvcParseUpdateRes", nRet, "strErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  279. return Error_Unexpect;
  280. }
  281. char* pKeyBuf = RvcGetKey(m_pkeys, TMKCHK, pBuf);
  282. if (NULL == pKeyBuf)
  283. {
  284. strErrMsg = CSimpleStringA::Format("调用KMC接口RvcGetKey(ParseWKUpdateResult)失败, 错误信息[%s], 返回值[%d]", (const char*)GetKMCLastErrMsg(), nRet);
  285. SetAuthErrMsg((const char*)strErrMsg);
  286. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  287. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_RVCGETKEY, (const char*)strErrMsg);
  288. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_KEY,
  289. GetOutPutStr("%s%s", "RvcGetKey", pKeyBuf).c_str());
  290. return Error_Unexpect;
  291. }
  292. //int nCapability = GetPinPadCapability();
  293. //if (nCapability == 1 || nCapability == 3)
  294. //{
  295. // Dbg("print DES WK after update");
  296. // PrintAllKeys(false);
  297. //}
  298. //if (nCapability == 2 || nCapability == 3)
  299. //{
  300. // Dbg("print SM WK after update");
  301. // PrintAllKeys(true);
  302. //}
  303. Dbg("parse wk update result succ");
  304. return Error_Succeed;
  305. }
  306. CSimpleStringA CAccessAuthEntity::GetKMCLastErrMsg()
  307. {
  308. char szBuf[256];
  309. memset(szBuf, 0, 256);
  310. int nBufLen = 256;
  311. RvcGetLastErrorMsg(szBuf, &nBufLen);
  312. return szBuf;
  313. }
  314. ErrorCodeEnum CAccessAuthEntity::ReleaseKMC()
  315. {
  316. ::RvcRelease();
  317. return Error_Succeed;
  318. }
  319. //ErrorCodeEnum CAccessAuthEntity::PrintAllKeys(bool bSM)
  320. //{
  321. // // 取出主密钥
  322. // char keyBuf[64];
  323. // int nKeyBufLen = 64;
  324. // memset(keyBuf, 0, 64);
  325. //
  326. // char chkBuf[16];
  327. // int nChkBufLen = 16;
  328. // memset(chkBuf, 0, 16);
  329. //
  330. // int nRet = GetKey(keyBuf, &nKeyBufLen, chkBuf, &nChkBufLen, bSM ? csTMK : cTMK);
  331. // if (nRet != 0)
  332. // {
  333. // Dbg("get %s TMK error, %s (%d)", bSM ? "SM" : "DES", (const char*)GetKMCLastErrMsg(), nRet);
  334. // return Error_Unexpect;
  335. // }
  336. //
  337. // Dbg("get %s TMK succeed: [%s], checkcode: [%s]",
  338. // bSM ? "SM" : "DES",
  339. // ByteArrayToHexStr((BYTE*)keyBuf, nKeyBufLen).c_str(),
  340. // ByteArrayToHexStr((BYTE*)chkBuf, nChkBufLen).c_str());
  341. //
  342. // // 取出TPK
  343. // nKeyBufLen = 64;
  344. // memset(keyBuf, 0, 64);
  345. //
  346. // nChkBufLen = 16;
  347. // memset(chkBuf, 0, 16);
  348. //
  349. // nRet = GetKey(keyBuf, &nKeyBufLen, chkBuf, &nChkBufLen, bSM ? csTPK : cTPK);
  350. // if (nRet != 0)
  351. // {
  352. // Dbg("get %s TPK error, %s (%d)", bSM ? "SM" : "DES", (const char*)GetKMCLastErrMsg(), nRet);
  353. // return Error_Unexpect;
  354. // }
  355. //
  356. // Dbg("get %s TPK succeed: [%s], checkcode: [%s]",
  357. // bSM ? "SM" : "DES",
  358. // ByteArrayToHexStr((BYTE*)keyBuf, nKeyBufLen).c_str(),
  359. // ByteArrayToHexStr((BYTE*)chkBuf, nChkBufLen).c_str());
  360. //
  361. //
  362. // // 取出EDK
  363. // nKeyBufLen = 64;
  364. // memset(keyBuf, 0, 64);
  365. //
  366. // nChkBufLen = 16;
  367. // memset(chkBuf, 0, 16);
  368. //
  369. // nRet = GetKey(keyBuf, &nKeyBufLen, chkBuf, &nChkBufLen, bSM ? csEDK : cEDK);
  370. // if (nRet != 0)
  371. // {
  372. // Dbg("get %s EDK error, %s (%d)", bSM ? "SM" : "DES", (const char*)GetKMCLastErrMsg(), nRet);
  373. // return Error_Unexpect;
  374. // }
  375. //
  376. // Dbg("get %s EDK succeed: [%s], checkcode: [%s]",
  377. // bSM ? "SM" : "DES",
  378. // ByteArrayToHexStr((BYTE*)keyBuf, nKeyBufLen).c_str(),
  379. // ByteArrayToHexStr((BYTE*)chkBuf, nChkBufLen).c_str());
  380. // return Error_Succeed;
  381. //}
  382. // 加载新WK
  383. ErrorCodeEnum CAccessAuthEntity::LoadPinPadWK(bool bSM)
  384. {
  385. #ifdef IGNORE_PINPAD
  386. return Error_Succeed;
  387. #else
  388. // 1:3des only; 2: sm4 only; 3: both 3des and sm4
  389. //int nCapability = GetPinPadCapability();
  390. //Dbg("pinpad capability: %d", nCapability);
  391. CSimpleStringA strErrMsg;
  392. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  393. char *retKeyBuf = NULL;
  394. if (!bSM)
  395. {
  396. // support des key
  397. // 读取工作密钥TPK
  398. char keyBuf[64];
  399. memset(keyBuf, 0, 64);
  400. retKeyBuf = RvcGetKey(m_pkeys, TPK, keyBuf);
  401. if (NULL == retKeyBuf)
  402. {
  403. strErrMsg = CSimpleStringA::Format("RvcGetKey(LoadPinPadWK()), get des TPK fail, ErrMsg: [%s]", (const char*)GetKMCLastErrMsg());
  404. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_RVCGETKEY, (const char*)strErrMsg);
  405. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_KEY,
  406. GetOutPutStr("%s%s%s%s", "RvcGetKey", retKeyBuf, "strErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  407. return Error_Unexpect;
  408. }
  409. PinPadService_LoadKeys_Req req = {};
  410. req.initializeflag = false;
  411. req.workingkey1 = keyBuf;
  412. // 读取加密密钥EDK
  413. memset(keyBuf, 0, 64);
  414. retKeyBuf = RvcGetKey(m_pkeys, EDK, keyBuf);
  415. if (NULL == retKeyBuf)
  416. {
  417. strErrMsg = CSimpleStringA::Format("RvcGetKey(LoadPinPadWK()), get des EDK fail, ErrMsg: [%s]", (const char*)GetKMCLastErrMsg());
  418. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_RVCGETKEY, (const char*)strErrMsg);
  419. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_KEY,
  420. GetOutPutStr("%s%s%s%s", "RvcGetKey", retKeyBuf, "strErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  421. return Error_Unexpect;
  422. }
  423. req.workingkey2 = keyBuf;
  424. Dbg("load des key to pinpad...");
  425. PinPadService_ClientBase *pPinPad = new PinPadService_ClientBase(this);
  426. auto rc = pPinPad->Connect();
  427. if (rc == Error_Succeed)
  428. {
  429. PinPadService_LoadKeys_Ans ans = {};
  430. rc = pPinPad->LoadKeys(req, ans, 30000);
  431. if (rc == Error_Succeed)
  432. Dbg("load des key to pinpad succ");
  433. else
  434. {
  435. strErrMsg = "加载DES密钥到PinPad失败";
  436. SetAuthErrMsg((const char*)strErrMsg);
  437. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  438. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_LOADKEYS2PINPAD, (const char*)strErrMsg);
  439. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_LOAD_KEYS_TO_PINPAD,
  440. GetOutPutStr("%s%08x%s%s", "LoadKeys", rc, "strErrMsg", strErrMsg).c_str());
  441. }
  442. pPinPad->GetFunction()->CloseSession();
  443. }
  444. else
  445. {
  446. strErrMsg = "连接PinPad实体失败";
  447. SetAuthErrMsg((const char*)strErrMsg);
  448. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  449. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNETPINPAD, (const char*)strErrMsg);
  450. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  451. GetOutPutStr("%s%08x%s%s", "Connect", rc, "strErrMsg", strErrMsg).c_str());
  452. }
  453. pPinPad->SafeDelete();
  454. return rc;
  455. }
  456. else
  457. //if (nCapability == 2 || nCapability == 3)
  458. {
  459. // support sm key
  460. // 读取工作密钥TPK
  461. char keyBuf[64];
  462. memset(keyBuf, 0, 64);
  463. retKeyBuf = RvcGetKey(m_pkeys, TPK, keyBuf);
  464. if (NULL == retKeyBuf)
  465. {
  466. strErrMsg = CSimpleStringA::Format("RvcGetKey(LoadPinPadWK()), get sm TPK fail, ErrMsg: [%s]", (const char*)GetKMCLastErrMsg());
  467. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_RVCGETKEY, (const char*)strErrMsg);
  468. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_KEY,
  469. GetOutPutStr("%s%s%s%s", "RvcGetKey", retKeyBuf, "strErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  470. return Error_Unexpect;
  471. }
  472. PinPadService_LoadKeysSM_Req req = {};
  473. req.smflag = 1;
  474. req.initializeflag = false;
  475. req.workingkey1 = keyBuf;
  476. // 读取加密密钥EDK
  477. memset(keyBuf, 0, 64);
  478. retKeyBuf = RvcGetKey(m_pkeys, EDK, keyBuf);
  479. if (NULL == retKeyBuf)
  480. {
  481. strErrMsg = CSimpleStringA::Format("RvcGetKey(LoadPinPadWK()), get sm EDK fail, ErrMsg: [%s]", (const char*)GetKMCLastErrMsg());
  482. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_RVCGETKEY, (const char*)strErrMsg);
  483. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_KEY,
  484. GetOutPutStr("%s%s%s%s", "RvcGetKey", retKeyBuf, "strErrMsg", (const char*)GetKMCLastErrMsg()).c_str());
  485. return Error_Unexpect;
  486. }
  487. req.workingkey2 = keyBuf;
  488. Dbg("load sm key to pinpad...");
  489. PinPadService_ClientBase *pPinPad = new PinPadService_ClientBase(this);
  490. auto rc = pPinPad->Connect();
  491. if (rc == Error_Succeed)
  492. {
  493. PinPadService_LoadKeysSM_Ans ans = {};
  494. rc = pPinPad->LoadKeysSM(req, ans, 30000);
  495. if (rc == Error_Succeed)
  496. Dbg("load sm key to pinpad succ");
  497. else
  498. {
  499. strErrMsg = "加载SM密钥到PinPad失败";
  500. SetAuthErrMsg((const char*)strErrMsg);
  501. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  502. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_LOADKEYS2PINPAD, (const char*)strErrMsg);
  503. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_LOAD_KEYS_TO_PINPAD,
  504. GetOutPutStr("%s%08x%s%s", "LoadKeys", rc, "strErrMsg", strErrMsg).c_str());
  505. }
  506. pPinPad->GetFunction()->CloseSession();
  507. }
  508. else
  509. {
  510. strErrMsg = "连接PinPad实体失败";
  511. SetAuthErrMsg((const char*)strErrMsg);
  512. spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
  513. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNETPINPAD, (const char*)strErrMsg);
  514. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  515. GetOutPutStr("%s%08x%s%s", "Connect", rc, "strErrMsg", strErrMsg).c_str());
  516. }
  517. pPinPad->SafeDelete();
  518. return rc;
  519. }
  520. #endif
  521. }
  522. // 将16进制字符串转成BYTE数据
  523. bool CAccessAuthEntity::HexStrToByteArray(const char* pHex, BYTE *pBuf, int *pBufLen)
  524. {
  525. int nHexLen = strlen(pHex);
  526. if (nHexLen %2 != 0)
  527. {
  528. Dbg("error hex string length");
  529. return false;
  530. }
  531. if (nHexLen /2 > *pBufLen)
  532. {
  533. Dbg("not enough buf length");
  534. return false;
  535. }
  536. for(int i=0; i<nHexLen; i++)
  537. {
  538. BYTE b =0;
  539. char ch1 = pHex[i];
  540. if (ch1 >='0' && ch1<='9')
  541. b = ch1 - '0';
  542. else if (ch1 >='A' && ch1 <='F')
  543. b = ch1 - 'A' + 10;
  544. else
  545. {
  546. Dbg("invalid hex string");
  547. return false;
  548. }
  549. if (i %2 ==0)
  550. {
  551. pBuf[i/2] = b;
  552. }
  553. else
  554. {
  555. pBuf[i/2] = pBuf[i/2] << 4 | b;
  556. }
  557. }
  558. *pBufLen = nHexLen / 2;
  559. return true;
  560. }
  561. string CAccessAuthEntity::ByteArrayToHexStr(BYTE *pBuf, int nBufLen)
  562. {
  563. char szBuf[1024];
  564. memset(szBuf, 0, sizeof(szBuf));
  565. for(int i=0; i<nBufLen; i++)
  566. {
  567. BYTE b1 = (pBuf[i] >> 4) & 0x0F;
  568. BYTE b2 = pBuf[i] & 0x0F;
  569. if (b1 <= 9)
  570. szBuf[i*2] = '0' + b1;
  571. else
  572. szBuf[i*2] = 'A' + b1 - 10;
  573. if (b2 <= 9)
  574. szBuf[i*2+1] = '0' + b2;
  575. else
  576. szBuf[i*2+1] = 'A' + b2 - 10;
  577. }
  578. return szBuf;
  579. }
  580. // 调用密码键盘加密
  581. ErrorCodeEnum CAccessAuthEntity::EncryptDataWithPinPad(const CBlob &raw, CBlob &enc)
  582. {
  583. #ifdef IGNORE_PINPAD
  584. enc.Alloc(raw.m_iLength);
  585. memcpy(enc.m_pData, raw.m_pData, raw.m_iLength);
  586. return Error_Succeed;
  587. #else
  588. //EnDecryptInfo srcInfo;
  589. //memset(&srcInfo, 0, sizeof(srcInfo));
  590. //string strHex = ByteArrayToHexStr((BYTE*)raw.m_pData, raw.m_iLength);
  591. //srcInfo.dwSize = strHex.length();
  592. //memcpy(srcInfo.data, strHex.c_str(), strHex.length());
  593. //
  594. //EnDecryptInfo destInfo;
  595. //memset(&destInfo, 0, sizeof(destInfo));
  596. //destInfo.dwSize = 512;
  597. //// 改为测试数据
  598. ////memset(&srcInfo, 0, sizeof(srcInfo));
  599. ////memcpy(srcInfo.data, "30303132353637383536373839404142", 32);
  600. //Dbg("begin encrpyt data by pinpad");
  601. //ErrorCodeEnum rc = m_pPinPad->EncryptData(srcInfo, destInfo);
  602. //if (rc != Error_Succeed)
  603. //{
  604. // Dbg("pinpad encrypt data error, %s(%d)", (const char *)GetPinPadLastErrMsg(), rc);
  605. // return rc;
  606. //}
  607. //Dbg("pinpad encrypt data succeed: [%s]", destInfo.data);
  608. CSimpleStringA strErrMsg;
  609. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  610. PinPadService_EncryptData_Req req = {};
  611. PinPadService_EncryptData_Ans ans = {};
  612. req.data = ByteArrayToHexStr((BYTE*)raw.m_pData, raw.m_iLength).c_str();
  613. Dbg("begin encrpyt data with pinpad");
  614. PinPadService_ClientBase *pPinPad = new PinPadService_ClientBase(this);
  615. auto rc = pPinPad->Connect();
  616. if (rc == Error_Succeed)
  617. {
  618. rc = pPinPad->EncryptData(req, ans, 10000);
  619. if (rc == Error_Succeed)
  620. Dbg("encrypt data with pinpad succ: [%s]", (const char*)ans.ciphertext);
  621. else
  622. {
  623. strErrMsg = "encrypt data with pinpad fail";
  624. SetAuthErrMsg((const char *)strErrMsg);
  625. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  626. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_PINPADENCDATA, (const char *)strErrMsg);
  627. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_PINPAD,
  628. GetOutPutStr("%s%08x%s%s", "EncryptData", rc, "strErrMsg", strErrMsg).c_str());
  629. }
  630. pPinPad->GetFunction()->CloseSession();
  631. }
  632. else
  633. {
  634. strErrMsg = "connect to pinpad entity fail";
  635. SetAuthErrMsg((const char *)strErrMsg);
  636. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  637. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNETPINPAD, (const char *)strErrMsg);
  638. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  639. GetOutPutStr("%s%08x%s%s", "Connect", rc, "strErrMsg", strErrMsg).c_str());
  640. }
  641. pPinPad->SafeDelete();
  642. if (rc != Error_Succeed)
  643. return rc;
  644. /*
  645. // 解密看看能否还原
  646. EnDecryptInfo srcInfo2;
  647. srcInfo2.dwSize = 512;
  648. memset(&srcInfo2, 0, sizeof(srcInfo2));
  649. nRet = m_pPinPad->DecryptData(destInfo, srcInfo2);
  650. if (nRet != ERROR_SUCCESS)
  651. {
  652. Dbg("pinpad decrypt data error, %s(%d)", (const char *) GetPinPadLastErrMsg(), nRet);
  653. return rc;
  654. }
  655. Dbg("pinpad decrypt data succeed: [%s]", srcInfo2.data);
  656. // 拷入测试数据
  657. //memset(req1.encTerminalInfo, 0, sizeof(req1.encTerminalInfo));
  658. */
  659. BYTE buf[512];
  660. int nLen = 512;
  661. memset(buf, 0, 512);
  662. if (!HexStrToByteArray((const char*)ans.ciphertext, buf, &nLen))
  663. {
  664. strErrMsg = "convert encrypted data to byte array fail";
  665. SetAuthErrMsg((const char *)strErrMsg);
  666. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  667. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_HEXSTRTOBYTEARRAR, (const char *)strErrMsg);
  668. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_HEX_TO_BYTE,
  669. GetOutPutStr("%s%s%s%s", "HexStrToByteArray", "False", "strErrMsg", strErrMsg).c_str());
  670. return Error_Unexpect;
  671. }
  672. enc.Alloc(nLen);
  673. memcpy(enc.m_pData, buf, nLen);
  674. return Error_Succeed;
  675. #endif
  676. }
  677. // 生成临时RSA密钥对
  678. ErrorCodeEnum CAccessAuthEntity::CreateRsaKeyPair(CBlob &pubKey, CBlob &priKey)
  679. {
  680. int nPubKeyLen = 140;
  681. int nPriKeyLen = 620;
  682. pubKey.Alloc(nPubKeyLen);
  683. priKey.Alloc(nPriKeyLen);
  684. if (!::CreateRsaKeyPair((BYTE *)pubKey.m_pData, &nPubKeyLen, (BYTE *)priKey.m_pData, &nPriKeyLen))
  685. {
  686. SetAuthErrMsg("创建RSA密钥对失败");
  687. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  688. spFunction->SetSysVar("AuthErrMsg", "创建RSA密钥对失败", true);
  689. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_CREATERSAKEYPAIR, "创建RSA密钥对失败!");
  690. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CREATE_RSA_KEY_PAIR,
  691. GetOutPutStr("%s%s","CreateRsaKeyPair","False").c_str());
  692. return Error_Unexpect;
  693. }
  694. pubKey.Resize(nPubKeyLen);
  695. priKey.Resize(nPriKeyLen);
  696. return Error_Succeed;
  697. }
  698. // 保存到令牌管理实体中
  699. ErrorCodeEnum CAccessAuthEntity::SaveRsaKeyPair(const CBlob &pubKey, const CBlob &priKey)
  700. {
  701. CSimpleStringA strErrMsg;
  702. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  703. TokenService_ClientBase *pTokenServiceClient = new TokenService_ClientBase(this);
  704. ErrorCodeEnum rc = pTokenServiceClient->Connect();
  705. if (rc != Error_Succeed)
  706. {
  707. strErrMsg = "连接令牌管理实体失败";
  708. SetAuthErrMsg((const char *)strErrMsg);
  709. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  710. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNECTTOKENMANAGER, (const char *)strErrMsg);
  711. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_TOKEN_SERVICE,
  712. GetOutPutStr("%s%08X%s%s", "Connect", rc,"strErrMsg", strErrMsg).c_str());
  713. }
  714. else
  715. {
  716. TokenService_SetKeyPair_Req req;
  717. req.pub_key = pubKey;
  718. req.pri_key = priKey;
  719. TokenService_SetKeyPair_Ans ans;
  720. rc = pTokenServiceClient->SetKeyPair(req, ans, 3000);
  721. pTokenServiceClient->GetFunction()->CloseSession();
  722. if (rc != Error_Succeed)
  723. {
  724. strErrMsg = "保存密钥对失败";
  725. SetAuthErrMsg((const char *)strErrMsg);
  726. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  727. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_SAVERSAKEYPAIR, (const char *)strErrMsg);
  728. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_TOKEN_SERVICE,
  729. GetOutPutStr("%s%08X%s%s", "SetKeyPair", rc,"strErrMsg", (const char*)strErrMsg).c_str());
  730. }
  731. else
  732. Dbg("set rsa key pair succ");
  733. }
  734. pTokenServiceClient->SafeDelete();
  735. return rc;
  736. }
  737. ErrorCodeEnum CAccessAuthEntity::SaveTokenAndSharedSK(const CBlob &token, const CBlob &sharedSK)
  738. {
  739. CSimpleStringA strErrMsg;
  740. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  741. TokenService_ClientBase *pTokenServiceClient = new TokenService_ClientBase(this);
  742. ErrorCodeEnum rc = pTokenServiceClient->Connect();
  743. if (rc != Error_Succeed)
  744. {
  745. strErrMsg = "连接令牌管理实体失败";
  746. SetAuthErrMsg((const char *)strErrMsg);
  747. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  748. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNECTTOKENMANAGER, (const char *)strErrMsg);
  749. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_TOKEN_SERVICE,
  750. GetOutPutStr("%s%08X%s%s", "Connect", rc,"strErrMsg", (const char*)strErrMsg).c_str());
  751. }
  752. else
  753. {
  754. TokenService_SetToken_Req req = {};
  755. req.token = token;
  756. TokenService_SetToken_Ans ans;
  757. rc = pTokenServiceClient->SetToken(req, ans, 5000);
  758. if (rc == Error_Succeed)
  759. Dbg("save token succ, token: [%s]", ByteArrayToHexStr((BYTE*)token.m_pData, token.m_iLength).c_str());
  760. else
  761. {
  762. strErrMsg = "保存令牌失败";
  763. SetAuthErrMsg((const char *)strErrMsg);
  764. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  765. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_SAVETOKEN, (const char *)strErrMsg);
  766. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_TOKEN_SERVICE,
  767. GetOutPutStr("%s%08X%s%s", "SetToken", rc,"strErrMsg", strErrMsg).c_str());
  768. }
  769. TokenService_SetSharedSK_Req req2 = {};
  770. req2.ssk = sharedSK;
  771. TokenService_SetSharedSK_Ans ans2 = {};
  772. rc = pTokenServiceClient->SetSharedSK(req2, ans2, 5000);
  773. if (rc == Error_Succeed)
  774. Dbg("save shared session key succ");
  775. else
  776. {
  777. strErrMsg = "保存会话密钥失败";
  778. SetAuthErrMsg((const char *)strErrMsg);
  779. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  780. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_SAVETOKEN, (const char *)strErrMsg);
  781. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_TOKEN_SERVICE,
  782. GetOutPutStr("%s%08X%s%s", "SetSharedSK", rc,"strErrMsg", (const char*)strErrMsg).c_str());
  783. }
  784. pTokenServiceClient->GetFunction()->CloseSession();
  785. }
  786. pTokenServiceClient->SafeDelete();
  787. return rc;
  788. }
  789. bool CAccessAuthEntity::HasPinPad()
  790. {
  791. CSimpleStringA strErrMsg;
  792. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  793. CSystemStaticInfo info;
  794. auto rc = GetFunction()->GetSystemStaticInfo(info);
  795. if (rc != Error_Succeed)
  796. {
  797. strErrMsg = "HasPinPad()=>GetSystemStaticInfo() fail";
  798. SetAuthErrMsg((const char *)strErrMsg);
  799. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  800. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETSTATICINFO, (const char *)strErrMsg);
  801. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO,
  802. GetOutPutStr("%s%08X", "GetSystemStaticInfo", rc).c_str());
  803. return true;
  804. }
  805. if (info.strMachineType.IsStartWith("RPM", true) || info.strMachineType.IsStartWith("RVC.CardStore", true) || info.strMachineType.IsStartWith("RVC.IL", true)) // 回单打印机、简化版
  806. {
  807. Dbg("MachineType[%s], not exist pinpad", info.strMachineType);
  808. return false;
  809. }
  810. else if (stricmp(info.strMachineType, "RVC.PAD") == 0) // Pad机型
  811. {
  812. // 根据PinPad实体状态确定是否连接密码键盘
  813. bool bPinPadExist = false;
  814. auto pPinPadClient = new PinPadService_ClientBase(this);
  815. if (pPinPadClient->Connect() != Error_Succeed)
  816. {
  817. Dbg("connect PinPad fail, assume no pinpad");
  818. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  819. GetOutPutStr("%s%s", "Connect", "False").c_str());
  820. }
  821. else
  822. {
  823. PinPadService_GetDevInfo_Req req = {};
  824. PinPadService_GetDevInfo_Ans ans = {};
  825. auto rc = pPinPadClient->GetDevInfo(req, ans, 3000);
  826. if (rc != Error_Succeed)
  827. {
  828. strErrMsg = "PinPad::GetDevInfo() fail";
  829. SetAuthErrMsg((const char *)strErrMsg);
  830. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  831. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETPINPADINFO, (const char *)strErrMsg);
  832. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_PINPAD,
  833. GetOutPutStr("%s%08X", "GetDevInfo", rc).c_str());
  834. }
  835. else
  836. {
  837. Dbg("PinPad::GetDevInfo() return state: %d", ans.state);
  838. bPinPadExist = ans.state != DEVICE_STATUS_NOT_READY;
  839. }
  840. pPinPadClient->GetFunction()->CloseSession();
  841. }
  842. pPinPadClient->SafeDelete();
  843. pPinPadClient = NULL;
  844. return bPinPadExist;
  845. }
  846. else
  847. {
  848. // 其它VTM机型,全部有内置密码键盘
  849. return true;
  850. }
  851. }
  852. // 1:3des only; 2: sm4 only; 3: both 3des and sm4
  853. // 由当前已初始化的密钥文件决定,兼容旧版本终端
  854. int CAccessAuthEntity::GetPinPadCapability()
  855. {
  856. int nCapability = 0;
  857. PinPadService_ClientBase *pPinPad = new PinPadService_ClientBase(this);
  858. auto rc = pPinPad->Connect();
  859. if (rc == Error_Succeed)
  860. {
  861. PinPadService_QueryFunc_Req req;
  862. PinPadService_QueryFunc_Ans ans;
  863. rc = pPinPad->QueryFunc(req,ans,3000);
  864. if (rc == Error_Succeed)
  865. {
  866. nCapability = ans.reserved1;
  867. Dbg("QueryFunc from pinpad succ, nCapability[%d]", nCapability);
  868. }
  869. else
  870. {
  871. SetAuthErrMsg("从PinPad获取主密钥类型失败");
  872. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  873. spFunction->SetSysVar("AuthErrMsg", "从PinPad获取主密钥类型失败", true);
  874. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_GETPINPADCAPABILITY, "从PinPad获取主密钥类型失败");
  875. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_PINPAD,
  876. GetOutPutStr("%s%s%s%s", "QueryFunc", "False", "AuthErrMsg", "从PinPad获取主密钥类型失败").c_str());
  877. }
  878. pPinPad->GetFunction()->CloseSession();
  879. }
  880. else
  881. {
  882. SetAuthErrMsg("连接PinPad实体失败");
  883. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  884. spFunction->SetSysVar("AuthErrMsg", "连接PinPad实体失败", true);
  885. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNETPINPAD, "连接PinPad实体失败");
  886. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  887. GetOutPutStr("%s%08X%s%s", "Connect", rc,"AuthErrMsg", "连接PinPad实体失败").c_str());
  888. }
  889. pPinPad->SafeDelete();
  890. return nCapability;
  891. }
  892. bool CAccessAuthEntity::SaveAuthVerAndKey(int nAuthVer, BYTE *pKey)
  893. {
  894. m_nAuthVersion = nAuthVer;
  895. if (m_nAuthVersion == 2)
  896. memcpy(m_AuthSessionKey, pKey, 140);
  897. else
  898. memset(m_AuthSessionKey, 0, 140);
  899. return true;
  900. }
  901. static BYTE* ConvertHexStrToBytes(const char *pszStr)
  902. {
  903. if (pszStr == NULL || strlen(pszStr) == 0)
  904. return NULL;
  905. int nLen = strlen(pszStr) / 2;
  906. BYTE *pRet = (BYTE*)malloc(nLen);
  907. memset(pRet, 0, nLen);
  908. for (int i = 0; i < nLen; i++)
  909. {
  910. int nTmp(0);
  911. if (sscanf(&pszStr[i * 2], "%2X", &nTmp) != 1)
  912. {
  913. free(pRet);
  914. return NULL;
  915. }
  916. pRet[i] = (BYTE)nTmp;
  917. }
  918. return pRet;
  919. }
  920. // 使用准入会话密钥加密
  921. ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBlob &enc)
  922. {
  923. assert(m_nAuthVersion ==2);
  924. CSimpleStringA strErrMsg;
  925. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  926. // 将准入会话密钥导到CSP中
  927. HCRYPTPROV hProv(0);
  928. if (!CryptAcquireContext(&hProv, "RVC", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
  929. {
  930. DWORD dwLastError = GetLastError();
  931. Dbg("open RVC keyset fail: %d", dwLastError);
  932. //如果返回错误码NTE_BAD_KEYSET(0x80090016L),密钥集丢失,提示重新初始化密钥
  933. if (dwLastError == NTE_BAD_KEYSET)
  934. {
  935. strErrMsg = "windows密钥集丢失,请重新初始化密钥!";
  936. SetAuthErrMsg((const char *)strErrMsg);
  937. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  938. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_OPENCRYPTCONTEXT, (const char *)strErrMsg);
  939. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_OPEN_CRYPT_CONTEXT,
  940. GetOutPutStr("%s%s%s%d", "CryptAcquireContext", "False", "dwLastError", dwLastError).c_str());
  941. }
  942. return Error_Unexpect;
  943. }
  944. else
  945. Dbg("open RVC keyset succ");
  946. HCRYPTKEY hExchKey(0);
  947. if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hExchKey))
  948. {
  949. strErrMsg = CSimpleStringA::Format("get exchange key fail: %d, 请重新初始化密钥", GetLastError());
  950. SetAuthErrMsg((const char *)strErrMsg);
  951. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  952. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETEXCHANGEKEY, (const char *)strErrMsg);
  953. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CRYPT_GET_UESR_KEY,
  954. GetOutPutStr("%s%s%s%d", "CryptGetUserKey", "False", "dwLastError", GetLastError()).c_str());
  955. CryptReleaseContext(hProv, 0);
  956. return Error_Unexpect;
  957. }
  958. Dbg("get exchange key succ");
  959. // 将会话密钥导入到持久容器中
  960. HCRYPTKEY hSessionKey(0);
  961. if (!CryptImportKey(hProv, m_AuthSessionKey, sizeof(m_AuthSessionKey), hExchKey, 0, &hSessionKey))
  962. {
  963. strErrMsg = CSimpleStringA::Format("import session key fail: %d, 请重新初始化密钥", GetLastError());
  964. SetAuthErrMsg((const char *)strErrMsg);
  965. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  966. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_IMPORTSESSIONKEY, (const char *)strErrMsg);
  967. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CRYPT_IMPORT_KEY,
  968. GetOutPutStr("%s%s%s%d", "CryptImportKey", "False", "dwLastError", GetLastError()).c_str());
  969. CryptDestroyKey(hExchKey);
  970. CryptReleaseContext(hProv, 0);
  971. return Error_Unexpect;
  972. }
  973. // 使用会话密钥加密数据
  974. DWORD dwDataLen = raw.m_iLength;
  975. BYTE *pEncData = new BYTE[128];
  976. memset(pEncData, 0, 128);
  977. memcpy(pEncData, raw.m_pData, raw.m_iLength);
  978. if (!CryptEncrypt(hSessionKey, 0, TRUE, 0, pEncData, &dwDataLen, 128))
  979. {
  980. strErrMsg = CSimpleStringA::Format("encrypt data fail: %d, 请重新初始化密钥", GetLastError());
  981. SetAuthErrMsg((const char *)strErrMsg);
  982. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  983. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_CRYPTWITHSESSIONKEY, (const char *)strErrMsg);
  984. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_ENCRYPT_SESSION_KEY,
  985. GetOutPutStr("%s%s%s%d", "CryptEncrypt", "False", "dwLastError", GetLastError()).c_str());
  986. CryptDestroyKey(hSessionKey);
  987. CryptDestroyKey(hExchKey);
  988. CryptReleaseContext(hProv, 0);
  989. return Error_Unexpect;
  990. }
  991. enc.Attach(pEncData, dwDataLen);
  992. CryptDestroyKey(hSessionKey);
  993. CryptDestroyKey(hExchKey);
  994. CryptReleaseContext(hProv, 0);
  995. return Error_Succeed;
  996. }
  997. bool CAccessAuthEntity::GetMD5Hash(const char *pStr, BYTE md5[16])
  998. {
  999. HCRYPTPROV hCryptProv;
  1000. bool bRet = false;
  1001. if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
  1002. {
  1003. HCRYPTHASH hHash;
  1004. if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
  1005. {
  1006. CryptHashData(hHash, (LPBYTE)pStr, strlen(pStr), 0);
  1007. DWORD dwLen = 16;
  1008. CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&md5[0], &dwLen, 0);
  1009. bRet = true;
  1010. }
  1011. else
  1012. {
  1013. LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETMD5HASH, CSimpleStringA::Format("CryptCreateHash fail: %d", GetLastError()));
  1014. }
  1015. CryptDestroyHash(hHash);
  1016. }
  1017. else
  1018. {
  1019. LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETMD5HASH, CSimpleStringA::Format("CryptAcquireContextA fail: %d", GetLastError()));
  1020. }
  1021. CryptReleaseContext(hCryptProv, 0);
  1022. return bRet;
  1023. }
  1024. static char* ConvertBytesToHexStr(BYTE *pBuf, int nLen)
  1025. {
  1026. char *pRet = (char*)malloc(nLen * 2 + 1);
  1027. memset(pRet, 0, nLen * 2 + 1);
  1028. char *p = pRet;
  1029. for (int i = 0; i < nLen; i++)
  1030. {
  1031. BYTE b = pBuf[i];
  1032. BYTE l = (b >> 4) & 0x0F;
  1033. if (l >= 10)
  1034. *p = l - 10 + 'A';
  1035. else
  1036. *p = l + '0';
  1037. p++;
  1038. BYTE r = b & 0x0F;
  1039. if (r >= 10)
  1040. *p = r - 10 + 'A';
  1041. else
  1042. *p = r + '0';
  1043. p++;
  1044. }
  1045. return pRet;
  1046. }
  1047. bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
  1048. {
  1049. char szTmp[1024] = {};
  1050. int nTmpBufLen = 1024;
  1051. CSimpleStringA strErrMsg;
  1052. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  1053. CSimpleStringA strRet;
  1054. if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
  1055. {
  1056. strErrMsg = CSimpleStringA::Format("query cpu id fail: %d, 请重启设备", GetLastError());
  1057. SetAuthErrMsg((const char *)strErrMsg);
  1058. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1059. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETCPUID, (const char *)strErrMsg);
  1060. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
  1061. GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
  1062. return false;
  1063. }
  1064. strRet = szTmp;
  1065. //Dbg("cpu id: %s", szTmp);
  1066. nTmpBufLen = 1024;
  1067. memset(szTmp, 0, sizeof(szTmp));
  1068. if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
  1069. {
  1070. strErrMsg = CSimpleStringA::Format("query baseboard sn fail: %d, 请重启设备", GetLastError());
  1071. SetAuthErrMsg((const char *)strErrMsg);
  1072. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1073. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETBASEBOARDSN, (const char *)strErrMsg);
  1074. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
  1075. GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
  1076. return false;
  1077. }
  1078. //Dbg("baseboard sn: %s", szTmp);
  1079. strRet += "|";
  1080. strRet += szTmp;
  1081. nTmpBufLen = 1024;
  1082. memset(szTmp, 0, sizeof(szTmp));
  1083. if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
  1084. {
  1085. strErrMsg = CSimpleStringA::Format("query harddisk sn fail: %d, 请重启设备", GetLastError());
  1086. SetAuthErrMsg((const char *)strErrMsg);
  1087. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1088. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_DISKDRIVESN, (const char *)strErrMsg);
  1089. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
  1090. GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
  1091. return false;
  1092. }
  1093. //Dbg("harddisk sn: %s", szTmp);
  1094. strRet += "|";
  1095. strRet += szTmp;
  1096. Dbg("device info: [%s]", (const char*)strRet);
  1097. // md5 hash
  1098. BYTE md5[16] = {};
  1099. if (!GetMD5Hash((const char*)strRet, md5))
  1100. {
  1101. strErrMsg = "get md5 hash as fingerprint fail";
  1102. SetAuthErrMsg((const char *)strErrMsg);
  1103. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1104. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETMD5HASH, (const char *)strErrMsg);
  1105. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
  1106. GetOutPutStr("%s%s%s%s", "GetMD5Hash", "False", "strErrMsg", (const char*)strErrMsg).c_str());
  1107. return false;
  1108. }
  1109. if (nBufLen < 16)
  1110. {
  1111. //Dbg("buf len is too small");
  1112. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETMD5HASH, "buf len is too small fail");
  1113. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
  1114. GetOutPutStr("%s%d", "nBufLen", nBufLen).c_str());
  1115. return false;
  1116. }
  1117. nBufLen = 16;
  1118. memcpy(pBuf, md5, nBufLen);
  1119. char *pszMd5 = ConvertBytesToHexStr(md5, 16);
  1120. //Dbg("fringerprint: [%s]", pszMd5);
  1121. free(pszMd5);
  1122. return true;
  1123. }
  1124. #define RSAPUBKEY_BITLEN 1024
  1125. struct PublicKeyBlob
  1126. {
  1127. PUBLICKEYSTRUC publickeystruc;
  1128. RSAPUBKEY rsapubkey;
  1129. BYTE modulus[RSAPUBKEY_BITLEN / 8];
  1130. };
  1131. // 生成RSA密钥对,并导出公钥
  1132. bool CAccessAuthEntity::GetTerminalPublicKey(BYTE *pBuf, int &nBufLen)
  1133. {
  1134. if (nBufLen < sizeof(PublicKeyBlob))
  1135. {
  1136. Dbg("buf len is too small, must >= %d", sizeof(PublicKeyBlob));;
  1137. return false;
  1138. }
  1139. CSimpleStringA strErrMsg;
  1140. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  1141. HCRYPTPROV hProv(0);
  1142. if (!CryptAcquireContext(&hProv, "RVC", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
  1143. {
  1144. DWORD dwLastError = GetLastError();
  1145. if (dwLastError != NTE_BAD_KEYSET)
  1146. {
  1147. strErrMsg = "windows密钥集丢失,请重新初始化密钥!";
  1148. SetAuthErrMsg((const char *)strErrMsg);
  1149. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1150. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_OPENCRYPTCONTEXT, (const char *)strErrMsg);
  1151. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
  1152. GetOutPutStr("%s%s%s%s", "CryptAcquireContext", "False", "strErrMsg", strErrMsg).c_str());
  1153. return false;
  1154. }
  1155. Dbg("RVC keyset not exist, create now");
  1156. if (!CryptAcquireContext(&hProv, "RVC", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET | CRYPT_NEWKEYSET))
  1157. {
  1158. strErrMsg = "windows密钥集丢失,请重新初始化密钥!";
  1159. SetAuthErrMsg((const char *)strErrMsg);
  1160. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1161. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_OPENCRYPTCONTEXT, (const char *)strErrMsg);
  1162. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
  1163. GetOutPutStr("%s%s%s%s", "CryptAcquireContext", "False", "strErrMsg", strErrMsg).c_str());
  1164. CryptReleaseContext(hProv, 0);
  1165. return false;
  1166. }
  1167. Dbg("create RVC keyset succ");
  1168. }
  1169. else
  1170. Dbg("open RVC keyset succ");
  1171. HCRYPTKEY hExchKey(0);
  1172. if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hExchKey))
  1173. {
  1174. DWORD dwLastError = GetLastError();
  1175. if (dwLastError != NTE_NO_KEY)
  1176. {
  1177. strErrMsg = CSimpleStringA::Format("get exchange key fail: %d, 请重新初始化密钥!", GetLastError());
  1178. SetAuthErrMsg((const char *)strErrMsg);
  1179. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1180. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETEXCHANGEKEY, (const char *)strErrMsg);
  1181. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
  1182. GetOutPutStr("%s%s%s%s", "CryptGetUserKey", "False", "strErrMsg", strErrMsg).c_str());
  1183. CryptReleaseContext(hProv, 0);
  1184. return false;
  1185. }
  1186. Dbg("exchange key not exist, now create it!");
  1187. if (!CryptGenKey(hProv, AT_KEYEXCHANGE, RSA1024BIT_KEY | CRYPT_EXPORTABLE, &hExchKey))
  1188. {
  1189. strErrMsg = CSimpleStringA::Format("create exchange key fail: %d, 请重新初始化密钥!", GetLastError());
  1190. SetAuthErrMsg((const char *)strErrMsg);
  1191. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1192. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GENEXCHANGEKEY, (const char *)strErrMsg);
  1193. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
  1194. GetOutPutStr("%s%s%s%s", "CryptGenKey", "False", "strErrMsg", strErrMsg).c_str());
  1195. CryptReleaseContext(hProv, 0);
  1196. return false;
  1197. }
  1198. Dbg("create exchange key succ");
  1199. CryptDestroyKey(hExchKey);
  1200. hExchKey = 0;
  1201. if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hExchKey))
  1202. {
  1203. strErrMsg = CSimpleStringA::Format("get exchange key fail: %d, 请重新初始化密钥!", GetLastError());
  1204. SetAuthErrMsg((const char *)strErrMsg);
  1205. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1206. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETEXCHANGEKEY, (const char *)strErrMsg);
  1207. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
  1208. GetOutPutStr("%s%s%s%s", "CryptGetUserKey", "False", "strErrMsg", strErrMsg).c_str());
  1209. CryptReleaseContext(hProv, 0);
  1210. return false;
  1211. }
  1212. }
  1213. Dbg("get exchange key succ");
  1214. Dbg("export public key now");
  1215. if (!CryptExportKey(hExchKey, 0, PUBLICKEYBLOB, 0, pBuf, (DWORD*)&nBufLen))
  1216. {
  1217. strErrMsg = CSimpleStringA::Format("export public key fail: %d, 请重新初始化密钥!", GetLastError());
  1218. SetAuthErrMsg((const char *)strErrMsg);
  1219. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1220. //LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_EXPORTKEY, (const char *)strErrMsg);
  1221. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
  1222. GetOutPutStr("%s%s%s%s", "CryptExportKey", "False", "strErrMsg", strErrMsg).c_str());
  1223. CryptDestroyKey(hExchKey);
  1224. CryptReleaseContext(hProv, 0);
  1225. return false;
  1226. }
  1227. assert(nBufLen == sizeof(PublicKeyBlob));
  1228. Dbg("export public key succ, len = %d ", nBufLen);
  1229. char *pszPubKey = ConvertBytesToHexStr(pBuf, nBufLen);
  1230. //Dbg("public key blob: [%s]", pszPubKey);
  1231. free(pszPubKey);
  1232. CryptDestroyKey(hExchKey);
  1233. CryptReleaseContext(hProv, 0);
  1234. return true;
  1235. }
  1236. ErrorCodeEnum CAccessAuthEntity::InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx)
  1237. {
  1238. return m_FSM.InitDevice(ctx);
  1239. }
  1240. // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:没有;-1表示失败
  1241. int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID)
  1242. {
  1243. CSimpleStringA strErrMsg;
  1244. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  1245. CSystemStaticInfo info;
  1246. auto rc = GetFunction()->GetSystemStaticInfo(info);
  1247. if (rc != Error_Succeed)
  1248. {
  1249. strErrMsg = "GetPinPadIDAndDeviceID()=>GetSystemStaticInfo() fail";
  1250. SetAuthErrMsg((const char *)strErrMsg);
  1251. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1252. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETSTATICINFO, (const char *)strErrMsg);
  1253. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO,
  1254. GetOutPutStr("%s%08X", "GetSystemStaticInfo", rc).c_str());
  1255. return -1;
  1256. }
  1257. if (info.strMachineType.IsStartWith("RPM", true) || info.strMachineType.IsStartWith("RVC.CardStore", true) || info.strMachineType.IsStartWith("RVC.IL", true)) // 回单打印机、简化版
  1258. return 0;
  1259. int nRet = -1;
  1260. auto pPinPadClient = new PinPadService_ClientBase(this);
  1261. bool bPinPadID = false;
  1262. bool bDeviceID = false;
  1263. bool bVendor = false;
  1264. CSimpleStringA strVendor;
  1265. CSimpleStringA strPID;
  1266. CSimpleStringA strMID;
  1267. rc = pPinPadClient->Connect();
  1268. if (rc == Error_Succeed)
  1269. {
  1270. PinPadService_GetDevInfo_Req req = {};
  1271. PinPadService_GetDevInfo_Ans ans = {};
  1272. rc = pPinPadClient->GetDevInfo(req, ans, 3000);
  1273. if (rc == Error_Succeed)
  1274. {
  1275. if (ans.state == DEVICE_STATUS_NORMAL)
  1276. {
  1277. nRet = 0;
  1278. Dbg("pinpad model: %s", (const char*)ans.model);
  1279. // CM = V2.0#PM = V1.0#MID = 75500001#PID = 12345678#FWID = V1234567#Vendor = nantian
  1280. // 密码键盘ID,PID,8到16字节; 设备ID,MID,8到16字节; 固件版本号,FWID,8字节
  1281. CSimpleStringA str = ans.model;
  1282. if (!str.IsNullOrEmpty())
  1283. {
  1284. auto arr = str.Split('#');
  1285. if (arr.GetCount() > 0)
  1286. {
  1287. for (int i = 0; i < arr.GetCount(); i++)
  1288. {
  1289. auto arr2 = arr[i].Split('=');
  1290. if (arr2.GetCount() != 2)
  1291. continue;
  1292. //if (arr2[0] == "PID")
  1293. if(!strnicmp((LPCTSTR)arr2[0], "PID", strlen("PID")))
  1294. {
  1295. strPID = arr2[1];
  1296. if (!strPID.IsNullOrEmpty())
  1297. bPinPadID = true;
  1298. }
  1299. //else if (arr2[0] == "MID")
  1300. else if(!strnicmp((LPCTSTR)arr2[0], "MID", strlen("MID")))
  1301. {
  1302. strMID = arr2[1];
  1303. if (!strMID.IsNullOrEmpty())
  1304. bDeviceID = true;
  1305. }
  1306. //else if (arr2[0] == "Vendor")
  1307. else if(!strnicmp((LPCTSTR)arr2[0], "Vendor", strlen("Vendor")))
  1308. {
  1309. strVendor = arr2[1];
  1310. if (!strVendor.IsNullOrEmpty())
  1311. bVendor = true;
  1312. }
  1313. }
  1314. }
  1315. }
  1316. }
  1317. else
  1318. {
  1319. Dbg("pinpad not exist, state: %d", ans.state);
  1320. }
  1321. }
  1322. else
  1323. {
  1324. strErrMsg = "PinPad::GetDevInfo() fail";
  1325. SetAuthErrMsg((const char *)strErrMsg);
  1326. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1327. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETPINPADINFO, (const char *)strErrMsg);
  1328. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_PINPAD,
  1329. GetOutPutStr("%s%08X%s%s", "GetDevInfo", rc, "strErrMsg", (const char*)strErrMsg ).c_str());
  1330. }
  1331. pPinPadClient->GetFunction()->CloseSession();
  1332. }
  1333. else
  1334. {
  1335. strErrMsg = "连接PinPad实体失败";
  1336. SetAuthErrMsg((const char *)strErrMsg);
  1337. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1338. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNETPINPAD, (const char *)strErrMsg);
  1339. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  1340. GetOutPutStr("%s%08X%s%s", "Connect", rc, "strErrMsg", "连接PinPad实体失败").c_str());
  1341. }
  1342. pPinPadClient->SafeDelete();
  1343. pPinPadClient = NULL;
  1344. if (bPinPadID)
  1345. {
  1346. if (bVendor)
  1347. strPinPadID = strVendor + "_" + strPID;
  1348. else
  1349. strPinPadID = strPID;
  1350. nRet += 1;
  1351. }
  1352. if (bDeviceID)
  1353. {
  1354. if (bVendor)
  1355. strDeviceID = strVendor + "_" + strMID;
  1356. else
  1357. strDeviceID = strMID;
  1358. nRet += 2;
  1359. }
  1360. return nRet;
  1361. }
  1362. bool CAccessAuthEntity::HasCkCodeFlg()
  1363. {
  1364. CSimpleStringA strErrMsg;
  1365. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  1366. CSystemStaticInfo info;
  1367. auto rc = GetFunction()->GetSystemStaticInfo(info);
  1368. if (rc != Error_Succeed)
  1369. {
  1370. strErrMsg = "HasCkCodeFlg()=>GetSystemStaticInfo() fail";
  1371. SetAuthErrMsg((const char *)strErrMsg);
  1372. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1373. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETSTATICINFO, (const char *)strErrMsg);
  1374. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO,
  1375. GetOutPutStr("%s%08X%s%s", "GetSystemStaticInfo", rc, "strErrMsg", (const char*)strErrMsg).c_str());
  1376. return false;
  1377. }
  1378. if (info.strMachineType.IsStartWith("RPM", true) || info.strMachineType.IsStartWith("RVC.CardStore", true) || info.strMachineType.IsStartWith("RVC.IL", true)) // 回单打印机、简化版
  1379. {
  1380. Dbg("MachineType is [%s], not exist pinpad entity", info.strMachineType);
  1381. return false;
  1382. }
  1383. auto pPinPadClient = new PinPadService_ClientBase(this);
  1384. bool bCheckCode = false;
  1385. CSimpleStringA strSpeficiCM;
  1386. if (pPinPadClient->Connect() == Error_Succeed)
  1387. {
  1388. PinPadService_GetDevInfo_Req req = {};
  1389. PinPadService_GetDevInfo_Ans ans = {};
  1390. auto rc = pPinPadClient->GetDevInfo(req, ans, 3000);
  1391. if (rc == Error_Succeed)
  1392. {
  1393. if (ans.state == DEVICE_STATUS_NORMAL)
  1394. {
  1395. Dbg("pinpad model: %s", (const char*)ans.model);
  1396. // CM = V2.0#PM = V1.0#MID = 75500001#PID = 12345678#FWID = V1234567#Vendor = nantian
  1397. // 密码键盘ID,PID,8到16字节; 设备ID,MID,8到16字节; 固件版本号,FWID,8字节
  1398. CSimpleStringA str = ans.model;
  1399. if (!str.IsNullOrEmpty())
  1400. {
  1401. auto arr = str.Split('#');
  1402. if (arr.GetCount() > 0)
  1403. {
  1404. for (int i = 0; i < arr.GetCount(); i++)
  1405. {
  1406. auto arr2 = arr[i].Split('=');
  1407. if (arr2.GetCount() != 2)
  1408. continue;
  1409. if(!strnicmp((LPCTSTR)arr2[0], "CM", strlen("CM")))
  1410. {
  1411. strSpeficiCM = arr2[1];
  1412. if (strSpeficiCM.GetLength() > 3 && _strnicmp(strSpeficiCM, "V2.0", strlen("V2.0")) == 0)
  1413. {
  1414. //Support checkcode, then operate checkcode routine..
  1415. bCheckCode = true;
  1416. }
  1417. }
  1418. }
  1419. }
  1420. }
  1421. }
  1422. else
  1423. {
  1424. Dbg("pinpad not exist, state: %d", ans.state);
  1425. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_PINPAD,
  1426. GetOutPutStr("%s%d", "ans.state", ans.state).c_str());
  1427. }
  1428. }
  1429. else
  1430. {
  1431. strErrMsg = "PinPad::GetDevInfo() fail";
  1432. SetAuthErrMsg((const char *)strErrMsg);
  1433. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1434. //LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_GETPINPADINFO, (const char *)strErrMsg);
  1435. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_FROM_PINPAD,
  1436. GetOutPutStr("%s%08X", "GetDevInfo", rc).c_str());
  1437. }
  1438. pPinPadClient->GetFunction()->CloseSession();
  1439. }
  1440. else
  1441. {
  1442. strErrMsg = "连接PinPad实体失败";
  1443. SetAuthErrMsg((const char *)strErrMsg);
  1444. spFunction->SetSysVar("AuthErrMsg", (const char *)strErrMsg, true);
  1445. //LogError(Severity_Low, rc, ERROR_ACCESSAUTH_CONNETPINPAD, (const char *)strErrMsg);
  1446. LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_CONNECT_PINPAD,
  1447. GetOutPutStr("%s%s", "strErrMsg", strErrMsg).c_str());
  1448. }
  1449. pPinPadClient->SafeDelete();
  1450. pPinPadClient = NULL;
  1451. return bCheckCode? true:false;
  1452. }
  1453. wstring CAccessAuthEntity::ANSIToUnicode(const string& str)
  1454. {
  1455. int len = 0;
  1456. len = str.length();
  1457. int unicodeLen = ::MultiByteToWideChar(CP_ACP,
  1458. 0,
  1459. str.c_str(),
  1460. -1,
  1461. NULL,
  1462. 0);
  1463. wchar_t * pUnicode;
  1464. pUnicode = new wchar_t[unicodeLen+1];
  1465. memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
  1466. ::MultiByteToWideChar( CP_ACP,
  1467. 0,
  1468. str.c_str(),
  1469. -1,
  1470. (LPWSTR)pUnicode,
  1471. unicodeLen);
  1472. wstring rt;
  1473. rt = (wchar_t*)pUnicode;
  1474. delete pUnicode;
  1475. return rt;
  1476. }
  1477. //China Standard Time
  1478. BOOL CAccessAuthEntity::SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime)
  1479. {
  1480. HKEY hKey;
  1481. LONG ErrorCode;
  1482. TCHAR szSubKey[256];
  1483. TCHAR szStandardName[32];
  1484. TCHAR szDaylightName[32];
  1485. REG_TZI_FORMAT regTZI;
  1486. DWORD dwByteLen;
  1487. // 检测入口参数
  1488. if ((szTimeZoneKeyName == NULL) || (strlen(szTimeZoneKeyName) == 0))
  1489. {
  1490. // 时区标识符不能为空
  1491. return FALSE;
  1492. }
  1493. StringCchCopy(szSubKey, 256, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"));
  1494. StringCchCat(szSubKey, 256, szTimeZoneKeyName);
  1495. ErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hKey);
  1496. if (ErrorCode != ERROR_SUCCESS)
  1497. {
  1498. //LogError(Severity_Middle, Error_Unexpect, ErrorCode, "RegOpenKeyEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time fail");
  1499. Dbg("RegOpenKeyEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time fail");
  1500. return FALSE;
  1501. }
  1502. // 标准名
  1503. dwByteLen = sizeof(szStandardName);
  1504. ErrorCode = RegQueryValueEx(hKey, TEXT("Std"), NULL, NULL, reinterpret_cast<LPBYTE>(&szStandardName), &dwByteLen);
  1505. if (ErrorCode != ERROR_SUCCESS)
  1506. {
  1507. RegCloseKey(hKey);
  1508. //LogError(Severity_Middle, Error_Unexpect, ErrorCode, "RegQueryValueEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time\\Std fail");
  1509. Dbg("RegQueryValueEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time\\Std fail");
  1510. return FALSE;
  1511. }
  1512. // 夏时制名
  1513. dwByteLen = sizeof(szDaylightName);
  1514. ErrorCode = RegQueryValueEx(hKey, TEXT("Dlt"), NULL, NULL, reinterpret_cast<LPBYTE>(&szDaylightName), &dwByteLen);
  1515. if (ErrorCode != ERROR_SUCCESS)
  1516. {
  1517. RegCloseKey(hKey);
  1518. //LogError(Severity_Middle, Error_Unexpect, ErrorCode, "RegQueryValueEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time\\Dlt fail");
  1519. Dbg("RegQueryValueEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time\\Dlt fail");
  1520. return FALSE;
  1521. }
  1522. // 时区信息
  1523. dwByteLen = sizeof(regTZI);
  1524. ErrorCode = RegQueryValueEx(hKey, TEXT("TZI"), NULL, NULL, reinterpret_cast<LPBYTE>(&regTZI), &dwByteLen);
  1525. RegCloseKey(hKey);
  1526. if ((ErrorCode != ERROR_SUCCESS) || (dwByteLen > sizeof(regTZI)))
  1527. {
  1528. //LogError(Severity_Middle, Error_Unexpect, ErrorCode, "RegQueryValueEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time\\TZI fail");
  1529. Dbg("RegQueryValueEx Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\China Standard Time\\TZI fail");
  1530. return FALSE;
  1531. }
  1532. // 开启权限
  1533. HANDLE hToken;
  1534. TOKEN_PRIVILEGES tkp;
  1535. BOOL isOK;
  1536. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
  1537. {
  1538. //LogError(Severity_Middle, Error_Unexpect, GetLastError(), "OpenProcessToken Standard Time\\Dlt fail");
  1539. Dbg("OpenProcessToken Standard Time\\Dlt fail");
  1540. return FALSE;
  1541. }
  1542. LookupPrivilegeValue(NULL, SE_TIME_ZONE_NAME, &tkp.Privileges[0].Luid);
  1543. tkp.PrivilegeCount = 1;
  1544. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  1545. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  1546. if (GetLastError() != ERROR_SUCCESS)
  1547. {
  1548. CloseHandle(hToken);
  1549. //LogError(Severity_Middle, Error_Unexpect, GetLastError(), "AdjustTokenPrivileges fail");
  1550. Dbg("AdjustTokenPrivileges fail");
  1551. return FALSE;
  1552. }
  1553. // 设置新时区
  1554. DYNAMIC_TIME_ZONE_INFORMATION tzi;
  1555. tzi.Bias = regTZI.Bias;
  1556. tzi.StandardDate = regTZI.StandardDate;
  1557. tzi.StandardBias = regTZI.StandardBias;
  1558. tzi.DaylightDate = regTZI.DaylightDate;
  1559. tzi.DaylightBias = regTZI.DaylightBias;
  1560. tzi.DynamicDaylightTimeDisabled = !isDaylightSavingTime;
  1561. wcscpy(tzi.StandardName, ANSIToUnicode(szStandardName).c_str());
  1562. wcscpy(tzi.DaylightName, ANSIToUnicode(szDaylightName).c_str());
  1563. wcscpy(tzi.TimeZoneKeyName, ANSIToUnicode(szTimeZoneKeyName).c_str());
  1564. isOK = SetDynamicTimeZoneInformation(&tzi); // 设置动态时区
  1565. if (!isOK)
  1566. {
  1567. //LogError(Severity_Middle, Error_Unexpect, GetLastError(), "SetDynamicTimeZoneInformation fail");
  1568. Dbg("SetDynamicTimeZoneInformation fail");
  1569. }
  1570. // 关闭权限
  1571. tkp.Privileges[0].Attributes = 0;
  1572. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  1573. CloseHandle(hToken);
  1574. return isOK;
  1575. }
  1576. SP_BEGIN_ENTITY_MAP()
  1577. SP_ENTITY(CAccessAuthEntity)
  1578. SP_END_ENTITY_MAP()