mod_tokenmgr.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. #include "stdafx.h"
  2. #include "modVer.h"
  3. #include "SpBase.h"
  4. #include "TokenKeeper_server_g.h"
  5. using namespace TokenKeeper;
  6. #include "RVCComm.h"
  7. class CTokenManagerEntity;
  8. class CTokenManagerSession : public TokenService_ServerSessionBase
  9. {
  10. public:
  11. CTokenManagerSession(CTokenManagerEntity *pEntity) : m_pEntity(pEntity) { }
  12. virtual ~CTokenManagerSession() { }
  13. virtual void Handle_GetToken(SpReqAnsContext<TokenService_GetToken_Req, TokenService_GetToken_Ans>::Pointer ctx);
  14. virtual void Handle_SetToken(SpReqAnsContext<TokenService_SetToken_Req, TokenService_SetToken_Ans>::Pointer ctx);
  15. virtual void Handle_GetSharedSK(SpReqAnsContext<TokenService_GetSharedSK_Req, TokenService_GetSharedSK_Ans>::Pointer ctx);
  16. virtual void Handle_SetSharedSK(SpReqAnsContext<TokenService_SetSharedSK_Req, TokenService_SetSharedSK_Ans>::Pointer ctx);
  17. virtual void Handle_SetKeyPair(SpReqAnsContext<TokenService_SetKeyPair_Req, TokenService_SetKeyPair_Ans>::Pointer ctx);
  18. virtual void Handle_GetPublicKey(SpReqAnsContext<TokenService_GetPublicKey_Req, TokenService_GetPublicKey_Ans>::Pointer ctx);
  19. virtual void Handle_EncryptWithPubKey(SpReqAnsContext<TokenService_EncryptWithPubKey_Req, TokenService_EncryptWithPubKey_Ans>::Pointer ctx);
  20. virtual void Handle_DecryptWithPubKey(SpReqAnsContext<TokenService_DecryptWithPubKey_Req, TokenService_DecryptWithPubKey_Ans>::Pointer ctx);
  21. virtual void Handle_EncryptWithPriKey(SpReqAnsContext<TokenService_EncryptWithPriKey_Req, TokenService_EncryptWithPriKey_Ans>::Pointer ctx);
  22. virtual void Handle_DecryptWithPriKey(SpReqAnsContext<TokenService_DecryptWithPriKey_Req, TokenService_DecryptWithPriKey_Ans>::Pointer ctx);
  23. private:
  24. CTokenManagerEntity *m_pEntity;
  25. };
  26. class CTokenManagerEntity : public CEntityBase
  27. {
  28. public:
  29. CTokenManagerEntity() : m_bTokenInitialized(false), m_bKeyInitialized(false), m_bSSKInitialized(false) {}
  30. virtual ~CTokenManagerEntity() {}
  31. virtual const char *GetEntityName() const { return "TokenKeeper"; }
  32. const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  33. virtual bool IsService()const { return true; }
  34. virtual void OnStarted()
  35. {
  36. InitializeCriticalSection(&m_lock);
  37. }
  38. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  39. {
  40. DeleteCriticalSection(&m_lock);
  41. pTransactionContext->SendAnswer(Error_Succeed);
  42. }
  43. virtual CServerSessionBase *OnNewSession(const char* pszRemoteEntityName, const char * pszClass)
  44. {
  45. Dbg("new session required from %s", pszRemoteEntityName);
  46. return new CTokenManagerSession(this);
  47. }
  48. ErrorCodeEnum GetToken(CBlob &token)
  49. {
  50. ErrorCodeEnum Error;
  51. EnterCriticalSection(&m_lock);
  52. if (m_bTokenInitialized) {
  53. token = m_blobToken;
  54. Error = Error_Succeed;
  55. } else {
  56. Error = Error_NotInit;
  57. Dbg("%s: token is not initiazlied!", __FUNCTION__);
  58. }
  59. LeaveCriticalSection(&m_lock);
  60. return Error;
  61. }
  62. ErrorCodeEnum SetToken(const CBlob &token)
  63. {
  64. EnterCriticalSection(&m_lock);
  65. m_blobToken = token;
  66. m_bTokenInitialized = true;
  67. LeaveCriticalSection(&m_lock);
  68. return Error_Succeed;
  69. }
  70. ErrorCodeEnum GetSharedSK(CBlob &ssk)
  71. {
  72. ErrorCodeEnum Error;
  73. EnterCriticalSection(&m_lock);
  74. if (m_bSSKInitialized) {
  75. ssk = m_blobSSK;
  76. Error = Error_Succeed;
  77. } else {
  78. Error = Error_NotInit;
  79. Dbg("%s: SharedSK is not initiazlied!", __FUNCTION__);
  80. }
  81. LeaveCriticalSection(&m_lock);
  82. return Error;
  83. }
  84. ErrorCodeEnum SetSharedSK(const CBlob &ssk)
  85. {
  86. EnterCriticalSection(&m_lock);
  87. m_blobSSK = ssk;
  88. m_bSSKInitialized = true;
  89. LeaveCriticalSection(&m_lock);
  90. return Error_Succeed;
  91. }
  92. ErrorCodeEnum SetKeyPair(const CBlob &pri, const CBlob &pub)
  93. {
  94. EnterCriticalSection(&m_lock);
  95. m_blobPriKey = pri;
  96. m_blobPubKey = pub;
  97. m_bKeyInitialized = true;
  98. LeaveCriticalSection(&m_lock);
  99. return Error_Succeed;
  100. }
  101. ErrorCodeEnum GetPubKey(CBlob &pub)
  102. {
  103. ErrorCodeEnum Error;
  104. EnterCriticalSection(&m_lock);
  105. if (m_bKeyInitialized) {
  106. pub = m_blobPubKey;
  107. Error = Error_Succeed;
  108. } else {
  109. LogError(Severity_Low, Error_NotInit, 0, "key not initialized");
  110. Error = Error_NotInit;
  111. }
  112. LeaveCriticalSection(&m_lock);
  113. return Error;
  114. }
  115. ErrorCodeEnum EncryptWithPubKey(const CBlob &raw_data, CBlob &enc_data)
  116. {
  117. ErrorCodeEnum Error;
  118. EnterCriticalSection(&m_lock);
  119. if (!m_bKeyInitialized) {
  120. LogError(Severity_Low, Error_NotInit, 0, "key not initialized");
  121. Error = Error_NotInit;
  122. }
  123. else
  124. {
  125. // 保证目标缓冲区长度
  126. int len = raw_data.m_iLength;
  127. if (len % 117 == 0)
  128. len = (len / 117) * 128;
  129. else
  130. len = (len / 117 + 1) * 128;
  131. enc_data.Alloc(len + 4);
  132. bool bRet = EncWithSM2PubKey((BYTE*)raw_data.m_pData, raw_data.m_iLength, (BYTE*)enc_data.m_pData + 4, &len, (BYTE*)m_blobPubKey.m_pData, m_blobPubKey.m_iLength);
  133. enc_data.Resize(len + 4); // shrink to return size
  134. auto dstData = (byte*)enc_data.m_pData;
  135. dstData[3] = (byte)((len >> 24) & 0xFF);
  136. dstData[2] = (byte)((len >> 16) & 0xFF);
  137. dstData[1] = (byte)((len >> 8) & 0xFF);
  138. dstData[0] = (byte)(len & 0xFF);
  139. Error = bRet ? Error_Succeed : Error_Unexpect;
  140. }
  141. LeaveCriticalSection(&m_lock);
  142. return Error;
  143. }
  144. ErrorCodeEnum DecryptWithPubKey(const CBlob &enc_data, CBlob &raw_data)
  145. {
  146. /*
  147. ErrorCodeEnum Error(Error_Succeed);
  148. EnterCriticalSection(&m_lock);
  149. if (!m_bKeyInitialized) {
  150. LogError(Severity_Low, Error_NotInit, 0, "key not initialized");
  151. Error = Error_NotInit;
  152. } else {
  153. int len = enc_data.m_iLength;
  154. raw_data.Alloc(len);
  155. bool bRet = DecWithRsaPubKey((BYTE*)enc_data.m_pData, enc_data.m_iLength, (BYTE*)raw_data.m_pData, &len, (BYTE*)m_blobPubKey.m_pData, m_blobPubKey.m_iLength);
  156. raw_data.Resize(len); // shrink to return size
  157. if (!bRet) {
  158. Error = Error_DataCheck;
  159. LogWarn(Severity_Low, Error, 0, "DecWithRsaPubKey failed!");
  160. }
  161. }
  162. LeaveCriticalSection(&m_lock);
  163. */
  164. LogWarn(Severity_Low, Error_Cancel, 0, "DecWithRsaPubKey not support in sm os!");
  165. return Error_Cancel;
  166. }
  167. ErrorCodeEnum EncryptWithPriKey(const CBlob &raw_data, CBlob &enc_data)
  168. {
  169. /*
  170. ErrorCodeEnum Error(Error_Succeed);
  171. EnterCriticalSection(&m_lock);
  172. if (!m_bKeyInitialized) {
  173. LogError(Severity_Low, Error_NotInit, 0, "key not initialized");
  174. Error = Error_NotInit;
  175. }
  176. else
  177. {
  178. // 保证目标缓冲区长度
  179. int len = raw_data.m_iLength;
  180. if (len % 117 ==0)
  181. len = (len / 117) * 128;
  182. else
  183. len = (len / 117 + 1) * 128;
  184. enc_data.Alloc(len);
  185. bool bRet = EncWithRsaPriKey((BYTE*)raw_data.m_pData, raw_data.m_iLength, (BYTE*)enc_data.m_pData, &len, (BYTE*)m_blobPriKey.m_pData, m_blobPriKey.m_iLength);
  186. enc_data.Resize(len); // shrink to return size
  187. if (!bRet) {
  188. Error = Error_DataCheck;
  189. LogWarn(Severity_Low, Error, 0, "EncWithRsaPriKey failed!");
  190. }
  191. }
  192. LeaveCriticalSection(&m_lock);
  193. */
  194. LogWarn(Severity_Low, Error_Cancel, 0, "EncryptWithPriKey not support in sm os!");
  195. return Error_Cancel;
  196. }
  197. ErrorCodeEnum DecryptWithPriKey(const CBlob &enc_data, CBlob &raw_data)
  198. {
  199. ErrorCodeEnum Error;
  200. EnterCriticalSection(&m_lock);
  201. if (!m_bKeyInitialized)
  202. {
  203. LogError(Severity_Low, Error_NotInit, 0, "key not initialized");
  204. Error = Error_NotInit;
  205. }
  206. else if (enc_data.m_iLength < 4)
  207. {
  208. LogError(Severity_Low, Error_NotInit, 0, "DecryptWithPriKey len < 4");
  209. Error = Error_NotInit;
  210. }
  211. else
  212. {
  213. auto srcData = (byte*)enc_data.m_pData;
  214. int len = ((int)srcData[3]) << 24 | ((int)srcData[2]) << 16 | ((int)srcData[1]) << 8 | ((int)srcData[0]);
  215. raw_data.Alloc(len);
  216. bool bRet = DecWithSM2PriKey((BYTE*)enc_data.m_pData + 4, len, (BYTE*)raw_data.m_pData, &len, (BYTE*)m_blobPriKey.m_pData, m_blobPriKey.m_iLength);
  217. raw_data.Resize(len); // shrink to return size
  218. Error = bRet ? Error_Succeed : Error_Unexpect;
  219. }
  220. LeaveCriticalSection(&m_lock);
  221. return Error;
  222. }
  223. private:
  224. CBlob m_blobToken;
  225. bool m_bTokenInitialized;
  226. CBlob m_blobSSK;
  227. bool m_bSSKInitialized;
  228. CBlob m_blobPriKey;
  229. CBlob m_blobPubKey;
  230. bool m_bKeyInitialized;
  231. CRITICAL_SECTION m_lock;
  232. };
  233. void CTokenManagerSession::Handle_GetToken( SpReqAnsContext<TokenService_GetToken_Req, TokenService_GetToken_Ans>::Pointer ctx )
  234. {
  235. ErrorCodeEnum Error = m_pEntity->GetToken(ctx->Ans.token);
  236. ctx->Answer(Error);
  237. }
  238. void CTokenManagerSession::Handle_SetToken( SpReqAnsContext<TokenService_SetToken_Req, TokenService_SetToken_Ans>::Pointer ctx )
  239. {
  240. ErrorCodeEnum Error = m_pEntity->SetToken(ctx->Req.token);
  241. ctx->Answer(Error);
  242. }
  243. void CTokenManagerSession::Handle_GetSharedSK(SpReqAnsContext<TokenService_GetSharedSK_Req, TokenService_GetSharedSK_Ans>::Pointer ctx)
  244. {
  245. ErrorCodeEnum Error = m_pEntity->GetSharedSK(ctx->Ans.ssk);
  246. ctx->Answer(Error);
  247. }
  248. void CTokenManagerSession::Handle_SetSharedSK(SpReqAnsContext<TokenService_SetSharedSK_Req, TokenService_SetSharedSK_Ans>::Pointer ctx)
  249. {
  250. ErrorCodeEnum Error = m_pEntity->SetSharedSK(ctx->Req.ssk);
  251. ctx->Answer(Error);
  252. }
  253. void CTokenManagerSession::Handle_SetKeyPair( SpReqAnsContext<TokenService_SetKeyPair_Req, TokenService_SetKeyPair_Ans>::Pointer ctx )
  254. {
  255. ErrorCodeEnum Error = m_pEntity->SetKeyPair(ctx->Req.pri_key, ctx->Req.pub_key);
  256. ctx->Answer(Error);
  257. }
  258. void CTokenManagerSession::Handle_GetPublicKey( SpReqAnsContext<TokenService_GetPublicKey_Req, TokenService_GetPublicKey_Ans>::Pointer ctx )
  259. {
  260. ErrorCodeEnum Error = m_pEntity->GetPubKey(ctx->Ans.key);
  261. ctx->Answer(Error);
  262. }
  263. void CTokenManagerSession::Handle_EncryptWithPubKey( SpReqAnsContext<TokenService_EncryptWithPubKey_Req, TokenService_EncryptWithPubKey_Ans>::Pointer ctx )
  264. {
  265. ErrorCodeEnum Error = m_pEntity->EncryptWithPubKey(ctx->Req.raw_data, ctx->Ans.enc_data);
  266. ctx->Answer(Error);
  267. }
  268. void CTokenManagerSession::Handle_DecryptWithPubKey( SpReqAnsContext<TokenService_DecryptWithPubKey_Req, TokenService_DecryptWithPubKey_Ans>::Pointer ctx )
  269. {
  270. ErrorCodeEnum Error = m_pEntity->DecryptWithPubKey(ctx->Req.enc_data, ctx->Ans.raw_data);
  271. ctx->Answer(Error);
  272. }
  273. void CTokenManagerSession::Handle_EncryptWithPriKey( SpReqAnsContext<TokenService_EncryptWithPriKey_Req, TokenService_EncryptWithPriKey_Ans>::Pointer ctx )
  274. {
  275. ErrorCodeEnum Error = m_pEntity->EncryptWithPriKey(ctx->Req.raw_data, ctx->Ans.enc_data);
  276. ctx->Answer(Error);
  277. }
  278. void CTokenManagerSession::Handle_DecryptWithPriKey( SpReqAnsContext<TokenService_DecryptWithPriKey_Req, TokenService_DecryptWithPriKey_Ans>::Pointer ctx )
  279. {
  280. ErrorCodeEnum Error = m_pEntity->DecryptWithPriKey(ctx->Req.enc_data, ctx->Ans.raw_data);
  281. ctx->Answer(Error);
  282. }
  283. SP_BEGIN_ENTITY_MAP()
  284. SP_ENTITY(CTokenManagerEntity)
  285. SP_END_ENTITY_MAP()