1c0ded849SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2c0ded849SHemant Agrawal * 3c0ded849SHemant Agrawal * Copyright 2008-2016 Freescale Semiconductor Inc. 4*83087a92SHemant Agrawal * Copyright 2016,2019-2021 NXP 5c0ded849SHemant Agrawal */ 6c0ded849SHemant Agrawal 7c0ded849SHemant Agrawal #ifndef __RTA_OPERATION_CMD_H__ 8c0ded849SHemant Agrawal #define __RTA_OPERATION_CMD_H__ 9c0ded849SHemant Agrawal 10c0ded849SHemant Agrawal extern enum rta_sec_era rta_sec_era; 11c0ded849SHemant Agrawal 12c0ded849SHemant Agrawal static inline int 13c0ded849SHemant Agrawal __rta_alg_aai_aes(uint16_t aai) 14c0ded849SHemant Agrawal { 15c0ded849SHemant Agrawal uint16_t aes_mode = aai & OP_ALG_AESA_MODE_MASK; 16c0ded849SHemant Agrawal 17c0ded849SHemant Agrawal if (aai & OP_ALG_AAI_C2K) { 18c0ded849SHemant Agrawal if ((aes_mode != OP_ALG_AAI_CCM) && 19c0ded849SHemant Agrawal (aes_mode != OP_ALG_AAI_GCM)) 20c0ded849SHemant Agrawal return -EINVAL; 21c0ded849SHemant Agrawal } 22c0ded849SHemant Agrawal 23c0ded849SHemant Agrawal switch (aes_mode) { 24c0ded849SHemant Agrawal case OP_ALG_AAI_CBC_CMAC: 25c0ded849SHemant Agrawal case OP_ALG_AAI_CTR_CMAC_LTE: 26c0ded849SHemant Agrawal case OP_ALG_AAI_CTR_CMAC: 27c0ded849SHemant Agrawal case OP_ALG_AAI_CTR: 28c0ded849SHemant Agrawal case OP_ALG_AAI_CBC: 29c0ded849SHemant Agrawal case OP_ALG_AAI_ECB: 30c0ded849SHemant Agrawal case OP_ALG_AAI_OFB: 31c0ded849SHemant Agrawal case OP_ALG_AAI_CFB: 32c0ded849SHemant Agrawal case OP_ALG_AAI_XTS: 33c0ded849SHemant Agrawal case OP_ALG_AAI_CMAC: 34c0ded849SHemant Agrawal case OP_ALG_AAI_XCBC_MAC: 35c0ded849SHemant Agrawal case OP_ALG_AAI_CCM: 36c0ded849SHemant Agrawal case OP_ALG_AAI_GCM: 37c0ded849SHemant Agrawal case OP_ALG_AAI_CBC_XCBCMAC: 38c0ded849SHemant Agrawal case OP_ALG_AAI_CTR_XCBCMAC: 39c0ded849SHemant Agrawal return 0; 40c0ded849SHemant Agrawal } 41c0ded849SHemant Agrawal 42c0ded849SHemant Agrawal return -EINVAL; 43c0ded849SHemant Agrawal } 44c0ded849SHemant Agrawal 45c0ded849SHemant Agrawal static inline int 46c0ded849SHemant Agrawal __rta_alg_aai_des(uint16_t aai) 47c0ded849SHemant Agrawal { 48c0ded849SHemant Agrawal uint16_t aai_code = (uint16_t)(aai & ~OP_ALG_AAI_CHECKODD); 49c0ded849SHemant Agrawal 50c0ded849SHemant Agrawal switch (aai_code) { 51c0ded849SHemant Agrawal case OP_ALG_AAI_CBC: 52c0ded849SHemant Agrawal case OP_ALG_AAI_ECB: 53c0ded849SHemant Agrawal case OP_ALG_AAI_CFB: 54c0ded849SHemant Agrawal case OP_ALG_AAI_OFB: 55c0ded849SHemant Agrawal return 0; 56c0ded849SHemant Agrawal } 57c0ded849SHemant Agrawal 58c0ded849SHemant Agrawal return -EINVAL; 59c0ded849SHemant Agrawal } 60c0ded849SHemant Agrawal 61c0ded849SHemant Agrawal static inline int 62c0ded849SHemant Agrawal __rta_alg_aai_md5(uint16_t aai) 63c0ded849SHemant Agrawal { 64c0ded849SHemant Agrawal switch (aai) { 65c0ded849SHemant Agrawal case OP_ALG_AAI_HMAC: 66c0ded849SHemant Agrawal case OP_ALG_AAI_SMAC: 67c0ded849SHemant Agrawal case OP_ALG_AAI_HASH: 68c0ded849SHemant Agrawal case OP_ALG_AAI_HMAC_PRECOMP: 69c0ded849SHemant Agrawal return 0; 70c0ded849SHemant Agrawal } 71c0ded849SHemant Agrawal 72c0ded849SHemant Agrawal return -EINVAL; 73c0ded849SHemant Agrawal } 74c0ded849SHemant Agrawal 75c0ded849SHemant Agrawal static inline int 76c0ded849SHemant Agrawal __rta_alg_aai_sha(uint16_t aai) 77c0ded849SHemant Agrawal { 78c0ded849SHemant Agrawal switch (aai) { 79c0ded849SHemant Agrawal case OP_ALG_AAI_HMAC: 80c0ded849SHemant Agrawal case OP_ALG_AAI_HASH: 81c0ded849SHemant Agrawal case OP_ALG_AAI_HMAC_PRECOMP: 82c0ded849SHemant Agrawal return 0; 83c0ded849SHemant Agrawal } 84c0ded849SHemant Agrawal 85c0ded849SHemant Agrawal return -EINVAL; 86c0ded849SHemant Agrawal } 87c0ded849SHemant Agrawal 88c0ded849SHemant Agrawal static inline int 89c0ded849SHemant Agrawal __rta_alg_aai_rng(uint16_t aai) 90c0ded849SHemant Agrawal { 91c0ded849SHemant Agrawal uint16_t rng_mode = aai & OP_ALG_RNG_MODE_MASK; 92c0ded849SHemant Agrawal uint16_t rng_sh = aai & OP_ALG_AAI_RNG4_SH_MASK; 93c0ded849SHemant Agrawal 94c0ded849SHemant Agrawal switch (rng_mode) { 95c0ded849SHemant Agrawal case OP_ALG_AAI_RNG: 96c0ded849SHemant Agrawal case OP_ALG_AAI_RNG_NZB: 97c0ded849SHemant Agrawal case OP_ALG_AAI_RNG_OBP: 98c0ded849SHemant Agrawal break; 99c0ded849SHemant Agrawal default: 100c0ded849SHemant Agrawal return -EINVAL; 101c0ded849SHemant Agrawal } 102c0ded849SHemant Agrawal 103c0ded849SHemant Agrawal switch (rng_sh) { 104c0ded849SHemant Agrawal case OP_ALG_AAI_RNG4_SH_0: 105c0ded849SHemant Agrawal case OP_ALG_AAI_RNG4_SH_1: 106c0ded849SHemant Agrawal return 0; 107c0ded849SHemant Agrawal } 108c0ded849SHemant Agrawal 109c0ded849SHemant Agrawal return -EINVAL; 110c0ded849SHemant Agrawal } 111c0ded849SHemant Agrawal 112c0ded849SHemant Agrawal static inline int 113c0ded849SHemant Agrawal __rta_alg_aai_crc(uint16_t aai) 114c0ded849SHemant Agrawal { 115c0ded849SHemant Agrawal uint16_t aai_code = aai & OP_ALG_CRC_POLY_MASK; 116c0ded849SHemant Agrawal 117c0ded849SHemant Agrawal switch (aai_code) { 118c0ded849SHemant Agrawal case OP_ALG_AAI_802: 119c0ded849SHemant Agrawal case OP_ALG_AAI_3385: 120c0ded849SHemant Agrawal case OP_ALG_AAI_CUST_POLY: 121c0ded849SHemant Agrawal return 0; 122c0ded849SHemant Agrawal } 123c0ded849SHemant Agrawal 124c0ded849SHemant Agrawal return -EINVAL; 125c0ded849SHemant Agrawal } 126c0ded849SHemant Agrawal 127c0ded849SHemant Agrawal static inline int 128c0ded849SHemant Agrawal __rta_alg_aai_kasumi(uint16_t aai) 129c0ded849SHemant Agrawal { 130c0ded849SHemant Agrawal switch (aai) { 131c0ded849SHemant Agrawal case OP_ALG_AAI_GSM: 132c0ded849SHemant Agrawal case OP_ALG_AAI_EDGE: 133c0ded849SHemant Agrawal case OP_ALG_AAI_F8: 134c0ded849SHemant Agrawal case OP_ALG_AAI_F9: 135c0ded849SHemant Agrawal return 0; 136c0ded849SHemant Agrawal } 137c0ded849SHemant Agrawal 138c0ded849SHemant Agrawal return -EINVAL; 139c0ded849SHemant Agrawal } 140c0ded849SHemant Agrawal 141c0ded849SHemant Agrawal static inline int 142c0ded849SHemant Agrawal __rta_alg_aai_snow_f9(uint16_t aai) 143c0ded849SHemant Agrawal { 144c0ded849SHemant Agrawal if (aai == OP_ALG_AAI_F9) 145c0ded849SHemant Agrawal return 0; 146c0ded849SHemant Agrawal 147c0ded849SHemant Agrawal return -EINVAL; 148c0ded849SHemant Agrawal } 149c0ded849SHemant Agrawal 150c0ded849SHemant Agrawal static inline int 151c0ded849SHemant Agrawal __rta_alg_aai_snow_f8(uint16_t aai) 152c0ded849SHemant Agrawal { 153c0ded849SHemant Agrawal if (aai == OP_ALG_AAI_F8) 154c0ded849SHemant Agrawal return 0; 155c0ded849SHemant Agrawal 156c0ded849SHemant Agrawal return -EINVAL; 157c0ded849SHemant Agrawal } 158c0ded849SHemant Agrawal 159c0ded849SHemant Agrawal static inline int 160c0ded849SHemant Agrawal __rta_alg_aai_zuce(uint16_t aai) 161c0ded849SHemant Agrawal { 162c0ded849SHemant Agrawal if (aai == OP_ALG_AAI_F8) 163c0ded849SHemant Agrawal return 0; 164c0ded849SHemant Agrawal 165c0ded849SHemant Agrawal return -EINVAL; 166c0ded849SHemant Agrawal } 167c0ded849SHemant Agrawal 168c0ded849SHemant Agrawal static inline int 169c0ded849SHemant Agrawal __rta_alg_aai_zuca(uint16_t aai) 170c0ded849SHemant Agrawal { 171c0ded849SHemant Agrawal if (aai == OP_ALG_AAI_F9) 172c0ded849SHemant Agrawal return 0; 173c0ded849SHemant Agrawal 174c0ded849SHemant Agrawal return -EINVAL; 175c0ded849SHemant Agrawal } 176c0ded849SHemant Agrawal 177c0ded849SHemant Agrawal struct alg_aai_map { 178c0ded849SHemant Agrawal uint32_t chipher_algo; 179c0ded849SHemant Agrawal int (*aai_func)(uint16_t); 180c0ded849SHemant Agrawal uint32_t class; 181c0ded849SHemant Agrawal }; 182c0ded849SHemant Agrawal 183c0ded849SHemant Agrawal static const struct alg_aai_map alg_table[] = { 184c0ded849SHemant Agrawal /*1*/ { OP_ALG_ALGSEL_AES, __rta_alg_aai_aes, OP_TYPE_CLASS1_ALG }, 185c0ded849SHemant Agrawal { OP_ALG_ALGSEL_DES, __rta_alg_aai_des, OP_TYPE_CLASS1_ALG }, 186c0ded849SHemant Agrawal { OP_ALG_ALGSEL_3DES, __rta_alg_aai_des, OP_TYPE_CLASS1_ALG }, 187c0ded849SHemant Agrawal { OP_ALG_ALGSEL_MD5, __rta_alg_aai_md5, OP_TYPE_CLASS2_ALG }, 188c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SHA1, __rta_alg_aai_md5, OP_TYPE_CLASS2_ALG }, 189c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SHA224, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG }, 190c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SHA256, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG }, 191c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SHA384, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG }, 192c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SHA512, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG }, 193c0ded849SHemant Agrawal { OP_ALG_ALGSEL_RNG, __rta_alg_aai_rng, OP_TYPE_CLASS1_ALG }, 194c0ded849SHemant Agrawal /*11*/ { OP_ALG_ALGSEL_CRC, __rta_alg_aai_crc, OP_TYPE_CLASS2_ALG }, 195c0ded849SHemant Agrawal { OP_ALG_ALGSEL_ARC4, NULL, OP_TYPE_CLASS1_ALG }, 196c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SNOW_F8, __rta_alg_aai_snow_f8, OP_TYPE_CLASS1_ALG }, 197c0ded849SHemant Agrawal /*14*/ { OP_ALG_ALGSEL_KASUMI, __rta_alg_aai_kasumi, OP_TYPE_CLASS1_ALG }, 198c0ded849SHemant Agrawal { OP_ALG_ALGSEL_SNOW_F9, __rta_alg_aai_snow_f9, OP_TYPE_CLASS2_ALG }, 199c0ded849SHemant Agrawal { OP_ALG_ALGSEL_ZUCE, __rta_alg_aai_zuce, OP_TYPE_CLASS1_ALG }, 200c0ded849SHemant Agrawal /*17*/ { OP_ALG_ALGSEL_ZUCA, __rta_alg_aai_zuca, OP_TYPE_CLASS2_ALG } 201c0ded849SHemant Agrawal }; 202c0ded849SHemant Agrawal 203c0ded849SHemant Agrawal /* 204c0ded849SHemant Agrawal * Allowed OPERATION algorithms for each SEC Era. 205c0ded849SHemant Agrawal * Values represent the number of entries from alg_table[] that are supported. 206c0ded849SHemant Agrawal */ 207c0ded849SHemant Agrawal static const unsigned int alg_table_sz[] = {14, 15, 15, 15, 17, 17, 208c0ded849SHemant Agrawal 11, 17, 17, 17}; 209c0ded849SHemant Agrawal 210c0ded849SHemant Agrawal static inline int 211c0ded849SHemant Agrawal rta_operation(struct program *program, uint32_t cipher_algo, 212c0ded849SHemant Agrawal uint16_t aai, uint8_t algo_state, 213c0ded849SHemant Agrawal int icv_checking, int enc) 214c0ded849SHemant Agrawal { 215c0ded849SHemant Agrawal uint32_t opcode = CMD_OPERATION; 216c0ded849SHemant Agrawal unsigned int i, found = 0; 217c0ded849SHemant Agrawal unsigned int start_pc = program->current_pc; 218c0ded849SHemant Agrawal int ret; 219c0ded849SHemant Agrawal 220c0ded849SHemant Agrawal for (i = 0; i < alg_table_sz[rta_sec_era]; i++) { 221c0ded849SHemant Agrawal if (alg_table[i].chipher_algo == cipher_algo) { 222caf84d61SAkhil Goyal if ((aai == OP_ALG_AAI_XCBC_MAC) || 223caf84d61SAkhil Goyal (aai == OP_ALG_AAI_CBC_XCBCMAC)) 224caf84d61SAkhil Goyal opcode |= cipher_algo | OP_TYPE_CLASS2_ALG; 225caf84d61SAkhil Goyal else 226c0ded849SHemant Agrawal opcode |= cipher_algo | alg_table[i].class; 227c0ded849SHemant Agrawal /* nothing else to verify */ 228c0ded849SHemant Agrawal if (alg_table[i].aai_func == NULL) { 229c0ded849SHemant Agrawal found = 1; 230c0ded849SHemant Agrawal break; 231c0ded849SHemant Agrawal } 232c0ded849SHemant Agrawal 233c0ded849SHemant Agrawal aai &= OP_ALG_AAI_MASK; 234c0ded849SHemant Agrawal 235c0ded849SHemant Agrawal ret = (*alg_table[i].aai_func)(aai); 236c0ded849SHemant Agrawal if (ret < 0) { 237c0ded849SHemant Agrawal pr_err("OPERATION: Bad AAI Type. SEC Program Line: %d\n", 238c0ded849SHemant Agrawal program->current_pc); 239c0ded849SHemant Agrawal goto err; 240c0ded849SHemant Agrawal } 241c0ded849SHemant Agrawal opcode |= aai; 242c0ded849SHemant Agrawal found = 1; 243c0ded849SHemant Agrawal break; 244c0ded849SHemant Agrawal } 245c0ded849SHemant Agrawal } 246c0ded849SHemant Agrawal if (!found) { 247c0ded849SHemant Agrawal pr_err("OPERATION: Invalid Command. SEC Program Line: %d\n", 248c0ded849SHemant Agrawal program->current_pc); 249c0ded849SHemant Agrawal ret = -EINVAL; 250c0ded849SHemant Agrawal goto err; 251c0ded849SHemant Agrawal } 252c0ded849SHemant Agrawal 253c0ded849SHemant Agrawal switch (algo_state) { 254c0ded849SHemant Agrawal case OP_ALG_AS_UPDATE: 255c0ded849SHemant Agrawal case OP_ALG_AS_INIT: 256c0ded849SHemant Agrawal case OP_ALG_AS_FINALIZE: 257c0ded849SHemant Agrawal case OP_ALG_AS_INITFINAL: 258c0ded849SHemant Agrawal opcode |= algo_state; 259c0ded849SHemant Agrawal break; 260c0ded849SHemant Agrawal default: 261c0ded849SHemant Agrawal pr_err("Invalid Operation Command\n"); 262c0ded849SHemant Agrawal ret = -EINVAL; 263c0ded849SHemant Agrawal goto err; 264c0ded849SHemant Agrawal } 265c0ded849SHemant Agrawal 266c0ded849SHemant Agrawal switch (icv_checking) { 267c0ded849SHemant Agrawal case ICV_CHECK_DISABLE: 268c0ded849SHemant Agrawal /* 269c0ded849SHemant Agrawal * opcode |= OP_ALG_ICV_OFF; 270c0ded849SHemant Agrawal * OP_ALG_ICV_OFF is 0 271c0ded849SHemant Agrawal */ 272c0ded849SHemant Agrawal break; 273c0ded849SHemant Agrawal case ICV_CHECK_ENABLE: 274c0ded849SHemant Agrawal opcode |= OP_ALG_ICV_ON; 275c0ded849SHemant Agrawal break; 276c0ded849SHemant Agrawal default: 277c0ded849SHemant Agrawal pr_err("Invalid Operation Command\n"); 278c0ded849SHemant Agrawal ret = -EINVAL; 279c0ded849SHemant Agrawal goto err; 280c0ded849SHemant Agrawal } 281c0ded849SHemant Agrawal 282c0ded849SHemant Agrawal switch (enc) { 283c0ded849SHemant Agrawal case DIR_DEC: 284c0ded849SHemant Agrawal /* 285c0ded849SHemant Agrawal * opcode |= OP_ALG_DECRYPT; 286c0ded849SHemant Agrawal * OP_ALG_DECRYPT is 0 287c0ded849SHemant Agrawal */ 288c0ded849SHemant Agrawal break; 289c0ded849SHemant Agrawal case DIR_ENC: 290c0ded849SHemant Agrawal opcode |= OP_ALG_ENCRYPT; 291c0ded849SHemant Agrawal break; 292c0ded849SHemant Agrawal default: 293c0ded849SHemant Agrawal pr_err("Invalid Operation Command\n"); 294c0ded849SHemant Agrawal ret = -EINVAL; 295c0ded849SHemant Agrawal goto err; 296c0ded849SHemant Agrawal } 297c0ded849SHemant Agrawal 298c0ded849SHemant Agrawal __rta_out32(program, opcode); 299c0ded849SHemant Agrawal program->current_instruction++; 300c0ded849SHemant Agrawal return (int)start_pc; 301c0ded849SHemant Agrawal 302c0ded849SHemant Agrawal err: 303c0ded849SHemant Agrawal program->first_error_pc = start_pc; 304c0ded849SHemant Agrawal return ret; 305c0ded849SHemant Agrawal } 306c0ded849SHemant Agrawal 307*83087a92SHemant Agrawal /* For non-proto offload CMAC, GMAC etc cases */ 308*83087a92SHemant Agrawal static inline int 309*83087a92SHemant Agrawal rta_operation2(struct program *program, uint32_t cipher_algo, 310*83087a92SHemant Agrawal uint16_t aai, uint8_t algo_state, 311*83087a92SHemant Agrawal int icv_checking, int enc) 312*83087a92SHemant Agrawal { 313*83087a92SHemant Agrawal uint32_t opcode = CMD_OPERATION; 314*83087a92SHemant Agrawal unsigned int i, found = 0; 315*83087a92SHemant Agrawal unsigned int start_pc = program->current_pc; 316*83087a92SHemant Agrawal int ret; 317*83087a92SHemant Agrawal 318*83087a92SHemant Agrawal for (i = 0; i < alg_table_sz[rta_sec_era]; i++) { 319*83087a92SHemant Agrawal if (alg_table[i].chipher_algo == cipher_algo) { 320*83087a92SHemant Agrawal if ((aai == OP_ALG_AAI_XCBC_MAC) || 321*83087a92SHemant Agrawal (aai == OP_ALG_AAI_CBC_XCBCMAC) || 322*83087a92SHemant Agrawal (aai == OP_ALG_AAI_CMAC)) 323*83087a92SHemant Agrawal opcode |= cipher_algo | OP_TYPE_CLASS2_ALG; 324*83087a92SHemant Agrawal else 325*83087a92SHemant Agrawal opcode |= cipher_algo | alg_table[i].class; 326*83087a92SHemant Agrawal /* nothing else to verify */ 327*83087a92SHemant Agrawal if (alg_table[i].aai_func == NULL) { 328*83087a92SHemant Agrawal found = 1; 329*83087a92SHemant Agrawal break; 330*83087a92SHemant Agrawal } 331*83087a92SHemant Agrawal 332*83087a92SHemant Agrawal aai &= OP_ALG_AAI_MASK; 333*83087a92SHemant Agrawal 334*83087a92SHemant Agrawal ret = (*alg_table[i].aai_func)(aai); 335*83087a92SHemant Agrawal if (ret < 0) { 336*83087a92SHemant Agrawal pr_err("OPERATION: Bad AAI Type. SEC Program Line: %d\n", 337*83087a92SHemant Agrawal program->current_pc); 338*83087a92SHemant Agrawal goto err; 339*83087a92SHemant Agrawal } 340*83087a92SHemant Agrawal opcode |= aai; 341*83087a92SHemant Agrawal found = 1; 342*83087a92SHemant Agrawal break; 343*83087a92SHemant Agrawal } 344*83087a92SHemant Agrawal } 345*83087a92SHemant Agrawal if (!found) { 346*83087a92SHemant Agrawal pr_err("OPERATION: Invalid Command. SEC Program Line: %d\n", 347*83087a92SHemant Agrawal program->current_pc); 348*83087a92SHemant Agrawal ret = -EINVAL; 349*83087a92SHemant Agrawal goto err; 350*83087a92SHemant Agrawal } 351*83087a92SHemant Agrawal 352*83087a92SHemant Agrawal switch (algo_state) { 353*83087a92SHemant Agrawal case OP_ALG_AS_UPDATE: 354*83087a92SHemant Agrawal case OP_ALG_AS_INIT: 355*83087a92SHemant Agrawal case OP_ALG_AS_FINALIZE: 356*83087a92SHemant Agrawal case OP_ALG_AS_INITFINAL: 357*83087a92SHemant Agrawal opcode |= algo_state; 358*83087a92SHemant Agrawal break; 359*83087a92SHemant Agrawal default: 360*83087a92SHemant Agrawal pr_err("Invalid Operation Command\n"); 361*83087a92SHemant Agrawal ret = -EINVAL; 362*83087a92SHemant Agrawal goto err; 363*83087a92SHemant Agrawal } 364*83087a92SHemant Agrawal 365*83087a92SHemant Agrawal switch (icv_checking) { 366*83087a92SHemant Agrawal case ICV_CHECK_DISABLE: 367*83087a92SHemant Agrawal /* 368*83087a92SHemant Agrawal * opcode |= OP_ALG_ICV_OFF; 369*83087a92SHemant Agrawal * OP_ALG_ICV_OFF is 0 370*83087a92SHemant Agrawal */ 371*83087a92SHemant Agrawal break; 372*83087a92SHemant Agrawal case ICV_CHECK_ENABLE: 373*83087a92SHemant Agrawal opcode |= OP_ALG_ICV_ON; 374*83087a92SHemant Agrawal break; 375*83087a92SHemant Agrawal default: 376*83087a92SHemant Agrawal pr_err("Invalid Operation Command\n"); 377*83087a92SHemant Agrawal ret = -EINVAL; 378*83087a92SHemant Agrawal goto err; 379*83087a92SHemant Agrawal } 380*83087a92SHemant Agrawal 381*83087a92SHemant Agrawal switch (enc) { 382*83087a92SHemant Agrawal case DIR_DEC: 383*83087a92SHemant Agrawal /* 384*83087a92SHemant Agrawal * opcode |= OP_ALG_DECRYPT; 385*83087a92SHemant Agrawal * OP_ALG_DECRYPT is 0 386*83087a92SHemant Agrawal */ 387*83087a92SHemant Agrawal break; 388*83087a92SHemant Agrawal case DIR_ENC: 389*83087a92SHemant Agrawal opcode |= OP_ALG_ENCRYPT; 390*83087a92SHemant Agrawal break; 391*83087a92SHemant Agrawal default: 392*83087a92SHemant Agrawal pr_err("Invalid Operation Command\n"); 393*83087a92SHemant Agrawal ret = -EINVAL; 394*83087a92SHemant Agrawal goto err; 395*83087a92SHemant Agrawal } 396*83087a92SHemant Agrawal 397*83087a92SHemant Agrawal __rta_out32(program, opcode); 398*83087a92SHemant Agrawal program->current_instruction++; 399*83087a92SHemant Agrawal return (int)start_pc; 400*83087a92SHemant Agrawal 401*83087a92SHemant Agrawal err: 402*83087a92SHemant Agrawal program->first_error_pc = start_pc; 403*83087a92SHemant Agrawal return ret; 404*83087a92SHemant Agrawal } 405*83087a92SHemant Agrawal 406c0ded849SHemant Agrawal /* 407c0ded849SHemant Agrawal * OPERATION PKHA routines 408c0ded849SHemant Agrawal */ 409c0ded849SHemant Agrawal static inline int 410c0ded849SHemant Agrawal __rta_pkha_clearmem(uint32_t pkha_op) 411c0ded849SHemant Agrawal { 412c0ded849SHemant Agrawal switch (pkha_op) { 413c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_ALL): 414c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_ABE): 415c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_ABN): 416c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_AB): 417c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_AEN): 418c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_AE): 419c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_AN): 420c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_A): 421c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_BEN): 422c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_BE): 423c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_BN): 424c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_B): 425c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_EN): 426c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_N): 427c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM_E): 428c0ded849SHemant Agrawal return 0; 429c0ded849SHemant Agrawal } 430c0ded849SHemant Agrawal 431c0ded849SHemant Agrawal return -EINVAL; 432c0ded849SHemant Agrawal } 433c0ded849SHemant Agrawal 434c0ded849SHemant Agrawal static inline int 435c0ded849SHemant Agrawal __rta_pkha_mod_arithmetic(uint32_t pkha_op) 436c0ded849SHemant Agrawal { 437c0ded849SHemant Agrawal pkha_op &= (uint32_t)~OP_ALG_PKMODE_OUT_A; 438c0ded849SHemant Agrawal 439c0ded849SHemant Agrawal switch (pkha_op) { 440c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_ADD): 441c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_SUB_AB): 442c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_SUB_BA): 443c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_MULT): 444c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_MULT_IM): 445c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_MULT_IM_OM): 446c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_EXPO): 447c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_EXPO_TEQ): 448c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_EXPO_IM): 449c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_EXPO_IM_TEQ): 450c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_REDUCT): 451c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_INV): 452c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_MONT_CNST): 453c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_CRT_CNST): 454c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_GCD): 455c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_PRIMALITY): 456c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_SML_EXP): 457c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_ADD): 458c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_MUL): 459c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_MUL_IM): 460c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_MUL_IM_OM): 461c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_EXP): 462c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_EXP_TEQ): 463c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_AMODN): 464c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_INV): 465c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_R2): 466c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_GCD): 467c0ded849SHemant Agrawal case (OP_ALG_PKMODE_F2M_SML_EXP): 468c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_ADD): 469c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_ADD_IM_OM_PROJ): 470c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_DBL): 471c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_DBL_IM_OM_PROJ): 472c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_MUL): 473c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_MUL_TEQ): 474c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_MUL_R2): 475c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_TEQ): 476c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_PROJ): 477c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_PROJ_TEQ): 478c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_ADD): 479c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_ADD_IM_OM_PROJ): 480c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_DBL): 481c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_DBL_IM_OM_PROJ): 482c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL): 483c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL_TEQ): 484c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL_R2): 485c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_TEQ): 486c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_PROJ): 487c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_PROJ_TEQ): 488c0ded849SHemant Agrawal return 0; 489c0ded849SHemant Agrawal } 490c0ded849SHemant Agrawal 491c0ded849SHemant Agrawal return -EINVAL; 492c0ded849SHemant Agrawal } 493c0ded849SHemant Agrawal 494c0ded849SHemant Agrawal static inline int 495c0ded849SHemant Agrawal __rta_pkha_copymem(uint32_t pkha_op) 496c0ded849SHemant Agrawal { 497c0ded849SHemant Agrawal switch (pkha_op) { 498c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A0_B0): 499c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A0_B1): 500c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A0_B2): 501c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A0_B3): 502c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A1_B0): 503c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A1_B1): 504c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A1_B2): 505c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A1_B3): 506c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A2_B0): 507c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A2_B1): 508c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A2_B2): 509c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A2_B3): 510c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A3_B0): 511c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A3_B1): 512c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A3_B2): 513c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A3_B3): 514c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B0_A0): 515c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B0_A1): 516c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B0_A2): 517c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B0_A3): 518c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B1_A0): 519c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B1_A1): 520c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B1_A2): 521c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B1_A3): 522c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B2_A0): 523c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B2_A1): 524c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B2_A2): 525c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B2_A3): 526c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B3_A0): 527c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B3_A1): 528c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B3_A2): 529c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B3_A3): 530c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A_E): 531c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_A_N): 532c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B_E): 533c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_B_N): 534c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_N_A): 535c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_N_B): 536c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ_N_E): 537c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A0_B0): 538c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A0_B1): 539c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A0_B2): 540c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A0_B3): 541c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A1_B0): 542c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A1_B1): 543c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A1_B2): 544c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A1_B3): 545c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A2_B0): 546c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A2_B1): 547c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A2_B2): 548c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A2_B3): 549c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A3_B0): 550c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A3_B1): 551c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A3_B2): 552c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A3_B3): 553c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B0_A0): 554c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B0_A1): 555c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B0_A2): 556c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B0_A3): 557c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B1_A0): 558c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B1_A1): 559c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B1_A2): 560c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B1_A3): 561c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B2_A0): 562c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B2_A1): 563c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B2_A2): 564c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B2_A3): 565c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B3_A0): 566c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B3_A1): 567c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B3_A2): 568c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B3_A3): 569c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A_E): 570c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_A_N): 571c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B_E): 572c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_B_N): 573c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_N_A): 574c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_N_B): 575c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ_N_E): 576c0ded849SHemant Agrawal return 0; 577c0ded849SHemant Agrawal } 578c0ded849SHemant Agrawal 579c0ded849SHemant Agrawal return -EINVAL; 580c0ded849SHemant Agrawal } 581c0ded849SHemant Agrawal 582c0ded849SHemant Agrawal static inline int 583c0ded849SHemant Agrawal rta_pkha_operation(struct program *program, uint32_t op_pkha) 584c0ded849SHemant Agrawal { 585c0ded849SHemant Agrawal uint32_t opcode = CMD_OPERATION | OP_TYPE_PK | OP_ALG_PK; 586c0ded849SHemant Agrawal uint32_t pkha_func; 587c0ded849SHemant Agrawal unsigned int start_pc = program->current_pc; 588c0ded849SHemant Agrawal int ret = -EINVAL; 589c0ded849SHemant Agrawal 590c0ded849SHemant Agrawal pkha_func = op_pkha & OP_ALG_PK_FUN_MASK; 591c0ded849SHemant Agrawal 592c0ded849SHemant Agrawal switch (pkha_func) { 593c0ded849SHemant Agrawal case (OP_ALG_PKMODE_CLEARMEM): 594c0ded849SHemant Agrawal ret = __rta_pkha_clearmem(op_pkha); 595c0ded849SHemant Agrawal if (ret < 0) { 596c0ded849SHemant Agrawal pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n", 597c0ded849SHemant Agrawal program->current_pc); 598c0ded849SHemant Agrawal goto err; 599c0ded849SHemant Agrawal } 600c0ded849SHemant Agrawal break; 601c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_ADD): 602c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_SUB_AB): 603c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_SUB_BA): 604c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_MULT): 605c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_EXPO): 606c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_REDUCT): 607c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_INV): 608c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_MONT_CNST): 609c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_CRT_CNST): 610c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_GCD): 611c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_PRIMALITY): 612c0ded849SHemant Agrawal case (OP_ALG_PKMODE_MOD_SML_EXP): 613c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_ADD): 614c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_DBL): 615c0ded849SHemant Agrawal case (OP_ALG_PKMODE_ECC_MOD_MUL): 616c0ded849SHemant Agrawal ret = __rta_pkha_mod_arithmetic(op_pkha); 617c0ded849SHemant Agrawal if (ret < 0) { 618c0ded849SHemant Agrawal pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n", 619c0ded849SHemant Agrawal program->current_pc); 620c0ded849SHemant Agrawal goto err; 621c0ded849SHemant Agrawal } 622c0ded849SHemant Agrawal break; 623c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_NSZ): 624c0ded849SHemant Agrawal case (OP_ALG_PKMODE_COPY_SSZ): 625c0ded849SHemant Agrawal ret = __rta_pkha_copymem(op_pkha); 626c0ded849SHemant Agrawal if (ret < 0) { 627c0ded849SHemant Agrawal pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n", 628c0ded849SHemant Agrawal program->current_pc); 629c0ded849SHemant Agrawal goto err; 630c0ded849SHemant Agrawal } 631c0ded849SHemant Agrawal break; 632c0ded849SHemant Agrawal default: 633c0ded849SHemant Agrawal pr_err("Invalid Operation Command\n"); 634c0ded849SHemant Agrawal goto err; 635c0ded849SHemant Agrawal } 636c0ded849SHemant Agrawal 637c0ded849SHemant Agrawal opcode |= op_pkha; 638c0ded849SHemant Agrawal 639c0ded849SHemant Agrawal __rta_out32(program, opcode); 640c0ded849SHemant Agrawal program->current_instruction++; 641c0ded849SHemant Agrawal return (int)start_pc; 642c0ded849SHemant Agrawal 643c0ded849SHemant Agrawal err: 644c0ded849SHemant Agrawal program->first_error_pc = start_pc; 645c0ded849SHemant Agrawal program->current_instruction++; 646c0ded849SHemant Agrawal return ret; 647c0ded849SHemant Agrawal } 648c0ded849SHemant Agrawal 649c0ded849SHemant Agrawal #endif /* __RTA_OPERATION_CMD_H__ */ 650