PageRenderTime 60ms CodeModel.GetById 34ms RepoModel.GetById 1ms app.codeStats 0ms

/MicroFrameworkPK_v4_2/DeviceCode/pal/PKCS11/Tokens/OpenSSL/OpenSSL_PKCS11.h

https://bitbucket.org/pmfsampaio/netmf-lpc
C Header | 246 lines | 192 code | 52 blank | 2 comment | 3 complexity | 292ca2d049466363a0c7b099bae05195 MD5 | raw file
  1. #include <PKCS11\CryptokiPAL.h>
  2. #include <EVP\evp.h>
  3. #include <HMAC\HMAC.h>
  4. #ifndef _OPENSSL_PKCS11_H_
  5. #define _OPENSSL_PKCS11_H_ 1
  6. #ifndef PKCS11_OPENSSL_MAX_OBJECT_COUNT
  7. #define PKCS11_OPENSSL_MAX_OBJECT_COUNT 40
  8. #endif
  9. #ifndef PKCS11_OPENSSL_MAX_IV_LEN
  10. #define PKCS11_OPENSSL_MAX_IV_LEN 64
  11. #endif
  12. // TODO: Add platform dependent value
  13. #define OPENSSL_MAX_SESSION_COUNT 10
  14. #define OPENSSL_HEADER() \
  15. CK_RV retVal = CKR_OK
  16. #define OPENSSL_CLEANUP() \
  17. CleanUp:
  18. #define OPENSSL_RETURN() \
  19. return retVal
  20. #define OPENSSL_NOCLEANUP() \
  21. OPENSSL_CLEANUP(); \
  22. OPENSSL_RETURN()
  23. #define OPENSSL_LEAVE() \
  24. goto CleanUp
  25. #define OPENSSL_SET_AND_LEAVE(x) \
  26. { \
  27. retVal = x; \
  28. OPENSSL_LEAVE(); \
  29. }
  30. #define OPENSSL_CHECKRESULT(x) \
  31. if((x) <= 0) OPENSSL_SET_AND_LEAVE(CKR_FUNCTION_FAILED)
  32. #define OPENSSL_CHECK_CK_RESULT(x) \
  33. if(CKR_OK != (retVal = x)) OPENSSL_LEAVE()
  34. extern CK_SLOT_INFO g_OpenSSL_SlotInfo;
  35. extern CryptokiToken g_OpenSSL_Token;
  36. typedef struct _KEY_DATA
  37. {
  38. CK_KEY_TYPE type;
  39. CK_ULONG size;
  40. KEY_ATTRIB attrib;
  41. CK_VOID_PTR key;
  42. CK_VOID_PTR ctx;
  43. } KEY_DATA;
  44. typedef struct _CERT_DATA
  45. {
  46. X509* cert;
  47. KEY_DATA pubKeyData;
  48. KEY_DATA privKeyData;
  49. } CERT_DATA;
  50. typedef enum _ObjectType
  51. {
  52. KeyType = 1,
  53. DataType = 2,
  54. CertificateType = 3
  55. } ObjectType;
  56. typedef struct _OBJECT_DATA
  57. {
  58. ObjectType Type;
  59. CHAR FileName[20];
  60. CHAR GroupName[20];
  61. int RefCount;
  62. CK_VOID_PTR Data;
  63. } OBJECT_DATA;
  64. struct PKCS11_Token_OpenSSL
  65. {
  66. static CK_RV Initialize();
  67. static CK_RV Uninitialize();
  68. static CK_RV InitializeToken(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen, CK_UTF8CHAR_PTR pLabel, CK_ULONG ulLabelLen);
  69. static CK_RV GetDeviceError(CK_ULONG_PTR pErrorCode);
  70. };
  71. typedef enum _OpenSSLCryptoState
  72. {
  73. Uninitialized,
  74. Initialized,
  75. InProgress,
  76. } OpenSSLCryptoState;
  77. typedef struct _OpenSSLEncryptData
  78. {
  79. UINT8 IV[PKCS11_OPENSSL_MAX_IV_LEN];
  80. EVP_CIPHER_CTX SymmetricCtx;
  81. BOOL IsSymmetric;
  82. KEY_DATA* Key;
  83. BOOL IsUpdateInProgress;
  84. } OpenSSLEncryptData;
  85. struct PKCS11_Encryption_OpenSSL
  86. {
  87. static CK_RV EncryptInit (Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pEncryptMech, CK_OBJECT_HANDLE hKey);
  88. static CK_RV Encrypt (Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen);
  89. static CK_RV EncryptUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen);
  90. static CK_RV EncryptFinal (Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen);
  91. static CK_RV DecryptInit (Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pEncryptMech, CK_OBJECT_HANDLE hKey);
  92. static CK_RV Decrypt (Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen);
  93. static CK_RV DecryptUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen);
  94. static CK_RV DecryptFinal (Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen);
  95. private:
  96. static CK_RV InitHelper(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pEncryptMech, CK_OBJECT_HANDLE hKey, BOOL isEncrypt);
  97. };
  98. struct PKCS11_Session_OpenSSL
  99. {
  100. static CK_RV InitPin(Cryptoki_Session_Context* pSessionCtx, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen);
  101. static CK_RV SetPin(Cryptoki_Session_Context* pSessionCtx, CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewPinLen);
  102. static CK_RV OpenSession(Cryptoki_Session_Context* pSessionCtx, CK_BBOOL fReadWrite);
  103. static CK_RV CloseSession(Cryptoki_Session_Context* pSessionCtx);
  104. static CK_RV Login(Cryptoki_Session_Context* pSessionCtx, CK_USER_TYPE userType, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen);
  105. static CK_RV Logout(Cryptoki_Session_Context* pSessionCtx);
  106. };
  107. struct FIND_OBJECT_DATA
  108. {
  109. UINT32 ObjectType;
  110. CHAR FileName[20];
  111. CHAR GroupName[20];
  112. };
  113. struct PKCS11_Objects_OpenSSL
  114. {
  115. static CK_RV CreateObject(Cryptoki_Session_Context* pSessionCtx, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject);
  116. static CK_RV CopyObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phNewObject);
  117. static CK_RV DestroyObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject);
  118. static CK_RV GetObjectSize(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ULONG_PTR pulSize);
  119. static CK_RV GetAttributeValue(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
  120. static CK_RV SetAttributeValue(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
  121. static CK_RV FindObjectsInit(Cryptoki_Session_Context* pSessionCtx, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
  122. static CK_RV FindObjects(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE_PTR phObjects, CK_ULONG ulMaxCount, CK_ULONG_PTR pulObjectCount);
  123. static CK_RV FindObjectsFinal(Cryptoki_Session_Context* pSessionCtx);
  124. static OBJECT_DATA* GetObjectFromHandle(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject);
  125. static BOOL FreeObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject);
  126. static CK_OBJECT_HANDLE AllocObject(Cryptoki_Session_Context* pSessionCtx, ObjectType type, size_t size, OBJECT_DATA** ppData);
  127. static void IntitializeObjects();
  128. private:
  129. static CK_RV LoadX509Cert(Cryptoki_Session_Context* pSessionCtx, X509* x, OBJECT_DATA** ppObject, EVP_PKEY* privateKey, CK_OBJECT_HANDLE_PTR phObject);
  130. static int FindEmptyObjectHandle();
  131. static OBJECT_DATA s_Objects[PKCS11_OPENSSL_MAX_OBJECT_COUNT];
  132. };
  133. typedef struct _OpenSSLDigestData
  134. {
  135. EVP_MD_CTX CurrentCtx;
  136. HMAC_CTX HmacCtx;
  137. KEY_DATA* HmacKey;
  138. BOOL IsUpdateInProgress;
  139. } OpenSSLDigestData;
  140. struct PKCS11_Digest_OpenSSL
  141. {
  142. static CK_RV DigestInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism);
  143. static CK_RV Digest(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen);
  144. static CK_RV Update(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen);
  145. static CK_RV DigestKey(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hKey);
  146. static CK_RV Final(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen);
  147. };
  148. typedef struct _OpenSSLSignatureData
  149. {
  150. KEY_DATA* Key;
  151. EVP_MD_CTX Ctx;
  152. BOOL IsUpdateInProgress;
  153. } OpenSSLSignatureData;
  154. struct PKCS11_Signature_OpenSSL
  155. {
  156. static CK_RV SignInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey);
  157. static CK_RV Sign(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen);
  158. static CK_RV SignUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen);
  159. static CK_RV SignFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen);
  160. static CK_RV VerifyInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey);
  161. static CK_RV Verify(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen);
  162. static CK_RV VerifyUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen);
  163. static CK_RV VerifyFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen);
  164. private:
  165. static CK_RV GetDigestFromMech(CK_MECHANISM_PTR pMechanism, const EVP_MD*& pDigest, CK_KEY_TYPE &keyType);
  166. static CK_RV InitHelper(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey, BOOL isSign);
  167. };
  168. struct PKCS11_Keys_OpenSSL
  169. {
  170. static CK_RV DeleteKey(Cryptoki_Session_Context* pSessionCtx, KEY_DATA* pKey);
  171. static CK_RV GenerateKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey);
  172. static CK_RV GenerateKeyPair(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism,
  173. CK_ATTRIBUTE_PTR pPublicKeyTemplate , CK_ULONG ulPublicCount,
  174. CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateCount,
  175. CK_OBJECT_HANDLE_PTR phPublicKey , CK_OBJECT_HANDLE_PTR phPrivateKey);
  176. static CK_RV WrapKey (Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey, CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen);
  177. static CK_RV UnwrapKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey, CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey);
  178. static CK_RV DeriveKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey);
  179. static CK_RV LoadSecretKey(Cryptoki_Session_Context* pSessionCtx, CK_KEY_TYPE keyType, const UINT8* pKey, CK_ULONG ulKeyLength, CK_OBJECT_HANDLE_PTR phKey);
  180. static CK_RV LoadRsaKey (Cryptoki_Session_Context* pSessionCtx, const RsaKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey);
  181. static CK_RV LoadDsaKey (Cryptoki_Session_Context* pSessionCtx, const DsaKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey);
  182. static CK_RV LoadEcKey (Cryptoki_Session_Context* pSessionCtx, const EcKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey);
  183. static CK_RV LoadKeyBlob(Cryptoki_Session_Context* pSessionCtx, const PBYTE pKey, CK_ULONG keyLen, CK_KEY_TYPE keyType, KEY_ATTRIB keyAttrib, CK_OBJECT_HANDLE_PTR phKey);
  184. //--//
  185. static KEY_DATA* GetKeyFromHandle(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hKey, BOOL getPrivate);
  186. private:
  187. static CK_OBJECT_HANDLE LoadKey(Cryptoki_Session_Context* pSessionCtx, void* pKey, CK_KEY_TYPE type, KEY_ATTRIB attrib, size_t keySize);
  188. };
  189. struct PKCS11_Random_OpenSSL
  190. {
  191. static CK_RV SeedRandom(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen);
  192. static CK_RV GenerateRandom(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pRandomData, CK_ULONG ulRandomLen);
  193. };
  194. #endif //_OPENSSL_PKCS11_H_