跳转至

安全子系统 API 参考

前言

概述

本文档主要介绍了安全驱动 API 及其用法。

说明:

本文以Hi3519DV500为例,未有特殊说明,Hi3516DV500与Hi3519DV500内容完全一致。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

Hi3516D

V500

Hi3519D

V500

Hi3516C

V608

Hi3516C

V610

Hi3511C

V100

读者对象

本文档主要适用于以下工程师:

  • 技术支持工程师
  • 软件开发工程师
  • 测试工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修改记录

文档版本

发布日期

修改说明

00B01

2026-06-30

第1次临时版本发布。

安全驱动概述

CIPHER DRIVER

功能描述

CIPHER DRIVER为安全算法模块,包括两层接口:MPI层、KAPI。

接口说明:

  • MPI 层

    由用户层应用调用,为 CA/TA 提供安全驱动能力。

  • KAPI 层

    由内核模块调用,为内核模块提供安全驱动能力。

功能描述:

  • CIPHER DRIVER提供如下算法:

    • AES、SM4、TDES等对称加解密算法;
    • HASH、SM3及HASH-MAC、SM3-MAC摘要算法;
    • PBKDF2 算法;
    • RSA、ECC、SM2等非对称签名验签、密钥协商、加解密算法,大数运算;
    • 随机数算法。
  • CIPHER DRIVER包括3个子模块:SPACC、PKE、TRNG。

  • SPACC

  • PKE

  • TRNG

SPACC

SPACC(Security Protocol Accelerator,安全协议加速器)模块实现了对称加解密算法、HASH及HMAC摘要算法。

对称加解密算法
  • AES:支持ECB/CBC/CFB/OFB/CTR/CCM/GCM/CMAC/CBC_MAC共9种工作模式。其中:

    • CFB模式支持的加密数据位宽可为8/128bit,Hi3516CV610、Hi3511CV100支持1bit。
    • ECB/CBC/OFB/CTR/CCM/GCM/CMAC/CBC_MAC模式支持的加密数据位宽可为128bit。
    • CCM/GCM模式下,加解密结束后需获取一次TAG值。
    • ECB、CBC、CBC_MAC模式加密数据长度必须为16字节对齐,CMAC允许最后一块加密数据长度非16字节对齐。
    • 支持AES-128/AES-256/AES-192(128、256、192均指传入的密钥长度,单位为bit)。注:Hi3519DV500不支持AES-192。
    • CCM/GCM模式下,加密数据位宽为无效参数。
  • SM4:支持ECB/CBC/CTR共3种工作模式,Hi3516CV610、Hi3511CV100还支持CFB/OFB模式。支持SM4-128;除CTR模式外,加密数据长度须为16字节对齐。

  • TDES:支持CBC/CFB/ECB/OFB共4种工作模式。支持TDES-128。其中:
    • CFB模式支持的加密数据位宽可为8/64bit。
    • CBC/ECB/OFB模式支持的加密数据位宽可为64bit。
    • ECB/CBC模式加密数据长度必须为8字节对齐。

cipher驱动支持软件多通道,单个进程最多可以同时申请32个,Hi3516CV610、Hi3511CV100默认配置为8个;支持低功耗模式,默认开启低功耗;支持轮询和wait_event模式,默认开启wait_event模式。

须知:

  • TDES算法及ECB模式属于非安全算法,不建议使用。
  • Hi3516CV610、Hi3511CV100不支持TDES算法。
  • Hi3519DV500不支持AES-192。
摘要算法
  • HASH:支持SHA256/SHA384/SHA512/SM3。
  • HMAC:支持HMAC_SHA256/HMAC_SHA384/HMAC_SHA512/HMAC_SM3。
    • HASH和HMAC支持中途传入非block size对齐的数据块;
    • 支持软件多通道,单进程最多可以同时申请32个,Hi3516CV610、Hi3511CV100默认配置为8。

说明:

Hi3516CV610、Hi3511CV100不支持SHA384/SHA512、HMAC_SHA384/HMAC_SHA512。 HMAC走长期通道,计算时会占用一个物理通道;HASH走短期通道,计算时会占用一个软件通道。

PKE

PKE(Public Key Encryption,公钥加密),即非对称加解密算法。常用于文件的签名和验签,以及非对称密钥的加解密,主要包括以下算法:

  • RSA

    • 支持 PKCS#1 v1.5和 PKCS#1 v2.1 PSS两种模式的私钥签名和公钥验签。
    • 支持PKCS#1 v1.5 和 PKCS#1 v2.1 OAEP两种模式的公钥加密和私钥解密。
    • 支持密钥位宽2048/3072/4096。
  • ECC

    • 支持 RFC 5639 - Brainpool 256/384/512、NIST FIPS 186 - 4 P 256/384/521 和 RFC 8032 - ED25519(即EDDSA)的私钥签名和公钥验签,Hi3516CV610、Hi3511CV100不支持RFC 8032。
    • 支持密钥位宽256/384/512(521)。
  • SM2

    • 支持SM2公钥加密和私钥解密。
    • 支持SM2私钥签名和公钥验签。
  • 密钥协商

    • 支持RFC 5639 - Brainpool 256/384/512、NIST FIPS 186 - 4 P 256/384/521、RFC 7748 - Curve25519、 RFC 8032 - ED25519(即EDDSA)和SM2的公私钥对生成,及由给定的私钥生成其对应的公钥,Hi3516CV610、Hi3511CV100不支持RFC 7748和RFC 8032。
    • 支持RFC 5639 - Brainpool 256/384/512、NIST FIPS 186 - 4 P 256/384/521、RFC 7748 - Curve25519和SM2的密钥交换(ECDH),Hi3516CV610、Hi3511CV100不支持RFC 7748。
  • 曲线上点的验证

    支持RFC 5639 - Brainpool 256/384/512、NIST FIPS 186 - 4 P 256/384/521和SM2的点是否在曲线上的验证。

  • 大数运算

    • 支持256/384/521/2048/3072/4096位的模加、模减、模乘和模运算。
    • 支持256/384/521的模逆、乘法运算;支持密钥位宽为256位的Curve25519蒙哥马利点乘。
    • 支持密钥位宽为256位的ED25519 ED点乘。
    • 支持密钥位宽为256/384/521位的ED点加(Uranus ES不支持)。
    • 支持密钥位宽为256/384/521位的ECC点乘、点加、倍点运算。
    • 支持2048/3072/4096位的模幂运算。
    • Hi3516CV610、Hi3511CV100不支持大数运算。

PKE支持低功耗模式,并支持PKE时钟的开启与关闭。当关闭时钟时,PKE模块整个不可用。支持轮询和wait_event模式,默认开启wait_event模式。

须知:

  • 默认不支持NIST FIPS 186-4 P256/384/521曲线,如需打开需要用户在security_subsys/crypto_features.h中定义宏CONFIG_PKE_SUPPORT_ECC_FIPS_P256R、CONFIG_PKE_SUPPORT_ECC_FIPS_P384R、CONFIG_PKE_SUPPORT_ECC_FIPS_P521R,并重新编译驱动。
  • 默认不支持RSA算法PKCS#1 v1.5填充模式,如需打开需要用户在security_subsys/crypto_features.h中定义宏CONFIG_PKE_RSA_V15_SUPPORT,并重新编译驱动。
  • 默认不支持对称算法ECB模式,如需打开需要用户在security_subsys/crypto_features.h中定义宏CONFIG_SYMC_MODE_ECB_SUPPORT,并重新编译驱动。
  • 默认不支持RSA2048,如需打开需要用户在security_subsys/crypto_features.h中定义宏CONFIG_PKE_RSA_2048_SUPPORT,并重新编译驱动。
  • 默认不支持SHA224,如需打开需要用户在security_subsys/crypto_features.h中定义宏CONFIG_HASH_SHA224_SUPPORT,并重新编译驱动。
TRNG

随机数获取模块,获取硬件产生的真随机数(满足FIPS 140-2标准)。

使用流程

HASH计算
场景说明

获取消息摘要。

工作流程
  1. HASH 模块初始化。调用 ot_mpi_cipher_hash_init接口完成。
  2. 创建一路HASH,配置当前HASH计算类型,并获取HASH句柄。调用ot_mpi_cipher_hash_create 接口完成。
  3. 传入消息数据,对消息进行摘要计算,调用ot_mpi_cipher_hash_update 接口完成。
  4. 获取消息摘要,调用ot_mpi_cipher_hash_finish接口完成。
注意事项

支持多段数据连续update,结果与多段数据一次性update结果一致。

HMAC计算
场景说明

计算一块数据的 HMAC值。

工作流程
  1. HASH 模块初始化。调用 ot_mpi_cipher_hash_init 接口完成。
  2. 创建一路HASH,配置当前HMAC算法及密钥并获取HASH句柄。调用ot_mpi_cipher_hash_create 接口完成。
  3. 传入消息数据,对消息进行摘要计算,调用ot_mpi_cipher_hash_update 接口完成。
  4. 获取消息摘要,调用ot_mpi_cipher_hash_finish接口完成。
注意事项

支持明文key与硬件key,支持多段数据连续update,结果与多段数据一次性update结果一致。

HASH Clone 计算
场景说明

计算HASH(Message1 || Message2),其中Message1的处理由hash_handle1完成,Message2的处理由hash_handle2完成,最终由hash_handle2计算出HASH(Message1 || Message2)的结果。

工作流程
  1. HASH 模块初始化。调用 ot_mpi_cipher_hash_init 接口完成。
  2. 创建一路HASH,设置当前HASH算法获取hash_handle1。调用ot_mpi_cipher_hash_create 接口完成。
  3. 创建第二路HASH,获取hash_handle2。调用ot_mpi_cipher_hash_create 接口完成。
  4. hash_handle1 传入 Message1进行摘要计算,调用ot_mpi_cipher_hash_update接口完成。
  5. 获取 hash_handle1的计算中间结果,调用ot_mpi_cipher_hash_get接口完成。
  6. 销毁hash_handle1,调用ot_mpi_cipher_hash_destroy接口完成。
  7. 将步骤5获取的中间结果设置到 hash_handle2,调用ot_mpi_cipher_hash_set接口完成。
  8. hash_handle2传入Message2进行摘要计算,调用ot_mpi_cipher_hash_update接口完成。
  9. 使用hash_handle2获取消息摘要,调用ot_mpi_cipher_hash_finish接口完成。
注意事项
  • 支持多段数据连续update,结果与多段数据一次性update结果一致。
  • HASH Clone计算时,若两个handle的type不一致以第一个handle的配置为准。
HMAC Clone 计算
  • HMAC在使用硬件算法时,不支持Clone计算
  • HMAC在使用明文key软件算法时,支持Clone计算,流程同HASH Clone
PBKDF2计算

调用ot_mpi_cipher_pbkdf2进行PBKDF2计算。

获取真随机数

调用ot_mpi_cipher_trng_get_random 获取四个字节的真随机数或调用ot_mpi_cipher_trng_get_multi_random获取任意字节的真随机数。

对称加解密,工作模式为ECB/CBC/CTR/OFB/CFB/ CFB8
  1. 调用ot_mpi_cipher_symc_init初始化SYMC模块;
  2. 调用ot_mpi_cipher_symc_create创建SYMC句柄;
  3. 调用ot_mpi_cipher_symc_attach绑定KEYSLOT通道,KEYSLOT通道创建可参考KEYSLOT&KLAD相关接口说明;
  4. 调用ot_mpi_cipher_symc_set_config设置算法参数;
  5. 调用ot_mpi_cipher_symc_encrypt进行加密(或调用ot_mpi_cipher_symc_decrypt进行解密);
  6. 调用ot_mpi_cipher_symc_destroy销毁SYMC句柄;
  7. 调用ot_mpi_cipher_symc_deinit去初始化SYMC模块。

注意:

步骤5进行加密后,iv值会更新。如果要使用相同的SYMC句柄进行解密,需要重新进行步骤4设置算法参数。

对称加解密,工作模式为GCM/CCM
  1. 调用ot_mpi_cipher_symc_init初始化SYMC模块;
  2. 调用ot_mpi_cipher_symc_create创建SYMC句柄;
  3. 调用ot_mpi_cipher_symc_attach绑定KEYSLOT通道,KEYSLOT通道创建可参考KEYSLOT&KLAD相关接口说明;
  4. 调用ot_mpi_cipher_symc_set_config设置算法参数;
  5. 调用ot_mpi_cipher_symc_encrypt进行加密(或调用ot_mpi_cipher_symc_decrypt进行解密);
  6. 调用ot_mpi_cipher_symc_get_tag获得tag值;
  7. 调用ot_mpi_cipher_symc_destroy销毁SYMC句柄;
  8. 调用ot_mpi_cipher_symc_deinit去初始化SYMC模块。
SYMC MAC
  1. 调用ot_mpi_cipher_symc_init初始化SYMC模块;
  2. 调用ot_mpi_cipher_mac_start 创建句柄;
  3. 调用ot_mpi_cipher_mac_update传入数据(可调用一次或多次);
  4. 调用ot_mpi_cipher_mac_finish获取MAC值,并销毁句柄;
  5. 调用ot_mpi_cipher_symc_deinit去初始化SYMC模块。
RSA加解密
场景说明

RSA加解密为公钥加密私钥解密应用场景。

工作流程
  1. PKE 模块初始化,调用ot_mpi_cipher_pke_init 接口完成;
  2. 公钥加密,调用ot_mpi_cipher_pke_rsa_public_encrypt接口完成;
  3. 私钥解密,调用ot_mpi_cipher_pke_rsa_private_decrypt接口完成;
  4. PKE模块去初始化,调用ot_mpi_cipher_pke_deinit接口完成。
注意事项

支持PKCS#1 v1.5 和 PKCS#1 v2.1 OAEP两种模式,且用户标签数据(label)可选, 该label仅在PKCS#1 v2.1 OAEP模式下使用。

RSA签名验签
场景说明

RSA签名验签主要应用场景是私钥签名和公钥验签。

工作流程
  1. PKE 模块初始化,调用 ot_mpi_cipher_pke_init 接口完成;
  2. 私钥签名,调用ot_mpi_cipher_pke_rsa_sign接口完成;
  3. 公钥验签,调用ot_mpi_cipher_pke_rsa_verify接口完成;
  4. PKE模块去初始化,调用ot_mpi_cipher_pke_deinit接口完成。
注意事项

支持 PKCS#1 v1.5和 PKCS#1 v2.1 PSS两种模式的私钥签名和公钥验签。

SM2加解密
场景说明

SM2加解密应用场景是公钥加密私钥解密。

工作流程
  1. PKE 模块初始化,调用 ot_mpi_cipher_pke_init 接口完成;
  2. 公钥加密,调用ot_mpi_cipher_pke_sm2_public_encrypt接口完成;
  3. 私钥解密,调用ot_mpi_cipher_pke_sm2_private_decrypt接口完成;
  4. PKE模块去初始化,调用ot_mpi_cipher_pke_deinit接口完成。
SM2签名验签
场景说明

SM2签名验签主要应用场景是私钥签名和公钥验签。

工作流程
  1. PKE 模块初始化,调用 ot_mpi_cipher_pke_init 接口完成;
  2. 生成消息对应的HASH摘要,调用ot_mpi_cipher_pke_sm2_dsa_hash接口完成;
  3. 私钥签名,调用ot_mpi_cipher_pke_ecdsa_sign接口完成;
  4. 公钥验签,调用ot_mpi_cipher_pke_ecdsa_verify接口完成;
  5. PKE模块去初始化,调用ot_mpi_cipher_pke_deinit接口完成。

说明:

签名验签所需要的公私钥对可调用ot_mpi_cipher_pke_ecc_gen_key接口生成,可以调用ot_mpi_cipher_pke_check_dot_on_curve接口以确认公钥确实是曲线上的点。

ECDSA签名验签
场景说明

ECDSA签名验签主要应用场景是私钥签名和公钥验签。

工作流程
  1. PKE 模块初始化,调用 ot_mpi_cipher_pke_init 接口完成。
  2. 生成消息对应的HASH摘要,调用HASH/HMAC相应接口完成。
  3. 私钥签名,调用ot_mpi_cipher_pke_ecdsa_sign接口完成。
  4. 公钥验签,调用ot_mpi_cipher_pke_ecdsa_verify接口完成。
  5. PKE模块去初始化,调用ot_mpi_cipher_pke_deinit接口完成。
注意事项

支持 RFC 5639 - Brainpool 256/384/512、NIST FIPS 186 - 4 P 256/384/521的私钥签名和公钥验签。

EDDSA签名验签
场景说明

EDDSA签名验签主要应用场景是私钥签名和公钥验签,是使用ed25519这种特殊曲线签名验签。

工作流程
  1. PKE 模块初始化,调用 ot_mpi_cipher_pke_init 接口完成。
  2. 私钥签名,调用ot_mpi_cipher_pke_eddsa_sign接口完成。
  3. 公钥验签,调用ot_mpi_cipher_pke_eddsa_verify接口完成。
  4. PKE模块去初始化,调用ot_mpi_cipher_pke_deinit接口完成。
注意事项

支持 RFC 8032 - ED25519的私钥签名和公钥验签。

KM DRIVER

功能描述

KM DRIVER为密钥管理模块,对外提供两层接口:MPI 层、KAPI 层。

接口说明:

  • MPI 层

    由用户层应用调用,为 CA/TA 提供密钥管理驱动能力。

  • KAPI 层

    由内核模块调用,为内核模块提供密钥管理驱动能力。

功能描述:

明文KEY传递
  • 支持 AES 128/192/256bits加解密。
  • 支持 SM4 128bits加解密。
  • 支持TDES 128bits加解密。
  • 支持HMAC。

须知:

  • 明文KEY即加解密引擎使用的工作密钥,应由用户妥善保管。
  • Hi3516CV610、Hi3511CV100不支持TDES。
  • Hi3519DV500不支持192bits
ROOTKEY传递

ROOTKEY即通过OTP模块的根密钥,经密钥解混淆、密钥派生后产生的KEY。ROOTKEY存储在硬件中,用户不可读取。加解密的工作密钥是KLAD多次层级传递后得到的KEY,该KEY也是存储在硬件中,用户不可读取。该方案大多用于安全方案要求高的场景。

  • 支持 AES 128/192/256bits加解密。
  • 支持 SM4 128bits加解密。
  • 支持TDES 128bits加解密。
  • 支持HMAC

须知:

  • 派生材料由用户妥善保管,SBRK0在启动阶段使用并关闭,启动后不可使用。
  • Hi3516CV610、Hi3511CV100不支持TDES。
  • Hi3519DV500不支持192bits

使用流程

明文KEY传递
场景说明

当用于加解密的工作密钥由用户自己传入时,需使用到明文KEY相关的接口。KLAD将工作密钥传递给一个KEYSLOT。加解密时,加解密引擎取对应KEYSLOT中的KEY用于加解密。

工作流程
  1. KLAD 设备初始化。调用 ot_mpi_km_init 接口完成。
  2. 创建KEYSLOT句柄。调用ot_mpi_keyslot_create接口完成。
  3. 创建KLAD句柄。调用ot_mpi_klad_create 接口完成。
  4. 绑定KLAD和KEYSLOT句柄,调用ot_mpi_klad_attach 接口完成。
  5. 设置KLAD属性,调用ot_mpi_klad_set_attr接口完成。
  6. 设置明文KEY,调用ot_mpi_klad_set_clear_key接口完成。
  7. 解绑定KLAD和KEYSLOT句柄,调用ot_mpi_klad_detach接口完成。
  8. 销毁KLAD句柄,调用ot_mpi_klad_destroy接口完成。
  9. 去初始化KLAD设备,调用接口ot_mpi_km_deinit接口完成。
注意事项

KEYSLOT句柄在配置KLAD的过程中必须已创建。

ROOTKEY传递
场景说明

当安全方案要求高的场景下采用,ROOTKEY经密钥解混淆、密钥派生后产生,经多级KLAD传递后得到一个真正的工作密钥。工作密钥存储在硬件中,用户不可读取。KLAD将工作密钥传递给一个KEYSLOT。加解密时,加解密引擎取对应KEYSLOT中的KEY用于加解密。

工作流程
  1. KLAD 设备初始化。调用 ot_mpi_km_init 接口完成。
  2. 创建KEYSLOT句柄。调用ot_mpi_keyslot_create接口完成。
  3. 创建KLAD句柄。调用ot_mpi_klad_create 接口完成。
  4. 绑定KLAD和KEYSLOT句柄,调用ot_mpi_klad_attach 接口完成。
  5. 设置KLAD属性,调用ot_mpi_klad_set_attr接口完成。
  6. Hi3516CV610、Hi3511CV100设置盐值,调用ot_mpi_klad_set_effective_key接口完成。Hi3519DV500设置一级KEY,调用ot_mpi_klad_set_session_key接口完成;设置二级KEY,调用ot_mpi_klad_set_content_key接口完成。
  7. 解绑定KLAD和KEYSLOT句柄,调用ot_mpi_klad_detach接口完成。
  8. 销毁KLAD句柄,调用ot_mpi_klad_destroy接口完成。
  9. 去初始化KLAD设备,调用接口ot_mpi_km_deinit接口完成。
注意事项

KEYSLOT句柄在配置KLAD的过程中必须已创建。

  • session_key为一级密钥。
  • content_key为二级密钥。

须知:

  • Hi3516CV610、Hi3511CV100不支持二级KLAD派生,即不支持session_key和content_key。只支持使用effective_key,调用ot_mpi_klad_set_effective_key接口完成。
  • Hi3516CV610、Hi3511CV100 OTP密钥区域对应派生密钥类型: obfu_mrk1对应密钥CRYPTO_KDF_HARD_KEY_TYPE_ERK_TEE、CRYPTO_KDF_HARD_KEY_TYPE_ERK_REE oem_rootkey1对应密钥CRYPTO_KDF_HARD_KEY_TYPE_ERK1_REE oem_rootkey2对应密钥CRYPTO_KDF_HARD_KEY_TYPE_ERK2_REE

OTP DRIVER

功能描述

OTP DRIVER主要实现OTP非易失性存储器的读写,对外提供两层接口:MPI 层、KAPI 层。

接口说明:

  • MPI 层

    由用户层应用调用,为 CA/TA 提供OTP读写能力。

  • KAPI 层

    由内核模块调用,为内核模块提供OTP读写能力。

功能描述:

OTP DRIVER支持按字节读、按字节写和按字读。

使用流程

OTP按字节读
场景说明

支持用户读取指定地址的一字节OTP数据。

工作流程
  1. OTP 设备初始化。调用 ot_mpi_otp_init 接口完成。
  2. 按字节读。调用ot_mpi_otp_read_byte 接口完成。
  3. 去初始化OTP设备,调用接口ot_mpi_otp_deinit接口完成。
OTP按字节写
场景说明

支持用户在指定地址写入一字节OTP数据。

工作流程
  1. OTP 设备初始化。调用 ot_mpi_otp_init 接口完成。
  2. 按字节写。调用ot_mpi_otp_write_byte 接口完成。
  3. 去初始化OTP设备,调用ot_mpi_otp_deinit接口完成。
OTP按字读
场景说明

支持用户读取指定地址的一字长OTP数据。

工作流程
  1. OTP 设备初始化。调用 ot_mpi_otp_init 接口完成。
  2. 按字读。调用ot_mpi_otp_read_word 接口完成。
  3. 去初始化OTP设备,调用接口ot_mpi_otp_deinit接口完成。

API参考

SPACC HASH API

说明:

以下 API 说明适用于 MPI, KAPI 两层接口,此处以MPI层接口为例,MPI层接口以 ot_mpi开头,KAPI层接口以kapi开头,后缀命名和参数均一致。KAPI层代码仅提供给在内核下有开发需求的用户使用,如无此需求,则只需使用MPI层接口,MPI层接口在Linux、U-Boot、OP-TEE三个环境下使用方式完全一致。 U-BOOT下如需使用安全子系统接口则应将安全子系统编译宏打开,在编译配置文件中设置 CONFIG_SECURITY_SUBSYS_ENABLE=y,并在使用安全子系统前调用 crypto_cipher_init() 接口初始化驱动,该接口对应的头文件为security_subsys_init.h。

ot_mpi_cipher_hash_init

【描述】

HASH 模块初始化。

【语法】

td_s32 ot_mpi_cipher_hash_init(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无

ot_mpi_cipher_hash_deinit

【描述】

HASH 模块去初始化。

【语法】

td_s32 ot_mpi_cipher_hash_deinit(td_void);

【返回值】

返回值

描述

0

成功

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

该接口不会返回失败,若接口内出错会打印 warn 日志。

ot_mpi_cipher_hash_create

【描述】

创建HASH句柄,并配置算法参数。

【语法】

td_s32 ot_mpi_cipher_hash_create(td_handle *mpi_hash_handle, const crypto_hash_attr *hash_attr);

【参数】

参数

描述

输入/输出

mpi_hash_handle

HASH句柄

输出

hash_attr

配置HASH句柄基本属性

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • mpi_hash_handle不能为空指针。
  • 通道数可通过头文件crypto_features.h中宏定义CONFIG_HASH_VIRT_CHN_NUM进行调整。

ot_mpi_cipher_hash_update

【描述】

HASH或HMAC update 计算。

【语法】

td_s32 ot_mpi_cipher_hash_update(td_handle mpi_hash_handle, const crypto_buf_attr *src_buf, const td_u32 len);

【参数】

参数

描述

输入/输出

mpi_hash_handle

HASH句柄

输入

src_buf

源 Buffer

输入

len

源 Buffer 大小

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • len 不可为0,且最大长度为4294901760(即16进制0xFFFF0000),无对齐要求(需保证为传入的buf长度)。
  • src_buf目前只支持使用virt_addr类型(即通过malloc or kmalloc等接口申请的虚拟内存),不支持其他类型。
  • 对于一段数据,调用一次update传入整段数据和调用多次update分段传入数据,结果相同。

ot_mpi_cipher_hash_finish

【描述】

HASH或HMAC计算获取摘要信息,并在计算成功的时候销毁HASH句柄。

【语法】

td_s32 ot_mpi_cipher_hash_finish(td_handle mpi_hash_handle, td_u8 *virt_addr, td_u32 buffer_len, td_u32 *result_len);

【参数】

参数

描述

输入/输出

mpi_hash_handle

HASH句柄

输入

virt_addr

存储摘要信息的 Buffer

输出

buffer_len

输入 Buffer 大小

输入

result_len

摘要信息的实际大小

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • 可不调用update接口,直接调用finish接口,表示计算空数据的HASH值。
  • buffer_len输入值应该为传入buffer的大小,不应小于HASH算法对应的HASH值长度,输出为实际的HASH值长度。

ot_mpi_cipher_hash_set

【描述】

设置HASH句柄属性。

【语法】

td_s32 ot_mpi_cipher_hash_set(td_handle mpi_hash_handle, const crypto_hash_clone_ctx *hash_clone_ctx);

【参数】

参数

描述

输入/输出

mpi_hash_handle

HASH句柄。

输入

hash_clone_ctx

HASH 计算中间结果

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无

ot_mpi_cipher_hash_get

【描述】

获取HASH句柄属性。

【语法】

td_s32 ot_mpi_cipher_hash_get(td_handle mpi_hash_handle, crypto_hash_clone_ctx *hash_clone_ctx);

【参数】

参数

描述

输入/输出

mpi_hash_handle

HASH句柄。

输入

hash_clone_ctx

HASH 计算中间结果。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无

ot_mpi_cipher_hash_destroy

【描述】

销毁HASH句柄。

【语法】

td_s32 ot_mpi_cipher_hash_destroy(td_handle mpi_hash_handle);

【参数】

参数

描述

输入/输出

mpi_hash_handle

HASH句柄。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • 必须已经创建了HASH句柄。
  • 如已经调用了 ot_mpi_cipher_hash_finish 接口销毁 HASH 句柄,则不能再次调用该接口。
  • 无论之前流程计算成功与否,均可调用该接口销毁HASH句柄。

ot_mpi_cipher_pbkdf2

【描述】

PBKDF2 计算。

【语法】

td_s32 ot_mpi_cipher_pbkdf2(const crypto_kdf_pbkdf2_param *param, td_u8 *out, const td_u32 out_len);

【参数】

参数

描述

输入/输出

param

PBKDF2 算法参数

输入

out

保存计算结果的 Buffer

输出

out_len

Buffer 的大小,最大为 1023,最小可以为 0

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • param和out不能为空指针。
  • 迭代次数超过10000次,out_len为1023的高压场景下,接口耗时较长超过10分钟。

TRNG

ot_mpi_cipher_trng_get_random

【描述】

获取4字节的硬件随机数。

【语法】

td_s32 ot_mpi_cipher_trng_get_random(td_u32 *randnum);

【参数】

参数

描述

输入/输出

randnum

指向存储生成的随机数的缓冲区的指针。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

randnum不能为空指针。

ot_mpi_cipher_trng_get_multi_random

【描述】

获取指定字节的硬件随机数。

【语法】

td_s32 ot_mpi_cipher_trng_get_multi_random(td_u32 size, td_u8 *randnum);

【参数】

参数

描述

输入/输出

size

需要生成的随机数的字节数

输入

randnum

指向存储生成的随机数的缓冲区的指针。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • size不能为0,且不得大于1024
  • randnum不能为空指针。

PKE

ot_mpi_cipher_pke_init

【描述】

pke 模块初始化。

【语法】

td_s32 ot_mpi_cipher_pke_init(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无

ot_mpi_cipher_pke_deinit

【描述】

pke 模块去初始化。

【语法】

td_s32 ot_mpi_cipher_pke_deinit(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无

ot_mpi_cipher_pke_rsa_sign

【描述】

RSA签名,签名对象必须为HASH值。

【语法】

td_s32 ot_mpi_cipher_pke_rsa_sign(
    const drv_pke_rsa_priv_key *priv_key,
    drv_pke_rsa_scheme scheme,
    drv_pke_hash_type hash_type,
    const drv_pke_data *input_hash,
    drv_pke_data *sign);

【参数】

参数

描述

输入/输出

priv_key

RSA私钥

输入

scheme

RSA签名模式,支持PKCSv15、PKCSv21

输入

hash_type

HASH算法类型

输入

input_hash

待签名的HASH值

输入

sign

HASH签名结果

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

priv_key、input_hash和sign不能为空指针;Hi3516CV610只支持SHA256的HASH。

ot_mpi_cipher_pke_rsa_verify

【描述】

RSA验签,与RSA签名相对应。

【语法】

td_s32 ot_mpi_cipher_pke_rsa_verify(
    const drv_pke_rsa_pub_key *pub_key,
    drv_pke_rsa_scheme scheme,
    drv_pke_hash_type hash_type,
    drv_pke_data *input_hash,
    const drv_pke_data *sig
);

【参数】

参数

描述

输入/输出

pub_key

RSA公钥

输入

scheme

RSA签名模式,支持PKCSv15、PKCSv21

输入

hash_type

HASH算法类型

输入

input_hash

已签名的HASH值

输入

sig

HASH签名结果

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

pub_key、input_hash、sig不能为空指针。

ot_mpi_cipher_pke_rsa_public_encrypt

【描述】

RSA公钥加密,与RSA私钥解密相对应。

【语法】

td_s32 ot_mpi_cipher_pke_rsa_public_encrypt(
    drv_pke_rsa_scheme scheme,
    drv_pke_hash_type hash_type,
    const drv_pke_rsa_pub_key *pub_key,
    const drv_pke_data *input,
    const drv_pke_data *label,
    drv_pke_data *output);

【参数】

参数

描述

输入/输出

scheme

RSA公钥加密模式,支持PKCSv15、PKCSv21

输入

hash_type

HASH算法类型

输入

pub_key

公钥 (e, n)

输入

input

待加密的消息

输入

label

OAEP Padding方式中的buffer标识选项

输入

output

加密完成的密文

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • pub_key、input和output不能为空指针。
  • 使用label需要开启宏CONFIG_PKE_RSA_LABEL_SUPPORT。

ot_mpi_cipher_pke_rsa_private_decrypt

【描述】

RSA私钥解密,与RSA公钥加密相对应。

【语法】

td_s32 ot_mpi_cipher_pke_rsa_private_decrypt(
    drv_pke_rsa_scheme scheme,
    drv_pke_hash_type hash_type,
    const drv_pke_rsa_priv_key *priv_key,
    const drv_pke_data *input,
    const drv_pke_data *label,
    drv_pke_data *output);

【参数】

参数

描述

输入/输出

scheme

RSA私钥解密模式,支持PKCSv15、PKCSv21

输入

hash_type

HASH算法类型

输入

priv_key

私钥 (d, n)

输入

input

待解密的密文

输入

label

OAEP Padding方式中的buffer标识选项

输入

output

解密完成的消息

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • priv_key、input和output不能为空指针。
  • 使用label需要开启宏CONFIG_PKE_RSA_LABEL_SUPPORT

ot_mpi_cipher_pke_ecc_gen_key

【描述】

ECC密钥生成。

【语法】

td_s32 ot_mpi_cipher_pke_ecc_gen_key(
    drv_pke_ecc_curve_type curve_type,
    const drv_pke_data *input_priv_key,
    const drv_pke_data *output_priv_key,
    const drv_pke_ecc_point *output_pub_key);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

input_priv_key

可选,指定输入私钥,若指定,则output_priv_key与之相同

输入

output_priv_key

生成的私钥,若input_priv_key为空则为随机数生成,反之则为input_priv_key

输出

output_pub_key

根据私钥生成的公钥

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

output_priv_key和output_pub_key不能为空指针。

ot_mpi_cipher_pke_ecc_gen_ecdh_key

【描述】

ECDH密钥交换。

【语法】

td_s32 ot_mpi_cipher_pke_ecc_gen_ecdh_key(
    drv_pke_ecc_curve_type curve_type,
    const drv_pke_ecc_point *input_pub_key,
    const drv_pke_data *input_priv_key,
    const drv_pke_data *output_shared_key);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

input_pub_key

对方公钥

输入

input_priv_key

我方私钥

输入

output_shared_key

根据对方公钥和我方私钥计算得到的共享密钥

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

input_pub_key、input_priv_key和output_shared_key不能为空指针。

ot_mpi_cipher_pke_ecdsa_sign

【描述】

ECC签名,签名对象必须为HASH值。

【语法】

td_s32 ot_mpi_cipher_pke_ecdsa_sign(
    drv_pke_ecc_curve_type curve_type,
    const drv_pke_data *priv_key,
    const drv_pke_data *hash,
    const drv_pke_ecc_sig *sig);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

priv_key

ECC私钥

输入

hash

待签名的HASH值

输入

sig

签名结果

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • priv_key、hash和sig不能为空指针。
  • 可开启宏CONFIG_PKE_ECC_SECURITY_STRENGTH_CHECK,增加安全长度检查。

ot_mpi_cipher_pke_ecdsa_verify

【描述】

ECC签名验证,签名对象必须为HASH值。

【语法】

td_s32 ot_mpi_cipher_pke_ecdsa_verify(
    drv_pke_ecc_curve_type curve_type,
    const drv_pke_ecc_point *pub_key,
    const drv_pke_data *hash,
    const drv_pke_ecc_sig *sig
);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

pub_key

ECC公钥

输入

hash

待签名的HASH值

输入

sig

待验证的签名

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • pub_key、hash、sig不能为空指针。
  • 可开启宏CONFIG_PKE_ECC_SECURITY_STRENGTH_CHECK,增加安全长度检查。

ot_mpi_cipher_pke_sm2_public_encrypt

【描述】

SM2公钥加密。

【语法】

td_s32 ot_mpi_cipher_pke_sm2_public_encrypt(
    const drv_pke_ecc_point *pub_key,
    const drv_pke_data *plain_text,
    drv_pke_data *cipher_text);

【参数】

参数

描述

输入/输出

pub_key

SM2公钥

输入

plain_text

待加密的消息

输入

cipher_text

密文

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

pub_key、plain_text、cipher_text不能为空指针。

ot_mpi_cipher_pke_sm2_private_decrypt

【描述】

SM2私钥解密。

【语法】

td_s32 ot_mpi_cipher_pke_sm2_private_decrypt(
    const drv_pke_data *priv_key,
    const drv_pke_data *cipher_text,
    drv_pke_data *plain_text);

【参数】

参数

描述

输入/输出

priv_key

Sm2私钥

输入

cipher_text

待解密的密文

输入

plain_text

解密的消息

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

priv_key、plain_text、cipher_text不能为空指针。

ot_mpi_cipher_pke_check_dot_on_curve

【描述】

检查点是否在曲线上。

【语法】

td_s32 ot_mpi_cipher_pke_check_dot_on_curve(drv_pke_ecc_curve_type curve_type, const drv_pke_ecc_point *pub_key, td_bool *is_on_curve);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

pub_key

ECC公钥

输入

is_on_curve

是否在曲线上

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

curve_type、pub_key、is_on_curve不能为空指针。

ot_mpi_cipher_pke_sm2_dsa_hash

【描述】

使用sm3计算sm2签名验证的HASH值。

【语法】

td_s32 ot_mpi_cipher_pke_sm2_dsa_hash(const drv_pke_data *sm2_id, const drv_pke_ecc_point *pub_key, const drv_pke_msg *msg, drv_pke_data *hash);

【参数】

参数

描述

输入/输出

sm2_id

Sm2的id值

输入

pub_key

Sm2公钥

输入

msg

待计算sm3 HASH的消息

输入

hash

HASH结果

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

sm2_id、pub_key、msg、hash不能为空指针。

ot_mpi_cipher_pke_eddsa_sign

【描述】

使用爱德华曲线进行EDDSA签名。

【语法】

td_s32 ot_mpi_cipher_pke_eddsa_sign(drv_pke_ecc_curve_type curve_type, const drv_pke_data *priv_key, const drv_pke_msg *msg, const drv_pke_ecc_sig *sig);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

priv_key

私钥

输入

msg

待签名的消息

输入

sig

签名结果

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

priv_key、msg、sig不能为空指针。

ot_mpi_cipher_pke_eddsa_verify

【描述】

使用爱德华曲线进行eddsa签名验证。

【语法】

td_s32 ot_mpi_cipher_pke_eddsa_verify(drv_pke_ecc_curve_type curve_type, const [drv_pke_ecc_point](#ZH-CN_TOPIC_0000001425627402) *pub_key, const [drv_pke_msg](#ZH-CN_TOPIC_0000001430000028) *msg, const [drv_pke_ecc_sig](#ZH-CN_TOPIC_0000001425787374) *sig);
td_s32 ot_mpi_cipher_pke_eddsa_verify(drv_pke_ecc_curve_type curve_type, const drv_pke_ecc_point *pub_key, const drv_pke_msg *msg, const drv_pke_ecc_sig *sig);

【参数】

参数

描述

输入/输出

curve_type

ECC曲线参数

输入

pub_key

公钥

输入

msg

签名的消息

输入

sig

签名

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

pub_key、msg、sig不能为空指针。

SPACC SYMC API

ot_mpi_cipher_symc_init

【描述】

SYMC 模块初始化。

【语法】

td_s32 ot_mpi_cipher_symc_init(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无

ot_mpi_cipher_symc_deinit

【描述】

SYMC 模块去初始化。

【语法】

td_s32 ot_mpi_cipher_symc_deinit(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

该接口不会返回失败,若接口内出错会打印 warn 日志。

ot_mpi_cipher_symc_create

【描述】

SYMC 模块创建通道。

【语法】

td_s32 ot_mpi_cipher_symc_create(td_handle *symc_handle, const crypto_symc_attr *symc_attr);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输出

symc_attr

SYMC通道属性

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • 最多只支持创建32个通道。Hi3516CV610、Hi3511CV100默认为8通道。
  • 通道数可通过头文件crypto_features.h中宏定义CONFIG_SYMC_VIRT_CHN_NUM进行调整。
  • symc_handle、symc_attr不能为空指针。

ot_mpi_cipher_symc_destroy

【描述】

SYMC 模块销毁通道。

【语法】

td_s32 ot_mpi_cipher_symc_destroy(td_handle symc_handle);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

无。

ot_mpi_cipher_symc_set_config

【描述】

SYMC 模块设置算法参数。

【语法】

td_s32 ot_mpi_cipher_symc_set_config(td_handle symc_handle, const crypto_symc_ctrl_t *symc_ctrl);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

symc_ctrl

算法参数结构体

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

symc_ctrl不能为空指针。

ot_mpi_cipher_symc_attach

【描述】

SYMC 模块绑定 KEYSLOT 句柄。

【语法】

td_s32 ot_mpi_cipher_symc_attach(td_handle symc_handle, td_handle keyslot_handle);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

keyslot_handle

KEYSLOT 句柄

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

此接口应在ot_mpi_cipher_symc_set_config前调用。

ot_mpi_cipher_symc_encrypt

【描述】

SYMC 模块加密。

【语法】

td_s32 ot_mpi_cipher_symc_encrypt(td_handle symc_handle, const crypto_buf_attr *src_buf, const crypto_buf_attr *dst_buf, td_u32 length);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

src_buf

源数据buf

输入

dst_buf

目的数据buf

输出

length

数据长度

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • src_buf和dst_buf 仅支持 phys_addr 内存类型。
  • src_buf和dst_buf 不能为空指针。

ot_mpi_cipher_symc_decrypt

【描述】

SYMC 模块解密。

【语法】

td_s32 ot_mpi_cipher_symc_decrypt(td_handle symc_handle, const crypto_buf_attr *src_buf, const crypto_buf_attr *dst_buf, td_u32 length);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

src_buf

源数据buf

输入

dst_buf

目的数据buf

输出

length

数据长度

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • src_buf和dst_buf仅支持 phys_addr 内存类型。
  • src_buf和dst_buf不能为空指针。

ot_mpi_cipher_symc_get_tag

【描述】

SYMC 模块获取 Tag 值。

【语法】

td_s32 ot_mpi_cipher_symc_get_tag(td_handle symc_handle, td_u8 *tag, td_u32 tag_length);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

tag

tag 值

输出

tag_length

tag 值长度

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

tag不能为空指针。

ot_mpi_cipher_mac_start

【描述】

SYMC 模块创建 MAC 句柄。

【语法】

td_s32 ot_mpi_cipher_mac_start(td_handle *symc_handle, const crypto_symc_mac_attr *mac_attr);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输出

mac_attr

mac 算法参数

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

symc_handle、mac_attr不能为空指针。

ot_mpi_cipher_mac_update

【描述】

对传入 SYMC 模块的数据进行 MAC 计算。

【语法】

td_s32 ot_mpi_cipher_mac_update(td_handle symc_handle, const crypto_buf_attr *src_buf, td_u32 length);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

src_buf

数据buf

输入

length

数据长度

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

  • length 要求为16字节的整数倍且不为0,最大长度为4294901760(即16进制0xFFFF0000);
  • src_buf不能为空指针。

ot_mpi_cipher_mac_finish

【描述】

获取 SYMC 模块数据的 MAC 计算结果。

【语法】

td_s32 ot_mpi_cipher_mac_finish(td_handle symc_handle, td_u8 *mac, td_u32 *mac_length);

【参数】

参数

描述

输入/输出

symc_handle

SYMC句柄

输入

mac

mac 结果

输出

mac_length

输入为传入的mac指针buf长度,输出为mac实际长度

输入/输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_cipher.h
  • 库文件:libot_mpi_cipher.a

【注意】

mac、mac_length不能为空指针。

KM

ot_mpi_km_init

【描述】

初始化KLAD模块。

【语法】

td_s32 ot_mpi_km_init(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

无

ot_mpi_km_deinit

【描述】

去初始化KLAD模块。

【语法】

td_s32 ot_mpi_km_deinit(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

km模块必须已经初始化。

ot_mpi_klad_create

【描述】

创建KLAD句柄。

【语法】

td_s32 ot_mpi_klad_create(crypto_handle *mpi_klad_handle);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

mpi_klad_handle不能为空。

ot_mpi_klad_destroy

【描述】

销毁KLAD句柄。

【语法】

td_s32 ot_mpi_klad_destroy(crypto_handle mpi_klad_handle);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • 销毁KLAD句柄的task必须与创建KLAD句柄的task是同一个。

ot_mpi_klad_attach

【描述】

绑定KLAD句柄与KEYSLOT通道。

【语法】

td_s32 ot_mpi_klad_attach(crypto_handle mpi_klad_handle, km_klad_dest_type klad_type, crypto_handle mpi_keyslot_handle);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

klad_type

绑定的KEYSLOT类型。

输入

mpi_keyslot_handle

当klad_type为MCIPHER或HMAC时,指KEYSLOT句柄;当klad_type为FLASH,指km_klad_flash_key_type。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • 执行绑定操作的task必须与创建KLAD句柄的task是同一个。

ot_mpi_klad_detach

【描述】

解绑KLAD句柄与KEYSLOT通道。

【语法】

td_s32 ot_mpi_klad_detach(crypto_handle mpi_klad_handle, km_klad_dest_type klad_type, crypto_handle mpi_keyslot_handle);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

klad_type

解绑的KEYSLOT类型。

输入

mpi_keyslot_handle

当klad_type为MCIPHER或HMAC时,指KEYSLOT句柄;当klad_type为FLASH,指km_klad_flash_key_type。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • KLAD句柄必须已绑定了KEYSLOT通道。
  • 执行解绑操作的task必须与创建KLAD句柄的task是同一个。

ot_mpi_klad_set_attr

【描述】

设置KLAD句柄属性。

【语法】

td_s32 ot_mpi_klad_set_attr(crypto_handle mpi_klad_handle, const km_klad_attr *attr);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

attr

KLAD句柄属性指针。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • KLAD句柄属性指针不能为空。
  • 执行set操作的task必须与创建KLAD句柄的task是同一个。

ot_mpi_klad_get_attr

【描述】

获取KLAD句柄属性。

【语法】

td_s32 ot_mpi_klad_get_attr(crypto_handle mpi_klad_handle, km_klad_attr *attr);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

attr

KLAD句柄属性的指针。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • KLAD句柄属性指针不能为空。
  • 执行get操作的task必须与创建KLAD句柄的task是同一个。

ot_mpi_klad_set_session_key

【描述】

设置密文密钥一级密钥。

【语法】

td_s32 ot_mpi_klad_set_session_key(crypto_handle mpi_klad_handle, const km_klad_session_key *key);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

key

存储一级key属性的指针。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • 存储一级key属性的指针不能为空。
  • 执行操作的task必须与创建KLAD句柄的task是同一个。
  • Hi3516CV610、Hi3511CV100不支持此接口。

ot_mpi_klad_set_content_key

【描述】

设置密文密钥二级密钥。

【语法】

td_s32 ot_mpi_klad_set_content_key(crypto_handle mpi_klad_handle, const km_klad_content_key *key);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

key

存储二级key属性的指针。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • 存储二级key属性的指针不能为空。
  • 执行操作的task必须与创建KLAD句柄的task是同一个。
  • Hi3516CV610、Hi3511CV100不支持此接口。

ot_mpi_klad_set_clear_key

【描述】

设置明文密钥。

【语法】

td_s32 ot_mpi_klad_set_clear_key(crypto_handle mpi_klad_handle, const km_klad_clear_key *key);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

key

存储明文key属性的指针。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • 存储明文key属性的指针不能为空。
  • 执行操作的task必须与创建KLAD句柄的task是同一个。

ot_mpi_keyslot_create

【描述】

创建KEYSLOT句柄。

【语法】

td_s32 ot_mpi_keyslot_create(crypto_handle *mpi_keyslot_handle, km_keyslot_type keyslot_type);

【参数】

参数

描述

输入/输出

mpi_keyslot_handle

KEYSLOT句柄。

输出

keyslot_type

KEYSLOT类型。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • Hi3516CV610对称算法支持2个硬件通道,Hi3511CV100对称算法支持8个硬件通道,两者的hash算法都只支持2个硬件通道。
  • km_keyslot_type参数目前不生效,默认为KM_KEYSLOT_TYPE_MCIPHER,实际的密钥类型由ot_mpi_klad_attach接口km_klad_dest_type参数决定。

ot_mpi_keyslot_destroy

【描述】

销毁KEYSLOT句柄。

【语法】

td_s32 ot_mpi_keyslot_destroy(crypto_handle mpi_keyslot_handle);

【参数】

参数

描述

输入/输出

mpi_keyslot_handle

KEYSLOT句柄。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KEYSLOT句柄必须已创建。
  • 执行操作的task必须与创建KEYSLOT句柄的task是同一个。
  • 此API是销毁KM模块中KEYSLOT句柄的相关资源,销毁后对应的KEYSLOT行为与具体芯片有关。不要在销毁后再使用此KEYSLOT。

ot_mpi_klad_set_effective_key

【描述】

设置硬件派生密钥。

【语法】

td_s32 ot_mpi_klad_set_effective_key(crypto_handle mpi_klad_handle, const km_klad_effective_key *key);

【参数】

参数

描述

输入/输出

mpi_klad_handle

KLAD句柄。

输入

key

存储effective key属性的指针。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ot_mpi_km.h
  • 库文件:libot_mpi_km.a

【注意】

  • KLAD句柄必须已创建。
  • 存储effective key属性的指针不能为空。
  • 执行操作的task必须与创建KLAD句柄的task是同一个。

OTP

ot_mpi_otp_init

【描述】

OTP模块初始化。

【语法】

td_s32 ot_mpi_otp_init(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ss_mpi_otp.h
  • 库文件:libss_mpi_otp.a

【注意】

无

ot_mpi_otp_deinit

【描述】

OTP模块去初始化。

【语法】

td_s32 ot_mpi_otp_deinit(td_void);

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ss_mpi_otp.h
  • 库文件:libss_mpi_otp.a

【注意】

无。

ot_mpi_otp_read_word

【描述】

按字读取指定OTP地址中的值。

【语法】

td_s32 ot_mpi_otp_read_word(td_u32 offset, td_u32 *data);

【参数】

参数

描述

输入/输出

offset

要执行读操作的OTP地址。

输入

data

存储从指定OTP地址中读取出的值。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ss_mpi_otp.h
  • 库文件:libss_mpi_otp.a

【注意】

data指针不能为空

ot_mpi_otp_read_byte

【描述】

按字节读取指定OTP地址中的值。

【语法】

td_s32 ot_mpi_otp_read_byte(td_u32 offset, td_u8 *data);

【参数】

参数

描述

输入/输出

offset

要执行读操作的OTP地址。

输入

data

存储从指定OTP地址中读取出的值。

输出

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ss_mpi_otp.h
  • 库文件:libss_mpi_otp.a

【注意】

data指针不能为空

ot_mpi_otp_write_byte

【描述】

按字节写OTP。

【语法】

td_s32 ot_mpi_otp_write_byte(td_u32 offset, td_u8 data);

【参数】

参数

描述

输入/输出

offset

要执行写操作的OTP地址。

输入

data

指定OTP地址中要写入的值。

输入

【返回值】

返回值

描述

0

成功

非0

参见错误码

【需求】

  • 头文件:ss_mpi_otp.h
  • 库文件:libss_mpi_otp.a

【注意】

可执行写操作的OTP地址范围为(0x00~0x3ff)。

数据类型

SPACC Common

crypto_buffer_secure

【描述】

内存安全属性

【定义】

typedef enum {
    CRYPTO_BUF_SECURE,
    CRYPTO_BUF_NONSECURE,
} crypto_buffer_secure;

【成员】

成员名称

描述

CRYPTO_BUF_SECURE

安全内存

CRYPTO_BUF_NONSECURE

非安全内存

【注意】

无

crypto_buf_attr

【描述】

内存属性

【定义】

typedef struct {
    unsigned long long uapi_mem_handle;
    unsigned long long addr_offset;
    td_void *kapi_mem_handle;
    unsigned long long phys_addr;
    void *virt_addr;
    crypto_buffer_secure buf_sec;
} crypto_buf_attr;

【成员】

成员名称

描述

uapi_mem_handle

用户侧内存句柄

addr_offset

内存偏移

kapi_mem_handle

内核侧内存句柄

phys_addr

Buffer的物理地址

virt_addr

Buffer的虚拟地址

buf_sec

内存的安全属性

【注意】

内存支持如下地址类型:

  • 只传入virt_addr;
  • 只传入 phys_addr;
  • 同时传入virt_addr和phys_addr;
  • HASH的摘要数据输入支持仅传入virt_addr或同时传入virt_addr和phys_addr;
  • SYMC的加解密数据输入支持仅传入phys_addr或同时传入virt_addr和phys_addr。

SPACC HASH

crypto_hash_type

【描述】

HASH 算法类型。

【定义】

typedef enum {
    /* Hash. */
    CRYPTO_HASH_TYPE_SHA1 = 0xf690a0,
    CRYPTO_HASH_TYPE_SHA224= 0x10690e0,
    CRYPTO_HASH_TYPE_SHA256 = 0x1169100,
    CRYPTO_HASH_TYPE_SHA384 = 0x127a180,
    CRYPTO_HASH_TYPE_SHA512 = 0x137a200,
    CRYPTO_HASH_TYPE_SM3 = 0x2169100,
    /* HMAC. */
    CRYPTO_HASH_TYPE_HMAC_SHA1 = 0x10f690a0,
    CRYPTO_HASH_TYPE_HMAC_SHA224 = 0x110690e0,
    CRYPTO_HASH_TYPE_HMAC_SHA256 = 0x11169100,
    CRYPTO_HASH_TYPE_HMAC_SHA384 = 0x1127a180,
    CRYPTO_HASH_TYPE_HMAC_SHA512 = 0x1137a200,
    CRYPTO_HASH_TYPE_HMAC_SM3 = 0x12169100,
    CRYPTO_HASH_TYPE_INVALID = 0xffffffff,
} crypto_hash_type;

【成员】

成员名称

描述

CRYPTO_HASH_TYPE_SHA1

SHA1算法,弱安全算法,默认不支持。

CRYPTO_HASH_TYPE_SHA224

SHA224算法,弱安全算法,默认不支持。

CRYPTO_HASH_TYPE_SHA256

SHA256 算法。

CRYPTO_HASH_TYPE_SHA384

SHA384 算法。

CRYPTO_HASH_TYPE_SHA512

SHA512 算法。

CRYPTO_HASH_TYPE_SM3

SM3 算法。

CRYPTO_HASH_TYPE_HMAC_SHA1

HMAC_SHA1算法,弱安全算法,默认不支持。

CRYPTO_HASH_TYPE_HMAC_SHA224

HMAC_SHA224算法,弱安全算法,默认不支持。

CRYPTO_HASH_TYPE_HMAC_SHA256

HMAC_SHA256 算法。

CRYPTO_HASH_TYPE_HMAC_SHA384

HMAC_SHA384 算法。

CRYPTO_HASH_TYPE_HMAC_SHA512

HMAC_SHA512 算法。

CRYPTO_HASH_TYPE_HMAC_SM3

HMAC_SM3 算法。

CRYPTO_HASH_TYPE_INVALID

代表无效枚举值。

【注意】

Hi3511CV100与Hi3516CV610仅支持HMAC_SHA256和HMAC_SM3哈希算法。

crypto_hash_attr

【描述】

HASH 句柄属性。

【定义】

typedef struct {
    td_u8 *key;
    td_u32 key_len;
    td_handle drv_keyslot_handle;
    crypto_hash_type hash_type;
    td_bool is_keyslot;
    td_bool is_long_term;
} crypto_hash_attr;

【成员】

成员名称

描述

key

HMAC算法且is_keyslot为TD_FALSE时有效,表示 HMAC 使用的 key

key_len

HMAC算法时有效,表示key 的长度

drv_keyslot_handle

HMAC 算法且is_keyslot 为 TD_TRUE 时有效,表示 HMAC 绑定的 KEYSLOT handle

hash_type

HASH 算法类型。

is_keyslot

HMAC 算法时有效,该成员表示使用 KEYSLOT 还是明文 key

is_long_term

该成员表示使用长期占用还是短期占用

TD_TRUE - 长期占用

TD_FALSE - 短期占用

【注意】

  • is_keyslot 为TD_FALSE时,使用软件算法,为TD_TRUE时,使用Keyslot和硬件算法;
  • 当key_len为0时,key可为NULL;
  • key_len 不超过 HASH 算法对应的 Block Size。(SHA256/SM3 为 64 Bytes,SHA384/SHA512 为 128 Bytes);
  • is_keyslot 为 TD_TRUE 时,drv_keyslot_handle应配置为Keyslot通道号。
  • hash_type为非HMAC算法时,is_long_term值为0。

crypto_hash_clone_ctx

【描述】

HASH 计算中间数据结构体。

【定义】

typedef struct {
    td_u32 length[2];
    td_u32 state[CRYPTO_HASH_RESULT_SIZE_MAX_IN_WORD];
    td_u32 tail_len;
    crypto_hash_type hash_type;
    td_u8 o_key_pad[CRYPTO_HASH_BLOCK_SIZE_MAX];
    td_u8 i_key_pad[CRYPTO_HASH_BLOCK_SIZE_MAX];
    td_u8 tail[CRYPTO_HASH_BLOCK_SIZE_MAX];
} crypto_hash_clone_ctx;

【成员】

成员名称

描述

length

要计算摘要的消息总长度, length[0] 是低地址。

state

摘要计算内部状态值。

tail_len

尾部数据长度

hash_type

HASH 算法类型。

o_key_pad

o_key_pad数据,用于 HMAC 计算

i_key_pad

i_key_pad数据,用于 HMAC 计算

tail

tail大小为处理过的数据总长度对当前 HASH 算法的 block size 取余的结果

【注意】

CRYPTO_HASH_RESULT_SIZE_MAX_IN_WORD 为 16,CRYPTO_HASH_BLOCK_SIZE_MAX 为 128。

crypto_kdf_pbkdf2_param

【描述】

HASH 计算中间数据结构体。

【定义】

typedef struct {
    [crypto_hash_type](#ZH-CN_TOPIC_0000001425627390)crypto_hash_type hash_type;
    td_u8 *password;
    td_u32 plen;
    td_u8 *salt;
    td_u32 slen;
    td_u16 count;
} crypto_kdf_pbkdf2_param;

【成员】

成员名称

描述

hash_type

HASH 算法类型。

password

PBKDF2 算法传入的 password

只有plen为0时才可为NULL

plen

password 的长度,不能超过对应 HASH 算法的 Block Size

salt

PBKDF2 算法传入的盐值

只有slen为0时才可为NULL

slen

salt的长度,可以为0,最大为1024

count

PBKDF2算法迭代次数

【注意】

此处hash_type成员支持的HASH算法类型仅为HMAC算法。

SPACC SYMC

crypto_symc_pack

【描述】

SYMC数据pack类型。

【定义】

typedef struct {
    crypto_buf_attr buf_attr;
    td_u32 length;
} crypto_symc_pack;

【成员】

成员名称

描述

buf_attr

数据地址及其属性

length

数据长度

【注意】

无

crypto_symc_type

【描述】

SYMC 通道类型。

【定义】

typedef enum {
    CRYPTO_SYMC_TYPE_NORMAL = 0x0,
    CRYPTO_SYMC_TYPE_REG,
    CRYPTO_SYMC_TYPE_MAX,
    CRYPTO_SYMC_TYPE_INVALID = 0xffffffff,
} crypto_symc_type;

【成员】

成员名称

描述

CRYPTO_SYMC_TYPE_NORMAL

常规DMA通道

CRYPTO_SYMC_TYPE_REG

寄存器通道

CRYPTO_SYMC_TYPE_MAX

代表最大值

CRYPTO_SYMC_TYPE_INVALID

代表无效枚举值

【注意】

无

crypto_symc_attr

【描述】

SYMC 句柄属性。

【定义】

typedef struct {
    crypto_symc_alg symc_alg;
    crypto_symc_work_mode work_mode;
    crypto_symc_type symc_type;
    td_bool is_long_term;
} crypto_symc_attr;

【成员】

成员名称

描述

symc_alg

选择软件算法的加解密算法,当前不支持软件算法,无需配置

work_mode

选择软件算法的工作模式,当前不支持软件算法,无需配置

symc_type

SYMC 通道类型

is_long_term

该成员表示使用长期占用还是短期占用

TD_TRUE - 长期占用

TD_FALSE - 短期占用

【注意】

  • symc_alg 参数为软件算法配置,目前不支持,未生效。
  • work_mode 参数为软件算法配置,目前不支持,未生效。
  • symc_type 参数目前不生效,默认为DMA通道。

crypto_symc_alg

【描述】

SYMC 算法。

【定义】

typedef enum {
    CRYPTO_SYMC_ALG_TDES = 0x0,
    CRYPTO_SYMC_ALG_AES = 0x1,
    CRYPTO_SYMC_ALG_SM4 = 0x2,
    CRYPTO_SYMC_ALG_LEA = 0x3,
    CRYPTO_SYMC_ALG_DMA = 0x4,
    CRYPTO_SYMC_ALG_MAX,
    CRYPTO_SYMC_ALG_INVALID = 0xffffffff,
} crypto_symc_alg;

【成员】

成员名称

描述

CRYPTO_SYMC_ALG_TDES

TDES算法(Hi3516CV610、Hi3511CV100不支持)

CRYPTO_SYMC_ALG_AES

AES算法

CRYPTO_SYMC_ALG_SM4

SM4国密算法

CRYPTO_SYMC_ALG_LEA

LEA算法(均不支持)

CRYPTO_SYMC_ALG_DMA

DMA功能(均不支持)

CRYPTO_SYMC_ALG_MAX

代表最大值

CRYPTO_SYMC_ALG_INVALID

代表无效枚举值

【注意】

无

crypto_symc_work_mode

【描述】

SYMC 算法工作模式。

【定义】

typedef enum {
    CRYPTO_SYMC_WORK_MODE_ECB = 0x0,
    CRYPTO_SYMC_WORK_MODE_CBC,
    CRYPTO_SYMC_WORK_MODE_CTR,
    CRYPTO_SYMC_WORK_MODE_OFB,
    CRYPTO_SYMC_WORK_MODE_CFB,
    CRYPTO_SYMC_WORK_MODE_CCM,
    CRYPTO_SYMC_WORK_MODE_GCM,
    CRYPTO_SYMC_WORK_MODE_CBC_MAC,
    CRYPTO_SYMC_WORK_MODE_CMAC,
    CRYPTO_SYMC_WORK_MODE_MAX,
    CRYPTO_SYMC_WORK_MODE_INVALID = 0xffffffff,
} crypto_symc_work_mode;

【成员】

成员名称

描述

CRYPTO_SYMC_WORK_MODE_ECB

对称算法ECB模式

CRYPTO_SYMC_WORK_MODE_CBC

对称算法CBC模式

CRYPTO_SYMC_WORK_MODE_CTR

对称算法CTR模式

CRYPTO_SYMC_WORK_MODE_OFB

对称算法OFB模式

CRYPTO_SYMC_WORK_MODE_CFB

对称算法CFB模式

CRYPTO_SYMC_WORK_MODE_CCM

对称算法CCM模式

CRYPTO_SYMC_WORK_MODE_GCM

对称算法GCM模式

CRYPTO_SYMC_WORK_MODE_CBC_MAC

对称算法CBC_MAC模式

CRYPTO_SYMC_WORK_MODE_CMAC

对称算法CMAC模式

CRYPTO_SYMC_WORK_MODE_MAX

代表最大值

CRYPTO_SYMC_WORK_MODE_INVALID

代表无效枚举值

【注意】

  • CFB工作模式在加密位宽为1bit且datasize大于2M时,计算会超时;
  • 宏定义CONFIG_SYMC_WAIT_TIMEOUT_IN_US可调整超时时间。

crypto_symc_key_length

【描述】

SYMC 算法key长度。

【定义】

typedef enum {
    CRYPTO_SYMC_KEY_64BIT =  0x0,
    CRYPTO_SYMC_KEY_128BIT = 0x1,
    CRYPTO_SYMC_KEY_192BIT = 0x2,
    CRYPTO_SYMC_KEY_256BIT = 0x3,
    CRYPTO_SYMC_KEY_LENGTH_MAX,
    CRYPTO_SYMC_KEY_LENGTH_INVALID = 0xffffffff,
} crypto_symc_key_length;

【成员】

成员名称

描述

CRYPTO_SYMC_KEY_64BIT

密钥长度64bit

CRYPTO_SYMC_KEY_128BIT

密钥长度128bit

CRYPTO_SYMC_KEY_192BIT

密钥长度192bit

CRYPTO_SYMC_KEY_256BIT

密钥长度256bit

CRYPTO_SYMC_KEY_LENGTH_MAX

代表最大值

CRYPTO_SYMC_KEY_LENGTH_INVALID

代表无效枚举值

【注意】

无

crypto_symc_key_parity

【描述】

SYMC 算法key奇偶性。

【定义】

typedef enum {
    CRYPTO_SYMC_KEY_EVEN =  0x0,
    CRYPTO_SYMC_KEY_ODD  =  0x1,
    CRYPTO_SYMC_KEY_PARITY_MAX,
    CRYPTO_SYMC_KEY_PARITY_INVALID = 0xffffffff,
} crypto_symc_key_parity;

【成员】

成员名称

描述

CRYPTO_SYMC_KEY_EVEN

偶密钥

CRYPTO_SYMC_KEY_ODD

奇密钥

CRYPTO_SYMC_KEY_PARITY_MAX

代表最大值

CRYPTO_SYMC_KEY_PARITY_INVALID

代表无效枚举值

【注意】

当前默认为偶密钥,该配置项暂未使用。

crypto_symc_bit_width

【描述】

SYMC 算法位宽。

【定义】

typedef enum {
    CRYPTO_SYMC_BIT_WIDTH_1BIT = 0x0,
    CRYPTO_SYMC_BIT_WIDTH_8BIT = 0x1,
    CRYPTO_SYMC_BIT_WIDTH_64BIT = 0x2,
    CRYPTO_SYMC_BIT_WIDTH_128BIT = 0x3,
    CRYPTO_SYMC_BIT_WIDTH_MAX,
    CRYPTO_SYMC_BIT_WIDTH_INVALID = 0xffffffff,
} crypto_symc_bit_width;

【成员】

成员名称

描述

CRYPTO_SYMC_BIT_WIDTH_1BIT

位宽1bit

CRYPTO_SYMC_BIT_WIDTH_8BIT

位宽8bit

CRYPTO_SYMC_BIT_WIDTH_64BIT

位宽64bit

CRYPTO_SYMC_BIT_WIDTH_128BIT

位宽128bit

CRYPTO_SYMC_BIT_WIDTH_MAX

代表最大值

CRYPTO_SYMC_BIT_WIDTH_INVALID

代表无效枚举值

【注意】

无

crypto_symc_iv_change_type

【描述】

SYMC 算法iv 标志。

【定义】

typedef enum {
    CRYPTO_SYMC_IV_DO_NOT_CHANGE = 0,
    CRYPTO_SYMC_IV_CHANGE_ONE_PKG,
    CRYPTO_SYMC_IV_CHANGE_ALL_PKG,
    /* GCM. */
    CRYPTO_SYMC_GCM_IV_DO_NOT_CHANGE,
    CRYPTO_SYMC_GCM_IV_CHANGE_START,
    CRYPTO_SYMC_GCM_IV_CHANGE_UPDATE,
    CRYPTO_SYMC_GCM_IV_CHANGE_FINISH,
    /* CCM. */
    CRYPTO_SYMC_CCM_IV_DO_NOT_CHANGE,
    CRYPTO_SYMC_CCM_IV_CHANGE_START,
    CRYPTO_SYMC_CCM_IV_CHANGE_UPDATE,
    CRYPTO_SYMC_CCM_IV_CHANGE_FINISH,
    CRYPTO_SYMC_IV_CHANGE_MAX,
    CRYPTO_SYMC_IV_CHANGE_INVALID = 0xffffffff,
} crypto_symc_iv_change_type;

【成员】

成员名称

描述

CRYPTO_SYMC_IV_DO_NOT_CHANGE

表示不更新IV,暂不支持配置

CRYPTO_SYMC_IV_CHANGE_ONE_PKG

多包计算,使用上个包迭代出来的IV值,暂不支持配置

CRYPTO_SYMC_IV_CHANGE_ALL_PKG

多包计算,每个包单独更新其IV值,暂不支持配置

CRYPTO_SYMC_GCM_IV_DO_NOT_CHANGE

GCM算法不更新IV,暂不支持配置

CRYPTO_SYMC_GCM_IV_CHANGE_START

GCM算法IV状态为计算开始,暂不支持配置(GCM模式需要配置)

CRYPTO_SYMC_GCM_IV_CHANGE_UPDATE

GCM算法IV状态为计算进行中,暂不支持配置

CRYPTO_SYMC_GCM_IV_CHANGE_FINISH

GCM算法IV状态为计算结束,暂不支持配置

CRYPTO_SYMC_CCM_IV_DO_NOT_CHANGE

CCM算法不更新IV,暂不支持配置

CRYPTO_SYMC_CCM_IV_CHANGE_START

CCM算法IV状态为计算开始,暂不支持配置(CCM模式需要配置)

CRYPTO_SYMC_CCM_IV_CHANGE_UPDATE

CCM算法IV状态为计算进行中,暂不支持配置

CRYPTO_SYMC_CCM_IV_CHANGE_FINISH

CCM算法IV状态为计算结束,暂不支持配置

CRYPTO_SYMC_IV_CHANGE_MAX

枚举最大值

CRYPTO_SYMC_IV_CHANGE_INVALID

无效枚举值

【注意】

  • CCM 需要配置CRYPTO_SYMC_CCM_IV_CHANGE_START;
  • GCM 需要配置CRYPTO_SYMC_GCM_IV_CHANGE_START;
  • 其余算法无需配置该参数,初始化为0。

crypto_symc_config_aes_ccm_gcm

【描述】

SYMC 算法CCM&GCM参数。

【定义】

typedef struct {
    crypto_buf_attr aad_buf;
    td_u32 aad_len;
    td_u32 data_len;
    td_u32 tag_len;
    td_u32 total_aad_len;
} crypto_symc_config_aes_ccm_gcm;

【成员】

成员名称

描述

aad_buf

aad数据buf

aad_len

aad数据buf长度

data_len

加解密数据长度

tag_len

tag值长度

total_aad_len

aad数据总长度

【注意】

aad_buf的虚拟地址及物理地址字段均需填充,U-BOOT下物理地址及虚拟地址应为同一值。

crypto_symc_ctrl_t

【描述】

SYMC 算法参数。

【定义】

typedef struct {
    crypto_symc_alg symc_alg;
    crypto_symc_work_mode work_mode;
    crypto_symc_key_length symc_key_length;
    crypto_symc_key_parity key_parity;
    crypto_symc_bit_width symc_bit_width;
    crypto_symc_iv_change_type iv_change_flag;
    td_u8 iv[CRYPTO_IV_LEN_IN_BYTES];
    td_u32 iv_length;
    td_void *param;
} crypto_symc_ctrl_t;

【成员】

成员名称

描述

symc_alg

SYMC算法

work_mode

SYMC算法工作模式

symc_key_length

SYMC算法key的长度

key_parity

SYMC算法key的奇偶性

symc_bit_width

SYMC算法位宽

iv_change_flag

SYMC算法iv更新标志

iv

SYMC算法iv值

iv_length

SYMC算法iv长度

param

SYMC算法额外参数指针

CCM/GCM 算法,该指针指向crypto_symc_config_aes_ccm_gcm 结构体

【注意】

  • key_parity参数未起作用,可暂时忽略;
  • CRYPTO_IV_LEN_IN_BYTES 取值为 16。

crypto_symc_mac_attr

【描述】

SYMC 算法MAC参数。

【定义】

typedef struct {
    td_bool is_long_term;
    crypto_symc_alg symc_alg;
    crypto_symc_work_mode work_mode;
    crypto_symc_key_length symc_key_length;
    td_u32 keyslot_chn;
} crypto_symc_mac_attr;

【成员】

成员名称

描述

is_long_term

是否长期占用

symc_alg

算法

work_mode

工作模式

symc_key_length

key长度

keyslot_chn

KEYSLOT通道号(KEYSLOT句柄)

【注意】

work_mode 当前支持CRYPTO_SYMC_WORK_MODE_CBC_MAC和CRYPTO_SYMC_WORK_MODE_CMAC。

PKE

drv_pke_rsa_priv_key

【描述】

RSA私钥结构体。

【定义】

typedef struct {
    td_u8 *n;          /* *< public modulus */
    td_u8 *e;          /* *< public exponent */
    td_u8 *d;          /* *< private exponent */
    td_u8 *p;          /* *< 1st prime factor */
    td_u8 *q;          /* *< 2nd prime factor */
    td_u8 *dp;         /* *< D % (P - 1) */
    td_u8 *dq;         /* *< D % (Q - 1) */
    td_u8 *qp;         /* *< 1 / (Q % P) */
    td_u16 n_len;      /* *< length of public modulus */
    td_u16 e_len;      /* *< length of public exponent */
    td_u16 d_len;      /* *< length of private exponent */
    td_u16 p_len;      /* *< length of 1st prime factor,should be half of u16NLen */
    td_u16 q_len;      /* *< length of 2nd prime factor,should be half of u16NLen */
    td_u16 dp_len;     /* *< length of D % (P - 1),should be half of u16NLen */
    td_u16 dq_len;     /* *< length of D % (Q - 1),should be half of u16NLen */
    td_u16 qp_len;     /* *< length of 1 / (Q % P),should be half of u16NLen */
} drv_pke_rsa_priv_key;

【成员】

成员名称

描述

n

公钥模数

e

公钥指数

d

私钥指数

p

密钥生成需要的参数

q

密钥生成需要的参数

dp

Crt解密参数(暂未支持)

dq

Crt解密参数(暂未支持)

qp

Crt解密参数(暂未支持)

n_len

公钥模数长度(按字节算)

e_len

公钥指数长度(按字节算)

d_len

私钥指数长度(按字节算)

p_len

参数p长度(按字节算)

q_len

参数q长度(按字节算)

dp_len

参数dp长度(按字节算)

dq_len

参数dq长度(按字节算)

qp_len

参数qp长度(按字节算)

【注意】

p、q用于RSA密钥生成,dp、dq、qp用于crt解密算法。

drv_pke_rsa_pub_key

【描述】

RSA公钥结构体。

【定义】

typedef struct {
    td_u8  *n;            /* point to public modulus */
    td_u8  *e;            /* point to public exponent */
    td_u16 len;           /* length of public modulus, max value is 512Byte */
} drv_pke_rsa_pub_key;

【成员】

成员名称

描述

n

公钥模数

e

公钥指数

len

n的长度(按字节算)

【注意】

公钥指数e需在前面填充0,直到长度与公钥模数n相同。

drv_pke_data

【描述】

PKE中高频使用的数据结构体,有数据内容和长度两个属性。

【定义】

typedef struct {
    td_u32  length;
    td_u8  *data;
} drv_pke_data;

【成员】

成员名称

描述

length

数据长度(按字节算)

data

数据内容

【注意】

无。

drv_pke_buffer_secure

【描述】

数据所在buffer的安全属性枚举类型。

【定义】

typedef enum {
    DRV_PKE_BUF_NONSECURE = 0x00,
    DRV_PKE_BUF_SECURE,
    DRV_PKE_BUF_INVALID = 0xffffffff,
} drv_pke_buffer_secure;

【成员】

成员名称

描述

DRV_PKE_BUF_NONSECURE

非安全buffer

DRV_PKE_BUF_SECURE

安全buffer

DRV_PKE_BUF_INVALID

无效枚举值

【注意】

无。

drv_pke_msg

【描述】

PKE中高频使用的数据结构体,比drv_pke_data多一个buffer属性。

【定义】

typedef struct {
    td_u32  length;
    td_u8  *data;
    drv_pke_buffer_secure buf_sec;
} drv_pke_msg;

【成员】

成员名称

描述

length

数据长度(按字节算)

data

数据内容

buf_sec

是否为安全buffer

【注意】

buf_sec参数当前暂未使用。

drv_pke_len

【描述】

ECC密钥字节长度枚举类型。

【定义】

typedef enum {
    DRV_PKE_LEN_192 = 24,
    DRV_PKE_LEN_224 = 28,
    DRV_PKE_LEN_256 = 32,
    DRV_PKE_LEN_384 = 48,
    DRV_PKE_LEN_448 = 56,
    DRV_PKE_LEN_512 = 64,
    DRV_PKE_LEN_521 = 68,
    DRV_PKE_LEN_576 = 72,
    DRV_PKE_LEN_1024 = 128,
    DRV_PKE_LEN_1536 = 192,
    DRV_PKE_LEN_2048 = 256,
    DRV_PKE_LEN_3072 = 384,
    DRV_PKE_LEN_4096 = 512,
    DRV_PKE_LEN_MAX,
    DRV_PKE_LEN_INVALID = 0xffffffff,
} drv_pke_len;

【成员】

成员名称

描述

DRV_PKE_LEN_192

24字节长度

DRV_PKE_LEN_224

28字节长度

DRV_PKE_LEN_256

32字节长度

DRV_PKE_LEN_384

48字节长度

DRV_PKE_LEN_448

56字节长度

DRV_PKE_LEN_512

64字节长度

DRV_PKE_LEN_521

68字节长度

DRV_PKE_LEN_576

72字节长度

DRV_PKE_LEN_1024

128字节长度

DRV_PKE_LEN_1536

192字节长度

DRV_PKE_LEN_2048

256字节长度

DRV_PKE_LEN_3072

384字节长度

DRV_PKE_LEN_4096

512字节长度

DRV_PKE_LEN_MAX

枚举最大值

DRV_PKE_LEN_INVALID

无效枚举值

【注意】

Hi3519DV500不支持DRV_PKE_LEN_192、DRV_PKE_LEN_224、DRV_PKE_LEN_448、DRV_PKE_LEN_1024、DRV_PKE_LEN_1536。

drv_pke_ecc_curve_type

【描述】

ECC曲线类型。

【定义】

typedef enum {
   DRV_PKE_ECC_TYPE_RFC5639_P256 = 0x20,
   DRV_PKE_ECC_TYPE_RFC5639_P384 = 0x430,
   DRV_PKE_ECC_TYPE_RFC5639_P512 = 0x840,
   DRV_PKE_ECC_TYPE_FIPS_P256K = 0xc20,
   DRV_PKE_ECC_TYPE_FIPS_P192R = 0x1018,
   DRV_PKE_ECC_TYPE_FIPS_P224R = 0x141c,
   DRV_PKE_ECC_TYPE_FIPS_P256R = 0x1820,
   DRV_PKE_ECC_TYPE_FIPS_P384R = 0x1c30,
   DRV_PKE_ECC_TYPE_FIPS_P521R = 0x2048,
   DRV_PKE_ECC_TYPE_RFC7748 = 0x2420,
   DRV_PKE_ECC_TYPE_RFC7748_448 = 0x2838,
   DRV_PKE_ECC_TYPE_RFC8032 = 0x2c20,
   DRV_PKE_ECC_TYPE_SM2 = 0x3020,
   DRV_PKE_ECC_TYPE_MAX,
   DRV_PKE_ECC_TYPE_INVALID = 0xffffffff,
} drv_pke_ecc_curve_type;

【成员】

成员名称

描述

DRV_PKE_ECC_TYPE_RFC5639_P256

RFC 5639 - Brainpool P256曲线

DRV_PKE_ECC_TYPE_RFC5639_P384

RFC 5639 - Brainpool P384曲线

DRV_PKE_ECC_TYPE_RFC5639_P512

RFC 5639 - Brainpool P512曲线

DRV_PKE_ECC_TYPE_FIPS_P192R

NIST FIPS 186-4 P192R曲线(非安全算法不建议使用)

DRV_PKE_ECC_TYPE_FIPS_P224R

NIST FIPS 186-4 P224R曲线

DRV_PKE_ECC_TYPE_FIPS_P256K

NIST FIPS 186-4 P256K曲线

DRV_PKE_ECC_TYPE_FIPS_P256R

NIST FIPS 186-4 P256R曲线

DRV_PKE_ECC_TYPE_FIPS_P384R

NIST FIPS 186-4 P384R曲线

DRV_PKE_ECC_TYPE_FIPS_P521R

NIST FIPS 186-4 P521R曲线

DRV_PKE_ECC_TYPE_RFC7748

RFC 7748 - Curve25519曲线

DRV_PKE_ECC_TYPE_RFC7748_448

RFC 7748 - Curve448曲线

DRV_PKE_ECC_TYPE_RFC8032

RFC 8032 - ED25519曲线

DRV_PKE_ECC_TYPE_SM2

GMT 0003.2-2012曲线

DRV_PKE_ECC_TYPE_MAX

枚举最大值

DRV_PKE_ECC_TYPE_INVALID

无效枚举值

【注意】

Hi3519DV500不支持DRV_PKE_ECC_TYPE_FIPS_P192R、DRV_PKE_ECC_TYPE_FIPS_P224R。

drv_pke_ecc_curve

【描述】

ECC曲线参数。

【定义】

typedef struct {
    const td_u8 *p;   /* prime specifying the base field.*/
    const td_u8 *a;   /* Curve parameter a.*/
    const td_u8 *b;   /* Curve parameter b.*/
    const td_u8 *gx;  /* X coordinates of G which is a base point on the curve. */
    const td_u8 *gy;  /* Y coordinates of G which is a base point on the curve. */
    const td_u8 *n;   /* Prime which is the order of G point. */
    td_u32 h;         /* Cofactor, which is the order of the elliptic curve divided by the order of the point G. */
    drv_pke_len ksize;         /* Ecc key size in bytes. It corresponds to the size in bytes of the prime. */
    drv_pke_ecc_curve_type ecc_type; /* Type of ECC curve */
} drv_pke_ecc_curve;

【成员】

成员名称

描述

p

ECC曲线素数有限域 点的数量p

a

ECC曲线参数a

b

ECC曲线参数b

gx

ECC曲线 基点 x坐标

gy

ECC曲线 基点 y坐标

n

ECC曲线 基点的阶

h

P和n做除法的商的整数部分

ksize

密钥长度(按字节算)

ecc_type

ECC曲线类型

【注意】

无。

drv_pke_ecc_point

【描述】

描述ECC曲线中的点的结构体。

【定义】

typedef struct {
    td_u8 *x;   /* X coordinates of the generated public key */
    td_u8 *y;   /* Y coordinates of the generated public key */
    td_u32 length;
} drv_pke_ecc_point;

【成员】

成员名称

描述

x

公钥X坐标

y

公钥Y坐标

length

x、y的长度(按字节算)

【注意】

无。

drv_pke_ecc_sig

【描述】

描述ECC签名结果的结构体。

【定义】

typedef struct {
    td_u8 *r;   /* r component of the signature. */
    td_u8 *s;   /* s component of the signature. */
    td_u32 length;
} drv_pke_ecc_sig;

【成员】

成员名称

描述

r

ECC签名结果分量r

s

ECC签名结果分量s

length

r、s的长度(按字节算)

【注意】

无。

drv_pke_rsa_scheme

【描述】

描述RSA填充方式的枚举类型。

【定义】

typedef enum {
    DRV_PKE_RSA_SCHEME_PKCS1_V15 = 0x00,  /* PKCS#1 V15 */
    DRV_PKE_RSA_SCHEME_PKCS1_V21,         /* PKCS#1 V21, PSS for signing, OAEP for encryption */
    DRV_PKE_RSA_SCHEME_MAX,
    DRV_PKE_RSA_SCHEME_INVALID = 0xffffffff,
} drv_pke_rsa_scheme;

【成员】

成员名称

描述

DRV_PKE_RSA_SCHEME_PKCS1_V15

PKCS#1 V15填充

DRV_PKE_RSA_SCHEME_PKCS1_V21

PKCS#1 V21填充

DRV_PKE_RSA_SCHEME_MAX

枚举最大值

DRV_PKE_RSA_SCHEME_INVALID

无效枚举值

【注意】

无。

drv_pke_hash_type

【描述】

PKE 模块的HASH算法枚举类型。

【定义】

typedef enum {
    DRV_PKE_HASH_TYPE_SHA1 = 0x00,   /* Suggest Not to use */
    DRV_PKE_HASH_TYPE_SHA224,
    DRV_PKE_HASH_TYPE_SHA256,
    DRV_PKE_HASH_TYPE_SHA384,
    DRV_PKE_HASH_TYPE_SHA512,
    DRV_PKE_HASH_TYPE_SM3,
    DRV_PKE_HASH_TYPE_MAX,
    DRV_PKE_HASH_TYPE_INVALID = 0xffffffff,
} drv_pke_hash_type;

【成员】

成员名称

描述

DRV_PKE_HASH_TYPE_SHA1

SHA1算法,弱安全算法,默认不支持。

DRV_PKE_HASH_TYPE_SHA224

SHA224算法,弱安全算法,默认不支持。

DRV_PKE_HASH_TYPE_SHA256

SHA256算法

DRV_PKE_HASH_TYPE_SHA384

SHA384算法

DRV_PKE_HASH_TYPE_SHA512

SHA512算法

DRV_PKE_HASH_TYPE_SM3

SM3算法

DRV_PKE_HASH_TYPE_MAX

枚举最大值

DRV_PKE_HASH_TYPE_INVALID

无效枚举值

【注意】

Hi3511CV100与Hi3516CV610 rsa加解密仅支持SHA256算法。

KM

km_keyslot_type

【描述】

KM 模块支持的 KEYSLOT 类型。

【定义】

typedef enum {
    KM_KEYSLOT_TYPE_MCIPHER = 0x00,
    KM_KEYSLOT_TYPE_HMAC,
    KM_KEYSLOT_TYPE_MAX,
    KM_KEYSLOT_TYPE_INVALID = 0xffffffff,
} km_keyslot_type;

【成员】

成员名称

描述

KM_KEYSLOT_TYPE_MCIPHER

SYMC 类型。

KM_KEYSLOT_TYPE_HMAC

HMAC 类型。

KM_KEYSLOT_TYPE_MAX

枚举边界值。

KM_KEYSLOT_TYPE_INVALID

无效枚举值

【注意】

无。

km_klad_hmac_type

【描述】

Klad 支持的 HMAC 类型。

【定义】

typedef enum {
    KM_KLAD_HMAC_SHA1 = 0x20, /* Do Not Recommend to Use */
    KM_KLAD_HMAC_SHA224,      /* Software Kdf not support */
    KM_KLAD_HMAC_SHA256,
    KM_KLAD_HMAC_SHA384,
    KM_KLAD_HMAC_SHA512,
    KM_KLAD_HMAC_SM3 = 0x30,
    KM_KLAD_HMAC_MAX,
    KM_KLAD_HMAC_INVALID = 0xffffffff,
} km_klad_hmac_type;

【成员】

成员名称

描述

KM_KLAD_HMAC_SHA1

HMAC_SHA1,弱安全算法,默认不支持

KM_KLAD_HMAC_SHA224

HMAC_SHA224,弱安全算法,默认不支持

KM_KLAD_HMAC_SHA256

HMAC_SHA256

KM_KLAD_HMAC_SHA384

HMAC_SHA384

KM_KLAD_HMAC_SHA512

HMAC_SHA512

KM_KLAD_HMAC_SM3

HMAC_SM3

KM_KLAD_HMAC_MAX

枚举边界值。

KM_KLAD_HMAC_INVALID

无效枚举值。

【注意】

Hi3511CV100与Hi3516CV610不支持HMAC_SHA1,HMAC_SHA224,HMAC_SHA384及HMAC_SHA512算法。

km_klad_sec

【描述】

密钥安全属性。

【定义】

typedef enum {
    KM_KLAD_SEC_DISABLE = 0,
    KM_KLAD_SEC_ENABLE,
    KM_KLAD_SEC_MAX,
    KM_KLAD_SEC_INVALID = 0xffffffff,
} km_klad_sec;

【成员】

成员名称

描述

KM_KLAD_SEC_DISABLE

非安全密钥。

KM_KLAD_SEC_ENABLE

安全密钥,仅安全buffer可以访问。

KM_KLAD_SEC_MAX

枚举边界值。

KM_KLAD_SEC_INVALID

无效枚举值

【注意】

无。

km_klad_level

【描述】

密钥层级。

【定义】

typedef enum {
    KM_KLAD_LEVEL1 = 0,
    KM_KLAD_LEVEL_MAX,
    KM_KLAD_LEVEL_INVALID = 0xffffffff,
} km_klad_level;

【成员】

成员名称

描述

KM_KLAD_LEVEL1

一级密钥。

KM_KLAD_LEVEL_MAX

枚举边界值。

KM_KLAD_LEVEL_INVALID

无效枚举值

【注意】

无。

km_klad_alg_type

【描述】

密钥派生算法。

【定义】

typedef enum {
    KM_KLAD_ALG_TYPE_TDES = 0, /* Do Not Recommend to Use */
    KM_KLAD_ALG_TYPE_AES,
    KM_KLAD_ALG_TYPE_SM4,
    KM_KLAD_ALG_TYPE_MAX,
    KM_KLAD_ALG_TYPE_INVALID = 0xffffffff,
} km_klad_alg_type;

【成员】

成员名称

描述

KM_KLAD_ALG_TYPE_TDES

使用 TDES 算法派生密钥,非安全算法不建议使用。

KM_KLAD_ALG_TYPE_AES

使用 AES 算法派生密钥。

KM_KLAD_ALG_TYPE_SM4

使用 SM4 算法派生密钥。

KM_KLAD_ALG_TYPE_MAX

枚举边界值。

KM_KLAD_ALG_TYPE_INVALID

无效枚举值

【注意】

无。

km_crypto_alg

【描述】

派生出的密钥可用于的模块和对应算法。

【定义】

typedef enum {
    KM_CRYPTO_ALG_AES = 0x20,
    KM_CRYPTO_ALG_LEA = 0x40,    /* Flash online decryption and Cipher offline encryption */
    KM_CRYPTO_ALG_SM4 = 0x50,
    KM_CRYPTO_ALG_TDES = 0x70,       /* Do Not Recommend to Use */
    KM_CRYPTO_ALG_HMAC_SHA1 = 0xA0,  /* Do Not Recommend to Use */
    KM_CRYPTO_ALG_HMAC_SHA2 = 0xA1,
    KM_CRYPTO_ALG_HMAC_SM3 = 0xA2,
    KM_CRYPTO_ALG_MAX,
    KM_CRYPTO_ALG_INVALID = 0xffffffff,
} km_crypto_alg;

【成员】

成员名称

描述

KM_CRYPTO_ALG_AES

AES 算法。

KM_CRYPTO_ALG_LEA

LEA算法。

KM_CRYPTO_ALG_SM4

SM4 算法。

KM_CRYPTO_ALG_TDES

TDES 算法,不建议使用。

KM_CRYPTO_ALG_HMAC_SHA1

HMAC_SHA1,不建议使用。

KM_CRYPTO_ALG_HMAC_SHA2

包括 HMAC_SHA256、HMAC_SHA384、HMAC_SHA512。

KM_CRYPTO_ALG_HMAC_SM3

HMAC_SM3。

KM_CRYPTO_ALG_MAX

枚举边界值。

KM_CRYPTO_ALG_INVALID

无效枚举值。

【注意】

无。

km_klad_dest_type

【描述】

派生出的密钥将被送往的模块。

【定义】

typedef enum {
    KM_KLAD_DEST_TYPE_MCIPHER = 0x00,   /* keyslot for mcipher */
    KM_KLAD_DEST_TYPE_HMAC,             /* keyslot for hmac */
    KM_KLAD_DEST_TYPE_FLASH,            /* flash controller, for flash on line decryption and authentication */
    KM_KLAD_DEST_TYPE_NPU,                    /* for NPU */
    KM_KLAD_DEST_TYPE_MAX,
    KM_KLAD_DEST_TYPE_INVALID = 0xffffffff,
} km_klad_dest_type;

【成员】

成员名称

描述

KM_KLAD_DEST_TYPE_MCIPHER

指定密钥将被送往 SYMC 模块。

KM_KLAD_DEST_TYPE_HMAC

指定密钥将被送往 HMAC 模块。

KM_KLAD_DEST_TYPE_FLASH

指定密钥被送往 FLASH 控制器,将用于 FLASH 在线解密和在线解密校验。

KM_KLAD_DEST_TYPE_NPU

指定密钥将被送往 NPU 模块。

KM_KLAD_DEST_TYPE_MAX

枚举边界值。

KM_KLAD_DEST_TYPE_INVALID

无效枚举值

【注意】

无。

km_klad_flash_key_type

【描述】

定义 flash 在线解密和在线解密校验密钥类型。

【定义】

typedef enum {
    KM_KLAD_FLASH_KEY_TYPE_REE_DEC = 0x00,  /* REE flash online decryption key */
    KM_KLAD_FLASH_KEY_TYPE_TEE_DEC,         /* TEE flash online decryption key */
    KM_KLAD_FLASH_KEY_TYPE_TEE_AUT,         /* TEE flash online authentication key */
    KM_KLAD_FLASH_KEY_TYPE_MAX,
    KM_KLAD_FLASH_KEY_TYPE_INVALID = 0xffffffff,
} km_klad_flash_key_type;

【成员】

成员名称

描述

KM_KLAD_FLASH_KEY_TYPE_REE_DEC

用于 REE boot 配置 ACPU和PCPU FLASH 在线解密。

KM_KLAD_FLASH_KEY_TYPE_TEE_DEC

用于 TEE boot 配置 SCPU FLASH在线解密。

KM_KLAD_FLASH_KEY_TYPE_TEE_AUT

用于 TEE boot 配置 SCPU FLASH在线校验。

KM_KLAD_FLASH_KEY_TYPE_MAX

枚举边界值。

KM_KLAD_FLASH_KEY_TYPE_INVALID

无效枚举值

【注意】

无。

km_klad_key_parity

【描述】

定义密钥奇偶属性。

【定义】

typedef enum {
    KM_KLAD_KEY_EVEN =  0x0,   /*  even key  */
    KM_KLAD_KEY_ODD  =  0x1,   /*  odd key */
    KM_KLAD_KEY_PARITY_MAX,
    KM_KLAD_KEY_PARITY_INVALID = 0xffffffff,
} km_klad_key_parity;

【成员】

成员名称

描述

KM_KLAD_KEY_EVEN

偶密钥。

KM_KLAD_KEY_ODD

奇密钥。

KM_KLAD_KEY_PARITY_MAX

枚举边界值。

KM_KLAD_KEY_PARITY_INVALID

无效枚举值。

【注意】

无。

km_klad_config

【描述】

定义KLAD根密钥属性。

【定义】

typedef struct {
    td_u32 rootkey_type;  /* Keyladder rootkey type, KM_KLAD_KEY_TYPE_xxx. */
} km_klad_config;
enum {
    /* SBRK0, TEE Global Boot Root Key0, delivered from MRK1, soc_tee_enable and Hash of TEE Root Public Key */
    KM_KLAD_KEY_TYPE_SBRK0  = 0x03000000,
    /* SBRK1, TEE Global Boot Root Key1, delivered from MRK1, soc_tee_enable and Hash of TEE Root Public Key */
    KM_KLAD_KEY_TYPE_SBRK1,
    /* SBRK2, TEE Global Boot Root Key2, delivered from MRK1, soc_tee_enable and Hash of TEE Root Public Key */
    KM_KLAD_KEY_TYPE_SBRK2,
    /* ABRK0, REE Global Boot Root Key0, delivered from MRK1 */
    KM_KLAD_KEY_TYPE_ABRK0,
    /* ABRK1, REE Global Boot Root Key1, delivered from MRK1 */
    KM_KLAD_KEY_TYPE_ABRK1,
    /* ABRK2, REE Global Boot Root Key2, delivered from MRK1 */
    KM_KLAD_KEY_TYPE_ABRK2,
    /* DRK0, TEE unique data decryption root key, delivered from USK */
    KM_KLAD_KEY_TYPE_DRK0,
    /* DRK1, REE unique data decryption root key, delivered from USK */
    KM_KLAD_KEY_TYPE_DRK1,
    /* RDRK0, TEE random data decryption root key, delivered from RUSK */
    KM_KLAD_KEY_TYPE_RDRK0,
    /* RDRK1, REE random data decryption root key, delivered from RUSK */
    KM_KLAD_KEY_TYPE_RDRK1,
    /* PSK, delivered from MRK1 */
    KM_KLAD_KEY_TYPE_PSK,
    /* ODRK0, TEE flash online decryption root key, delivered from MRK0/1,
        soc_tee_enable and Hash of TEE Root Public Key */
    KM_KLAD_KEY_TYPE_ODRK0,
    /* OARK0  TEE flash online authentication root key, delivered from MRK0/1,
        soc_tee_enable and Hash of TEE Root Public Key */
    KM_KLAD_KEY_TYPE_OARK0,
    /* ODRK1, REE flash online decryption root key, delivered from MRK1 */
    KM_KLAD_KEY_TYPE_ODRK1,
    /* MDRK0 */
    KM_KLAD_KEY_TYPE_MDRK0,
    /* MDRK1 */
    KM_KLAD_KEY_TYPE_MDRK1,
    /* MDRK2 */
    KM_KLAD_KEY_TYPE_MDRK2,
    /* MDRK3 */
    KM_KLAD_KEY_TYPE_MDRK3,

    KM_KLAD_KEY_TYPE_ABRK_REE,
    KM_KLAD_KEY_TYPE_ABRK_TEE,
    KM_KLAD_KEY_TYPE_RDRK_REE,
    KM_KLAD_KEY_TYPE_RDRK_TEE,
    KM_KLAD_KEY_TYPE_ERK_TEE,
    KM_KLAD_KEY_TYPE_ERK_REE
};

【成员】

成员名称

描述

rootkey_type

密钥派生使用的根密钥类型。

【注意】

无。

km_klad_key_secure_config

【描述】

密钥的安全属性配置。

【定义】

typedef struct {
    km_klad_sec key_sec; /* Secure key can only be used by TEE CPU and AIDSP locked cipher and hash channel */
    /* Only the cipher or hash channel which is locked by same CPU as keyladder can use this key,
    valid only for TEE CPU and AIDSP */
    td_bool master_only_enable;
    td_bool dest_buf_sec_support;     /* The destination buffer of target engine can be secure. */
    td_bool dest_buf_non_sec_support; /* The destination buffer of target engine can be non-secure. */
    td_bool src_buf_sec_support;      /* The source buffer of target engine can be secure. */
    td_bool src_buf_non_sec_support;  /* The source buffer of target engine can be non-secure. */
} km_klad_key_secure_config;

【成员】

成员名称

描述

key_sec

安全密钥,只能用于 S 核和 AIDSP 锁定的 SYMC 和 HASH 通道。

master_only_enable

只有锁定 SYMC 或 HASH 通道的核或模块类型与创建 KLAD 句柄一致时,才可以使用该密钥,S 核和 AIDSP 创建的 KLAD 派生的密钥会对该属性进行判断。

dest_buf_sec_support

密钥加/解密出的数据可以放在安全缓冲区。

dest_buf_non_sec_support

密钥加/解密出的数据可以放在非安全缓冲区。

src_buf_sec_support

密钥要加/解密的原始数据可以放在安全缓冲区。

src_buf_non_sec_support

密钥要加/解密的原始数据可以放在非安全缓冲区。

【注意】

  • master_only_enable参数在Hi3516CV610及Hi3511CV100上配置无效,无需关注。
  • tee环境下,密钥加解密出的数据或者密钥要加解密的数据放在安全缓冲区。
  • ree环境下,密钥加解密出的数据或者密钥要加解密的数据放在非安全缓冲区。

km_klad_key_config

【描述】

密钥属性配置。

【定义】

typedef struct {
    km_crypto_alg engine; /* The content key can be used for which algorithm of the crypto engine. */
    td_bool decrypt_support;  /* The content key can be used for decrypting. */
    td_bool encrypt_support;  /* The content key can be used for encrypting. */
} km_klad_key_config;

【成员】

成员名称

描述

engine

指定密钥可用于的模块和算法类型。

decrypt_support

指定密钥是否可用于解密。

encrypt_support

指定密钥是否可用于加密。

【注意】

无。

km_klad_attr

【描述】

KLAD句柄属性。

【定义】

typedef struct {
    km_klad_config klad_cfg;          /* The keyladder configuration, valid for hardware key. */
    km_klad_key_config key_cfg;       /* The content key configuration. */
    km_klad_key_secure_config key_sec_cfg; /* The content key security configuration. */
    td_u32 rkp_sw_cfg;   /* The software configuration for NPU */
} km_klad_attr;

【成员】

成员名称

描述

klad_cfg

KLAD 根密钥配置,使用硬件 key 时将会判断该属性。

key_cfg

密钥属性配置。

key_sec_cfg

密钥安全属性配置。

rkp_sw_cfg

NPU软件配置。

【注意】

在set_clear_key明文密钥属性配置中HMAC类型选择256或SM3时,key_cfg中engine属性配置无效。

km_klad_session_key

【描述】

多级密钥属性配置。

【定义】

typedef struct {
    km_klad_level level;              /* the level of session key. */
    km_klad_alg_type alg;             /* the algorithm used to derive session key. */
    td_u32 key_size;                      /* the size of session key, should be 16. */
    td_u8 *key;   /* the session key. */
} km_klad_session_key;

【成员】

成员名称

描述

level

密钥层级。

alg

密钥派生使用的算法。

key_size

多级密钥的长度,应该为16字节。

key

多级密钥数据内容,当前 KLAD 仅支持两级密钥。

【注意】

无。

km_klad_content_key

【描述】

密文密钥属性配置。

【定义】

typedef struct {
    km_klad_alg_type alg;             /* The algorithm of the content key. */
    td_u32 key_size;                      /* The size of content key, should be 16 or 32. */
    td_u8 *key;                           /* The content key. */
    km_klad_key_parity key_parity;    /* Odd or even key flag. */
} km_klad_content_key;

【成员】

成员名称

描述

alg

指定密钥派生使用的算法。

key_size

指定密钥大小,只能为16或32字节。

key

密文密钥数据内容。

key_parity

密钥奇偶属性配置。

【注意】

当前只支持使用偶密钥。

km_klad_clear_key

【描述】

明文密钥属性配置。

【定义】

typedef struct {
    km_klad_hmac_type hmac_type;      /* hmac type, only send hmac key need to config. */
    td_u32 key_size;                      /* The size of content key, 16, 24 or 32 for cipher, not more than block size for HMAC. */
    td_u8 *key;                           /* The content key. */
    km_klad_key_parity key_parity;    /* Odd or even key flag. */
} km_klad_clear_key;

【成员】

成员名称

描述

hmac_type

HMAC 类型,只有给 HMAC模块 送密钥时才需指定。

key_size

明文密钥长度,对于 SYMC 模块只能为16、24或32字节,对于 HMAC 模块,则不应该大于对应 HMAC 类型的块大小。

key

明文密钥数据内容。

key_parity

密钥奇偶属性配置。

【注意】

当前只支持使用偶密钥。

crypto_kdf_hard_alg

【描述】

KDF硬件派生算法

【定义】

typedef enum {
    CRYPTO_KDF_HARD_ALG_SHA256 = 0,
    CRYPTO_KDF_HARD_ALG_SM3,
    CRYPTO_KDF_HARD_ALG_MAX
} crypto_kdf_hard_alg;

【成员】

成员名称

描述

CRYPTO_KDF_HARD_ALG_SHA256

基于SHA256哈希算法进行KDF派生

CRYPTO_KDF_HARD_ALG_SM3

基于SM3哈希算法进行KDF派生

CRYPTO_KDF_HARD_ALG_MAX

枚举边界值

【注意】

无

crypto_klad_key_size

【描述】

KDF硬件派生密钥长度

【定义】

typedef enum {
    CRYPTO_KLAD_KEY_SIZE_128BIT,
    CRYPTO_KLAD_KEY_SIZE_192BIT,
    CRYPTO_KLAD_KEY_SIZE_256BIT,
} crypto_klad_key_size;

【成员】

成员名称

描述

CRYPTO_KLAD_KEY_SIZE_128BIT

长度为128bit

CRYPTO_KLAD_KEY_SIZE_192BIT

长度为192bit

CRYPTO_KLAD_KEY_SIZE_256BIT

长度为256bit

【注意】

无

km_klad_effective_key

【描述】

硬件密钥属性配置。

【定义】

typedef struct {
    crypto_kdf_hard_alg kdf_hard_alg;
    td_bool key_parity;
    crypto_klad_key_size key_size;
    td_u8 *salt;
    td_u32 salt_length;
    td_bool oneway;
} km_klad_effective_key;

【成员】

成员名称

描述

kdf_hard_alg

KDF硬件派生算法

key_parity

密钥奇偶属性配置

key_size

指定密钥大小

salt

盐值

salt_length

盐值长度

oneway

ONEWAY寄存器配置

【注意】

effective key的盐值长度固定为28字节。

OTP

无。

错误码

说明:

本章描述了CIPHER DRIVER、KM DRIVER、OTP DRIVER的错误码,便于开发人员理解与定位所发生的错误。

错误码结构与说明

Cipher驱动返回值通常有成功和失败两种类型,如表1所示。

表 1 Cipher驱动返回值

成员名称

描述

CRYPTO_SUCCESS

0

CRYPTO_FAILURE

0xFFFFFFFF(Hi3516CV610、Hi3511CV100为-1)

为了通过错误码更加清晰的标识错误发生的具体信息,采用了层级结构的信息拼接。其结构为:

Env(4 bits) | Layer(4 bits) | Modules(4 bits) | Reserved(12 bits) | Error Code(8 bits)

ENV

【描述】

错误码发生的操作系统环境。

【定义】

#define ERROR_ENV_LINUX         0x1
#define ERROR_ENV_ITRUSTEE      0x2
#define ERROR_ENV_OPTEE         0x3
#define ERROR_ENV_LITEOS        0x4
#define ERROR_ENV_SELITEOS      0x5
#define ERROR_ENV_NOOS          0x6
#define ERROR_ENV_FREERTOS      0x7
#define ERROR_ENV_ALIOS         0x8

【成员】

成员名称

描述

ERROR_ENV_LINUX

LINUX

ERROR_ENV_ITRUSTEE

ITRUSTEE

ERROR_ENV_OPTEE

OPTEE

ERROR_ENV_LITEOS

LITEOS

ERROR_ENV_SELITEOS

SELITEOS

ERROR_ENV_NOOS

无OS环境

ERROR_ENV_FREERTOS

FREERTOS

ERROR_ENV_ALIOS

ALIOS

【注意】

Hi3519DV500不支持ERROR_ENV_FREERTOS和ERROR_ENV_ALIOS。

LAYER

【描述】

错误码发生的代码层级。

【定义】

enum {
    ERROR_LAYER_UAPI = 0x1,
    ERROR_LAYER_DISPATCH,
    ERROR_LAYER_KAPI,
    ERROR_LAYER_DRV,
    ERROR_LAYER_HAL,
};

【成员】

成员名称

描述

ERROR_LAYER_UAPI

用户接口层

ERROR_LAYER_DISPATCH

指令分发层

ERROR_LAYER_KAPI

内核接口层

ERROR_LAYER_DRV

驱动逻辑层

ERROR_LAYER_HAL

硬件适配层

【注意】

无

MODULE

【描述】

错误码发生的CIPHER模块。

【定义】

enum {
    ERROR_MODULE_SYMC = 0x1,
    ERROR_MODULE_HASH,
    ERROR_MODULE_PKE,
    ERROR_MODULE_TRNG,
    ERROR_MODULE_KM,
    ERROR_MODULE_OTP,
    ERROR_MODULE_OTHER
};

【成员】

成员名称

描述

ERROR_MODULE_SYMC

对称加解密模块

ERROR_MODULE_HASH

摘要算法模块

ERROR_MODULE_PKE

非对称加解密模块

ERROR_MODULE_TRNG

随机数模块

ERROR_MODULE_KM

密钥管理模块

ERROR_MODULE_OTP

OTP 模块

ERROR_MODULE_OTHER

其他模块

【注意】

无

错误类型

【描述】

错误码发生的具体错误类型。

【定义】

/* Common Error Code. 0x01 ~ 0x3F. */
    ERROR_INVALID_PARAM = 0x1,      /* return when the input param's value is not in the valid range. */
    ERROR_PARAM_IS_NULL,            /* return when the input param is NULL and required not NULL. */
    ERROR_NOT_INIT,                 /* return when call other functions before call init function. */
    ERROR_UNSUPPORT,                /* return when some configuration is unsupport. */
    ERROR_UNEXPECTED,               /* return when unexpected error occurs. */
    ERROR_TRY_TIMES,                /* return when the number of try attempts failed. */
    ERROR_CHN_BUSY,                 /* return when try to create one channel but all channels are busy. */
    ERROR_CTX_CLOSED,               /* return when using one ctx to do something but has been closed. */
    ERROR_NOT_SET_CONFIG,           /* return when not set_config but need for symc. */
    ERROR_NOT_ATTACHED,             /* return when not attach but need for symc. */
    ERROR_NOT_SET_SESSION_KEY,      /* return when not set_session_key but need for klad. */
    ERROR_NOT_MAC_START,            /* return when not mac_start but need for symc. */
    ERROR_INVALID_HANDLE,           /* return when pass one invalid handle. */
    ERROR_GET_PHYS_ADDR,            /* return when transfer from virt_addr to phys_addr failed. */
    ERROR_SYMC_LEN_NOT_ALIGNED,     /* return when length isn't aligned to 16-Byte except CTR/CCM/GCM.  */
    ERROR_SYMC_ADDR_NOT_ALIGNED,    /* return when the phys_addr writing to register is not aligned to 4-Byte. */
    ERROR_PKE_RSA_SAME_DATA,        /* return when rsa exp_mod, the input is equal to output. */
    ERROR_PKE_RSA_CRYPTO_V15_CHECK, /* return when rsa crypto v15 padding check failed. */
    ERROR_PKE_RSA_CRYPTO_OAEP_CHECK,    /* return when rsa crypto oaep padding check failed. */
    ERROR_PKE_RSA_VERIFY_V15_CHECK,     /* return when rsa verify v15 padding check failed. */
    ERROR_PKE_RSA_VERIFY_PSS_CHECK,     /* return when rsa verify pss padding check failed. */
    ERROR_PKE_RSA_GEN_KEY,          /* return when rsa generate key failed. */
    ERROR_PKE_SM2_DECRYPT,          /* return when sm2 decrypt failed. */
    ERROR_ECDSA_SIGN_R_IS_ZERO,     /* return when ecdsa sign, the sig_r is zero. */
    ERROR_ECDSA_SIGN_S_IS_ZERO,     /* return when ecdsa sign, the sig_s is zero. */
    ERROR_PKE_ECDSA_VERIFY_CHECK,   /* return when ecdsa verify check failed. */
    ERROR_OTP_ADDR_NOT_ALIGNED,     /* return when otp address is not aligned to 4. */
    ERROR_HASH_ADDR_NOT_ALIGNED,    /* return when hash data's address is not aligned */

    ERROR_HASH_LEN_NOT_ALIGNED,     /* return when hash length is not aligned to block size. */
    ERROR_PKE_SM2_T_IS_ZERO,          /* return when sm2 encrypt or decrypt kdf out is zero. */
    /* Outer's Error Code. 0x40 ~ 0x5F. */
    ERROR_MEMCPY_S      = 0x40,     /* return when call memcpy_s failed. */
    ERROR_MALLOC,                   /* return when call xxx_malloc failed. */
    ERROR_MUTEX_INIT,               /* return when call xxx_mutex_init failed. */
    ERROR_MUTEX_LOCK,               /* return when call xxx_lock failed. */
    /* Specific Error Code for UAPI. 0x60 ~ 0x6F. */
    ERROR_DEV_OPEN_FAILED,          /* return when open dev failed. */
    ERROR_COUNT_OVERFLOW,           /* return when call init too many times. */
    /* Specific Error Code for Dispatch. 0x70 ~ 0x7F. */
    ERROR_CMD_DISMATCH  = 0x70,     /* return when cmd is dismatched. */
    ERROR_COPY_FROM_USER,           /* return when call copy_from_user failed. */
    ERROR_COPY_TO_USER,             /* return when call copy_to_user failed. */
    ERROR_MEM_HANDLE_GET,           /* return when parse user's mem handle to kernel's mem handle failed. */
    ERROR_GET_OWNER,                /* return when call crypto_get_owner failed. */

    /* Specific Error Code for KAPI. 0x80 ~ 0x8F. */
    ERROR_PROCESS_NOT_INIT = 0x80,  /* return when one process not call kapi_xxx_init first. */
    ERROR_MAX_PROCESS,              /* return when process's num is over the limit. */
    ERROR_MEMORY_ACCESS,            /* return when access the memory that does not belong to itself.  */
    ERROR_INVALID_PROCESS,          /* return when the process accesses resources of other processes. */
    /* Specific Error Code for DRV. 0x90 ~ 0x9F. */

    /* Specific Error Code for HAL. 0xA0 ~ 0xAF. */
    ERROR_HASH_LOGIC    = 0xA0,     /* return when hash logic's error occurs. */
    ERROR_PKE_LOGIC,                /* return when pke logic's error occurs. */
    ERROR_INVALID_CPU_TYPE,         /* return when logic get the invalid cpu type. */
    ERROR_INVALID_REGISTER_VALUE,   /* return when value in register is invalid. */
    ERROR_INVALID_PHYS_ADDR,        /* return when phys_addr is invalid. */
    ERROR_OTP_PERMISSION,           /* return when otp access is forbidden. */
    ERROR_KM_LOGIC,                 /* return when km logic's error occurs. */
    ERROR_KM_KL_LOGIC,              /* return when km HKL logic's error occurs. */
    ERROR_KM_KC_LOGIC,              /* return when km KEY CTRL logic's error occurs. */
    ERROR_KLAD_ROOTKEY_NOT_READY,   /* return when klad rootkey is not ready. */

    /* Specific Error Code for Timeout. 0xB0 ~ 0xBF. */
    ERROR_GET_TRNG_TIMEOUT = 0xB0,  /* return when logic get rnd timeout. */
    ERROR_HASH_CLEAR_CHN_TIMEOUT,   /* return when clear hash channel timeout. */
    ERROR_HASH_CALC_TIMEOUT,        /* return when hash calculation timeout. */
    ERROR_SYMC_CLEAR_CHN_TIMEOUT,   /* return when clear symc channel timeout. */
    ERROR_SYMC_CALC_TIMEOUT,        /* return when symc crypto timeout. */
    ERROR_SYMC_GET_TAG_TIMEOUT,     /* return when symc get tag timeout. */
    ERROR_PKE_LOCK_TIMEOUT,         /* return when pke lock timeout. */
    ERROR_PKE_WAIT_DONE_TIMEOUT,    /* return when pke wait done timeout. */
    ERROR_PKE_ROBUST_WARNING,       /* return when pke wait done timeout. */
    ERROR_RKP_LOCK_TIMEOUT,         /* return when rkp lock timeout. */
    ERROR_RKP_CALC_TIMEOUT,         /* return when rkp calculate timeout. */
    ERROR_KLAD_COM_ROUTE_TIMEOUT,   /* return when klad com route timeout. */
    ERROR_OTP_TIMEOUT,          /* return when otp wait timeout. */
    ERROR_KEYSLOT_TIMEOUT,       /* return when keyslot wait timeout. */
    ERROR_KEYSLOT_LOCK,          /* return when keyslot lock or unlock fail. */
    ERROR_KLAD_TIMEOUT,          /* return when klad wait timeout. */
    ERROR_KLAD_LOCK,             /* return when klad lock or unlock fail. */

【成员】

类型

描述

COMMON

ERROR_INVALID_PARAM

输入参数在无效范围

ERROR_PARAM_IS_NULL

输入非法空指针参数

ERROR_NOT_INIT

未调用初始化函数

ERROR_UNSUPPORT

算法或配置未支持

ERROR_UNEXPECTED

预期之外的错误

ERROR_TRY_TIMES

超过尝试次数后仍失败

ERROR_CHN_BUSY

通道均被占用时尝试创建通道

ERROR_CTX_CLOSED

尝试使用已关闭的CTX

ERROR_NOT_SET_CONFIG

SYMC未调用set_config函数

ERROR_NOT_ATTACHED

SYMC未绑定KEYSLOT

ERROR_NOT_SET_SESSION_KEY

使用 klad 但是没有设置 session_key

ERROR_NOT_MAC_START

SYMC未调用mac_start函数

ERROR_INVALID_HANDLE

传入了无效的handle

ERROR_GET_PHYS_ADDR

获取物理地址失败

ERROR_SYMC_LEN_NOT_ALIGNED

非 CTR/CCM/GCM 模式下,数据长度未 16 字节对齐

ERROR_SYMC_ADDR_NOT_ALIGNED

SYMC写到寄存器的物理地址没有按照4字节对齐

ERROR_PKE_RSA_SAME_DATA

RSA模幂运算时,输入和输出相等

ERROR_PKE_RSA_CRYPTO_V15_CHECK

RSA PKCSV15 解密 Padding校验失败

ERROR_PKE_RSA_CRYPTO_OAEP_CHECK

RSA OAEP 解密 Padding校验失败

ERROR_PKE_RSA_VERIFY_V15_CHECK

RSA PKCSV15 验签 Padding校验失败

ERROR_PKE_RSA_VERIFY_PSS_CHECK

RSA PSS 验签 Padding校验失败

ERROR_PKE_RSA_GEN_KEY

RSA 密钥生成失败

ERROR_PKE_SM2_DECRYPT

SM2 算法解密失败

ERROR_ECDSA_SIGN_R_IS_ZERO

ECDSA签名结果分量R为0

ERROR_ECDSA_SIGN_S_IS_ZERO

ECDSA签名结果分量S为0

ERROR_PKE_ECDSA_VERIFY_CHECK

ECDSA 验签失败

ERROR_OTP_ADDR_NOT_ALIGNED

OTP 地址未 4 字节对齐

ERROR_HASH_ADDR_NOT_ALIGNED

HASH数据地址未对齐

ERROR_HASH_LEN_NOT_ALIGNED

HASH数据长度未对齐

OUTER

ERROR_MEMCPY_S

调用memcpy_s失败

ERROR_MALLOC

调用xxx_malloc失败

ERROR_MUTEX_INIT

调用xxx_mutex_init失败

ERROR_MUTEX_LOCK

调用xxx_lock失败

SPECIFIC UAPI

ERROR_DEV_OPEN_FAILED

打开设备失败

ERROR_COUNT_OVERFLOW

调用太多次初始化

SPECIFIC DISPATCH

ERROR_CMD_DISMATCH

CMD无匹配项

ERROR_COPY_FROM_USER

从用户态拷贝发生错误

ERROR_COPY_TO_USER

向用户态拷贝发生错误

ERROR_MEM_HANDLE_GET

获取句柄发生错误

ERROR_GET_OWNER

获取使用者发生错误

SPECIFIC KAPI

ERROR_PROCESS_NOT_INIT

进程未初始化

ERROR_MAX_PROCESS

数值超过了最大值

ERROR_MEMORY_ACCESS

没有该内存的访问权限

ERROR_INVALID_PROCESS

进程非法访问其他进程的资源

SPECIFIC HAL

ERROR_HASH_LOGIC

HASH发生硬件逻辑错误

ERROR_PKE_LOGIC

PKE发生硬件逻辑错误

ERROR_INVALID_CPU_TYPE

逻辑拿到了无效的CPU类型

ERROR_INVALID_REGISTER_VALUE

寄存器中的值是无效的

ERROR_INVALID_PHYS_ADDR

无效的物理地址

ERROR_OTP_PERMISSION

OTP 访问被拒绝

ERROR_KM_LOGIC

密钥管理模块逻辑错误

ERROR_KM_KL_LOGIC

密钥管理模块HKL逻辑错误

ERROR_KM_KC_LOGIC

密钥管理模块KEY CTRL逻辑错误

ERROR_KLAD_ROOTKEY_NOT_READY

KLAD ROOTKEY未准备好

TIMEOUT

ERROR_GET_TRNG_TIMEOUT

获取随机数超时

ERROR_HASH_CLEAR_CHN_TIMEOUT

HASH清通道超时

ERROR_HASH_CALC_TIMEOUT

HASH计算超时

ERROR_SYMC_CLEAR_CHN_TIMEOUT

SYMC清通道超时

ERROR_SYMC_CALC_TIMEOUT

SYMC计算超时

ERROR_SYMC_GET_TAG_TIMEOUT

获取tag值超时

ERROR_PKE_LOCK_TIMEOUT

PKE锁超时

ERROR_PKE_WAIT_DONE_TIMEOUT

PKE计算超时

ERROR_PKE_ROBUST_WARNING

PKE等待超时

ERROR_RKP_LOCK_TIMEOUT

RKP锁超时

ERROR_RKP_CALC_TIMEOUT

RKP计算超时

ERROR_KLAD_COM_ROUTE_TIMEOUT

KLAD COM ROUTE超时

ERROR_OTP_TIMEOUT

OTP访问超时

ERROR_KEYSLOT_TIMEOUT

KEYSLOT上锁或解锁操作超时

ERROR_KEYSLOT_LOCK

KEYSLOT上锁或解锁失败

ERROR_KLAD_TIMEOUT

KLAD计算超时

ERROR_KLAD_LOCK

KLAD上锁或解锁失败

【注意】

  • Hi3516CV610、Hi3511CV100错误码的起始值从1开始,即 ERROR_INVALID_PARAM = 0x1
  • Hi3519DV500不支持ERROR_ECDSA_SIGN_R_IS_ZERO、ERROR_ECDSA_SIGN_S_IS_ZERO、ERROR_HASH_ADDR_NOT_ALIGNED、ERROR_HASH_LEN_NOT_ALIGNED、ERROR_KM_KL_LOGIC、ERROR_KM_KC_LOGIC、ERROR_KLAD_ROOTKEY_NOT_READY、ERROR_KLAD_COM_ROUTE_TIMEOUT。

网络安全注意事项

安全驱动

  • Cipher驱动实现了标准的对称加密AES/TDES/SM4算法,非对称RSA、ECDSA/SM2/ED25519算法,摘要算法SHA/SM3/HMAC_SHA/SM3,密钥协商算法ECDH,密钥派生算法PBKDF2,没有使用任何私有算法。
  • 对称算法使用建议:

    • TDES为非安全算法,不建议使用。
    • AES/SM4算法ECB模式为非安全算法,不建议使用。
    • 对称算法的密钥的长度越长,安全等级越高,建议用户使用AES 128bits及以上的密钥。
  • 非对称算法使用建议:

    • RSA算法建议使用密钥长度3072bits及以上的密钥。
    • RSA签名算法padding方式建议使用PSS padding方式。
    • RSA加解密算法padding方式建议使用OAEP padding方式。
    • ECDSA算法建议使用密钥长度256bits及以上的密钥。
    • ECDSA算法曲线不建议使用NIST P256/384/521曲线。
  • 摘要算法使用建议:

    SHA/HMAC_SHA算法建议使用SHA256/HMAC_SHA256及以上的算法。

  • 密钥协商算法使用建议:

    ECDH算法建议使用密钥长度256bits及以上的密钥。

  • 密钥派生算法使用建议:

    • 迭代次数和安全性成正比,也与计算时间成正比,迭代次数越大,意味着计算密钥花费时间越长,同时抗暴力破解能力越强。对于性能不敏感或高安全性要求场景推荐迭代次数至少需要10000000次,其他场景迭代次数默认推荐至少10000次;对于性能有特殊要求的产品最低可以迭代1000次(NIST SP 800 -132)。
    • 哈希函数推荐选择SHA256或更安全的哈希算法。
    • 盐值至少16字节,应使用安全的随机数。
    • 用于口令单向哈希时,其输出长度应该不小于256bit。

其他使用安全注意事项

JTAG接口

恶意者可通过JTAG接口,篡改系统和配置,恶意破坏系统。

建议用户采用以下措施:

  • 产品出厂时,将JTAG接口从物理上删除。
  • 芯片提供JTAG disable功能,软件通过写OTP,可从芯片层面直接永久关闭JTAG。

附录

HASH 不同算法对应参数

-

SHA1

SHA224

SHA256

SHA384

SHA512

SM3

消息摘要长度

160

224

256

384

512

256

消息长度

<264

<264

<264

<2128

<2128

<2128

分组长度

512

512

512

1024

1024

512

注:所有的长度以 bit 为单位。

默认关闭算法

说明:

通过删除smp/a7_linux/source/out/include/autoconf.h文件中与security_subsys相关的宏定义,可以裁剪security_subsys对外接口,从而减小重新编译后的.ko和静态库大小。

算法

参数

描述

ECC所有算法

DRV_PKE_ECC_TYPE_FIPS_P256K

FIPS P256K曲线

ECC所有算法

DRV_PKE_ECC_TYPE_FIPS_P256R

FIPS P256R曲线

ECC所有算法

DRV_PKE_ECC_TYPE_FIPS_P384R

FIPS P384R曲线

ECC所有算法

DRV_PKE_ECC_TYPE_FIPS_P521R

FIPS P521R曲线

RSA加解密

PKCSV15

PKCSV15 的Padding方式

RSA签名验签

PKCSV15

PKCSV15 的Padding方式

SYMC加解密

CRYPTO_SYMC_ALG_TDES

TDES 算法

SYMC加解密

CRYPTO_SYMC_WORK_MODE_ECB

ECB 工作模式

SYMC加解密

CRYPTO_SYMC_KEY_64BIT

密钥长度 64 bit

SYMC加解密

CRYPTO_SYMC_BIT_WIDTH_64BIT

算法位宽 64 bit

/* 使能hash相关接口的宏*/

CONFIG_HASH_SUPPORT

CONFIG_HASH_PBKDF2_SUPPORT

CONFIG_HASH_CLONE_SUPPORT

/* 使能SYMC相关接口的宏*/

CONFIG_SYMC_SUPPORT

CONFIG_SYMC_CCM_SUPPORT

CONFIG_SYMC_GCM_SUPPORT

CONFIG_SYMC_CMAC_SUPPORT

CONFIG_SYMC_CBC_MAC_SUPPORT

/* 使能PKE ECC相关接口的宏*/

CONFIG_PKE_ECC_SUPPORT

CONFIG_PKE_ECC_GEN_KEY_SUPPORT

CONFIG_PKE_ECC_ECDH_SUPPORT

CONFIG_PKE_ECC_ECDSA_SIGN_SUPPORT

CONFIG_PKE_ECC_ECDSA_VERIFY_SUPPORT

CONFIG_PKE_ECC_CHECK_DOT_ON_CURVE_SUPPORT

CONFIG_PKE_ECC_SM2_DSA_HASH_SUPPORT

CONFIG_PKE_ECC_SM2_PUB_ENC_SUPPORT

CONFIG_PKE_ECC_SM2_PRIV_DEC_SUPPORT

/* 使能PKE RSA相关接口的宏*/

CONFIG_PKE_RSA_SUPPORT

CONFIG_PKE_RSA_SIGN_SUPPORT

CONFIG_PKE_RSA_VERIFY_SUPPORT

CONFIG_PKE_RSA_PUB_ENC_SUPPORT

CONFIG_PKE_RSA_PRIV_DEC_SUPPORT

/* 使能大数计算相关接口的宏*/

CONFIG_PKE_MOD_SUPPORT

CONFIG_PKE_EXP_MOD_SUPPORT

/* 使能TRNG相关接口的宏*/

CONFIG_TRNG_GET_RANDOM_SUPPORT

CONFIG_TRNG_GET_MULTI_RANDOM_SUPPORT

/* 使能KM相关接口的宏*/

CONFIG_OT_KM_SUPPORT

CONFIG_KM_CLEAR_KEY_SUPPORT

CONFIG_KM_EFFECTIVE_KEY_SUPPORT

须知:

相关接口的功能由宏CONFIG_HASH_SUPPORT、CONFIG_SYMC_SUPPORT、CONFIG_PKE_ECC_SUPPORT和CONFIG_PKE_RSA_SUPPORT分别控制,要支持以上接口,需要先在代码中定义相应的宏。

  • CONFIG_HASH_SUPPORT用于哈希功能
  • CONFIG_SYMC_SUPPORT用于对称加密功能
  • CONFIG_PKE_ECC_SUPPORT用于椭圆曲线加密(ECC)功能
  • CONFIG_PKE_RSA_SUPPORT用于RSA加密功能