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