ax_cipher_api.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**********************************************************************************
  2. *
  3. * Copyright (c) 2019-2020 Beijing AXera Technology Co., Ltd. All Rights Reserved.
  4. *
  5. * This source file is the property of Beijing AXera Technology Co., Ltd. and
  6. * may not be copied or distributed in any isomorphic form without the prior
  7. * written consent of Beijing AXera Technology Co., Ltd.
  8. *
  9. **********************************************************************************/
  10. #ifndef __AX_CIPHER_H__
  11. #define __AX_CIPHER_H__
  12. #ifdef __cplusplus
  13. #if __cplusplus
  14. extern "C" {
  15. #endif
  16. #endif /* __cplusplus */
  17. /** Cipher algorithm */
  18. typedef enum {
  19. AX_CIPHER_ALGO_HASH_SHA1 = 0, // SHA-1
  20. AX_CIPHER_ALGO_HASH_SHA224 = 1, // SHA-224
  21. AX_CIPHER_ALGO_HASH_SHA256 = 2, // SHA-256
  22. AX_CIPHER_ALGO_HASH_SHA384 = 3, // SHA-384
  23. AX_CIPHER_ALGO_HASH_SHA512 = 4, // SHA-512
  24. AX_CIPHER_ALGO_MAC_HMAC_SHA1 = 5, // HMAC-SHA-1
  25. AX_CIPHER_ALGO_MAC_HMAC_SHA224 = 6, // HMAC-SHA-224
  26. AX_CIPHER_ALGO_MAC_HMAC_SHA256 = 7, // HMAC-SHA-256
  27. AX_CIPHER_ALGO_MAC_HMAC_SHA384 = 8, // HMAC-SHA-384
  28. AX_CIPHER_ALGO_MAC_HMAC_SHA512 = 9, // HMAC-SHA-512
  29. AX_CIPHER_ALGO_MAC_AES_CMAC = 10, // AES-CMAC
  30. AX_CIPHER_ALGO_MAC_AES_CBC_MAC = 11, // AES-CBC-MAC
  31. AX_CIPHER_ALGO_CIPHER_AES = 12, // AES
  32. AX_CIPHER_ALGO_CIPHER_DES = 13, // DES
  33. AX_CIPHER_ALG_INVALID = 0xffffffff,
  34. } AX_CIPHER_ALGO_E;
  35. typedef enum {
  36. // (Block)Cipher modes
  37. AX_CIPHER_MODE_CIPHER_ECB = 0, // ECB
  38. AX_CIPHER_MODE_CIPHER_CBC, // CBC
  39. AX_CIPHER_MODE_CIPHER_CTR, // CTR
  40. AX_CIPHER_MODE_CIPHER_ICM, // ICM
  41. AX_CIPHER_MODE_CIPHER_F8, // F8
  42. AX_CIPHER_MODE_CIPHER_CCM, // CCM
  43. AX_CIPHER_MODE_CIPHER_XTS, // XTS
  44. AX_CIPHER_MODE_CIPHER_GCM, // GCM
  45. AX_CIPHER_MODE_CIPHER_MAX, // must be last
  46. } AX_CIPHER_MODE_E;
  47. typedef enum AX_CIPHER_RSA_SIGN_SCHEME_E {
  48. AX_CIPHER_RSA_SIGN_RSASSA_PKCS1_V15_SHA1 = 0x0,
  49. AX_CIPHER_RSA_SIGN_RSASSA_PKCS1_V15_SHA224,
  50. AX_CIPHER_RSA_SIGN_RSASSA_PKCS1_V15_SHA256,
  51. AX_CIPHER_RSA_SIGN_RSASSA_PKCS1_PSS_SHA1,
  52. AX_CIPHER_RSA_SIGN_RSASSA_PKCS1_PSS_SHA224,
  53. AX_CIPHER_RSA_SIGN_RSASSA_PKCS1_PSS_SHA256,
  54. AX_CIPHER_RSA_SIGN_SCHEME_INVALID = 0xffffffff,
  55. } AX_CIPHER_RSA_SIGN_SCHEME_E;
  56. typedef struct {
  57. AX_U8 *hmacKey;
  58. AX_U32 hmackeyLen;
  59. AX_CIPHER_ALGO_E hashType;
  60. } AX_CIPHER_HASH_CTL_S;
  61. typedef struct {
  62. AX_U32 hashBits;
  63. AX_U32 modulusBits;
  64. AX_U8 *modulusData;
  65. AX_U32 privateExponentBytes;
  66. AX_U8 *exponentData;
  67. AX_CIPHER_RSA_SIGN_SCHEME_E enScheme;
  68. } AX_CIPHER_RSA_PRIVATE_KEY;
  69. typedef struct {
  70. AX_U32 hashBits;
  71. AX_U32 modulusBits;
  72. AX_U8 *modulusData;
  73. AX_U32 publicExponentBytes;
  74. AX_U8 *exponentData;
  75. AX_CIPHER_RSA_SIGN_SCHEME_E enScheme;
  76. } AX_CIPHER_RSA_PUBLIC_KEY;
  77. typedef struct {
  78. AX_U8 *data;
  79. AX_U32 len; // Data size in bytes
  80. } AX_CIPHER_SIG_DATA_S;
  81. typedef enum {
  82. AX_CIPHER_RSA_ENC_SCHEME_NO_PADDING,
  83. AX_CIPHER_RSA_ENC_SCHEME_PKCS1_V1_5,
  84. AX_CIPHER_RSA_ENC_SCHEME_OAEP,
  85. } AX_CIPHER_RSA_ENC_SCHEME_E;
  86. typedef struct {
  87. AX_CIPHER_RSA_ENC_SCHEME_E enScheme;
  88. AX_CIPHER_RSA_PUBLIC_KEY pubKey;
  89. } AX_CIPHER_RSA_PUB_ENC_S;
  90. typedef struct {
  91. AX_CIPHER_RSA_ENC_SCHEME_E enScheme;
  92. AX_CIPHER_RSA_PRIVATE_KEY priKey;
  93. } AX_CIPHER_RSA_PRI_ENC_S;
  94. #ifndef AX_SUCCESS
  95. #define AX_SUCCESS 0
  96. #endif
  97. typedef enum {
  98. AX_ERR_CIPHER_ILLEGAL_PARAM = 0x8002000A, /** Invalid parameter */
  99. AX_ERR_CIPHER_ACCESS_ERROR = 0x80020080, /** Access error */
  100. AX_ERR_CIPHER_BUF_FULL = 0x80020021, /** Full/Overflow error */
  101. AX_ERR_CIPHER_INVALID_ALGORITHM = 0x80020081, /** Invalid algorithm code */
  102. AX_ERR_CIPHER_NOMEM = 0x80020018, /** No memory */
  103. AX_ERR_CIPHER_OPERATION = 0x80020082, /** Operation failed */
  104. AX_ERR_CIPHER_INTERNAL = 0x80020083, /** Internal error */
  105. AX_ERR_CIPHER_OPEN = 0x80020084, /** load dev error */
  106. } AX_CIPHER_STS;
  107. typedef AX_U64 AX_CIPHER_HANDLE;
  108. typedef struct {
  109. AX_CIPHER_ALGO_E alg; /**< Cipher algorithm */
  110. AX_CIPHER_MODE_E workMode; /**< Operating mode */
  111. AX_U8 *pKey; /**< Key input */
  112. AX_U32 keySize; /**< Key size */
  113. AX_U8 *pIV; /**< Initialization vector (IV) */
  114. } AX_CIPHER_CTRL_S;
  115. AX_S32 AX_CIPHER_Init(AX_VOID);
  116. AX_S32 AX_CIPHER_DeInit(AX_VOID);
  117. AX_S32 AX_CIPHER_CreateHandle(AX_CIPHER_HANDLE *phCipher, const AX_CIPHER_CTRL_S *pstCipherCtrl);
  118. AX_S32 AX_CIPHER_Encrypt(AX_CIPHER_HANDLE pCipher, AX_U8 *szSrcAddr, AX_U8 *szDestAddr, AX_U32 byteLength);
  119. AX_S32 AX_CIPHER_Decrypt(AX_CIPHER_HANDLE pCipher, AX_U8 *szSrcAddr, AX_U8 *szDestAddr, AX_U32 byteLength);
  120. AX_S32 AX_CIPHER_EncryptPhy(AX_CIPHER_HANDLE pCipher, AX_U64 szSrcAddr, AX_U64 szDestAddr, AX_U32 byteLength);
  121. AX_S32 AX_CIPHER_DecryptPhy(AX_CIPHER_HANDLE pCipher, AX_U64 szSrcAddr, AX_U64 szDestAddr, AX_U32 byteLength);
  122. AX_S32 AX_CIPHER_DestroyHandle(AX_CIPHER_HANDLE pCipher);
  123. AX_S32 AX_CIPHER_RsaVerify(AX_CIPHER_RSA_PUBLIC_KEY *key, AX_U8 *msg, AX_U32 msgBytes, AX_CIPHER_SIG_DATA_S *sig);
  124. AX_S32 AX_CIPHER_RsaSign(AX_CIPHER_RSA_PRIVATE_KEY *key, AX_U8 *msg, AX_U32 msgBytes, AX_CIPHER_SIG_DATA_S *sig);
  125. AX_S32 AX_CIPHER_HashInit(AX_CIPHER_HASH_CTL_S *pstHashCtl, AX_CIPHER_HANDLE *pHashHandle);
  126. AX_S32 AX_CIPHER_HashUpdate(AX_CIPHER_HANDLE handle, AX_U8 *inputData, AX_U32 inPutLen);
  127. AX_S32 AX_CIPHER_HashFinal(AX_CIPHER_HANDLE handle, AX_U8 *inputData, AX_U32 inPutLen, AX_U8 *outPutHash);
  128. AX_U32 AX_CIPHER_GetRandomNumber(AX_U32 *pRandomNumber, AX_U32 size);
  129. //
  130. #ifdef __cplusplus
  131. #if __cplusplus
  132. }
  133. #endif
  134. #endif /* __cplusplus */
  135. #endif /* __AX_CIPHER_H__ */