/* * Copyright (c) 2022 Rockchip Electronics Co. Ltd. */ #ifndef _RKCRYPTO_COMMON_H_ #define _RKCRYPTO_COMMON_H_ #include #include 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_ */