1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright (c) 2021 Rockchip Electronics Co. Ltd. 4 */ 5 6 #ifndef RK_CRYPTO_API_H 7 #define RK_CRYPTO_API_H 8 9 #include <stdint.h> 10 11 #define DES_BLOCK_SIZE 8 12 #define AES_BLOCK_SIZE 16 13 #define SM4_BLOCK_SIZE 16 14 #define SHA1_HASH_SIZE 20 15 #define SHA224_HASH_SIZE 28 16 #define SHA256_HASH_SIZE 32 17 #define SHA384_HASH_SIZE 48 18 #define SHA512_HASH_SIZE 64 19 #define MD5_HASH_SIZE 16 20 #define SM3_HASH_SIZE 32 21 #define AES_AE_DATA_BLOCK 128 22 #define MAX_HASH_BLOCK_SIZE 128 /* SHA-512 is the longest so far */ 23 24 typedef enum { 25 PKCS7_PADDING = 0, 26 NO_PADDING = 1, 27 } rk_padding_t; 28 29 typedef enum { 30 SIGN_DIGEST = 0, 31 SIGN_DATA = 1, 32 } rk_sign_type_t; 33 34 typedef enum { 35 RK_MAC_SIGN = 3, 36 RK_MAC_VERIFY = 13, 37 } rk_mac_mode_t; 38 39 typedef enum { 40 RK_AE_UPDATE_DATA = 0, 41 RK_AE_UPDATE_AAD = 1, 42 } rk_ae_update_type_t; 43 44 typedef struct crypto_context { 45 TEE_OperationHandle op; 46 TEE_ObjectHandle obj; 47 TEE_ObjectHandle obj_2; //for those one operation with two keys, such as aes-xts 48 TEE_OperationMode mode; 49 uint32_t algo; 50 uint32_t padding; 51 uint32_t sign_mode; 52 uint8_t buffer[16]; 53 uint32_t buffer_offs; 54 } crypto_ctx_t; 55 56 /* 57 * ecc key max size is 521 bits, so 66 bytes is enough. 58 * set buffer to 68 bytes for 4 byte alignment. 59 */ 60 typedef struct EC_KEY { 61 uint32_t d_len; 62 uint32_t x_len; 63 uint32_t y_len; 64 uint32_t curve; 65 uint32_t key_len; 66 uint8_t d[68]; 67 uint8_t x[68]; 68 uint8_t y[68]; 69 } ec_key_t; 70 71 typedef struct EC_PUB_KEY { 72 uint32_t x_len; 73 uint32_t y_len; 74 uint32_t curve; 75 uint32_t key_len; 76 uint8_t x[68]; 77 uint8_t y[68]; 78 } ec_pub_key_t; 79 80 typedef struct RSA_KEY { 81 uint16_t key_len; 82 uint16_t d_len; 83 uint16_t e_len; 84 uint16_t p_len; 85 uint16_t q_len; 86 uint16_t dp_len; 87 uint16_t dq_len; 88 uint16_t iq_len; 89 uint8_t n[512]; 90 uint8_t e[8]; 91 uint8_t d[512]; 92 uint8_t p[256]; 93 uint8_t q[256]; 94 uint8_t dp[256]; 95 uint8_t dq[256]; 96 uint8_t iq[256]; 97 } rsa_key_t; 98 99 #define RK_MAX_SM2_KEP_ID_SIZE 32 100 typedef struct { 101 ec_key_t my_key; 102 ec_key_t my_eph_key; /* ephemeral key */ 103 ec_pub_key_t pub_B; 104 ec_pub_key_t eph_pub_B; /* ephemeral public key */ 105 uint8_t id_a[RK_MAX_SM2_KEP_ID_SIZE]; 106 uint32_t id_a_len; 107 uint8_t id_b[RK_MAX_SM2_KEP_ID_SIZE]; 108 uint32_t id_b_len; 109 uint8_t conf_in[SM3_HASH_SIZE]; 110 uint32_t conf_in_len; 111 uint32_t is_initiator; 112 } rk_sm2_kep_parms; 113 114 115 crypto_ctx_t *rk_crypto_malloc_ctx(void); 116 void rk_crypto_free_ctx(crypto_ctx_t **ctx); 117 118 TEE_Result rk_hash_crypto(uint8_t *in, uint8_t *out, uint32_t in_len, 119 uint32_t out_len, uint32_t algo); 120 TEE_Result rk_hash_begin(crypto_ctx_t *ctx, uint32_t algo); 121 TEE_Result rk_hash_update(crypto_ctx_t *ctx, uint8_t *in, uint32_t in_len); 122 TEE_Result rk_hash_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out, 123 uint32_t in_len, uint32_t *out_len); 124 125 TEE_Result rk_cipher_crypto(uint8_t *in, uint8_t *out, uint32_t len, 126 uint8_t *key, uint32_t key_len, uint8_t *iv, 127 uint32_t algo, TEE_OperationMode mode); 128 TEE_Result rk_set_padding(crypto_ctx_t *ctx, int padding); 129 TEE_Result rk_cipher_begin(crypto_ctx_t *ctx, uint8_t *key, uint32_t key_len, 130 uint8_t *iv, uint32_t algo, TEE_OperationMode mode); 131 TEE_Result rk_cipher_update(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out, 132 uint32_t in_len, uint32_t *out_len); 133 TEE_Result rk_cipher_finish(crypto_ctx_t *ctx, uint8_t *out, uint32_t *out_len); 134 135 TEE_Result rk_ae_begin(crypto_ctx_t *ctx, uint8_t *key, uint32_t key_len, 136 uint8_t *iv, uint32_t iv_len, uint32_t add_len, uint32_t tag_len, 137 uint32_t payload_len, uint32_t algo, TEE_OperationMode mode); 138 TEE_Result rk_ae_update(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out, 139 uint32_t in_len, uint32_t *out_len, rk_ae_update_type_t is_add); 140 TEE_Result rk_ae_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out, 141 uint8_t *tag, uint32_t in_len, uint32_t *out_len, uint32_t *tag_len); 142 143 TEE_Result rk_gen_rsa_key(rsa_key_t *rsa_key, uint32_t key_len, 144 uint64_t public_exponent); 145 TEE_Result rk_rsa_crypto(uint8_t *in, uint8_t *out, uint32_t len, 146 rsa_key_t *key, uint32_t algo, TEE_OperationMode mode); 147 TEE_Result rk_rsa_sign(uint8_t *digest, uint8_t *signature, uint32_t digest_len, 148 uint32_t *signature_len, rsa_key_t *key, uint32_t salt_len, 149 uint32_t algo, TEE_OperationMode mode); 150 TEE_Result rk_set_sign_mode(crypto_ctx_t *ctx, unsigned int mode); 151 TEE_Result rk_rsa_begin(crypto_ctx_t *ctx, rsa_key_t *key, uint32_t algo, 152 TEE_OperationMode mode); 153 TEE_Result rk_rsa_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out, 154 uint32_t in_len, 155 uint32_t *out_len, uint32_t salt_len); 156 157 TEE_Result rk_gen_ec_key(ec_key_t *ec_key, uint32_t key_len, uint32_t curve); 158 TEE_Result rk_ecdh_genkey(uint8_t *private, uint8_t *publicx, uint32_t *publicy, 159 uint32_t algo, uint32_t curve, uint32_t keysize, uint8_t *out); 160 TEE_Result rk_ecdsa_sign(uint8_t *digest, uint8_t *signature, 161 uint32_t digest_len, uint32_t *signature_len, 162 ec_key_t *key, uint32_t algo, TEE_OperationMode mode); 163 TEE_Result rk_ecdsa_begin(crypto_ctx_t *ctx, ec_key_t *key, uint32_t algo, 164 TEE_OperationMode mode); 165 TEE_Result rk_ecdsa_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out, 166 uint32_t in_len, uint32_t *out_len); 167 168 TEE_Result rk_sm2_pke(uint8_t *in, uint32_t in_len, uint8_t *out, 169 uint32_t *out_len, ec_key_t *key, uint32_t algo, 170 TEE_OperationMode mode); 171 TEE_Result rk_sm2_dsa_sm3(uint8_t *digest, uint32_t digest_len, 172 uint8_t *signature, uint32_t *signature_len, 173 ec_key_t *key, uint32_t algo, TEE_OperationMode mode); 174 TEE_Result rk_sm2_kep_genkey(rk_sm2_kep_parms *kep_parms, uint8_t *share_key, 175 uint32_t share_key_len, uint8_t *conf_out); 176 177 TEE_Result rk_mac_crypto(uint8_t *in, uint8_t *out, uint32_t in_len, 178 uint32_t *out_len, uint8_t *key, uint32_t key_len, 179 uint8_t *iv, uint32_t algo); 180 TEE_Result rk_mac_begin(crypto_ctx_t *ctx, uint8_t *key, uint32_t key_len, 181 uint8_t *iv, uint32_t algo); 182 TEE_Result rk_mac_update(crypto_ctx_t *ctx, uint8_t *in, uint32_t in_len); 183 TEE_Result rk_mac_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *mac, 184 uint32_t in_len, uint32_t *mac_len, rk_mac_mode_t mode); 185 186 TEE_Result rk_hkdf_genkey(uint8_t *ikm, uint32_t ikm_len, 187 uint8_t *salt, uint32_t salt_len, uint32_t *info, uint32_t info_len, 188 uint32_t algo, uint32_t okm_len, uint8_t *okm); 189 TEE_Result rk_pkcs5_pbkdf2_hmac(uint8_t *password, uint32_t password_len, 190 uint8_t *salt, uint32_t salt_len, uint32_t iterations, 191 uint32_t algo, uint32_t key_len, uint8_t *out_key); 192 193 #endif /* RK_CRYPTO_API_H */ 194