Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cryptocop.h
Go to the documentation of this file.
1 /*
2  * The device /dev/cryptocop is accessible using this driver using
3  * CRYPTOCOP_MAJOR (254) and minor number 0.
4  */
5 
6 #ifndef CRYPTOCOP_H
7 #define CRYPTOCOP_H
8 
9 #include <linux/uio.h>
10 
11 
12 #define CRYPTOCOP_SESSION_ID_NONE (0)
13 
14 typedef unsigned long long int cryptocop_session_id;
15 
16 /* cryptocop ioctls */
17 #define ETRAXCRYPTOCOP_IOCTYPE (250)
18 
19 #define CRYPTOCOP_IO_CREATE_SESSION _IOWR(ETRAXCRYPTOCOP_IOCTYPE, 1, struct strcop_session_op)
20 #define CRYPTOCOP_IO_CLOSE_SESSION _IOW(ETRAXCRYPTOCOP_IOCTYPE, 2, struct strcop_session_op)
21 #define CRYPTOCOP_IO_PROCESS_OP _IOWR(ETRAXCRYPTOCOP_IOCTYPE, 3, struct strcop_crypto_op)
22 #define CRYPTOCOP_IO_MAXNR (3)
23 
24 typedef enum {
28  cryptocop_cipher_m2m = 3, /* mem2mem is essentially a NULL cipher with blocklength=1 */
31 
32 typedef enum {
37 
38 typedef enum {
43 
44 typedef enum {
49 
50 typedef enum {
60 
61 /* Usermode accessible (ioctl) operations. */
64 
65  cryptocop_cipher_type cipher; /* AES, DES, 3DES, m2m, none */
66 
67  cryptocop_cipher_mode cmode; /* ECB, CBC, none */
69 
70  cryptocop_digest_type digest; /* MD5, SHA1, none */
71 
72  cryptocop_csum_type csum; /* BE, LE, none */
73 
74  unsigned char *key;
75  size_t keylen;
76 };
77 
78 #define CRYPTOCOP_CSUM_LENGTH (2)
79 #define CRYPTOCOP_MAX_DIGEST_LENGTH (20) /* SHA-1 20, MD5 16 */
80 #define CRYPTOCOP_MAX_IV_LENGTH (16) /* (3)DES==8, AES == 16 */
81 #define CRYPTOCOP_MAX_KEY_LENGTH (32)
82 
85 
86  /* Indata. */
87  unsigned char *indata;
88  size_t inlen; /* Total indata length. */
89 
90  /* Cipher configuration. */
91  unsigned char do_cipher:1;
92  unsigned char decrypt:1; /* 1 == decrypt, 0 == encrypt */
93  unsigned char cipher_explicit:1;
94  size_t cipher_start;
95  size_t cipher_len;
96  /* cipher_iv is used if do_cipher and cipher_explicit and the cipher
97  mode is CBC. The length is controlled by the type of cipher,
98  e.g. DES/3DES 8 octets and AES 16 octets. */
100  /* Outdata. */
101  unsigned char *cipher_outdata;
103 
104  /* digest configuration. */
105  unsigned char do_digest:1;
106  size_t digest_start;
107  size_t digest_len;
108  /* Outdata. The actual length is determined by the type of the digest. */
110 
111  /* Checksum configuration. */
112  unsigned char do_csum:1;
113  size_t csum_start;
114  size_t csum_len;
115  /* Outdata. */
116  unsigned char csum[CRYPTOCOP_CSUM_LENGTH];
117 };
118 
119 
120 
121 #ifdef __KERNEL__
122 
123 /********** The API to use from inside the kernel. ************/
124 
125 #include <arch/hwregs/dma.h>
126 
127 typedef enum {
128  cryptocop_alg_csum = 0,
129  cryptocop_alg_mem2mem,
130  cryptocop_alg_md5,
131  cryptocop_alg_sha1,
132  cryptocop_alg_des,
133  cryptocop_alg_3des,
134  cryptocop_alg_aes,
135  cryptocop_no_alg,
136 } cryptocop_algorithm;
137 
138 typedef u8 cryptocop_tfrm_id;
139 
140 
141 struct cryptocop_operation;
142 
143 typedef void (cryptocop_callback)(struct cryptocop_operation*, void*);
144 
145 struct cryptocop_transform_init {
146  cryptocop_algorithm alg;
147  /* Keydata for ciphers. */
148  unsigned char key[CRYPTOCOP_MAX_KEY_LENGTH];
149  unsigned int keylen;
150  cryptocop_cipher_mode cipher_mode;
151  cryptocop_3des_mode tdes_mode;
152  cryptocop_csum_type csum_mode; /* cryptocop_csum_none is not allowed when alg==cryptocop_alg_csum */
153 
154  cryptocop_tfrm_id tid; /* Locally unique in session; assigned by user, checked by driver. */
155  struct cryptocop_transform_init *next;
156 };
157 
158 
159 typedef enum {
160  cryptocop_source_dma = 0,
161  cryptocop_source_des,
162  cryptocop_source_3des,
163  cryptocop_source_aes,
164  cryptocop_source_md5,
165  cryptocop_source_sha1,
166  cryptocop_source_csum,
167  cryptocop_source_none,
168 } cryptocop_source;
169 
170 
171 struct cryptocop_desc_cfg {
172  cryptocop_tfrm_id tid;
173  cryptocop_source src;
174  unsigned int last:1; /* Last use of this transform in the operation. Will push outdata when encountered. */
175  struct cryptocop_desc_cfg *next;
176 };
177 
178 struct cryptocop_desc {
179  size_t length;
180  struct cryptocop_desc_cfg *cfg;
181  struct cryptocop_desc *next;
182 };
183 
184 
185 /* Flags for cryptocop_tfrm_cfg */
186 #define CRYPTOCOP_NO_FLAG (0x00)
187 #define CRYPTOCOP_ENCRYPT (0x01)
188 #define CRYPTOCOP_DECRYPT (0x02)
189 #define CRYPTOCOP_EXPLICIT_IV (0x04)
190 
191 struct cryptocop_tfrm_cfg {
192  cryptocop_tfrm_id tid;
193 
194  unsigned int flags; /* DECRYPT, ENCRYPT, EXPLICIT_IV */
195 
196  /* CBC initialisation vector for cihers. */
198 
199  /* The position in output where to write the transform output. The order
200  in which the driver writes the output is unspecified, hence if several
201  transforms write on the same positions in the output the result is
202  unspecified. */
203  size_t inject_ix;
204 
205  struct cryptocop_tfrm_cfg *next;
206 };
207 
208 
209 
210 struct cryptocop_dma_list_operation{
211  /* The consumer can provide DMA lists to send to the co-processor. 'use_dmalists' in
212  struct cryptocop_operation must be set for the driver to use them. outlist,
213  out_data_buf, inlist and in_data_buf must all be physical addresses since they will
214  be loaded to DMA . */
215  dma_descr_data *outlist; /* Out from memory to the co-processor. */
216  char *out_data_buf;
217  dma_descr_data *inlist; /* In from the co-processor to memory. */
218  char *in_data_buf;
219 
220  cryptocop_3des_mode tdes_mode;
221  cryptocop_csum_type csum_mode;
222 };
223 
224 
225 struct cryptocop_tfrm_operation{
226  /* Operation configuration, if not 'use_dmalists' is set. */
227  struct cryptocop_tfrm_cfg *tfrm_cfg;
228  struct cryptocop_desc *desc;
229 
230  struct iovec *indata;
231  size_t incount;
232  size_t inlen; /* Total inlength. */
233 
234  struct iovec *outdata;
235  size_t outcount;
236  size_t outlen; /* Total outlength. */
237 };
238 
239 
240 struct cryptocop_operation {
241  cryptocop_callback *cb;
242  void *cb_data;
243 
245 
246  /* The status of the operation when returned to consumer. */
247  int operation_status; /* 0, -EAGAIN */
248 
249  /* Flags */
250  unsigned int use_dmalists:1; /* Use outlist and inlist instead of the desc/tfrm_cfg configuration. */
251  unsigned int in_interrupt:1; /* Set if inserting job from interrupt context. */
252  unsigned int fast_callback:1; /* Set if fast callback wanted, i.e. from interrupt context. */
253 
254  union{
255  struct cryptocop_dma_list_operation list_op;
256  struct cryptocop_tfrm_operation tfrm_op;
257  };
258 };
259 
260 
261 int cryptocop_new_session(cryptocop_session_id *sid, struct cryptocop_transform_init *tinit, int alloc_flag);
263 
264 int cryptocop_job_queue_insert_csum(struct cryptocop_operation *operation);
265 
266 int cryptocop_job_queue_insert_crypto(struct cryptocop_operation *operation);
267 
268 int cryptocop_job_queue_insert_user_job(struct cryptocop_operation *operation);
269 
270 #endif /* __KERNEL__ */
271 
272 #endif /* CRYPTOCOP_H */