/* * 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__ */