247 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
 | 
						|
 */
 | 
						|
#ifndef _RKCRYPTO_COMMON_H_
 | 
						|
#define _RKCRYPTO_COMMON_H_
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
#include <stdbool.h>
 | 
						|
 | 
						|
typedef uint32_t RK_RES;
 | 
						|
typedef uint32_t rk_handle;
 | 
						|
 | 
						|
#define STR_HELPER(x)	#x
 | 
						|
#define STR(x)		STR_HELPER(x)
 | 
						|
 | 
						|
/* RK_CRYPTO api verison */
 | 
						|
#define RK_CRYPTO_API_MAJOR_VERSION	1
 | 
						|
#define RK_CRYPTO_API_MINOR_VERSION	2
 | 
						|
#define RK_CRYPTO_API_REVISION_VERSION	0
 | 
						|
 | 
						|
#define RK_CRYPTO_API_VERSION STR(RK_CRYPTO_API_MAJOR_VERSION) "." \
 | 
						|
			      STR(RK_CRYPTO_API_MINOR_VERSION) "." \
 | 
						|
			      STR(RK_CRYPTO_API_REVISION_VERSION)
 | 
						|
 | 
						|
#define RK_CRYPTO_API_FULL_VERSION "rkcrypto api version " RK_CRYPTO_API_VERSION
 | 
						|
 | 
						|
/* API return codes */
 | 
						|
#define RK_CRYPTO_SUCCESS		0x00000000
 | 
						|
#define RK_CRYPTO_ERR_GENERIC		0xF0000000
 | 
						|
#define RK_CRYPTO_ERR_PARAMETER		0xF0000001
 | 
						|
#define RK_CRYPTO_ERR_STATE		0xF0000002
 | 
						|
#define RK_CRYPTO_ERR_NOT_SUPPORTED	0xF0000003
 | 
						|
#define RK_CRYPTO_ERR_OUT_OF_MEMORY	0xF0000004
 | 
						|
#define RK_CRYPTO_ERR_ACCESS_DENIED	0xF0000005
 | 
						|
#define RK_CRYPTO_ERR_BUSY		0xF0000006
 | 
						|
#define RK_CRYPTO_ERR_TIMEOUT		0xF0000007
 | 
						|
#define RK_CRYPTO_ERR_UNINITED		0xF0000008
 | 
						|
#define RK_CRYPTO_ERR_KEY		0xF0000009
 | 
						|
#define RK_CRYPTO_ERR_VERIFY		0xF000000A
 | 
						|
#define RK_CRYPTO_ERR_PADDING		0xF000000B
 | 
						|
#define RK_CRYPTO_ERR_PADDING_OVERFLOW	0xF000000C
 | 
						|
#define RK_CRYPTO_ERR_MAC_INVALID	0xF000000D
 | 
						|
 | 
						|
/* Algorithm operation */
 | 
						|
#define RK_OP_CIPHER_ENC		1
 | 
						|
#define RK_OP_CIPHER_DEC		0
 | 
						|
 | 
						|
/* Algorithm block length */
 | 
						|
#define DES_BLOCK_SIZE			8
 | 
						|
#define AES_BLOCK_SIZE			16
 | 
						|
#define SM4_BLOCK_SIZE			16
 | 
						|
#define SHA1_HASH_SIZE			20
 | 
						|
#define SHA224_HASH_SIZE		28
 | 
						|
#define SHA256_HASH_SIZE		32
 | 
						|
#define SHA384_HASH_SIZE		48
 | 
						|
#define SHA512_HASH_SIZE		64
 | 
						|
#define SHA512_224_HASH_SIZE		28
 | 
						|
#define SHA512_256_HASH_SIZE		32
 | 
						|
#define MD5_HASH_SIZE			16
 | 
						|
#define SM3_HASH_SIZE			32
 | 
						|
 | 
						|
#define SM3_BLOCK_SIZE			64
 | 
						|
#define SHA1_BLOCK_SIZE			64
 | 
						|
#define MD5_BLOCK_SIZE			64
 | 
						|
#define SHA224_BLOCK_SIZE		64
 | 
						|
#define SHA256_BLOCK_SIZE		64
 | 
						|
#define SHA384_BLOCK_SIZE		128
 | 
						|
#define SHA512_BLOCK_SIZE		128
 | 
						|
#define SHA512_224_BLOCK_SIZE		128
 | 
						|
#define SHA512_256_BLOCK_SIZE		128
 | 
						|
 | 
						|
#define AES_AE_DATA_BLOCK		128
 | 
						|
#define MAX_HASH_BLOCK_SIZE		128
 | 
						|
#define MAX_TDES_KEY_SIZE		24
 | 
						|
#define MAX_AES_KEY_SIZE		32
 | 
						|
#define MAX_AE_TAG_SIZE			16
 | 
						|
 | 
						|
#define RSA_BITS_1024			1024
 | 
						|
#define RSA_BITS_2048			2048
 | 
						|
#define RSA_BITS_3072			3072
 | 
						|
#define RSA_BITS_4096			4096
 | 
						|
#define MAX_RSA_KEY_BITS		RSA_BITS_4096
 | 
						|
 | 
						|
#define RK_CRYPTO_MAX_DATA_LEN		(1 * 1024 * 1024)
 | 
						|
 | 
						|
/* Crypto algorithm */
 | 
						|
enum RK_CRYPTO_ALGO {
 | 
						|
	RK_ALGO_CIPHER_TOP = 0x00,
 | 
						|
	RK_ALGO_AES,
 | 
						|
	RK_ALGO_DES,
 | 
						|
	RK_ALGO_TDES,
 | 
						|
	RK_ALGO_SM4,
 | 
						|
	RK_ALGO_CIPHER_BUTT,
 | 
						|
 | 
						|
	RK_ALGO_HASH_TOP = 0x10,
 | 
						|
	RK_ALGO_MD5,
 | 
						|
	RK_ALGO_SHA1,
 | 
						|
	RK_ALGO_SHA256,
 | 
						|
	RK_ALGO_SHA224,
 | 
						|
	RK_ALGO_SHA512,
 | 
						|
	RK_ALGO_SHA384,
 | 
						|
	RK_ALGO_SHA512_224,
 | 
						|
	RK_ALGO_SHA512_256,
 | 
						|
	RK_ALGO_SM3,
 | 
						|
	RK_ALGO_HASH_BUTT,
 | 
						|
 | 
						|
	RK_ALGO_HMAC_TOP = 0x20,
 | 
						|
	RK_ALGO_HMAC_MD5,
 | 
						|
	RK_ALGO_HMAC_SHA1,
 | 
						|
	RK_ALGO_HMAC_SHA256,
 | 
						|
	RK_ALGO_HMAC_SHA512,
 | 
						|
	RK_ALGO_HMAC_SM3,
 | 
						|
	RK_ALGO_CMAC_AES,
 | 
						|
	RK_ALGO_CBCMAC_AES,
 | 
						|
	RK_ALGO_CMAC_SM4,
 | 
						|
	RK_ALGO_CBCMAC_SM4,
 | 
						|
	RK_ALGO_HMAC_BUTT,
 | 
						|
};
 | 
						|
 | 
						|
/* Crypto mode */
 | 
						|
enum RK_CIPIHER_MODE {
 | 
						|
	RK_CIPHER_MODE_ECB = 0,
 | 
						|
	RK_CIPHER_MODE_CBC,
 | 
						|
	RK_CIPHER_MODE_CTS,
 | 
						|
	RK_CIPHER_MODE_CTR,
 | 
						|
	RK_CIPHER_MODE_CFB,
 | 
						|
	RK_CIPHER_MODE_OFB,
 | 
						|
	RK_CIPHER_MODE_XTS,
 | 
						|
	RK_CIPHER_MODE_CCM,
 | 
						|
	RK_CIPHER_MODE_GCM,
 | 
						|
	RK_CIPHER_MODE_MAX
 | 
						|
};
 | 
						|
 | 
						|
enum RK_OEM_OTP_KEYID {
 | 
						|
	RK_OEM_OTP_KEY0 = 0,
 | 
						|
	RK_OEM_OTP_KEY1 = 1,
 | 
						|
	RK_OEM_OTP_KEY2 = 2,
 | 
						|
	RK_OEM_OTP_KEY3 = 3,
 | 
						|
	RK_OEM_OTP_KEY_FW = 10,		// keyid of fw_encryption_key
 | 
						|
	RK_OEM_OTP_KEYMAX
 | 
						|
};
 | 
						|
 | 
						|
enum RK_RSA_KEY_TYPE {
 | 
						|
	RK_RSA_KEY_TYPE_PLAIN = 0,
 | 
						|
	RK_RSA_KEY_TYPE_KEY0_ENC = RK_OEM_OTP_KEY0 +1,
 | 
						|
	RK_RSA_KEY_TYPE_KEY1_ENC,
 | 
						|
	RK_RSA_KEY_TYPE_KEY2_ENC,
 | 
						|
	RK_RSA_KEY_TYPE_KEY3_ENC,
 | 
						|
	RK_RSA_KEY_TYPE_MAX,
 | 
						|
};
 | 
						|
 | 
						|
enum RK_RSA_CRYPT_PADDING {
 | 
						|
	RK_RSA_CRYPT_PADDING_NONE = 0x00,	/* without padding */
 | 
						|
	RK_RSA_CRYPT_PADDING_BLOCK_TYPE_0,	/* PKCS#1 block type 0 padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_BLOCK_TYPE_1,	/* PKCS#1 block type 1padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_BLOCK_TYPE_2,	/* PKCS#1 block type 2 padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_OAEP_SHA1,		/* PKCS#1 RSAES-OAEP-SHA1 padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_OAEP_SHA224,	/* PKCS#1 RSAES-OAEP-SHA224 padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_OAEP_SHA256,	/* PKCS#1 RSAES-OAEP-SHA256   padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_OAEP_SHA384,	/* PKCS#1 RSAES-OAEP-SHA384   padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_OAEP_SHA512,	/* PKCS#1 RSAES-OAEP-SHA512   padding*/
 | 
						|
	RK_RSA_CRYPT_PADDING_PKCS1_V1_5,	/* PKCS#1 RSAES-PKCS1_V1_5    padding*/
 | 
						|
};
 | 
						|
 | 
						|
enum RK_RSA_SIGN_PADDING {
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA1 = 0x100,/* PKCS#1 RSASSA_PKCS1_V15_SHA1 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA224,	/* PKCS#1 RSASSA_PKCS1_V15_SHA224 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA256,	/* PKCS#1 RSASSA_PKCS1_V15_SHA256 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA384,	/* PKCS#1 RSASSA_PKCS1_V15_SHA384 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA512,	/* PKCS#1 RSASSA_PKCS1_V15_SHA512 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA1,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA1 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA224,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA224 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA256,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA384,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA1 signature*/
 | 
						|
	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA512,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature*/
 | 
						|
};
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	uint32_t	algo;
 | 
						|
	uint32_t	mode;
 | 
						|
	uint32_t	operation;
 | 
						|
	uint8_t		key[64];
 | 
						|
	uint32_t	key_len;
 | 
						|
	uint8_t		iv[16];
 | 
						|
	void		*reserved;
 | 
						|
} rk_cipher_config;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	uint32_t	algo;
 | 
						|
	uint32_t	mode;
 | 
						|
	uint32_t	operation;
 | 
						|
	uint8_t		key[32];
 | 
						|
	uint32_t	key_len;
 | 
						|
	uint8_t		iv[16];
 | 
						|
	uint32_t	iv_len;
 | 
						|
	uint32_t	tag_len;
 | 
						|
	uint32_t	aad_len;
 | 
						|
	uint32_t	payload_len;
 | 
						|
	void		*reserved;
 | 
						|
} rk_ae_config;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	uint32_t	algo;
 | 
						|
	uint8_t		*key;
 | 
						|
	uint32_t	key_len;
 | 
						|
} rk_hash_config;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	const uint8_t		*n;
 | 
						|
	const uint8_t		*e;
 | 
						|
 | 
						|
	uint16_t		n_len;
 | 
						|
	uint16_t		e_len;
 | 
						|
} rk_rsa_pub_key;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	enum RK_RSA_KEY_TYPE	key_type;
 | 
						|
	rk_rsa_pub_key		key;
 | 
						|
} rk_rsa_pub_key_pack;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	const uint8_t		*n;
 | 
						|
	const uint8_t		*e;
 | 
						|
	const uint8_t		*d;
 | 
						|
	const uint8_t		*p;
 | 
						|
	const uint8_t		*q;
 | 
						|
	const uint8_t		*dp;
 | 
						|
	const uint8_t		*dq;
 | 
						|
	const uint8_t		*qp;
 | 
						|
 | 
						|
	uint16_t		n_len;
 | 
						|
	uint16_t		e_len;
 | 
						|
	uint16_t		d_len;
 | 
						|
	uint16_t		p_len;
 | 
						|
	uint16_t		q_len;
 | 
						|
	uint16_t		dp_len;
 | 
						|
	uint16_t		dq_len;
 | 
						|
	uint16_t		qp_len;
 | 
						|
} rk_rsa_priv_key;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	enum RK_RSA_KEY_TYPE	key_type;
 | 
						|
	rk_rsa_priv_key		key;
 | 
						|
} rk_rsa_priv_key_pack;
 | 
						|
 | 
						|
#endif /* _RKCRYPTO_COMMON_H_ */
 |