1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2022 Rockchip Electronics Co. Ltd. 3*4882a593Smuzhiyun */ 4*4882a593Smuzhiyun #ifndef _RKCRYPTO_COMMON_H_ 5*4882a593Smuzhiyun #define _RKCRYPTO_COMMON_H_ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <stdint.h> 8*4882a593Smuzhiyun #include <stdbool.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun typedef uint32_t RK_RES; 11*4882a593Smuzhiyun typedef uint32_t rk_handle; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define STR_HELPER(x) #x 14*4882a593Smuzhiyun #define STR(x) STR_HELPER(x) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* RK_CRYPTO api verison */ 17*4882a593Smuzhiyun #define RK_CRYPTO_API_MAJOR_VERSION 1 18*4882a593Smuzhiyun #define RK_CRYPTO_API_MINOR_VERSION 2 19*4882a593Smuzhiyun #define RK_CRYPTO_API_REVISION_VERSION 0 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define RK_CRYPTO_API_VERSION STR(RK_CRYPTO_API_MAJOR_VERSION) "." \ 22*4882a593Smuzhiyun STR(RK_CRYPTO_API_MINOR_VERSION) "." \ 23*4882a593Smuzhiyun STR(RK_CRYPTO_API_REVISION_VERSION) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define RK_CRYPTO_API_FULL_VERSION "rkcrypto api version " RK_CRYPTO_API_VERSION 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* API return codes */ 28*4882a593Smuzhiyun #define RK_CRYPTO_SUCCESS 0x00000000 29*4882a593Smuzhiyun #define RK_CRYPTO_ERR_GENERIC 0xF0000000 30*4882a593Smuzhiyun #define RK_CRYPTO_ERR_PARAMETER 0xF0000001 31*4882a593Smuzhiyun #define RK_CRYPTO_ERR_STATE 0xF0000002 32*4882a593Smuzhiyun #define RK_CRYPTO_ERR_NOT_SUPPORTED 0xF0000003 33*4882a593Smuzhiyun #define RK_CRYPTO_ERR_OUT_OF_MEMORY 0xF0000004 34*4882a593Smuzhiyun #define RK_CRYPTO_ERR_ACCESS_DENIED 0xF0000005 35*4882a593Smuzhiyun #define RK_CRYPTO_ERR_BUSY 0xF0000006 36*4882a593Smuzhiyun #define RK_CRYPTO_ERR_TIMEOUT 0xF0000007 37*4882a593Smuzhiyun #define RK_CRYPTO_ERR_UNINITED 0xF0000008 38*4882a593Smuzhiyun #define RK_CRYPTO_ERR_KEY 0xF0000009 39*4882a593Smuzhiyun #define RK_CRYPTO_ERR_VERIFY 0xF000000A 40*4882a593Smuzhiyun #define RK_CRYPTO_ERR_PADDING 0xF000000B 41*4882a593Smuzhiyun #define RK_CRYPTO_ERR_PADDING_OVERFLOW 0xF000000C 42*4882a593Smuzhiyun #define RK_CRYPTO_ERR_MAC_INVALID 0xF000000D 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* Algorithm operation */ 45*4882a593Smuzhiyun #define RK_OP_CIPHER_ENC 1 46*4882a593Smuzhiyun #define RK_OP_CIPHER_DEC 0 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* Algorithm block length */ 49*4882a593Smuzhiyun #define DES_BLOCK_SIZE 8 50*4882a593Smuzhiyun #define AES_BLOCK_SIZE 16 51*4882a593Smuzhiyun #define SM4_BLOCK_SIZE 16 52*4882a593Smuzhiyun #define SHA1_HASH_SIZE 20 53*4882a593Smuzhiyun #define SHA224_HASH_SIZE 28 54*4882a593Smuzhiyun #define SHA256_HASH_SIZE 32 55*4882a593Smuzhiyun #define SHA384_HASH_SIZE 48 56*4882a593Smuzhiyun #define SHA512_HASH_SIZE 64 57*4882a593Smuzhiyun #define SHA512_224_HASH_SIZE 28 58*4882a593Smuzhiyun #define SHA512_256_HASH_SIZE 32 59*4882a593Smuzhiyun #define MD5_HASH_SIZE 16 60*4882a593Smuzhiyun #define SM3_HASH_SIZE 32 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define SM3_BLOCK_SIZE 64 63*4882a593Smuzhiyun #define SHA1_BLOCK_SIZE 64 64*4882a593Smuzhiyun #define MD5_BLOCK_SIZE 64 65*4882a593Smuzhiyun #define SHA224_BLOCK_SIZE 64 66*4882a593Smuzhiyun #define SHA256_BLOCK_SIZE 64 67*4882a593Smuzhiyun #define SHA384_BLOCK_SIZE 128 68*4882a593Smuzhiyun #define SHA512_BLOCK_SIZE 128 69*4882a593Smuzhiyun #define SHA512_224_BLOCK_SIZE 128 70*4882a593Smuzhiyun #define SHA512_256_BLOCK_SIZE 128 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define AES_AE_DATA_BLOCK 128 73*4882a593Smuzhiyun #define MAX_HASH_BLOCK_SIZE 128 74*4882a593Smuzhiyun #define MAX_TDES_KEY_SIZE 24 75*4882a593Smuzhiyun #define MAX_AES_KEY_SIZE 32 76*4882a593Smuzhiyun #define MAX_AE_TAG_SIZE 16 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define RSA_BITS_1024 1024 79*4882a593Smuzhiyun #define RSA_BITS_2048 2048 80*4882a593Smuzhiyun #define RSA_BITS_3072 3072 81*4882a593Smuzhiyun #define RSA_BITS_4096 4096 82*4882a593Smuzhiyun #define MAX_RSA_KEY_BITS RSA_BITS_4096 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define RK_CRYPTO_MAX_DATA_LEN (1 * 1024 * 1024) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* Crypto algorithm */ 87*4882a593Smuzhiyun enum RK_CRYPTO_ALGO { 88*4882a593Smuzhiyun RK_ALGO_CIPHER_TOP = 0x00, 89*4882a593Smuzhiyun RK_ALGO_AES, 90*4882a593Smuzhiyun RK_ALGO_DES, 91*4882a593Smuzhiyun RK_ALGO_TDES, 92*4882a593Smuzhiyun RK_ALGO_SM4, 93*4882a593Smuzhiyun RK_ALGO_CIPHER_BUTT, 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun RK_ALGO_HASH_TOP = 0x10, 96*4882a593Smuzhiyun RK_ALGO_MD5, 97*4882a593Smuzhiyun RK_ALGO_SHA1, 98*4882a593Smuzhiyun RK_ALGO_SHA256, 99*4882a593Smuzhiyun RK_ALGO_SHA224, 100*4882a593Smuzhiyun RK_ALGO_SHA512, 101*4882a593Smuzhiyun RK_ALGO_SHA384, 102*4882a593Smuzhiyun RK_ALGO_SHA512_224, 103*4882a593Smuzhiyun RK_ALGO_SHA512_256, 104*4882a593Smuzhiyun RK_ALGO_SM3, 105*4882a593Smuzhiyun RK_ALGO_HASH_BUTT, 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun RK_ALGO_HMAC_TOP = 0x20, 108*4882a593Smuzhiyun RK_ALGO_HMAC_MD5, 109*4882a593Smuzhiyun RK_ALGO_HMAC_SHA1, 110*4882a593Smuzhiyun RK_ALGO_HMAC_SHA256, 111*4882a593Smuzhiyun RK_ALGO_HMAC_SHA512, 112*4882a593Smuzhiyun RK_ALGO_HMAC_SM3, 113*4882a593Smuzhiyun RK_ALGO_CMAC_AES, 114*4882a593Smuzhiyun RK_ALGO_CBCMAC_AES, 115*4882a593Smuzhiyun RK_ALGO_CMAC_SM4, 116*4882a593Smuzhiyun RK_ALGO_CBCMAC_SM4, 117*4882a593Smuzhiyun RK_ALGO_HMAC_BUTT, 118*4882a593Smuzhiyun }; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* Crypto mode */ 121*4882a593Smuzhiyun enum RK_CIPIHER_MODE { 122*4882a593Smuzhiyun RK_CIPHER_MODE_ECB = 0, 123*4882a593Smuzhiyun RK_CIPHER_MODE_CBC, 124*4882a593Smuzhiyun RK_CIPHER_MODE_CTS, 125*4882a593Smuzhiyun RK_CIPHER_MODE_CTR, 126*4882a593Smuzhiyun RK_CIPHER_MODE_CFB, 127*4882a593Smuzhiyun RK_CIPHER_MODE_OFB, 128*4882a593Smuzhiyun RK_CIPHER_MODE_XTS, 129*4882a593Smuzhiyun RK_CIPHER_MODE_CCM, 130*4882a593Smuzhiyun RK_CIPHER_MODE_GCM, 131*4882a593Smuzhiyun RK_CIPHER_MODE_MAX 132*4882a593Smuzhiyun }; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun enum RK_OEM_OTP_KEYID { 135*4882a593Smuzhiyun RK_OEM_OTP_KEY0 = 0, 136*4882a593Smuzhiyun RK_OEM_OTP_KEY1 = 1, 137*4882a593Smuzhiyun RK_OEM_OTP_KEY2 = 2, 138*4882a593Smuzhiyun RK_OEM_OTP_KEY3 = 3, 139*4882a593Smuzhiyun RK_OEM_OTP_KEY_FW = 10, // keyid of fw_encryption_key 140*4882a593Smuzhiyun RK_OEM_OTP_KEYMAX 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun enum RK_RSA_KEY_TYPE { 144*4882a593Smuzhiyun RK_RSA_KEY_TYPE_PLAIN = 0, 145*4882a593Smuzhiyun RK_RSA_KEY_TYPE_KEY0_ENC = RK_OEM_OTP_KEY0 +1, 146*4882a593Smuzhiyun RK_RSA_KEY_TYPE_KEY1_ENC, 147*4882a593Smuzhiyun RK_RSA_KEY_TYPE_KEY2_ENC, 148*4882a593Smuzhiyun RK_RSA_KEY_TYPE_KEY3_ENC, 149*4882a593Smuzhiyun RK_RSA_KEY_TYPE_MAX, 150*4882a593Smuzhiyun }; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun enum RK_RSA_CRYPT_PADDING { 153*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_NONE = 0x00, /* without padding */ 154*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_BLOCK_TYPE_0, /* PKCS#1 block type 0 padding*/ 155*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_BLOCK_TYPE_1, /* PKCS#1 block type 1padding*/ 156*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_BLOCK_TYPE_2, /* PKCS#1 block type 2 padding*/ 157*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_OAEP_SHA1, /* PKCS#1 RSAES-OAEP-SHA1 padding*/ 158*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_OAEP_SHA224, /* PKCS#1 RSAES-OAEP-SHA224 padding*/ 159*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_OAEP_SHA256, /* PKCS#1 RSAES-OAEP-SHA256 padding*/ 160*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_OAEP_SHA384, /* PKCS#1 RSAES-OAEP-SHA384 padding*/ 161*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_OAEP_SHA512, /* PKCS#1 RSAES-OAEP-SHA512 padding*/ 162*4882a593Smuzhiyun RK_RSA_CRYPT_PADDING_PKCS1_V1_5, /* PKCS#1 RSAES-PKCS1_V1_5 padding*/ 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun enum RK_RSA_SIGN_PADDING { 166*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_V15_SHA1 = 0x100,/* PKCS#1 RSASSA_PKCS1_V15_SHA1 signature*/ 167*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_V15_SHA224, /* PKCS#1 RSASSA_PKCS1_V15_SHA224 signature*/ 168*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_V15_SHA256, /* PKCS#1 RSASSA_PKCS1_V15_SHA256 signature*/ 169*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_V15_SHA384, /* PKCS#1 RSASSA_PKCS1_V15_SHA384 signature*/ 170*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_V15_SHA512, /* PKCS#1 RSASSA_PKCS1_V15_SHA512 signature*/ 171*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA1, /* PKCS#1 RSASSA_PKCS1_PSS_SHA1 signature*/ 172*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA224, /* PKCS#1 RSASSA_PKCS1_PSS_SHA224 signature*/ 173*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA256, /* PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature*/ 174*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA384, /* PKCS#1 RSASSA_PKCS1_PSS_SHA1 signature*/ 175*4882a593Smuzhiyun RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA512, /* PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature*/ 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun typedef struct { 179*4882a593Smuzhiyun uint32_t algo; 180*4882a593Smuzhiyun uint32_t mode; 181*4882a593Smuzhiyun uint32_t operation; 182*4882a593Smuzhiyun uint8_t key[64]; 183*4882a593Smuzhiyun uint32_t key_len; 184*4882a593Smuzhiyun uint8_t iv[16]; 185*4882a593Smuzhiyun void *reserved; 186*4882a593Smuzhiyun } rk_cipher_config; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun typedef struct { 189*4882a593Smuzhiyun uint32_t algo; 190*4882a593Smuzhiyun uint32_t mode; 191*4882a593Smuzhiyun uint32_t operation; 192*4882a593Smuzhiyun uint8_t key[32]; 193*4882a593Smuzhiyun uint32_t key_len; 194*4882a593Smuzhiyun uint8_t iv[16]; 195*4882a593Smuzhiyun uint32_t iv_len; 196*4882a593Smuzhiyun uint32_t tag_len; 197*4882a593Smuzhiyun uint32_t aad_len; 198*4882a593Smuzhiyun uint32_t payload_len; 199*4882a593Smuzhiyun void *reserved; 200*4882a593Smuzhiyun } rk_ae_config; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun typedef struct { 203*4882a593Smuzhiyun uint32_t algo; 204*4882a593Smuzhiyun uint8_t *key; 205*4882a593Smuzhiyun uint32_t key_len; 206*4882a593Smuzhiyun } rk_hash_config; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun typedef struct { 209*4882a593Smuzhiyun const uint8_t *n; 210*4882a593Smuzhiyun const uint8_t *e; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun uint16_t n_len; 213*4882a593Smuzhiyun uint16_t e_len; 214*4882a593Smuzhiyun } rk_rsa_pub_key; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun typedef struct { 217*4882a593Smuzhiyun enum RK_RSA_KEY_TYPE key_type; 218*4882a593Smuzhiyun rk_rsa_pub_key key; 219*4882a593Smuzhiyun } rk_rsa_pub_key_pack; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun typedef struct { 222*4882a593Smuzhiyun const uint8_t *n; 223*4882a593Smuzhiyun const uint8_t *e; 224*4882a593Smuzhiyun const uint8_t *d; 225*4882a593Smuzhiyun const uint8_t *p; 226*4882a593Smuzhiyun const uint8_t *q; 227*4882a593Smuzhiyun const uint8_t *dp; 228*4882a593Smuzhiyun const uint8_t *dq; 229*4882a593Smuzhiyun const uint8_t *qp; 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun uint16_t n_len; 232*4882a593Smuzhiyun uint16_t e_len; 233*4882a593Smuzhiyun uint16_t d_len; 234*4882a593Smuzhiyun uint16_t p_len; 235*4882a593Smuzhiyun uint16_t q_len; 236*4882a593Smuzhiyun uint16_t dp_len; 237*4882a593Smuzhiyun uint16_t dq_len; 238*4882a593Smuzhiyun uint16_t qp_len; 239*4882a593Smuzhiyun } rk_rsa_priv_key; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun typedef struct { 242*4882a593Smuzhiyun enum RK_RSA_KEY_TYPE key_type; 243*4882a593Smuzhiyun rk_rsa_priv_key key; 244*4882a593Smuzhiyun } rk_rsa_priv_key_pack; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun #endif /* _RKCRYPTO_COMMON_H_ */ 247