171 lines
7.2 KiB
C
171 lines
7.2 KiB
C
/*
|
||
* Copyright (c) XMEDIA. All rights reserved.
|
||
*/
|
||
|
||
#ifndef __XMEDIA_CIPHER_H__
|
||
#define __XMEDIA_CIPHER_H__
|
||
|
||
#include "xmedia_type.h"
|
||
|
||
#ifdef __cplusplus
|
||
#if __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
#endif /* __cplusplus */
|
||
|
||
/* Klad target. */
|
||
typedef enum {
|
||
XMEDIA_CIPHER_KLAD_TARGET_AES = 0x0, /* Klad for AES. */
|
||
XMEDIA_CIPHER_KLAD_TARGET_RSA, /* Klad for RSA. */
|
||
XMEDIA_CIPHER_KLAD_TARGET_BUTT,
|
||
} cipher_klad_target;
|
||
|
||
/* Hash algrithm type. */
|
||
typedef enum {
|
||
XMEDIA_CIPHER_HASH_TYPE_SHA1,
|
||
XMEDIA_CIPHER_HASH_TYPE_SHA224,
|
||
XMEDIA_CIPHER_HASH_TYPE_SHA256,
|
||
XMEDIA_CIPHER_HASH_TYPE_SHA384,
|
||
XMEDIA_CIPHER_HASH_TYPE_SHA512,
|
||
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA1,
|
||
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA224,
|
||
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA256,
|
||
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA384,
|
||
XMEDIA_CIPHER_HASH_TYPE_HMAC_SHA512,
|
||
XMEDIA_CIPHER_HASH_TYPE_SM3,
|
||
XMEDIA_CIPHER_HASH_TYPE_BUTT,
|
||
XMEDIA_CIPHER_HASH_TYPE_INVALID = 0xffffffff,
|
||
} cipher_hash_type;
|
||
|
||
/* Cipher algorithm. */
|
||
typedef enum {
|
||
XMEDIA_CIPHER_ALG_AES = 0x0, /* Advanced encryption standard (AES) algorithm */
|
||
XMEDIA_CIPHER_ALG_SM1 = 0x1, /* SM1 algorithm. */
|
||
XMEDIA_CIPHER_ALG_SM4 = 0x2, /* SM4 algorithm. */
|
||
XMEDIA_CIPHER_ALG_DMA = 0x3, /* DMA copy. */
|
||
XMEDIA_CIPHER_ALG_BUTT = 0x4,
|
||
XMEDIA_CIPHER_ALG_INVALID = 0xffffffff,
|
||
} cipher_alg;
|
||
|
||
/* Cipher bit width. */
|
||
typedef enum {
|
||
XMEDIA_CIPHER_BIT_WIDTH_128BIT = 0x0, /* 128-bit width */
|
||
XMEDIA_CIPHER_BIT_WIDTH_64BIT = 0x1, /* 64-bit width */
|
||
XMEDIA_CIPHER_BIT_WIDTH_8BIT = 0x2, /* 8-bit width */
|
||
XMEDIA_CIPHER_BIT_WIDTH_1BIT = 0x3, /* 1-bit width */
|
||
XMEDIA_CIPHER_BIT_WIDTH_BUTT = 0x4,
|
||
XMEDIA_CIPHER_BIT_WIDTH_INVALID = 0xffffffff,
|
||
} cipher_bit_width;
|
||
|
||
/* enum typedef */
|
||
/* Cipher work mode. */
|
||
typedef enum {
|
||
XMEDIA_CIPHER_WORK_MODE_ECB = 0x0, /* Electronic codebook (ECB) mode, ECB has been considered insecure and it is
|
||
recommended not to use it. */
|
||
XMEDIA_CIPHER_WORK_MODE_CBC, /* Cipher block chaining (CBC) mode. */
|
||
XMEDIA_CIPHER_WORK_MODE_CFB, /* Cipher feedback (CFB) mode. */
|
||
XMEDIA_CIPHER_WORK_MODE_OFB, /* Output feedback (OFB) mode. */
|
||
XMEDIA_CIPHER_WORK_MODE_CTR, /* Counter (CTR) mode. */
|
||
XMEDIA_CIPHER_WORK_MODE_BUTT,
|
||
XMEDIA_CIPHER_WORK_MODE_INVALID = 0xffffffff,
|
||
} cipher_work_mode;
|
||
|
||
/* Key length. */
|
||
typedef enum {
|
||
XMEDIA_CIPHER_KEY_DEFAULT = 0x0, /* Default key length, AES-16, SM1-48, SM4-16 */
|
||
XMEDIA_CIPHER_KEY_AES_128BIT = 0x0, /* 128-bit key for the AES algorithm */
|
||
XMEDIA_CIPHER_KEY_AES_192BIT = 0x1, /* 192-bit key for the AES algorithm */
|
||
XMEDIA_CIPHER_KEY_AES_256BIT = 0x2, /* 256-bit key for the AES algorithm */
|
||
XMEDIA_CIPHER_KEY_LEN_BUTT = 0x3,
|
||
XMEDIA_CIPHER_KEY_INVALID = 0xffffffff,
|
||
} cipher_key_len;
|
||
|
||
typedef enum {
|
||
XMEDIA_CIPHER_KEY_SRC_USER = 0x0, /* plain key */
|
||
XMEDIA_CIPHER_KEY_SRC_KLAD_0, /* aes key0 */
|
||
XMEDIA_CIPHER_KEY_SRC_KLAD_1, /* aes key1 */
|
||
XMEDIA_CIPHER_KEY_SRC_KLAD_2, /* aes key2 */
|
||
XMEDIA_CIPHER_KEY_SRC_KLAD_3, /* aes key3 */
|
||
XMEDIA_CIPHER_KEY_SRC_BUTT,
|
||
} xmedia_cipher_key_type;
|
||
|
||
/* Structure of the cipher control information */
|
||
typedef struct {
|
||
xmedia_u32 key[8]; /* Key input */
|
||
xmedia_u32 iv[4]; /* Initialization vector (IV) */
|
||
xmedia_cipher_key_type key_type;
|
||
cipher_work_mode work_mode;
|
||
} cipher_ctrl;
|
||
|
||
typedef enum {
|
||
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256 = 0x0, /* PKCS#1 RSASSA_PKCS1_V15_SHA256 */
|
||
XMEDIA_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256, /* PKCS#1 RSASSA_PKCS1_PSS_SHA256 */
|
||
XMEDIA_CIPHER_RSA_SIGN_SCHEME_BUTT,
|
||
} xmedia_cipher_rsa_sign_scheme;
|
||
|
||
/* RSA public key struct */
|
||
typedef struct {
|
||
xmedia_u8 *n; /* Point to public modulus N */
|
||
xmedia_u8 *e; /* Point to public exponent E */
|
||
xmedia_u16 n_len; /* Length of public modulus N, max value is 512Byte */
|
||
xmedia_u16 e_len; /* Length of public exponent E, max value is 512Byte */
|
||
} cipher_rsa_pub_key;
|
||
|
||
/* RSA signature verify struct input */
|
||
typedef struct {
|
||
xmedia_cipher_rsa_sign_scheme scheme;
|
||
cipher_rsa_pub_key pub_key; /* RSA public key struct */
|
||
} cipher_rsa_verify;
|
||
|
||
typedef struct {
|
||
xmedia_u8 *hash_data; /* Hash of data. */
|
||
xmedia_u32 hash_data_len; /* Length of hash data. */
|
||
xmedia_u8 *sign; /* Input sign data. */
|
||
xmedia_u32 sign_len; /* Length of input sign data. */
|
||
} cipher_verify_data;
|
||
|
||
xmedia_s32 xmedia_cipher_deinit(xmedia_void);
|
||
/*
|
||
* 函数说明:AES256加密接口
|
||
*
|
||
* 1、支持aes加密算法,支持ECB、CBC、CFB、OFB、CTR模式,key长度只支持256bits
|
||
* 2、支持明文key与密文key,使用明文key时,ctrl->key_type需配置为XMEDIA_CIPHER_KEY_SRC_USER,AES逻辑实际使用的key
|
||
* 与配置的明文key相同;使用密文key时,ctrl->key_type需配置为XMEDIA_CIPHER_KEY_SRC_KLAD_X(X为[0,3],依次对应OTP中的AES KEY0~3),
|
||
* cipher模块首先调用KLAD模块使用OTP中的AES KEY对输入的密文key进行AES256 ECB解密,然后AES逻辑使用解密后的明文key对输入数据进行加密
|
||
*/
|
||
xmedia_s32 xmedia_cipher_aes256_encrypt(cipher_ctrl *ctrl, xmedia_size_t src_phy_addr, xmedia_size_t dest_phy_addr, xmedia_u32 byte_len);
|
||
|
||
/*
|
||
* 函数说明:AES256解密接口
|
||
*
|
||
* 1、支持aes解密算法,支持ECB、CBC、CFB、OFB、CTR模式,key长度只支持256bits
|
||
* 2、支持明文key与密文key,使用明文key时,ctrl->key_type需配置为XMEDIA_CIPHER_KEY_SRC_USER,AES逻辑实际使用的key
|
||
* 与配置的明文key相同;使用密文key时,ctrl->key_type需配置为XMEDIA_CIPHER_KEY_SRC_KLAD_X(X为[0,3],依次对应OTP中的AES KEY0~3),
|
||
* cipher模块首先调用KLAD模块使用OTP中的AES KEY对输入的密文key进行AES256 ECB解密,然后AES逻辑使用解密后的明文key对输入数据进行解密
|
||
*/
|
||
xmedia_s32 xmedia_cipher_aes256_decrypt(cipher_ctrl *ctrl, xmedia_size_t src_phy_addr, xmedia_size_t dest_phy_addr, xmedia_u32 byte_len);
|
||
|
||
xmedia_s32 xmedia_cipher_sha256_init(xmedia_void);
|
||
xmedia_s32 xmedia_cipher_sha256_update(xmedia_u8 *input_data, xmedia_u32 input_data_len);
|
||
xmedia_s32 xmedia_cipher_sha256_final(xmedia_u8 *output_hash);
|
||
xmedia_s32 xmedia_cipher_rsa_deinit(xmedia_void);
|
||
/*
|
||
* 函数说明:RSA验签接口
|
||
*
|
||
* 1、RSA验签运算支持两种key长度,分别是2048bits、4096bits,通过输入参数中的公钥参数rsa_verify->pub_key进行指定
|
||
* 2、支持两种验签标准,分别是PKCS#1 RSASSA_PKCS1_PSS_SHA256与PKCS#1 RSASSA_PKCS1_V15_SHA256,通过输入参数rsa_verify->schme进行指定
|
||
*
|
||
* 注:根据支持的验签标准,传入的数据hash值必须采用SHA256算法,可调用xmedia_cipher_sha256_xxx系列接口进行hash运算
|
||
*/
|
||
xmedia_s32 xmedia_cipher_rsa_verify(const cipher_rsa_verify *rsa_verify, cipher_verify_data *verify_data);
|
||
xmedia_void xmedia_cipher_klad_deinit(xmedia_void);
|
||
|
||
#ifdef __cplusplus
|
||
#if __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* __cplusplus */
|
||
|
||
#endif /* __XMEDIA_CIPHER_H__ */
|
||
|