1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2016 Cavium, Inc. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _CPTVF_ALGS_H_ 7*4882a593Smuzhiyun #define _CPTVF_ALGS_H_ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "request_manager.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define MAX_DEVICES 16 12*4882a593Smuzhiyun #define MAJOR_OP_FC 0x33 13*4882a593Smuzhiyun #define MAX_ENC_KEY_SIZE 32 14*4882a593Smuzhiyun #define MAX_HASH_KEY_SIZE 64 15*4882a593Smuzhiyun #define MAX_KEY_SIZE (MAX_ENC_KEY_SIZE + MAX_HASH_KEY_SIZE) 16*4882a593Smuzhiyun #define CONTROL_WORD_LEN 8 17*4882a593Smuzhiyun #define KEY2_OFFSET 48 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define DMA_MODE_FLAG(dma_mode) \ 20*4882a593Smuzhiyun (((dma_mode) == DMA_GATHER_SCATTER) ? (1 << 7) : 0) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum req_type { 23*4882a593Smuzhiyun AE_CORE_REQ, 24*4882a593Smuzhiyun SE_CORE_REQ, 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun enum cipher_type { 28*4882a593Smuzhiyun DES3_CBC = 0x1, 29*4882a593Smuzhiyun DES3_ECB = 0x2, 30*4882a593Smuzhiyun AES_CBC = 0x3, 31*4882a593Smuzhiyun AES_ECB = 0x4, 32*4882a593Smuzhiyun AES_CFB = 0x5, 33*4882a593Smuzhiyun AES_CTR = 0x6, 34*4882a593Smuzhiyun AES_GCM = 0x7, 35*4882a593Smuzhiyun AES_XTS = 0x8 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun enum aes_type { 39*4882a593Smuzhiyun AES_128_BIT = 0x1, 40*4882a593Smuzhiyun AES_192_BIT = 0x2, 41*4882a593Smuzhiyun AES_256_BIT = 0x3 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun union encr_ctrl { 45*4882a593Smuzhiyun u64 flags; 46*4882a593Smuzhiyun struct { 47*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 48*4882a593Smuzhiyun u64 enc_cipher:4; 49*4882a593Smuzhiyun u64 reserved1:1; 50*4882a593Smuzhiyun u64 aes_key:2; 51*4882a593Smuzhiyun u64 iv_source:1; 52*4882a593Smuzhiyun u64 hash_type:4; 53*4882a593Smuzhiyun u64 reserved2:3; 54*4882a593Smuzhiyun u64 auth_input_type:1; 55*4882a593Smuzhiyun u64 mac_len:8; 56*4882a593Smuzhiyun u64 reserved3:8; 57*4882a593Smuzhiyun u64 encr_offset:16; 58*4882a593Smuzhiyun u64 iv_offset:8; 59*4882a593Smuzhiyun u64 auth_offset:8; 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun u64 auth_offset:8; 62*4882a593Smuzhiyun u64 iv_offset:8; 63*4882a593Smuzhiyun u64 encr_offset:16; 64*4882a593Smuzhiyun u64 reserved3:8; 65*4882a593Smuzhiyun u64 mac_len:8; 66*4882a593Smuzhiyun u64 auth_input_type:1; 67*4882a593Smuzhiyun u64 reserved2:3; 68*4882a593Smuzhiyun u64 hash_type:4; 69*4882a593Smuzhiyun u64 iv_source:1; 70*4882a593Smuzhiyun u64 aes_key:2; 71*4882a593Smuzhiyun u64 reserved1:1; 72*4882a593Smuzhiyun u64 enc_cipher:4; 73*4882a593Smuzhiyun #endif 74*4882a593Smuzhiyun } e; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct cvm_cipher { 78*4882a593Smuzhiyun const char *name; 79*4882a593Smuzhiyun u8 value; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct enc_context { 83*4882a593Smuzhiyun union encr_ctrl enc_ctrl; 84*4882a593Smuzhiyun u8 encr_key[32]; 85*4882a593Smuzhiyun u8 encr_iv[16]; 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct fchmac_context { 89*4882a593Smuzhiyun u8 ipad[64]; 90*4882a593Smuzhiyun u8 opad[64]; /* or OPAD */ 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct fc_context { 94*4882a593Smuzhiyun struct enc_context enc; 95*4882a593Smuzhiyun struct fchmac_context hmac; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct cvm_enc_ctx { 99*4882a593Smuzhiyun u32 key_len; 100*4882a593Smuzhiyun u8 enc_key[MAX_KEY_SIZE]; 101*4882a593Smuzhiyun u8 cipher_type:4; 102*4882a593Smuzhiyun u8 key_type:2; 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct cvm_des3_ctx { 106*4882a593Smuzhiyun u32 key_len; 107*4882a593Smuzhiyun u8 des3_key[MAX_KEY_SIZE]; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct cvm_req_ctx { 111*4882a593Smuzhiyun struct cpt_request_info cpt_req; 112*4882a593Smuzhiyun u64 control_word; 113*4882a593Smuzhiyun struct fc_context fctx; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun int cptvf_do_request(void *cptvf, struct cpt_request_info *req); 117*4882a593Smuzhiyun #endif /*_CPTVF_ALGS_H_*/ 118