MI CIPHER API
1. 概述¶
1.1. 模块说明¶
CIPHER提供数据的加解密功能,提供包括AES\RSA\SHA加解密算法
1.2. 流程框图¶
图1-1 AES 加解密
图1-2 SHA算法
图1-3 RSA公钥加密与私钥解密
图1-4 RSA私钥加密与公钥解密
图1-5 RSA签名与验签
1.3. 关键字说明¶
-
AES:
密码学中的高级加密标准(Advanced Encryption Standard),是一种对称加密算法。
-
SHA:
安全散列算法(Secure Hash Algorithm),是一个密码散列函数家族,能将不同长度的数字消息计算生成固定长度的消息摘要。
-
RSA:
一种非对称加密算法,具有比较高的可靠性。
2. API 参考¶
2.1. 功能模块API¶
API名 | 功能 |
---|---|
MI_CIPHER_Init | 初始化CIPHER模块 |
MI_CIPHER_Uninit | 析构CIPHER模块 |
MI_CIPHER_CreateHandle | 创建CIPHER的 Handle |
MI_CIPHER_DestroyHandle | 销毁CIPHER的 Handle |
MI_CIPHER_ConfigHandle | 配置CIPHER的参数 |
MI_CIPHER_Encrypt | 加密数据 |
MI_CIPHER_Decrypt | 解密数据 |
MI_CIPHER_HashInit | 初始化HASH库 |
MI_CIPHER_HashUnInit | 退出HASH库,释放资源 |
MI_CIPHER_HashUpdate | 计算hash值 |
MI_CIPHER_HashFinal | 获取hash值 |
MI_CIPHER_RsaPublicEncrypt | 使用rsa公钥加密一段明文 |
MI_CIPHER_RsaPrivateDecrypt | 使用rsa私钥解密一段密文 |
MI_CIPHER_RsaPrivateEncrypt | 使用rsa私钥加密一段明文 |
MI_CIPHER_RsaPublicDecrypt | 使用rsa公钥解密一段密文 |
MI_CIPHER_RsaSign | 使用rsa私钥签名 |
MI_CIPHER_RsaVerify | 使用rsa公钥校验 |
MI_CIPHER_InitDev | 初始化CIPHER设备 |
MI_CIPHER_DeInitDev | 反初始化CIPHER设备 |
2.2. MI_CIPHER_Init¶
-
功能
初始化CIPHER模块。
-
语法
MI_S32 MI_CIPHER_Init(void);
-
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
注意
在使用cipher模块之前需要调用该接口。
-
相关主题
2.3. MI_CIPHER_Uninit¶
-
功能
析构CIPHER,释放资源。
-
语法
MI_S32 MI_CIPHER_Uninit (void);
-
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
2.4. MI_CIPHER_CreateHandle¶
-
功能
创建CIPHER的Handle。
-
语法
MI_S32 MI_CIPHER_CreateHandle(MI_HANDLE *phandle);
-
形参
参数名称 描述 输入/输出 phandle Cipher的handle地址指针 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
以ECB-AES-128加解密为例:
1. #include <stdlib.h> 2. #include <stdio.h> 3. #include <string.h> 4. #include <fcntl.h> 5. #include <unistd.h> 6. #include "mi_common.h" 7. #include "mi_cipher.h" 8. #include "mi_cipher_datatype.h" 9. MI_S32 Setconfiginfo(MI_HANDLE chnHandle, MI_CIPHER_ALG_e alg, const MI_U8 u8KeyBuf[16], const MI_U8 u8IVBuf[16]) 10. { 11. MI_S32 s32Ret = MI_SUCCESS; 12. MI_CIPHER_Config_t stconfig; 13. memset(&stconfig, 0, sizeof(MI_CIPHER_Config_t)); 14. stconfig.eAlg = alg; 15. if(alg != MI_CIPHER_ALG_AES_ECB) 16. { 17. memcpy(stconfig.iv, u8IVBuf,16); 18. } 19. stconfig.eKeySize = E_MI_CIPHER_KEY_SIZE_128; 20. memcpy(stconfig.key, u8KeyBuf, 16); 21. s32Ret = MI_CIPHER_ConfigHandle(chnHandle, &stconfig); 22. if (MI_SUCCESS != s32Ret) 23. { 24. s32Ret = -1; 25. } 26. return s32Ret; 27. } 28. int main(int argc, char **argv) 29. { 30. MI_S32 s32Ret = MI_SUCCESS; 31. MI_U32 u32TestSrcDataLen = 16; 32. MI_U32 u32TestDstDataLen = 0; 33. MI_U32 u32Testcached = 0; 34. MI_U8 pInputAddrVir[16]; 35. MI_U8 pOutputAddrVir[16]; 36. MI_HANDLE hTestchnid = -1; 37. MI_U8 aes_key[16] = {0x1B,0x2F,0x38,0x47,0x55,0x6C,0x71,0x89,0x9A,0xE1,0x42,0x93,0x14,0xE5,0x76,0x7D}; 38. MI_U8 aes_src[16] = {0x61,0xE2,0xF3,0xE4,0x85,0x56,0x57,0x88,0xF9,0x3A,0x6B,0x2C,0x6D,0x4E,0x7F,0x6A}; 39. MI_U8 aes_dst[16] = {0x53,0x6D,0x21,0xB8,0x7C,0x68,0xEC,0x31,0xB2,0xA0,0x64,0x72,0x65,0x6E,0xA2,0xDA}; 40. s32Ret = MI_CIPHER_Init(); 41. if(MI_SUCCESS != s32Ret) 42. { 43. return ; 44. } 45. s32Ret = MI_CIPHER_CreateHandle(&hTestchnid); 46. if(MI_SUCCESS != s32Ret) 47. { 48. MI_CIPHER_Uninit(); 49. return ; 50. } 51. s32Ret = Setconfiginfo(hTestchnid, MI_CIPHER_ALG_AES_ECB, aes_key, NULL); 52. if(MI_SUCCESS != s32Ret) 53. { 54. CIPHER_ERR("Set config info failed.\n"); 55. goto __CIPHER_EXIT__; 56. } 57. memset(pInputAddrVir, 0x0, u32TestSrcDataLen); 58. memcpy(pInputAddrVir, aes_src, u32TestSrcDataLen); 59. printBuffer("ECB-AES-128-ORI:", aes_src, sizeof(aes_src)); 60. memset(pOutputAddrVir, 0x0, u32TestSrcDataLen); 61. s32Ret = MI_CIPHER_Encrypt(hTestchnid, pInputAddrVir, pOutputAddrVir, u32TestSrcDataLen, &u32TestDstDataLen); 62. if(MI_SUCCESS != s32Ret) 63. { 64. CIPHER_ERR("Cipher encrypt failed.\n"); 65. s32Ret = -1; 66. goto __CIPHER_EXIT__; 67. } 68. printBuffer("ECB-AES-128-ENC:", pOutputAddrVir, u32TestDstDataLen); 69. /* compare */ 70. if ( 0 != memcmp(pOutputAddrVir, aes_dst, u32TestSrcDataLen) ) 71. { 72. CIPHER_ERR("Memcmp failed!\n"); 73. s32Ret = -1; 74. goto __CIPHER_EXIT__; 75. } 76. /* For decrypt */ 77. memcpy(pInputAddrVir, pOutputAddrVir, u32TestSrcDataLen); 78. memset(pOutputAddrVir, 0x00, u32TestSrcDataLen); 79. s32Ret = Setconfiginfo(hTestchnid, MI_CIPHER_ALG_AES_ECB, aes_key, NULL); 80. if(MI_SUCCESS != s32Ret) 81. { 82. CIPHER_ERR("Set config info failed.\n"); 83. goto __CIPHER_EXIT__; 84. } 85. s32Ret = MI_CIPHER_Decrypt(hTestchnid, pInputAddrVir, pOutputAddrVir, u32TestSrcDataLen, &u32TestDstDataLen); 86. if(MI_SUCCESS != s32Ret) 87. { 88. CIPHER_ERR("Cipher decrypt failed.\n"); 89. s32Ret = -1; 90. goto __CIPHER_EXIT__; 91. } 92. printBuffer("ECB-AES-128-DEC:", pOutputAddrVir, u32TestDstDataLen); 93. /* compare */ 94. if ( 0 != memcmp(pOutputAddrVir, aes_src, u32TestSrcDataLen) ) 95. { 96. CIPHER_ERR("Memcmp failed!\n"); 97. s32Ret = -1; 98. goto __CIPHER_EXIT__; 99. } 100. printf("\033[0;32m""sample ECB_AES128 %s run successfully!\n""\033[0m", __FUNCTION__); 101. MI_CIPHER_DestroyHandle(hTestchnid); 102. MI_CIPHER_Uninit(); 103. return; 104. __CIPHER_EXIT__: 105. MI_CIPHER_DestroyHandle(hTestchnid); 106. MI_CIPHER_Uninit(); 107. CIPHER_ERR("\033[0;32m""sample ECB_AES128 run fail!\n""\033[0m"); 108. return ; 109. }
-
相关主题
2.5. MI_CIPHER_DestroyHandle¶
-
功能
销毁已创建CIPHER Handle
-
语法
MI_S32 MI_CIPHER_DestroyHandle(MI_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle 已经创建的Cipher Handle 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_CreateHandle举例部分。
2.6. MI_CIPHER_ConfigHandle¶
-
功能
配置cipher的参数。
-
语法
MI_S32 MI_CIPHER_ConfigHandle(MI_HANDLE handle, MI_CIPHER_Config_t *pconfig);
-
形参
参数名称 描述 输入/输出 handle 已经创建的cipher handle。 输入 pconfig cipher handle对应的配置参数 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_CreateHandle举例部分。
2.7. MI_CIPHER_Encrypt¶
-
功能
Cipher加密数据。
-
语法
MI_U32 MI_CIPHER_Encrypt(MI_HANDLE handle, void* srcAddr, void* dstAddr , MI_U32 u32srcByteLen, MI_U32* pu32dstByteLen);
-
形参
参数名称 描述 输入/输出 handle 已经创建的cipher handle 输入 srcAddr 需要加密的数据地址 输入 dstAddr 加密后的数据地址 输出 u32srcByteLen 加密数据的长度 输出 u32dstByteLen 输出数据的长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_CreateHandle举例部分。
2.8. MI_CIPHER_Decrypt¶
-
功能
Cipher解密数据。
-
语法
MI_CIPHER_Decrypt(MI_HANDLE handle, void* srcAddr, void* dstAddr, MI_U32 u32srcByteLen, MI_U32* pu32dstByteLen);
-
形参
参数名称 描述 输入/输出 handle Cipher handle 输入 srcAddr 需要解密的数据地址 输入 dstAddr 解密后的数据地址 输出 u32srcByteLen 解密数据的长度 输出 pu32dstByteLen 输出数据的长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:Mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_CreateHandle举例部分。
2.9. MI_CIPHER_HashInit¶
-
功能
初始化HASH模块。
-
语法
MI_S32 MI_CIPHER_HashInit(MI_CIPHER_HASH_ALGO_e eHashAlgoType, MI_HANDLE *pHashHandle);
-
形参
参数名称 描述 输入/输出 eHashAlgoType Hash算法类型 输入 pHashHandle 输出的hash句柄 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
使用SHA1为例:
1. static unsigned char sha1_buf[3][128] = { 2. {"abc"}, 3. {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, 4. {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqabcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"} 5. }; 6. static const unsigned char sha1_sum[5][20] = 7. { 8. {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D}, 9. {0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1}, 10. {0xaf, 0xc5, 0x3a, 0x4e, 0xa2, 0x08, 0x56, 0xf9, 0x8e, 0x08, 0xdc, 0x6f, 0x3a, 0x5c, 0x98, 0x33, 0x13, 0x77, 0x68, 0xed}, 11. {0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda, 0xa4, 0xf6, 0x1e, 0xeb, 0x2b, 0xdb, 0xad, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6f}, 12. {0x7d, 0xf9, 0x62, 0x1f, 0x17, 0xad, 0x18, 0xc5, 0x8a, 0x5a, 0xf7, 0x99, 0x1d, 0x12, 0x62, 0x20, 0x0f, 0xaf, 0xa9, 0x0f}, 13. }; 14. static MI_U8 au8Buf[LONG_DATA_SIZE]; 15. int main(int argc, char *argv) 16. { 17. MI_S32 ret = MI_SUCCESS; 18. MI_U8 u8Hash[20]; 19. MI_U32 i = 0,j = 0; 20. MI_HANDLE hHandle[MAX_HASH_HANDLE]; 21. MI_CIPHER_HASH_ALGO_e eHashAlgoType; 22. MI_U32 u32HashOutLen = 0; 23. ret = MI_CIPHER_Init(); 24. if ( MI_SUCCESS != ret ) 25. { 26. return -1; 27. } 28. memset(u8Hash, 0, 20); 29. for(i = 0; i < MAX_HASH_HANDLE; i++) 30. { 31. eHashAlgoType = MI_CIPHER_HASH_ALG_SHA1; 32. ret = MI_CIPHER_HashInit(eHashAlgoType, &hHandle[i]); 33. if ( MI_SUCCESS != ret ) 34. { 35. CIPHER_ERR("hHandle :%d MI_CIPHER_HashUpdate failed \n", hHandle[i]); 36. MI_CIPHER_HashUnInit(hHandle[i]); 37. goto __CIPHER_HASH_EXIT__; 38. } 39. } 40. for(i = 0; i < MAX_HASH_HANDLE; i++) 41. { 42. if(i == 3) 43. { 44. memset(au8Buf, 'a', LONG_DATA_SIZE); 45. for(j=0; j<1000000/LONG_DATA_SIZE; j++) 46. { 47. ret = MI_CIPHER_HashUpdate(hHandle[i], au8Buf, LONG_DATA_SIZE); 48. if ( MI_SUCCESS != ret ) 49. { 50. CIPHER_ERR("hHandle :%d MI_CIPHER_HashUpdate failed \n", hHandle[i]); 51. MI_CIPHER_HashUnInit(hHandle[i]); 52. goto __CIPHER_HASH_EXIT__; 53. } 54. } 55. } 56. else 57. { 58. ret = MI_CIPHER_HashUpdate(hHandle[i], sha1_buf[i], strlen(sha1_buf[i])); 59. if ( MI_SUCCESS != ret ) 60. { 61. CIPHER_ERR("hHandle :%d MI_CIPHER_HashUpdate failed \n", hHandle[i]); 62. MI_CIPHER_HashUnInit(hHandle[i]); 63. goto __CIPHER_HASH_EXIT__; 64. } 65. } 66. } 67. for(i = 0; i < MAX_HASH_HANDLE; i++) 68. { 69. ret = MI_CIPHER_HashFinal(hHandle[i], u8Hash, &u32HashOutLen); 70. if ( MI_SUCCESS != ret ) 71. { 72. CIPHER_ERR("hHandle :%d MI_CIPHER_HashFinal failed \n", hHandle[0]); 73. MI_CIPHER_HashUnInit(hHandle[i]); 74. goto __CIPHER_HASH_EXIT__; 75. } 76. if(memcmp(u8Hash, sha1_sum[i], 20) != 0) 77. { 78. CIPHER_ERR("\033[0;31m" "SHA1 run failed, sample %d!\n" "\033[0m", i); 79. printBuffer("Sha1 result:", u8Hash, 20); 80. printBuffer("golden data:", sha1_sum[i], 20); 81. MI_CIPHER_HashUnInit(hHandle[i]); 82. goto __CIPHER_HASH_EXIT__; 83. return -1; 84. } 85. MI_CIPHER_HashUnInit(hHandle[i]); 86. CIPHER_DBG("SHA1 run success, sample %d!\n", i); 87. } 88. CIPHER_DBG("sample SHA1 run successfully!\n"); 89. return MI_SUCCESS; 90. __CIPHER_HASH_EXIT__: 91. MI_CIPHER_Uninit(); 92. CIPHER_ERR("sample SHA1 run fail!\n"); 93. return -1; 94. }
-
相关主题
2.10. MI_CIPHER_HashUnInit¶
-
功能
退出hash模块,释放资源。
-
语法
MI_S32 MI_CIPHER_HashUnInit(MI_HANDLE hHashHandle);
-
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考 MI_CIPHER_HashInit举例部分。
-
相关主题
2.11. MI_CIPHER_HashUpdate¶
-
功能
计算hash值。
-
语法
MI_S32 MI_CIPHER_HashUpdate(MI_HANDLE hHashHandle ,MI_U8 *pu8InputData, MI_U32 u32IDataLen);
-
形参
参数名称 描述 输入/输出 hHashHandle Hash句柄 输入 pu8InputData 输入数据缓冲 输入 u32IDataLen 输入数据长度 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考 MI_CIPHER_HashInit举例部分。
2.12. MI_CIPHER_HashFinal¶
-
功能
获取hash值,在计算完所有的数据后,调用这个接口获取最终的hash值,该接口同时会关闭hash句柄。如果在计算过程中,需要中断计算,也必须调用该接口关闭hash句柄。
-
语法
MI_S32 MI_CIPHER_HashFinal(MI_HANDLE hHashHandle, MI_U8 *pu8OutputHash, MI_U32 *pu32OutputHashLen);
-
形参
参数名称 描述 输入/输出 hHashHandle Hash句柄 输入 pu8OutputHash 输出的hash值 输出 pu32OutputHashLe 输出的Hash 长度(byte 数目) 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考 MI_CIPHER_HashInit举例部分。
2.13. MI_CIPHER_RsaPublicEncrypt¶
-
功能
使用RSA公钥加解密数据。
-
语法
MI_S32 MI_CIPHER_RsaPublicEncrypt(MI_CIPHER_RSA_PUB_ENC_t *pstRsaEncrypt,MI_U8 *pu8Input, MI_U32 u32InLen,MI_U8 *pu8Output, MI_U32 *pu32OutLen);
-
形参
参数名称 描述 输入/输出 pstRsaEncrypt 加解密属性结构体 输入 pu8Input 需要加密的数据 输入 u32InLen 需要加密的数据长度 输入 pu8Output 加密后的数据 输出 pu32OutLen 加密后的数据长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
以公钥加密,并用私钥解密为例:
1. MI_S32 PKCS_PUB_ENC(MI_CIPHER_RSA_ENC_SCHEME_E eRsaAlgoType, MI_U8 *pu8Expect) 2. { 3. MI_S32 ret = MI_SUCCESS, i; 4. MI_U8 u8Enc[256]; 5. MI_U8 u8Dec[256]; 6. MI_U32 u32OutLen = 0; 7. MI_CIPHER_RSA_PUB_ENC_t stRsaEncrypt; 8. MI_CIPHER_RSA_PRI_ENC_t stRsaDecrypt; 9. ret = MI_CIPHER_Init(); 10. if ( MI_SUCCESS != ret ) 11. { 12. return -1; 13. } 14. memset(&stRsaEncrypt, 0, sizeof(MI_CIPHER_RSA_PUB_ENC_t)); 15. memset(&stRsaDecrypt, 0, sizeof(MI_CIPHER_RSA_PRI_ENC_t)); 16. stRsaEncrypt.eRsaAlgoType = eRsaAlgoType; 17. stRsaEncrypt.stPubKey.pu8ExpE = E; 18. stRsaEncrypt.stPubKey.pu8ModN = N; 19. stRsaEncrypt.stPubKey.expSize = sizeof(E); 20. stRsaEncrypt.stPubKey.modSize =sizeof(N); 21. if(eRsaAlgoType == MI_CIPHER_RSA_ENC_SCHEME_NO_PADDING) 22. { 23. ret = MI_CIPHER_RsaPublicEncrypt(&stRsaEncrypt, NO_PADDING, 256, u8Enc, &u32OutLen); 24. } 25. else 26. { 27. ret = MI_CIPHER_RsaPublicEncrypt(&stRsaEncrypt, test_data, sizeof(test_data), u8Enc, &u32OutLen); 28. } 29. if ( MI_SUCCESS != ret ) 30. { 31. CIPHER_ERR("MI_CIPHER_RsaPublicEncrypt failed\n"); 32. goto __CIPHER_RSA_EXIT__; 33. } 34. if(pu8Expect != NULL) 35. { 36. if(memcmp(u8Enc, pu8Expect, u32OutLen) != 0) 37. { 38. CIPHER_ERR("MI_CIPHER_RsaPublicEncrypt failed\n"); 39. printBuffer("enc", u8Enc, u32OutLen); 40. printBuffer("expect", pu8Expect, 256); 41. goto __CIPHER_RSA_EXIT__; 42. } 43. } 44. stRsaDecrypt.eRsaAlgoType = eRsaAlgoType; 45. stRsaDecrypt.stPriKey.pu8ModN = N; 46. stRsaDecrypt.stPriKey.pu8ExpD = D; 47. stRsaDecrypt.stPriKey.expSize = sizeof(D); 48. stRsaDecrypt.stPriKey.modSize = sizeof(N); 49. ret = MI_CIPHER_RsaPrivateDecrypt(&stRsaDecrypt, u8Enc, u32OutLen, u8Dec, &u32OutLen); 50. if ( MI_SUCCESS != ret ) 51. { 52. CIPHER_ERR("MI_CIPHER_RsaPrivateDecrypt failed\n"); 53. goto __CIPHER_RSA_EXIT__; 54. } 55. if(eRsaAlgoType == MI_CIPHER_RSA_ENC_SCHEME_NO_PADDING) 56. { 57. if(memcmp(u8Dec, NO_PADDING, 256) != 0) 58. { 59. CIPHER_ERR("MI_CIPHER_RsaPrivateDecrypt failed\n"); 60. printBuffer("dec", u8Dec, u32OutLen); 61. printBuffer("expect", NO_PADDING, 256); 62. goto __CIPHER_RSA_EXIT__; 63. } 64. } 65. else 66. { 67. if(sizeof(test_data) != u32OutLen) 68. { 69. CIPHER_ERR("MI_CIPHER_RsaPrivateDecrypt len error\n"); 70. printf("dec: 0x%x, expect: %zu\n", u32OutLen, sizeof(test_data) - 1); 71. goto __CIPHER_RSA_EXIT__; 72. } 73. if(memcmp(u8Dec, test_data, sizeof(test_data)) != 0) 74. { 75. CIPHER_ERR("MI_CIPHER_RsaPrivateDecrypt failed\n"); 76. printBuffer("enc", u8Enc, u32OutLen); 77. printBuffer("expect", test_data, sizeof(test_data)); 78. goto __CIPHER_RSA_EXIT__; 79. } 80. } 81. CIPHER_DBG("sample PKCS_PUB_ENC run successfully!\n"); 82. MI_CIPHER_Uninit(); 83. return MI_SUCCESS; 84. __CIPHER_RSA_EXIT__: 85. CIPHER_ERR("sample PKCS_PUB_ENC run fail!\n"); 86. MI_CIPHER_Uninit(); 87. return -1; 88. }
2.14. MI_CIPHER_RsaPrivateDecrypt¶
-
功能
使用私钥加解密数据。
-
语法
MI_S32 MI_CIPHER_RsaPrivateDecrypt(MI_CIPHER_RSA_PRI_ENC_t * pstRsaDecrypt , MI_U8 *pu8Input, MI_U32 u32InLen, MI_U8 *pu8Output, MI_U32 *pu32OutLen);
-
形参
参数名称 描述 输入/输出 pstRsaDecrypt 解密属性结构体 输入 pu8Input 需要解密的数据 输入 u32InLen 需要解密的数据长度 输入 pu8Output 解密后的数据 输出 pu32OutLen 解密后的数据长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_RsaPublicEncrypt举例部分。
2.15. MI_CIPHER_RsaPrivateEncrypt¶
-
功能
使用私钥加解密数据。
-
语法
MI_S32 MI_CIPHER_RsaPrivateEncrypt(MI_CIPHER_RSA_PRI_ENC_t * pstRsaEncrypt , MI_U8 *pu8Input, MI_U32 u32InLen, MI_U8 *pu8Output, MI_U32 *pu32OutLen);
-
形参
参数名称 描述 输入/输出 pstRsaEncrypt 加密属性结构体 输入 pu8Input 需要加密的数据 输入 u32InLen 需要加密的数据长度 输入 pu8Output 加密后的数据 输出 pu32OutLen 加密后的数据长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
以私钥加密,公钥解密为例:
1. MI_S32 PKCS_PRI_ENC(MI_CIPHER_RSA_ENC_SCHEME_E eRsaAlgoType) 2. { 3. MI_S32 ret = MI_SUCCESS; 4. MI_U8 u8Sign[256]; 5. MI_U32 u32SignLen; 6. MI_U8 u8Hash[32]; 7. MI_U32 u32HLen; 8. MI_CIPHER_RSA_PUB_ENC_t stRsaDecrypt; 9. MI_CIPHER_RSA_PRI_ENC_t stRsaEncrypt; 10. ret = MI_CIPHER_Init(); 11. if ( MI_SUCCESS != ret ) 12. { 13. return -1; 14. } 15. 16. memset(&stRsaEncrypt, 0, sizeof(MI_CIPHER_RSA_PRI_ENC_t)); 17. memset(&stRsaDecrypt, 0, sizeof(MI_CIPHER_RSA_PUB_ENC_t)); 18. stRsaEncrypt.eRsaAlgoType = eRsaAlgoType; 19. stRsaDecrypt.eRsaAlgoType = eRsaAlgoType; 20. 21. stRsaEncrypt.stPriKey.pu8ExpD = D; 22. stRsaEncrypt.stPriKey.pu8ModN = N; 23. stRsaEncrypt.stPriKey.expSize = sizeof(D); 24. stRsaEncrypt.stPriKey.modSize = sizeof(N); 25. stRsaDecrypt.stPubKey.pu8ExpE = E; 26. stRsaDecrypt.stPubKey.pu8ModN = N; 27. stRsaDecrypt.stPubKey.expSize = sizeof(E); 28. stRsaDecrypt.stPubKey.modSize =sizeof(N); 29. 30. ret = MI_CIPHER_RsaPrivateEncrypt(&stRsaEncrypt, sha256_sum, 32, u8Sign, &u32SignLen); 31. if ( MI_SUCCESS != ret ) 32. { 33. CIPHER_ERR("MI_CIPHER_RsaPrivateEncrypt failed\n"); 34. goto __CIPHER_RSA_EXIT__; 35. } 36. 37. // printBuffer("sign", u8Sign, u32SignLen); 38. 39. ret = MI_CIPHER_RsaPublicDecrypt(&stRsaDecrypt, u8Sign, u32SignLen, u8Hash, &u32HLen); 40. if ( MI_SUCCESS != ret ) 41. { 42. CIPHER_ERR("MI_CIPHER_RsaPublicDecrypt failed\n"); 43. goto __CIPHER_RSA_EXIT__; 44. } 45. 46. CIPHER_DBG("sample PKCS_PRI_ENC run successfully!\n"); 47. MI_CIPHER_Uninit(); 48. return MI_SUCCESS; 49. 50. __CIPHER_RSA_EXIT__: 51. 52. MI_CIPHER_Uninit(); 53. CIPHER_ERR("sample PKCS_PRI_ENC run fail!\n"); 54. return -1; 55. }
2.16. MI_CIPHER_RsaPublicDecrypt¶
-
功能
使用RSA公钥加解密数据。
-
语法
MI_S32 MI_CIPHER_RsaPublicDecrypt(MI_CIPHER_RSA_PUB_ENC_t *pstRsaDecrypt, MI_U8 *pu8Input, MI_U32 u32InLen, MI_U8 *pu8Output, MI_U32 *pu32OutLen);
-
形参
参数名称 描述 输入/输出 pstRsaDecrypt 解密属性结构体 输入 pu8Input 需要解密的数据 输入 u32InLen 需要解密的数据长度 输入 pu8Output 解密后的数据 输出 pu32OutLen 解密后的数据长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_RsaPrivateEncrypt举例部分。
2.17. MI_CIPHER_RsaSign¶
-
功能
使用RSA私钥签名数据。
-
语法
MI_S32 MI_CIPHER_RsaSign(MI_CIPHER_RSA_SIGN_t *pstRsaSign, MI_U8 *pu8InHashData, MI_U32 u32HashDataLen, MI_U8 *pu8OutSign, MI_U32 *pu32OutSignLen);
-
形参
参数名称 描述 输入/输出 pstRsaSign 签名属性结构体 输入 pu8InHashData 待签名文本的HASH摘要 输入 u32HashDataLen 输入的hash摘要的长度 输入 pu8OutSign 签名信息 输出 pu32OutSignLen 签名信息的长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
1. MI_S32 RSA_SIGN_VERIFY(MI_CIPHER_RSA_SIGN_SCHEME_E enScheme) 2. { 3. MI_S32 ret = MI_SUCCESS; 4. MI_U8 u8Sign[256]; 5. MI_U32 u32SignLen; 6. MI_CIPHER_RSA_SIGN_t stRsaSign; 7. MI_CIPHER_RSA_VERIFY_t stRsaVerify; 8. ret = MI_CIPHER_Init(); 9. if ( MI_SUCCESS != ret ) 10. { 11. return -1; 12. } 13. memset(&stRsaSign, 0, sizeof(MI_CIPHER_RSA_SIGN_t)); 14. stRsaSign.eRsaAlgoType = enScheme; 15. stRsaSign.stPriKey.pu8ModN = N; 16. stRsaSign.stPriKey.pu8ExpD = D; 17. stRsaSign.stPriKey.modSize = sizeof(N); 18. stRsaSign.stPriKey.expSize = sizeof(D); 19. ret = MI_CIPHER_RsaSign(&stRsaSign, sha256_sum, sizeof(sha256_sum) , u8Sign, &u32SignLen); 20. if ( MI_SUCCESS != ret ) 21. { 22. CIPHER_ERR("MI_CIPHER_RsaSign failed\n"); 23. goto _RSA_VERIFY_EXIT; 24. } 25. switch(enScheme) 26. { 27. case MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256: 28. if(memcmp(u8Sign, RES, sizeof(RES)) != 0) 29. { 30. CIPHER_ERR("MI_CIPHER_RsaSign failed\n"); 31. printBuffer("sign", u8Sign, u32SignLen); 32. printBuffer("golden", RES, sizeof(RES)); 33. goto _RSA_VERIFY_EXIT; 34. } 35. break; 36. default: 37. break; 38. } 39. // printBuffer("sign", u8Sign, u32SignLen); 40. memset(&stRsaVerify, 0, sizeof(MI_CIPHER_RSA_VERIFY_t)); 41. stRsaVerify.eRsaAlgoType = enScheme; 42. stRsaVerify.stPubKey.pu8ModN = N; 43. stRsaVerify.stPubKey.pu8ExpE = E; 44. stRsaVerify.stPubKey.modSize = sizeof(N); 45. stRsaVerify.stPubKey.expSize = sizeof(E); 46. ret = MI_CIPHER_RsaVerify(&stRsaVerify, sha256_sum, sizeof(sha256_sum) , u8Sign, u32SignLen); 47. if ( MI_SUCCESS != ret ) 48. { 49. CIPHER_ERR("MI_CIPHER_RsaVerify failed\n"); 50. goto _RSA_VERIFY_EXIT; 51. } 52. CIPHER_DBG("rsa sign && verify sample run successfully!\n"); 53. MI_CIPHER_Uninit(); 54. return MI_SUCCESS; 55. _RSA_VERIFY_EXIT: 56. MI_CIPHER_Uninit(); 57. CIPHER_ERR("rsa sign && verify sample run fail!\n"); 58. return -1; 59. }
2.18. MI_CIPHER_RsaVerify¶
-
功能
使用RSA公钥验证。
-
语法
MI_S32 MI_CIPHER_RsaVerify(MI_CIPHER_RSA_VERIFY_t *pstRsaVerify, MI_U8 *pu8InHashData, MI_U32 u32HashDataLen, MI_U8 *pu8InSign, MI_U32 u32InSignLen);
-
形参
参数名称 描述 输入/输出 pstRsaVerify 校验属性结构体 输入 pu8InHashData 待签名文本的HASH摘要 输入 u32HashDataLen 输入的hash摘要的长度 输入 pu8InSign 签名信息 输出 u32InSignLen 签名信息的长度 输出 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_cipher.h
-
库文件:libmi_cipher.a/libmi_cipher.so
-
-
举例
请参考MI_CIPHER_RsaSign举例部分。
2.19. MI_CIPHER_InitDev¶
-
功能
初始化cipher设备。
-
语法
MI_S32 MI_CIPHER_InitDev(MI_CIPHER_InitParam_t *pstInitParam);
-
形参
参数名称 描述 输入/输出 pstInitParam 设备初始化参数 输入 -
返回值
-
0 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_common.h、mi_sys.h
-
库文件:libmi.a
-
-
注意
pstInitParam暂未使用,空值传入即可。
此接口在Version 2.06以上版本推荐使用,用于替换原有MI_CIPHER_Init 接口。
2.20. MI_CIPHER_DeInitDev¶
-
功能
反初始化cipher设备。
-
语法
MI_S32 MI_CIPHER_DeInitDev(void);
-
返回值
-
0 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_common.h、mi_sys.h
-
库文件:libmi.a
-
-
注意
此接口在Version 2.06以上版本推荐使用,用于替换原有MI_CIPHER_Uninit接口。
3. 数据类型¶
3.1. 数据类型定义¶
数据类型 | 定义 |
---|---|
MI_CIPHER_ALG_e | 定义AES加解密算法枚举类型 |
MI_CIPHER_HASH_ALGO_e | 定义哈希算法枚举类型 |
MI_CIPHER_RSA_ENC_SCHEME_E | 定义RSA 加密方案枚举类型 |
MI_CIPHER_RSA_SIGN_SCHEME_E | 定义RSA 签名方案枚举类型 |
MI_CIPHER_KeySize_e | 定义AES加密密钥长度枚举类型 |
MI_CIPHER_Config_t | 定义Cipher配置结构体 |
MI_CIPHER_RSA_PUB_Key_t | 定义公钥key数据结构类型 |
MI_CIPHER_RSA_PRI_Key_t | 义私钥key数据结构类型 |
MI_CIPHER_RSA_PUB_ENC_t | 定义MD结果的结构体 |
MI_CIPHER_RSA_PRI_ENC_t | 定义私钥加解密结构体类型 |
MI_CIPHER_RSA_SIGN_t | 定义签名结构体类型 |
MI_CIPHER_RSA_VERIRY_t | 定义校验结构体类型 |
MI_CIPHER_InitParam_t | 定义CIPHER设备初始化参数 |
3.2. MI_CIPHER_ALG_e¶
-
说明
定义AES加解密算法枚举值
-
定义
typedef enum { MI_CIPHER_ALG_AES_CBC , MI_CIPHER_ALG_AES_CTR , MI_CIPHER_ALG_AES_ECB , } MI_CIPHER_ALG_e;
-
成员
成员名称 描述 MI_CIPHER_ALG_AES_CBC CBC(Cipher Block Chaining)模式AEC算法 MI_CIPHER_ALG_AES_CTR CTR(Counter)模式AEC算法 MI_CIPHER_ALG_AES_ECB ECB(Electronic CodeBook)模式AEC算法
3.3. MI_CIPHER_HASH_ALGO_e¶
-
说明
哈希算法类型。
-
定义
typedef enum { MI_CIPHER_HASH_ ALG_SHA1 ; MI_CIPHER_HASH_ ALG_SHA256 ; } MI_CIPHER_HASH_ALGO_e;
-
成员
成员名称 描述 MI_CIPHER_HASH_ ALG_SHA1 SHA1 哈希算法 MI_CIPHER_HASH_ ALG_SHA256 SHA256哈希算法
3.4. MI_CIPHER_RSA_ENC_SCHEME_E¶
-
说明
定义RSA 加密方案枚举类型。
-
定义
typedef enum { MI_CIPHER_RSA_ENC_SCHEME_NO_PADDING, MI_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA1, MI_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA256, MI_CIPHER_RSA_ENC_SCHEME_RSAES_PKCS1_V1_5, MI_CIPHER_RSA_ENC_SCHEME_BUTT, }MI_CIPHER_RSA_ENC_SCHEME_E;
-
成员
成员名称 描述 MI_CIPHER_RSA_ENC_SCHEME_NO_PADDING 不填充 MI_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA1 OAEP 填充,SHA1运算 MI_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA256 OAEP 填充,SHA256运算 MI_CIPHER_RSA_ENC_SCHEME_RSAES_PKCS1_V1_5 PKCS1v15 填充 MI_CIPHER_RSA_ENC_SCHEME_BUTT 错误参数
3.5. MI_CIPHER_RSA_SIGN_SCHEME_E¶
-
说明
定义RSA 签名方案类型。
-
定义
typedef enum { MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA1 = 0x100, MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256, MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA1, MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256, MI_CIPHER_RSA_SIGN_SCHEME_BUTT, }MI_CIPHER_RSA_SIGN_SCHEME_E;_E;
-
成员
成员名称 描述 MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA1 PKCS#1 RSASSA_PKCS1_V15_SHA1 MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256 PKCS#1 RSASSA_PKCS1_V15_SHA256 MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA1 PKCS#1 RSASSA_PKCS1_PSS_SHA1 MI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256 PKCS#1 RSASSA_PKCS1_PSS_SHA256 MI_CIPHER_RSA_SIGN_SCHEME_BUTT 错误参数
3.6. MI_CIPHER_KeySize_e¶
-
说明
定义Aes加密密钥长度枚举类型。
-
定义
typedef enum { E_MI_CIPHER_KEY_SIZE_128 = 0, E_MI_CIPHER_KEY_SIZE_192, E_MI_CIPHER_KEY_SIZE_256, } MI_CIPHER_KeySize_e;
-
成员
成员名称 描述 E_MI_CIPHER_KEY_SIZE_128 密钥长度为128位 E_MI_CIPHER_KEY_SIZE_192 密钥长度为192位 E_MI_CIPHER_KEY_SIZE_256 密钥长度为256位
3.7. MI_CIPHER_Config_t¶
-
说明
定义Cipher配置结构体类型。
-
定义
typedef struct MI_CIPHER_Config_s { MI_CIPHER_ KeySize_e eKeySize; MI_U8 key MI_CIPHER_KEY_SIZE_MAX; MI_U8 iv AES_BLOCK_SIZE; MI_CIPHER_ALG_e eAlg; } MI_CIPHER_Config_t;
-
成员
成员名称 描述 eKeySize 指定加密密钥长度的枚举类型 key 存储加密密钥的数组, MI_CIPHER_KEY_SIZE_MAX 等于 32 iv 初始化向量,AES_BLOCK_SIZE等于16 eAlg 加解密算法类型
3.8. MI_CIPHER_RSA_PUB_Key_t¶
-
说明
定义公钥key的数据结构类型。
-
定义
typedef struct MI_CIPHER_RSA_PUB_Key_s { MI_U8* pu8ExpE; MI_U8* pu8ModN; MI_U32 expSize; MI_U32 modSize; } MI_CIPHER_RSA_PUB_Key_t;
-
成员
成员名称 描述 pu8ExpE; 公钥指数数据指针 pu8ModN 公钥模数数据指针 expSize 公钥指数数据长度 modSize 公钥模数数据长度
3.9. MI_CIPHER_RSA_PRI_Key_t¶
-
说明
定义私钥key的数据结构类型。
-
定义
typedef struct MI_CIPHER_RSA_PRI_Key_s { MI_U8* pu8ExpD; MI_U8* pu8ModN; MI_U32 expSize; MI_U32 modSize; } MI_CIPHER_RSA_PRI_Key_t;
-
成员
成员名称 描述 pu8ExpD 私钥指数数据指针 pu8ModN 私钥模数数据指针 expSize 私钥指数数据长度 modSize 私钥模数数据长度
3.10. MI_CIPHER_RSA_PUB_ENC_t¶
-
说明
定义公钥加解密算法参数结构体。
-
定义
typedef struct MI_CIPHER_RSA_PUB_ENC_s { MI_CIPHER_RSA_ENC_SCHEME_E eRsaAlgoType; MI_CIPHER_RSA_PUB_Key_t stPubKey; } MI_CIPHER_RSA_PUB_ENC_t;
-
成员
成员名称 描述 eRsaAlgoType 加解密算法类型 stPubKey Key数据
3.11. MI_CIPHER_RSA_PRI_ENC_t¶
-
说明
定义公钥加解密参数结构体。
-
定义
typedef struct MI_CIPHER_RSA_PRI_ENC_s { MI_CIPHER_RSA_ENC_SCHEME_E eRsaAlgoType; MI_CIPHER_RSA_PRI_Key_t stPriKey; } MI_CIPHER_RSA_PRI_ENC_t;
-
成员
成员名称 描述 eRsaAlgoType 加解密算法类型 stPriKey 私钥Key数据
3.12. MI_CIPHER_RSA_SIGN_t¶
-
说明
定义RSA签名的结构体。
-
定义
typedef struct MI_CIPHER_RSA_SIGN_s { MI_CIPHER_RSA_SIGN_SCHEME_E eRsaAlgoType; MI_CIPHER_RSA_PRI_Key_t stPriKey; } MI_CIPHER_RSA_SIGN_t;
-
成员
成员名称 描述 成员名称 描述 eRsaAlgoType 加解密算法类型 stPriKey 私钥Key数据,用于签名
3.13. MI_CIPHER_RSA_VERIFY_t¶
-
说明
定义公钥加解密算法参数结构体。
-
定义
typedef struct MI_CIPHER_RSA_Veriry_s { MI_CIPHER_RSA_SIGN_SCHEME_E eRsaAlgoType; MI_CIPHER_RSA_PUB_Key_t stPubKey; } MI_CIPHER_RSA_VERIRY_t;
-
成员
成员名称 描述 eRsaAlgoType 加解密算法填充类型 stPubKey 公钥Key数据,用于校验
3.13. MI_CIPHER_InitParam_t¶
-
说明
CIPHER设备初始化参数。
-
定义
typedef struct MI_CIPHER_InitParam_s { MI_U32 u32DevId; MI_U8 *u8Data; } MI_CIPHER_InitParam_t;
-
成员
成员名称 描述 u32DevId 设备ID u8Data 数据指针buffer -
相关数据类型及接口
4. 错误码¶
表4-1 AI API错误码
宏定义 | 描述 |
---|---|
MI_CIPHER_ERR_INVALID_DEVID | 设备号无效 |
MI_CIPHER_ERR_ILLEGAL_PARAM | 参数设置无效 |
MI_CIPHER_ERR_NOT_ENABLED | 设备没有使能 |
MI_CIPHER_ERR_NOT_DISABLED | 设备没有关闭 |
MI_CIPHER_ERR_NULL_PTR | 使用空指针 |
MI_CIPHER_ERR_INVALID_CHNID | 通道号无效 |
MI_CIPHER_ERR_NOT_CONFIG | 设备没有配置 |
MI_CIPHER_ERR_NOT_SUPPORT | 操作不支持 |
MI_CIPHER_ERR_NOT_PERM | 操作不允许 |
MI_CIPHER_ERR_NOMEM | 分配内存失败 |
MI_CIPHER_ERR_NOBUF | 缓存不足 |
MI_CIPHER_ERR_BUF_EMPTY | 缓存为空 |
MI_CIPHER_ERR_BUF_FULL | 缓存为满 |
MI_CIPHER_ERR_SYS_NOTREADY | 系统为初始化 |
MI_CIPHER_ERR_BUSY | 系统繁忙 |
MI_CIPHER_ERR_MOD_NOTINIT | 模块未初始化 |
MI_CIPHER_ERR_MOD_INITED | 模块已初始化 |
MI_CIPHER_ERR_FAILED | 非预期错误 |