Files

556 lines
21 KiB
C

/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef __XMEDIA_CIPHER_H__
#define __XMEDIA_CIPHER_H__
#include "xmedia_type.h"
#include "xmedia_errcode.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CIPHER_IV_CHANGE_ONE_PKG (1)
#define CIPHER_IV_CHANGE_ALL_PKG (2)
typedef enum {
XMEDIA_CIPHER_WORK_MODE_ECB,
XMEDIA_CIPHER_WORK_MODE_CBC,
XMEDIA_CIPHER_WORK_MODE_CFB,
XMEDIA_CIPHER_WORK_MODE_OFB,
XMEDIA_CIPHER_WORK_MODE_CTR,
XMEDIA_CIPHER_WORK_MODE_MAX,
} xmedia_cipher_work_mode;
typedef enum {
XMEDIA_CIPHER_ALG_AES = 0x0,
XMEDIA_CIPHER_ALG_DMA = 0x1,
XMEDIA_CIPHER_ALG_MAX = 0x2,
} xmedia_cipher_alg;
typedef enum {
XMEDIA_CIPHER_KEY_AES_128BIT = 0x0,
XMEDIA_CIPHER_KEY_AES_192BIT = 0x1,
XMEDIA_CIPHER_KEY_AES_256BIT = 0x2,
XMEDIA_CIPHER_KEY_AES_MAX = 0x3,
} xmedia_cipher_key_length;
typedef enum {
XMEDIA_CIPHER_BIT_WIDTH_8BIT = 0x0,
XMEDIA_CIPHER_BIT_WIDTH_1BIT = 0x1,
XMEDIA_CIPHER_BIT_WIDTH_128BIT = 0x2,
XMEDIA_CIPHER_BIT_WIDTH_MAX = 0X3,
} xmedia_cipher_bit_width;
typedef enum {
XMEDIA_CIPHER_KEY_SRC_USER = 0x0,
XMEDIA_CIPHER_KEY_SRC_KLAD_1,
XMEDIA_CIPHER_KEY_SRC_KLAD_2,
XMEDIA_CIPHER_KEY_SRC_KLAD_3,
XMEDIA_CIPHER_KEY_SRC_MAX,
} xmedia_cipher_ca_type;
typedef enum {
XMEDIA_CIPHER_KLAD_TARGET_AES = 0x0,
XMEDIA_CIPHER_KLAD_TARGET_RSA,
XMEDIA_CIPHER_KLAD_TARGET_MAX,
} xmedia_cipher_klad_target;
typedef struct {
xmedia_u32 key[8];
xmedia_u32 iv[4];
xmedia_u32 iv_usage;
xmedia_cipher_bit_width bit_width;
xmedia_cipher_key_length key_len;
} xmedia_cipher_ctrl_aes;
typedef struct {
xmedia_cipher_alg alg;
xmedia_cipher_work_mode mode;
xmedia_bool key_by_ca;
xmedia_cipher_ca_type ca_type;
xmedia_cipher_ctrl_aes aes_ctrl;
} xmedia_cipher_ctrl;
typedef struct {
xmedia_ulong src_phy_addr;
xmedia_ulong dest_phy_addr;
xmedia_u32 byte_length;
} xmedia_cipher_package;
typedef struct {
xmedia_u8 *data;
xmedia_u32 data_len;
} xmedia_cipher_data;
typedef enum {
XMEDIA_CIPHER_HASH_TYPE_SHA1,
XMEDIA_CIPHER_HASH_TYPE_SHA224,
XMEDIA_CIPHER_HASH_TYPE_SHA256,
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA1,
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA224,
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA256,
XMEDIA_CIPHER_HASH_TYPE_MAX,
} xmedia_cipher_hash_type;
typedef struct {
xmedia_u8 *hmac_key;
xmedia_u32 hmac_key_len;
xmedia_cipher_hash_type type;
} xmedia_cipher_hash_attr;
typedef enum {
XMEDIA_CIPHER_RSA_ENC_SCHEME_NO_PADDING,
XMEDIA_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_0,
XMEDIA_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_1,
XMEDIA_CIPHER_RSA_ENC_SCHEME_BLOCK_TYPE_2,
XMEDIA_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA1,
XMEDIA_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA224,
XMEDIA_CIPHER_RSA_ENC_SCHEME_RSAES_OAEP_SHA256,
XMEDIA_CIPHER_RSA_ENC_SCHEME_RSAES_PKCS1_V1_5,
XMEDIA_CIPHER_RSA_ENC_SCHEME_MAX,
} xmedia_cipher_rsa_enc_scheme;
typedef enum {
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA1 = 0x100,
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA224,
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256,
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA1,
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA224,
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256,
XMEDIA_CIPHER_RSA_SIGN_SCHEME_MAX,
} xmedia_cipher_rsa_sign_scheme;
typedef struct {
xmedia_u8 *n;
xmedia_u8 *e;
xmedia_u16 n_len;
xmedia_u16 e_len;
} xmedia_cipher_rsa_pub_key;
typedef struct {
xmedia_u8 *n;
xmedia_u8 *e;
xmedia_u8 *d;
xmedia_u8 *p;
xmedia_u8 *q;
xmedia_u8 *dp;
xmedia_u8 *dq;
xmedia_u8 *qp;
xmedia_u16 n_len;
xmedia_u16 e_len;
xmedia_u16 d_len;
xmedia_u16 p_len;
xmedia_u16 q_len;
xmedia_u16 dp_len;
xmedia_u16 dq_len;
xmedia_u16 qp_len;
} xmedia_cipher_rsa_pri_key;
typedef struct {
xmedia_cipher_rsa_enc_scheme scheme;
xmedia_cipher_rsa_pub_key pub_key;
} xmedia_cipher_rsa_pub_enc;
typedef struct {
xmedia_cipher_rsa_enc_scheme scheme;
xmedia_cipher_rsa_pri_key pri_key;
xmedia_cipher_ca_type ca_type;
} xmedia_cipher_rsa_pri_enc;
typedef struct {
xmedia_cipher_rsa_sign_scheme scheme;
xmedia_cipher_rsa_pri_key pri_key;
xmedia_cipher_ca_type ca_type;
} xmedia_cipher_rsa_sign_attr;
typedef struct {
xmedia_cipher_rsa_sign_scheme scheme;
xmedia_cipher_rsa_pub_key pub_key;
} xmedia_cipher_rsa_verify_attr;
/*
* 函数功能:cipher模块初始化
* 函数参数:
* 无
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_PERMITTED - 超过接口允许的调用次数
* XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点文件失败
*/
xmedia_s32 xmedia_cipher_init(xmedia_void);
/*
* 函数功能:cipher模块去初始化
* 函数参数:
* 无
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_CLOSE_FAILED - 关闭设备节点文件失败
*/
xmedia_s32 xmedia_cipher_exit(xmedia_void);
/*
* 函数功能:创建一路Cipher句柄
* 函数参数:
* handle - 输出参数,cipher句柄指针
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_BUSY - 通道已申请完,无可用通道
* XMEDIA_ERRCODE_NOT_READY - 通道输入节点地址不可配置
* 注意:
* 1. handle不能为空
* 2. cipher句柄将用于数据AES加解密时的输入
* 3. 最大支持2路cipher
* 4. 使用完通道后,应销毁对应的通道
*/
xmedia_s32 xmedia_cipher_create_handle(xmedia_handle *handle);
/*
* 函数功能:销毁一路cipher
* 函数参数:
* handle - 输入参数,cipher句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* 注意:
* 创建与销毁通道成对使用
*/
xmedia_s32 xmedia_cipher_destroy_handle(xmedia_handle handle);
/*
* 函数功能:配置cipher控制信息。详细配置请参见结构体xmedia_cipher_ctrl
* 函数参数:
* handle - 输入参数,cipher句柄
* ctrl - 输入参数,cipher控制信息指针
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_BUSY - OTP控制器忙/KLAD忙
* XMEDIA_FAILURE - OTP控制器操作未完成
* 注意:
* cipher控制信息指针不能为空
*/
xmedia_s32 xmedia_cipher_config_handle(xmedia_handle handle, const xmedia_cipher_ctrl *ctrl);
/*
* 函数功能:获取cipher通道对应的配置信息
* 函数参数:
* handle - 输入参数,cipher句柄
* ctrl - 输出参数,cipher通道的配置信息
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
*/
xmedia_s32 xmedia_cipher_get_handle_config(xmedia_handle handle, xmedia_cipher_ctrl *ctrl);
/*
* 函数功能:对数据进行加密
* 函数参数:
* handle - 输入参数,cipher句柄
* src_phy_addr - 输入参数,待加密的数据的物理地址
* dest_phy_addr - 输入参数,存放加密结果的物理地址
* length - 输入参数,数据的长度(单位:字节)
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* 注意:
* 1. cipher句柄必须已创建
* 2. 可多次调用
* 3. 模式为CTR时数据的长度为任意长度,其他模式要求与block size对齐
*/
xmedia_s32 xmedia_cipher_encrypt(xmedia_handle handle, xmedia_ulong src_phy_addr,
xmedia_ulong dest_phy_addr, xmedia_u32 length);
/*
* 函数功能:对数据进行解密
* 函数参数:
* handle - 输入参数,cipher句柄
* src_phy_addr - 输入参数,待解密的数据的物理地址
* dest_phy_addr - 输入参数,存放解密结果的物理地址
* length - 输入参数,数据的长度(单位:字节)
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* 注意:
* 1. cipher句柄必须已创建
* 2. 可多次调用
* 3. 模式为CTR时数据的长度为任意长度,其他模式要求与block size对齐
*/
xmedia_s32 xmedia_cipher_decrypt(xmedia_handle handle, xmedia_ulong src_phy_addr,
xmedia_ulong dest_phy_addr, xmedia_u32 length);
/*
* 函数功能:对数据进行加密
* 函数参数:
* handle - 输入参数,cipher句柄
* src_data - 输入参数,待加密的数据的虚拟地址
* dest_data - 输出参数,存放加密结果的虚拟地址
* length - 输入参数,数据的长度(单位:字节)
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* 注意:
* 1. cipher句柄必须已创建
* 2. 可多次调用
* 3. 模式为CTR时数据的长度为任意长度,其他模式要求与block size对齐
*/
xmedia_s32 xmedia_cipher_encrypt_vir(xmedia_handle handle, const xmedia_u8 *src_data,
xmedia_u8 *dest_data, xmedia_u32 length);
/*
* 函数功能:对数据进行解密
* 函数参数:
* handle - 输入参数,cipher句柄
* src_data - 输入参数,待解密的数据的虚拟地址
* dest_data - 输出参数,存放解密结果的虚拟地址
* length - 输入参数,数据的长度(单位:字节)
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* 注意:
* 1. cipher句柄必须已创建
* 2. 可多次调用
* 3. 模式为CTR时数据的长度为任意长度,其他模式要求与block size对齐
*/
xmedia_s32 xmedia_cipher_decrypt_vir(xmedia_handle handle, const xmedia_u8 *src_data,
xmedia_u8 *dest_data, xmedia_u32 length);
/*
* 函数功能:进行多个包数据的加密
* 函数参数:
* handle - 输入参数,cipher句柄
* pkg - 输入参数,待加密的数据包
* num - 输入参数,待加密的数据包个数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* 注意:
* 1. cipher句柄必须已创建
* 2. 可多次调用
* 3. 每次加密的数据包个数最多不超过128个
* 4. 对于多个包的操作,每个包都使用xmedia_cipher_config_handle配置的IV进行运算。
* IV作用域是可配置的,前一个包的向量运算结果可以作为下一个包的IV,
* 或者每个包IV都是独立运算的(前一次函数调用的结果不会影响后一次函数调用的运算结果)
*/
xmedia_s32 xmedia_cipher_encrypt_multi(xmedia_handle handle, const xmedia_cipher_package *pkg,
xmedia_u32 num);
/*
* 函数功能:进行多个包数据的解密
* 函数参数:
* handle - 输入参数,cipher句柄
* pkg - 输入参数,待解密的数据包
* num - 输入参数,待解密的数据包个数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_INVALID_HANDLE - 输入句柄无效
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* 注意:
* 1. cipher句柄必须已创建
* 2. 可多次调用
* 3. 每次加密的数据包个数最多不超过128个
* 4. 对于多个包的操作,每个包都使用xmedia_cipher_config_handle配置的IV进行运算。
* IV作用域是可配置的,前一个包的向量运算结果可以作为下一个包的IV,
* 或者每个包IV都是独立运算的(前一次函数调用的结果不会影响后一次函数调用的运算结果)
*/
xmedia_s32 xmedia_cipher_decrypt_multi(xmedia_handle handle, const xmedia_cipher_package *pkg,
xmedia_u32 num);
/*
* 函数功能:使用KLAD对透明密钥进行加密
* 函数参数:
* type - 输入参数,KLAD根密钥选择,只能选择EFUSE Key
* target - 输入参数,使用该密钥的模块
* clean_key - 输入参数,透明密钥
* ecnrypt_key - 输出参数,加密密钥
* key_len - 输入参数,密钥的长度,必须是16整数倍
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_BUSY - OTP控制器忙/KLAD忙
* XMEDIA_FAILURE - OTP控制器操作未完成
* 注意:
* 1. 默认使用AES256 ECB
* 2. target为XMEDIA_CIPHER_KLAD_TARGET_RSA时,会对输入数据每16B进行大小端转换,然后对转换后的数据进行加密
*/
xmedia_s32 xmedia_cipher_klad_encrypt_key(xmedia_cipher_ca_type type,
xmedia_cipher_klad_target target, const xmedia_u8 *clean_key,
xmedia_u8 *encrypt_key, xmedia_u32 key_len);
/*
* 函数功能:生成随机数
* 函数参数:
* number - 输出参数,输出的随机数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_TIMEOUT - 获取随机数超时
* XMEDIA_FAILURE - 随机数无效
*/
xmedia_s32 xmedia_cipher_get_random_number(xmedia_u32 *number);
/*
* 函数功能:初始化HASH模块
* 函数参数:
* attr - 输入参数,用于计算hash的结构体参数
* handle - 输出参数,输出的hash句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_ERRCODE_BUSY - 所有通道忙,无法申请通道
* 注意:
* 如果有其他程序正在使用HASH模块,返回失败状态
*/
xmedia_s32 xmedia_cipher_hash_init(const xmedia_cipher_hash_attr *attr, xmedia_handle *handle);
/*
* 函数功能:计算hash值
* 函数参数:
* handle - 输入参数,hash句柄
* input - 输入参数,输入数据缓冲
* in_len - 输入参数,输入数据的长度,单位:byte
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_INVALID_HANDLE - hash句柄无效
* 注意:
* 1. Hash句柄必须已经创建
* 2. 可以分多次调用,每次计算若干字节数据
*/
xmedia_s32 xmedia_cipher_hash_update(xmedia_handle handle, const xmedia_u8 *input, xmedia_u32 in_len);
/*
* 函数功能:获取hash值
* 函数参数:
* handle - 输入参数,hash句柄
* output_hash - 输出参数,输出的hash值
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_INVALID_HANDLE - hash句柄无效
*/
xmedia_s32 xmedia_cipher_hash_final(xmedia_handle handle, xmedia_u8 *output);
/*
* 函数功能:使用RSA公钥加密一段明文
* 函数参数:
* rsa_enc - 输入参数,公钥加密属性结构体
* input - 输入参数,待加密的数据及其长度
* output - 输出参数,加密结果数据及其长度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_FAILURE - 加密失败
*/
xmedia_s32 xmedia_cipher_rsa_public_encrypt(const xmedia_cipher_rsa_pub_enc *rsa_enc,
xmedia_cipher_data *input,
xmedia_cipher_data *output);
/*
* 函数功能:使用RSA私钥解密一段密文
* 函数参数:
* rsa_dec - 输入参数,私钥解密属性结构体
* input - 输入参数,待解密的数据及其长度
* output - 输出参数,解密结果数据及其长度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_FAILURE - 解密失败
*/
xmedia_s32 xmedia_cipher_rsa_private_decrypt(const xmedia_cipher_rsa_pri_enc *rsa_dec,
xmedia_cipher_data *input,
xmedia_cipher_data *output);
/*
* 函数功能:使用RSA私钥加密一段明文
* 函数参数:
* rsa_enc - 输入参数,私钥加密属性结构体
* input - 输入参数,待加密的数据及其长度
* output - 输出参数,加密结果数据及其长度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_FAILURE - 加密失败
*/
xmedia_s32 xmedia_cipher_rsa_private_encrypt(const xmedia_cipher_rsa_pri_enc *rsa_enc,
xmedia_cipher_data *input,
xmedia_cipher_data *output);
/*
* 函数功能:使用RSA公钥解密一段密文
* 函数参数:
* rsa_dec - 输入参数,公钥解密属性结构体
* input - 输入参数,待解密的数据及其长度
* output - 输出参数,解密结果数据及其长度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_FAILURE - 解密失败
*/
xmedia_s32 xmedia_cipher_rsa_public_decrypt(const xmedia_cipher_rsa_pub_enc *rsa_dec,
xmedia_cipher_data *input,
xmedia_cipher_data *output);
/*
* 函数功能:使用RSA私钥签名一段文本
* 函数参数:
* rsa_sign_attr - 输入参数,签名属性结构体
* data - 输入参数,包括待签名的数据及其长度, 如果hash_data不为空,
* 则使用hash_data进行签名,该参数将被忽略
* hash_data - 输入参数,待签名文本的HASH摘要,如果为空,则自动计算输入数据的HASH摘要进行签名
* sign - 输出参数,包括签名结果数据及其长度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_FAILURE - 签名失败
*/
xmedia_s32 xmedia_cipher_rsa_sign(const xmedia_cipher_rsa_sign_attr *rsa_sign_attr,
xmedia_cipher_data *data,
const xmedia_u8 *hash_data, xmedia_cipher_data *sign);
/*
* 函数功能:使用RSA公钥验证签名
* 函数参数:
* rsa_verify_attr - 输入参数,签名验证属性结构体
* data - 输入参数,包括待验证的数据及其长度, 如果hash_data不为空,
* 则使用hash_data进行验证,该参数将被忽略
* hash_data - 输入参数,待验证文本的HASH摘要,如果为空,则自动计算数据的HASH摘要进行验证
* sign - 输入参数,包括待验证的签名数据及其长度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_INVALID_PARAM - 参数错误
* XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请内存失败
* XMEDIA_FAILURE - 验签失败
*/
xmedia_s32 xmedia_cipher_rsa_verify(const xmedia_cipher_rsa_verify_attr *rsa_verify_attr,
xmedia_cipher_data *data,
const xmedia_u8 *hash_data, xmedia_cipher_data *sign);
#ifdef __cplusplus
}
#endif
#endif