MI CIPHER API


1. 概述


1.1. 模块说明

CIPHER提供数据的加解密功能,提供包括AES\RSA\SHA加解密算法


1.2. 流程框图

1.2.1. AES加解密

1.2.2. SHA算法

1.2.3. 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模块之前需要调用该接口。

  • 相关主题

    MI_CIPHER_Uninit


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. }
    
  • 相关主题

    MI_CIPHER_DestroyHandle


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. }
    
  • 相关主题

    MI_CIPHER_HashUnInit


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举例部分。

  • 相关主题

    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
  • 相关数据类型及接口

    MI_CIPHER_InitDev


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 非预期错误