mod_AccessAuth.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #pragma once
  2. #include "SpBase.h"
  3. #include "RVCCrypt.h"
  4. #include "AccessAuthorization_server_g.h"
  5. using namespace AccessAuthorization;
  6. #include "..\EventCode.h"
  7. #include "AccessAuthFSM.h"
  8. //
  9. //#include <string>
  10. //using namespace std;
  11. // 准入服务 0x502
  12. class CAccessAuthEntity;
  13. class CAccessAuthSession : public AccessAuthService_ServerSessionBase
  14. {
  15. public:
  16. CAccessAuthSession(CAccessAuthEntity *pEntity) : m_pEntity(pEntity) {}
  17. virtual ~CAccessAuthSession() {}
  18. virtual void Handle_Regist(SpOnewayCallContext<AccessAuthService_Regist_Info>::Pointer ctx);
  19. virtual void Handle_Unregist(SpOnewayCallContext<AccessAuthService_Unregist_Info>::Pointer ctx);
  20. virtual void Handle_Reregist(SpOnewayCallContext<AccessAuthService_Reregist_Info>::Pointer ctx);
  21. virtual void Handle_PushTerminalStage(SpOnewayCallContext<AccessAuthService_PushTerminalStage_Info>::Pointer ctx);
  22. virtual void Handle_InitDev(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer ctx);
  23. virtual void Handle_SyncTime(SpOnewayCallContext<AccessAuthService_SyncTime_Info>::Pointer ctx);
  24. private:
  25. CAccessAuthEntity *m_pEntity;
  26. };
  27. //class PinPadClass;
  28. class CAccessAuthEntity : public CEntityBase, public ISysVarListener
  29. {
  30. public:
  31. CAccessAuthEntity() :m_nAuthVersion(1) {}
  32. virtual ~CAccessAuthEntity()
  33. {
  34. /*if (NULL != m_pkeys)
  35. {
  36. delete m_pkeys;
  37. m_pkeys = NULL;
  38. }*/
  39. }
  40. virtual const char *GetEntityName() const { return "AccessAuthorization"; }
  41. virtual bool IsService()const{return true;}
  42. virtual void OnStarted();
  43. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext);
  44. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext);
  45. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  46. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszClass*/)
  47. {
  48. //LOG_FUNCTION();
  49. return new CAccessAuthSession(this);
  50. }
  51. // 开始准入
  52. ErrorCodeEnum Regist();
  53. // 重新准入
  54. ErrorCodeEnum Reregist();
  55. // 准入退出
  56. ErrorCodeEnum Unregist(int nReason, int nWay);
  57. // 时间同步
  58. ErrorCodeEnum SyncTime();
  59. // 状态上报
  60. ErrorCodeEnum PushTerminalStage(char cNewStage, DWORD dwNewStageTime, char cOldStage, DWORD dwOldStageTime);
  61. // KMC初始化
  62. ErrorCodeEnum InitKMC();
  63. // 获取WK更新请求包
  64. // @nAlgFlag: 1:3des only; 2: sm4 only; 3: both 3des and sm4
  65. ErrorCodeEnum GetKmcWKUpdateData(char *pBuf, int &nLen, int nAlgFlag);
  66. // 解析WK
  67. // @nAlgFlag: 1:3des only; 2: sm4 only; 3: both 3des and sm4
  68. ErrorCodeEnum ParseWKUpdateResult(char *pBuf, int nLen, int nAlgFlag);
  69. // 获取KMC错误
  70. CSimpleStringA GetKMCLastErrMsg();
  71. // 释放KMC
  72. ErrorCodeEnum ReleaseKMC();
  73. //ErrorCodeEnum PrintAllKeys(bool bSM);
  74. // 加载新WK
  75. ErrorCodeEnum LoadPinPadWK(bool bSM);
  76. bool HexStrToByteArray(const char* pHex, BYTE *pBuf, int *pBufLen);
  77. string ByteArrayToHexStr(BYTE *pBuf, int nBufLen);
  78. // 调用PinPad加密(只支持DES加密,不支持SM)
  79. ErrorCodeEnum EncryptDataWithPinPad(const CBlob &raw, CBlob &enc);
  80. // 生成RSA密钥对
  81. ErrorCodeEnum CreateRsaKeyPair(CBlob &pubKey, CBlob &priKey);
  82. // 保存密钥对到令牌实体
  83. ErrorCodeEnum SaveRsaKeyPair(const CBlob &pubKey, const CBlob &priKey);
  84. // 保存Token和共享会话密钥到令牌实体
  85. ErrorCodeEnum SaveTokenAndSharedSK(const CBlob &token, const CBlob &sharedSK);
  86. // 是否使用PinPad
  87. bool HasPinPad();
  88. int GetPinPadCapability();
  89. // 保存准入版本及会话密钥
  90. bool SaveAuthVerAndKey(int nAuthVer, BYTE *pKey);
  91. inline int GetAuthVersion(){ return m_nAuthVersion; }
  92. // 调用准入会话密钥加密
  93. ErrorCodeEnum EncryptDataWithSessionKey(const CBlob &raw, CBlob &enc);
  94. bool GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen);
  95. bool GetTerminalPublicKey(BYTE *pBuf, int &nBufLen);
  96. bool GetMD5Hash(const char *pStr, BYTE md5[16]);
  97. ErrorCodeEnum InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  98. void SetAuthErrMsg(const char *pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
  99. const char *GetAuthErrMsg() { return m_strAuthErrMsg; }
  100. // 获取密码键盘ID和外设ID
  101. // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
  102. int GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID);
  103. // 密码键盘是否支持校验码
  104. bool HasCkCodeFlg();
  105. // 设置时区
  106. wstring ANSIToUnicode(const string& str);
  107. BOOL SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime);
  108. protected:
  109. CAccessAuthFSM m_FSM;
  110. int m_nAuthVersion; // 准入请求版本: 1 借助KMC密钥验证;2 借助终端密钥动态生成会话密钥验证
  111. BYTE m_AuthSessionKey[140];
  112. CSimpleStringA m_strAuthErrMsg;
  113. EncKeys* m_pkeys;
  114. };