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