1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright (C) Foundries Ltd. 2022 4 * Author: Jorge Ramirez <jorge@foundries.io> 5 */ 6 7 #ifndef IPI_H 8 #define IPI_H 9 10 #include <drivers/versal_pmc.h> 11 12 struct versal_rsa_input_param { 13 uint64_t key_addr; 14 uint64_t data_addr; 15 uint32_t key_len; 16 }; 17 18 #if defined(PLATFORM_FLAVOR_net) 19 enum versal_rsa_opmode { 20 VERSAL_RSA_OPMODE_EXPQ = 0, 21 VERSAL_RSA_OPMODE_CRT, 22 VERSAL_RSA_OPMODE_EXPORT, 23 }; 24 25 struct versal_rsa_key_param { 26 uint64_t exp_addr; 27 uint64_t mod_addr; 28 uint64_t p_addr; 29 uint64_t q_addr; 30 uint64_t dp_addr; 31 uint64_t dq_addr; 32 uint64_t qinv_addr; 33 uint64_t tot_addr; 34 uint64_t rn_addr; 35 uint64_t rrn_addr; 36 uint32_t p_size; 37 uint32_t q_size; 38 uint32_t pubexp; 39 uint32_t is_prime_avail; 40 uint32_t is_privexp_avail; 41 uint32_t is_tot_avail; 42 uint32_t is_pubexp_avail; 43 enum versal_rsa_opmode opmode; 44 }; 45 #endif 46 47 struct versal_rsa_sign_param { 48 uint64_t sign_addr; 49 uint64_t hash_addr; 50 uint32_t hash_len; 51 }; 52 53 struct versal_ecc_sign_param { 54 uint64_t hash_addr; 55 uint64_t priv_key_addr; 56 uint64_t epriv_key_addr; 57 uint32_t curve; 58 uint32_t hash_len; 59 }; 60 61 struct versal_ecc_verify_param { 62 uint64_t hash_addr; 63 uint64_t pub_key_addr; 64 uint64_t signature_addr; 65 uint32_t curve; 66 uint32_t hash_len; 67 }; 68 69 enum versal_aes_operation { VERSAL_AES_ENCRYPT, VERSAL_AES_DECRYPT }; 70 71 struct versal_aes_init { 72 uint64_t iv_addr; 73 uint32_t operation; 74 uint32_t key_src; 75 uint32_t key_len; 76 }; 77 78 struct versal_aes_input_param { 79 uint64_t input_addr; 80 uint32_t input_len; 81 uint32_t is_last; 82 }; 83 84 enum versal_crypto_api { 85 VERSAL_FEATURES = 0U, 86 VERSAL_RSA_SIGN_VERIFY, 87 VERSAL_RSA_PUBLIC_ENCRYPT, 88 VERSAL_RSA_PRIVATE_DECRYPT, 89 VERSAL_SHA3_UPDATE, 90 VERSAL_ELLIPTIC_GENERATE_PUBLIC_KEY, 91 VERSAL_ELLIPTIC_GENERATE_SIGN, 92 VERSAL_ELLIPTIC_VALIDATE_PUBLIC_KEY, 93 VERSAL_ELLIPTIC_VERIFY_SIGN, 94 VERSAL_AES_INIT, 95 VERSAL_AES_OP_INIT, 96 VERSAL_AES_UPDATE_AAD, 97 VERSAL_AES_ENCRYPT_UPDATE, 98 VERSAL_AES_ENCRYPT_FINAL, 99 VERSAL_AES_DECRYPT_UPDATE, 100 VERSAL_AES_DECRYPT_FINAL, 101 VERSAL_AES_KEY_ZERO, 102 VERSAL_AES_WRITE_KEY, 103 VERSAL_AES_LOCK_USER_KEY, 104 VERSAL_AES_KEK_DECRYPT, 105 VERSAL_AES_SET_DPA_CM, 106 VERSAL_KAT, 107 VERSAL_TRNG_GENERATE, 108 VERSAL_AES_PERFORM_OPERATION, 109 VERSAL_CRYPTO_API_MAX 110 }; 111 112 enum versal_crypto_kat { 113 VERSAL_AES_DECRYPT_KAT = 0U, 114 VERSAL_AES_DECRYPT_CM_KAT, 115 VERSAL_RSA_PUB_ENC_KAT, 116 VERSAL_ELLIPTIC_SIGN_VERIFY_KAT, 117 VERSAL_SHA3_KAT, 118 VERSAL_AES_ENCRYPT_KAT, 119 VERSAL_RSA_PRIVATE_DEC_KAT, 120 VERSAL_ELLIPTIC_SIGN_GEN_KAT, 121 VERSAL_TRNG_KAT, 122 VERSAL_UPDATE_KAT_STATUS, 123 }; 124 125 #define VERSAL_MAX_IPI_REGS 6 126 127 struct versal_cmd_args { 128 uint32_t data[VERSAL_MAX_IPI_REGS]; 129 size_t dlen; 130 struct versal_ipi_buf ibuf[VERSAL_MAX_IPI_BUF]; 131 }; 132 133 TEE_Result versal_crypto_request(enum versal_crypto_api id, 134 struct versal_cmd_args *arg, uint32_t *err); 135 #endif 136 137