mod_AccessAuth.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #ifndef __MOD_ACCESSAUTH_H
  2. #define __MOD_ACCESSAUTH_H
  3. #include "SpBase.h"
  4. #include "EventCode.h"
  5. #include "AccessAuthFSM.h"
  6. #include "modVer.h"
  7. #include "AccessAuthorization_server_g.h"
  8. using namespace AccessAuthorization;
  9. // 准入服务 0x502
  10. class CAccessAuthEntity;
  11. class CAccessAuthSession : public AccessAuthService_ServerSessionBase
  12. {
  13. public:
  14. CAccessAuthSession(CAccessAuthEntity *pEntity) : m_pEntity(pEntity) {}
  15. virtual ~CAccessAuthSession() {}
  16. virtual void Handle_Regist(SpOnewayCallContext<AccessAuthService_Regist_Info>::Pointer ctx);
  17. virtual void Handle_Unregist(SpOnewayCallContext<AccessAuthService_Unregist_Info>::Pointer ctx);
  18. virtual void Handle_InitDev(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer ctx);
  19. virtual void Handle_UpdateWK(SpOnewayCallContext<AccessAuthService_UpdateWK_Info>::Pointer ctx);
  20. virtual void Handle_InitializeNew(SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer ctx);
  21. virtual void Handle_SyncTime(SpOnewayCallContext<AccessAuthService_SyncTime_Info>::Pointer ctx);
  22. private:
  23. CAccessAuthEntity *m_pEntity;
  24. };
  25. class CAccessAuthEntity : public CEntityBase, public ISysVarListener
  26. {
  27. public:
  28. CAccessAuthEntity() :m_nAuthVersion(1), m_bGetKMCKey(false){}
  29. virtual ~CAccessAuthEntity() {}
  30. virtual const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  31. virtual const char *GetEntityName() const { return "AccessAuthorization"; }
  32. virtual bool IsService()const{return true;}
  33. virtual void OnStarted();
  34. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext);
  35. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext);
  36. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  37. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszClass*/){
  38. return new CAccessAuthSession(this);
  39. }
  40. // 开始准入
  41. ErrorCodeEnum Regist();
  42. void UpdateWK();
  43. // 重新准入
  44. ErrorCodeEnum Reregist();
  45. // 准入退出
  46. ErrorCodeEnum Unregist(int nReason, int nWay);
  47. // 时间同步
  48. DWORD SyncTime();
  49. // 状态上报
  50. ErrorCodeEnum PushTerminalStage(char cNewStage, DWORD dwNewStageTime, char cOldStage, DWORD dwOldStageTime);
  51. // KMC初始化
  52. DWORD InitKMC();
  53. // 获取WK更新请求包
  54. // @nAlgFlag: 1:3des only; 2: sm4 only; 3: both 3des and sm4
  55. ErrorCodeEnum GetKmcWKUpdateData(char *pBuf, int &nLen, int nAlgFlag);
  56. // 解析WK
  57. // @nAlgFlag: 1:3des only; 2: sm4 only; 3: both 3des and sm4
  58. DWORD ParseWKUpdateResult(char *pBuf, int nLen, int nAlgFlag);
  59. // 获取KMC错误
  60. CSimpleStringA GetKMCLastErrMsg();
  61. // 释放KMC
  62. ErrorCodeEnum ReleaseKMC();
  63. // 加载新WK
  64. DWORD LoadPinPadWK(bool bSM);
  65. bool HexStrToByteArray(const char* pHex, BYTE *pBuf, int *pBufLen);
  66. string ByteArrayToHexStr(BYTE *pBuf, int nBufLen);
  67. // 调用PinPad加密(只支持DES加密,不支持SM)
  68. DWORD EncryptDataWithPinPad(const CBlob &raw, CBlob &enc);
  69. // 生成SM2密钥对
  70. DWORD CreateSM2KeyPair(CBlob &pubKey, CBlob &priKey);
  71. // 保存密钥对到令牌实体
  72. DWORD SaveSM2KeyPair(const CBlob &pubKey, const CBlob &priKey);
  73. // 保存Token和共享会话密钥到令牌实体
  74. ErrorCodeEnum SaveTokenAndSharedSK(const CBlob &token, const CBlob &sharedSK);
  75. // 是否使用PinPad
  76. bool HasPinPad();
  77. // 机型是否配置密码键盘
  78. bool IsMachineTypeConfigurePinPad(CSimpleStringA strMachineType);
  79. int GetPinPadCapability();
  80. // 保存准入版本及会话密钥
  81. bool SaveAuthVerAndKey(int nAuthVer, BYTE *pKey);
  82. inline int GetAuthVersion(){ return m_nAuthVersion; }
  83. // 调用准入会话密钥加密
  84. ErrorCodeEnum EncryptDataWithSessionKey(const CBlob &raw, CBlob &enc);
  85. bool GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen);
  86. bool GetTerminalPublicKey(BYTE *pBuf, int &nBufLen);
  87. bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey);
  88. bool GetMD5Hash(const char *pStr, BYTE md5[16]);
  89. DWORD InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  90. void SetAuthErrMsg(const char *pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
  91. const char *GetAuthErrMsg() { return m_strAuthErrMsg; }
  92. // 获取密码键盘ID和外设ID
  93. //oilyang@20210510 add:in order to avoid getting info out of async, check if has pinpad while getting info
  94. // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
  95. int GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID,bool &bHasPinPad);
  96. // 密码键盘是否支持校验码
  97. bool HasCkCodeFlg();
  98. // 设置时区
  99. wstring ANSIToUnicode(const string& str);
  100. BOOL SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime);
  101. int ConvertStr2Byte(string input, BYTE* output, int outputLen);
  102. void printPasswdError();
  103. DWORD LoadKeysToPinPadNew(string TMK, string TPK, string EDK, string index);
  104. BYTE m_AuthSessionKey[140];
  105. virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  106. {
  107. pTransactionContext->SendAnswer(Error_Succeed);
  108. }
  109. /*type=0 means read first or not while type=1 for writing not first*/
  110. /*return 1 means first access auth as 0 means not first access auth*/
  111. int GetOrSetIsFirstSM(int type);
  112. string m_TMK;
  113. string m_TPK;
  114. string m_EDK;
  115. string m_index;
  116. bool m_bGetKMCKey;
  117. CSimpleStringA m_strUserID, m_strPassword, m_strInitUrl;
  118. SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer m_ctx;
  119. void BeginInitMKACS();
  120. bool SendInitMKReqACS(CInitlizerMKReq& initMKReq);
  121. CSimpleStringA GetInitUrl()
  122. {
  123. return m_strInitUrl;
  124. }
  125. void EndInitMK(DWORD rc, const char* pszErrMsg);
  126. ErrorCodeEnum LoadKeysToPinPadACS(string TMK, string TPK, string EDK, string index);
  127. DWORD m_eErrNum;
  128. CSimpleStringA m_strLastErrMsg;
  129. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
  130. {
  131. char* tmpStr = *strBuf;
  132. int count = 0;
  133. for (int i = 0; i < len; ++i)
  134. {
  135. sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
  136. count += 2;
  137. }
  138. return 0;
  139. }
  140. int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf)
  141. {
  142. int len = strlen(strBuf);
  143. if (len == 0 || len % 2 != 0)
  144. return 0;
  145. BYTE* buf = new BYTE[len / 2];
  146. if (buf == NULL)
  147. return 0;
  148. int j = 0;
  149. for (int i = 0; i < len;)
  150. {
  151. int tmpVal;
  152. sscanf(strBuf + i, "%2X", &tmpVal);
  153. buf[j] = tmpVal;
  154. //buf[j] = char2int(strBuf[i])*16 + char2int(strBuf[i+1]);
  155. i += 2;
  156. j++;
  157. }
  158. //memcpy(buf,strBuf,len);
  159. *hexBuf = buf;
  160. return j;
  161. }
  162. protected:
  163. CAccessAuthFSM m_FSM;
  164. int m_nAuthVersion; // 准入请求版本: 1 借助KMC密钥验证;2 借助终端密钥动态生成会话密钥验证
  165. CSystemStaticInfo m_info;
  166. CSimpleStringA m_strAuthErrMsg;
  167. };
  168. #endif //__MOD_ACCESSAUTH_H