Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / sep / sep_crypto.c
1 /*
2 *
3 * sep_crypto.c - Crypto interface structures
4 *
5 * Copyright(c) 2009-2011 Intel Corporation. All rights reserved.
6 * Contributions(c) 2009-2010 Discretix. All rights reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; version 2 of the License.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 *
21 * CONTACTS:
22 *
23 * Mark Allyn mark.a.allyn@intel.com
24 * Jayant Mangalampalli jayant.mangalampalli@intel.com
25 *
26 * CHANGES:
27 *
28 * 2009.06.26 Initial publish
29 * 2010.09.14 Upgrade to Medfield
30 * 2011.02.22 Enable Kernel Crypto
31 *
32 */
33
34 /* #define DEBUG */
35 #include <linux/init.h>
36 #include <linux/module.h>
37 #include <linux/miscdevice.h>
38 #include <linux/fs.h>
39 #include <linux/cdev.h>
40 #include <linux/kdev_t.h>
41 #include <linux/mutex.h>
42 #include <linux/sched.h>
43 #include <linux/mm.h>
44 #include <linux/poll.h>
45 #include <linux/wait.h>
46 #include <linux/pci.h>
47 #include <linux/pm_runtime.h>
48 #include <linux/err.h>
49 #include <linux/device.h>
50 #include <linux/errno.h>
51 #include <linux/interrupt.h>
52 #include <linux/kernel.h>
53 #include <linux/clk.h>
54 #include <linux/irq.h>
55 #include <linux/io.h>
56 #include <linux/platform_device.h>
57 #include <linux/list.h>
58 #include <linux/dma-mapping.h>
59 #include <linux/delay.h>
60 #include <linux/jiffies.h>
61 #include <linux/workqueue.h>
62 #include <linux/crypto.h>
63 #include <crypto/internal/hash.h>
64 #include <crypto/scatterwalk.h>
65 #include <crypto/sha.h>
66 #include <crypto/md5.h>
67 #include <crypto/aes.h>
68 #include <crypto/des.h>
69 #include <crypto/hash.h>
70 #include "sep_driver_hw_defs.h"
71 #include "sep_driver_config.h"
72 #include "sep_driver_api.h"
73 #include "sep_dev.h"
74 #include "sep_crypto.h"
75
76 #if defined(CONFIG_CRYPTO) || defined(CONFIG_CRYPTO_MODULE)
77
78 /* Globals for queuing */
79 static spinlock_t queue_lock;
80 static struct crypto_queue sep_queue;
81
82 /* Declare of dequeuer */
83 static void sep_dequeuer(void *data);
84
85 /* TESTING */
86 /**
87 * sep_do_callback
88 * @work: pointer to work_struct
89 * This is what is called by the queue; it is generic so that it
90 * can be used by any type of operation as each different callback
91 * function can use the data parameter in its own way
92 */
93 static void sep_do_callback(struct work_struct *work)
94 {
95 struct sep_work_struct *sep_work = container_of(work,
96 struct sep_work_struct, work);
97 if (sep_work != NULL) {
98 (sep_work->callback)(sep_work->data);
99 kfree(sep_work);
100 } else {
101 pr_debug("sep crypto: do callback - NULL container\n");
102 }
103 }
104
105 /**
106 * sep_submit_work
107 * @work_queue: pointer to struct_workqueue
108 * @funct: pointer to function to execute
109 * @data: pointer to data; function will know
110 * how to use it
111 * This is a generic API to submit something to
112 * the queue. The callback function will depend
113 * on what operation is to be done
114 */
115 static int sep_submit_work(struct workqueue_struct *work_queue,
116 void(*funct)(void *),
117 void *data)
118 {
119 struct sep_work_struct *sep_work;
120 int result;
121
122 sep_work = kmalloc(sizeof(struct sep_work_struct), GFP_ATOMIC);
123
124 if (sep_work == NULL) {
125 pr_debug("sep crypto: cant allocate work structure\n");
126 return -ENOMEM;
127 }
128
129 sep_work->callback = funct;
130 sep_work->data = data;
131 INIT_WORK(&sep_work->work, sep_do_callback);
132 result = queue_work(work_queue, &sep_work->work);
133 if (!result) {
134 pr_debug("sep_crypto: queue_work failed\n");
135 return -EINVAL;
136 }
137 return 0;
138 }
139
140 /**
141 * sep_alloc_sg_buf -
142 * @sep: pointer to struct sep_device
143 * @size: total size of area
144 * @block_size: minimum size of chunks
145 * each page is minimum or modulo this size
146 * @returns: pointer to struct scatterlist for new
147 * buffer
148 **/
149 static struct scatterlist *sep_alloc_sg_buf(
150 struct sep_device *sep,
151 size_t size,
152 size_t block_size)
153 {
154 u32 nbr_pages;
155 u32 ct1;
156 void *buf;
157 size_t current_size;
158 size_t real_page_size;
159
160 struct scatterlist *sg, *sg_temp;
161
162 if (size == 0)
163 return NULL;
164
165 dev_dbg(&sep->pdev->dev, "sep alloc sg buf\n");
166
167 current_size = 0;
168 nbr_pages = 0;
169 real_page_size = PAGE_SIZE - (PAGE_SIZE % block_size);
170 /**
171 * The size of each page must be modulo of the operation
172 * block size; increment by the modified page size until
173 * the total size is reached, then you have the number of
174 * pages
175 */
176 while (current_size < size) {
177 current_size += real_page_size;
178 nbr_pages += 1;
179 }
180
181 sg = kmalloc_array(nbr_pages, sizeof(struct scatterlist), GFP_ATOMIC);
182 if (!sg)
183 return NULL;
184
185 sg_init_table(sg, nbr_pages);
186
187 current_size = 0;
188 sg_temp = sg;
189 for (ct1 = 0; ct1 < nbr_pages; ct1 += 1) {
190 buf = (void *)get_zeroed_page(GFP_ATOMIC);
191 if (!buf) {
192 dev_warn(&sep->pdev->dev,
193 "Cannot allocate page for new buffer\n");
194 kfree(sg);
195 return NULL;
196 }
197
198 sg_set_buf(sg_temp, buf, real_page_size);
199 if ((size - current_size) > real_page_size) {
200 sg_temp->length = real_page_size;
201 current_size += real_page_size;
202 } else {
203 sg_temp->length = (size - current_size);
204 current_size = size;
205 }
206 sg_temp = sg_next(sg);
207 }
208 return sg;
209 }
210
211 /**
212 * sep_free_sg_buf -
213 * @sg: pointer to struct scatterlist; points to area to free
214 */
215 static void sep_free_sg_buf(struct scatterlist *sg)
216 {
217 struct scatterlist *sg_temp = sg;
218 while (sg_temp) {
219 free_page((unsigned long)sg_virt(sg_temp));
220 sg_temp = sg_next(sg_temp);
221 }
222 kfree(sg);
223 }
224
225 /**
226 * sep_copy_sg -
227 * @sep: pointer to struct sep_device
228 * @sg_src: pointer to struct scatterlist for source
229 * @sg_dst: pointer to struct scatterlist for destination
230 * @size: size (in bytes) of data to copy
231 *
232 * Copy data from one scatterlist to another; both must
233 * be the same size
234 */
235 static void sep_copy_sg(
236 struct sep_device *sep,
237 struct scatterlist *sg_src,
238 struct scatterlist *sg_dst,
239 size_t size)
240 {
241 u32 seg_size;
242 u32 in_offset, out_offset;
243
244 u32 count = 0;
245 struct scatterlist *sg_src_tmp = sg_src;
246 struct scatterlist *sg_dst_tmp = sg_dst;
247 in_offset = 0;
248 out_offset = 0;
249
250 dev_dbg(&sep->pdev->dev, "sep copy sg\n");
251
252 if ((sg_src == NULL) || (sg_dst == NULL) || (size == 0))
253 return;
254
255 dev_dbg(&sep->pdev->dev, "sep copy sg not null\n");
256
257 while (count < size) {
258 if ((sg_src_tmp->length - in_offset) >
259 (sg_dst_tmp->length - out_offset))
260 seg_size = sg_dst_tmp->length - out_offset;
261 else
262 seg_size = sg_src_tmp->length - in_offset;
263
264 if (seg_size > (size - count))
265 seg_size = (size = count);
266
267 memcpy(sg_virt(sg_dst_tmp) + out_offset,
268 sg_virt(sg_src_tmp) + in_offset,
269 seg_size);
270
271 in_offset += seg_size;
272 out_offset += seg_size;
273 count += seg_size;
274
275 if (in_offset >= sg_src_tmp->length) {
276 sg_src_tmp = sg_next(sg_src_tmp);
277 in_offset = 0;
278 }
279
280 if (out_offset >= sg_dst_tmp->length) {
281 sg_dst_tmp = sg_next(sg_dst_tmp);
282 out_offset = 0;
283 }
284 }
285 }
286
287 /**
288 * sep_oddball_pages -
289 * @sep: pointer to struct sep_device
290 * @sg: pointer to struct scatterlist - buffer to check
291 * @size: total data size
292 * @blocksize: minimum block size; must be multiples of this size
293 * @to_copy: 1 means do copy, 0 means do not copy
294 * @new_sg: pointer to location to put pointer to new sg area
295 * @returns: 1 if new scatterlist is needed; 0 if not needed;
296 * error value if operation failed
297 *
298 * The SEP device requires all pages to be multiples of the
299 * minimum block size appropriate for the operation
300 * This function check all pages; if any are oddball sizes
301 * (not multiple of block sizes), it creates a new scatterlist.
302 * If the to_copy parameter is set to 1, then a scatter list
303 * copy is performed. The pointer to the new scatterlist is
304 * put into the address supplied by the new_sg parameter; if
305 * no new scatterlist is needed, then a NULL is put into
306 * the location at new_sg.
307 *
308 */
309 static int sep_oddball_pages(
310 struct sep_device *sep,
311 struct scatterlist *sg,
312 size_t data_size,
313 u32 block_size,
314 struct scatterlist **new_sg,
315 u32 do_copy)
316 {
317 struct scatterlist *sg_temp;
318 u32 flag;
319 u32 nbr_pages, page_count;
320
321 dev_dbg(&sep->pdev->dev, "sep oddball\n");
322 if ((sg == NULL) || (data_size == 0) || (data_size < block_size))
323 return 0;
324
325 dev_dbg(&sep->pdev->dev, "sep oddball not null\n");
326 flag = 0;
327 nbr_pages = 0;
328 page_count = 0;
329 sg_temp = sg;
330
331 while (sg_temp) {
332 nbr_pages += 1;
333 sg_temp = sg_next(sg_temp);
334 }
335
336 sg_temp = sg;
337 while ((sg_temp) && (flag == 0)) {
338 page_count += 1;
339 if (sg_temp->length % block_size)
340 flag = 1;
341 else
342 sg_temp = sg_next(sg_temp);
343 }
344
345 /* Do not process if last (or only) page is oddball */
346 if (nbr_pages == page_count)
347 flag = 0;
348
349 if (flag) {
350 dev_dbg(&sep->pdev->dev, "sep oddball processing\n");
351 *new_sg = sep_alloc_sg_buf(sep, data_size, block_size);
352 if (*new_sg == NULL) {
353 dev_warn(&sep->pdev->dev, "cannot allocate new sg\n");
354 return -ENOMEM;
355 }
356
357 if (do_copy)
358 sep_copy_sg(sep, sg, *new_sg, data_size);
359
360 return 1;
361 } else {
362 return 0;
363 }
364 }
365
366 /**
367 * sep_copy_offset_sg -
368 * @sep: pointer to struct sep_device;
369 * @sg: pointer to struct scatterlist
370 * @offset: offset into scatterlist memory
371 * @dst: place to put data
372 * @len: length of data
373 * @returns: number of bytes copies
374 *
375 * This copies data from scatterlist buffer
376 * offset from beginning - it is needed for
377 * handling tail data in hash
378 */
379 static size_t sep_copy_offset_sg(
380 struct sep_device *sep,
381 struct scatterlist *sg,
382 u32 offset,
383 void *dst,
384 u32 len)
385 {
386 size_t page_start;
387 size_t page_end;
388 size_t offset_within_page;
389 size_t length_within_page;
390 size_t length_remaining;
391 size_t current_offset;
392
393 /* Find which page is beginning of segment */
394 page_start = 0;
395 page_end = sg->length;
396 while ((sg) && (offset > page_end)) {
397 page_start += sg->length;
398 sg = sg_next(sg);
399 if (sg)
400 page_end += sg->length;
401 }
402
403 if (sg == NULL)
404 return -ENOMEM;
405
406 offset_within_page = offset - page_start;
407 if ((sg->length - offset_within_page) >= len) {
408 /* All within this page */
409 memcpy(dst, sg_virt(sg) + offset_within_page, len);
410 return len;
411 } else {
412 /* Scattered multiple pages */
413 current_offset = 0;
414 length_remaining = len;
415 while ((sg) && (current_offset < len)) {
416 length_within_page = sg->length - offset_within_page;
417 if (length_within_page >= length_remaining) {
418 memcpy(dst+current_offset,
419 sg_virt(sg) + offset_within_page,
420 length_remaining);
421 length_remaining = 0;
422 current_offset = len;
423 } else {
424 memcpy(dst+current_offset,
425 sg_virt(sg) + offset_within_page,
426 length_within_page);
427 length_remaining -= length_within_page;
428 current_offset += length_within_page;
429 offset_within_page = 0;
430 sg = sg_next(sg);
431 }
432 }
433
434 if (sg == NULL)
435 return -ENOMEM;
436 }
437 return len;
438 }
439
440 /**
441 * partial_overlap -
442 * @src_ptr: source pointer
443 * @dst_ptr: destination pointer
444 * @nbytes: number of bytes
445 * @returns: 0 for success; -1 for failure
446 * We cannot have any partial overlap. Total overlap
447 * where src is the same as dst is okay
448 */
449 static int partial_overlap(void *src_ptr, void *dst_ptr, u32 nbytes)
450 {
451 /* Check for partial overlap */
452 if (src_ptr != dst_ptr) {
453 if (src_ptr < dst_ptr) {
454 if ((src_ptr + nbytes) > dst_ptr)
455 return -EINVAL;
456 } else {
457 if ((dst_ptr + nbytes) > src_ptr)
458 return -EINVAL;
459 }
460 }
461
462 return 0;
463 }
464
465 /* Debug - prints only if DEBUG is defined */
466 static void sep_dump_ivs(struct ablkcipher_request *req, char *reason)
467
468 {
469 unsigned char *cptr;
470 struct sep_aes_internal_context *aes_internal;
471 struct sep_des_internal_context *des_internal;
472 int ct1;
473
474 struct this_task_ctx *ta_ctx;
475 struct crypto_ablkcipher *tfm;
476 struct sep_system_ctx *sctx;
477
478 ta_ctx = ablkcipher_request_ctx(req);
479 tfm = crypto_ablkcipher_reqtfm(req);
480 sctx = crypto_ablkcipher_ctx(tfm);
481
482 dev_dbg(&ta_ctx->sep_used->pdev->dev, "IV DUMP - %s\n", reason);
483 if ((ta_ctx->current_request == DES_CBC) &&
484 (ta_ctx->des_opmode == SEP_DES_CBC)) {
485
486 des_internal = (struct sep_des_internal_context *)
487 sctx->des_private_ctx.ctx_buf;
488 /* print vendor */
489 dev_dbg(&ta_ctx->sep_used->pdev->dev,
490 "sep - vendor iv for DES\n");
491 cptr = (unsigned char *)des_internal->iv_context;
492 for (ct1 = 0; ct1 < crypto_ablkcipher_ivsize(tfm); ct1 += 1)
493 dev_dbg(&ta_ctx->sep_used->pdev->dev,
494 "%02x\n", *(cptr + ct1));
495
496 /* print walk */
497 dev_dbg(&ta_ctx->sep_used->pdev->dev,
498 "sep - walk from kernel crypto iv for DES\n");
499 cptr = (unsigned char *)ta_ctx->walk.iv;
500 for (ct1 = 0; ct1 < crypto_ablkcipher_ivsize(tfm); ct1 += 1)
501 dev_dbg(&ta_ctx->sep_used->pdev->dev,
502 "%02x\n", *(cptr + ct1));
503 } else if ((ta_ctx->current_request == AES_CBC) &&
504 (ta_ctx->aes_opmode == SEP_AES_CBC)) {
505
506 aes_internal = (struct sep_aes_internal_context *)
507 sctx->aes_private_ctx.cbuff;
508 /* print vendor */
509 dev_dbg(&ta_ctx->sep_used->pdev->dev,
510 "sep - vendor iv for AES\n");
511 cptr = (unsigned char *)aes_internal->aes_ctx_iv;
512 for (ct1 = 0; ct1 < crypto_ablkcipher_ivsize(tfm); ct1 += 1)
513 dev_dbg(&ta_ctx->sep_used->pdev->dev,
514 "%02x\n", *(cptr + ct1));
515
516 /* print walk */
517 dev_dbg(&ta_ctx->sep_used->pdev->dev,
518 "sep - walk from kernel crypto iv for AES\n");
519 cptr = (unsigned char *)ta_ctx->walk.iv;
520 for (ct1 = 0; ct1 < crypto_ablkcipher_ivsize(tfm); ct1 += 1)
521 dev_dbg(&ta_ctx->sep_used->pdev->dev,
522 "%02x\n", *(cptr + ct1));
523 }
524 }
525
526 /**
527 * RFC2451: Weak key check
528 * Returns: 1 (weak), 0 (not weak)
529 */
530 static int sep_weak_key(const u8 *key, unsigned int keylen)
531 {
532 static const u8 parity[] = {
533 8, 1, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 2, 8,
534 0, 8, 8, 0, 8, 0, 0, 8, 8,
535 0, 0, 8, 0, 8, 8, 3,
536 0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
537 8, 0, 0, 8, 0, 8, 8, 0, 0,
538 8, 8, 0, 8, 0, 0, 8,
539 0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
540 8, 0, 0, 8, 0, 8, 8, 0, 0,
541 8, 8, 0, 8, 0, 0, 8,
542 8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
543 0, 8, 8, 0, 8, 0, 0, 8, 8,
544 0, 0, 8, 0, 8, 8, 0,
545 0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
546 8, 0, 0, 8, 0, 8, 8, 0, 0,
547 8, 8, 0, 8, 0, 0, 8,
548 8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
549 0, 8, 8, 0, 8, 0, 0, 8, 8,
550 0, 0, 8, 0, 8, 8, 0,
551 8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
552 0, 8, 8, 0, 8, 0, 0, 8, 8,
553 0, 0, 8, 0, 8, 8, 0,
554 4, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
555 8, 5, 0, 8, 0, 8, 8, 0, 0,
556 8, 8, 0, 8, 0, 6, 8,
557 };
558
559 u32 n, w;
560
561 n = parity[key[0]]; n <<= 4;
562 n |= parity[key[1]]; n <<= 4;
563 n |= parity[key[2]]; n <<= 4;
564 n |= parity[key[3]]; n <<= 4;
565 n |= parity[key[4]]; n <<= 4;
566 n |= parity[key[5]]; n <<= 4;
567 n |= parity[key[6]]; n <<= 4;
568 n |= parity[key[7]];
569 w = 0x88888888L;
570
571 /* 1 in 10^10 keys passes this test */
572 if (!((n - (w >> 3)) & w)) {
573 if (n < 0x41415151) {
574 if (n < 0x31312121) {
575 if (n < 0x14141515) {
576 /* 01 01 01 01 01 01 01 01 */
577 if (n == 0x11111111)
578 goto weak;
579 /* 01 1F 01 1F 01 0E 01 0E */
580 if (n == 0x13131212)
581 goto weak;
582 } else {
583 /* 01 E0 01 E0 01 F1 01 F1 */
584 if (n == 0x14141515)
585 goto weak;
586 /* 01 FE 01 FE 01 FE 01 FE */
587 if (n == 0x16161616)
588 goto weak;
589 }
590 } else {
591 if (n < 0x34342525) {
592 /* 1F 01 1F 01 0E 01 0E 01 */
593 if (n == 0x31312121)
594 goto weak;
595 /* 1F 1F 1F 1F 0E 0E 0E 0E (?) */
596 if (n == 0x33332222)
597 goto weak;
598 } else {
599 /* 1F E0 1F E0 0E F1 0E F1 */
600 if (n == 0x34342525)
601 goto weak;
602 /* 1F FE 1F FE 0E FE 0E FE */
603 if (n == 0x36362626)
604 goto weak;
605 }
606 }
607 } else {
608 if (n < 0x61616161) {
609 if (n < 0x44445555) {
610 /* E0 01 E0 01 F1 01 F1 01 */
611 if (n == 0x41415151)
612 goto weak;
613 /* E0 1F E0 1F F1 0E F1 0E */
614 if (n == 0x43435252)
615 goto weak;
616 } else {
617 /* E0 E0 E0 E0 F1 F1 F1 F1 (?) */
618 if (n == 0x44445555)
619 goto weak;
620 /* E0 FE E0 FE F1 FE F1 FE */
621 if (n == 0x46465656)
622 goto weak;
623 }
624 } else {
625 if (n < 0x64646565) {
626 /* FE 01 FE 01 FE 01 FE 01 */
627 if (n == 0x61616161)
628 goto weak;
629 /* FE 1F FE 1F FE 0E FE 0E */
630 if (n == 0x63636262)
631 goto weak;
632 } else {
633 /* FE E0 FE E0 FE F1 FE F1 */
634 if (n == 0x64646565)
635 goto weak;
636 /* FE FE FE FE FE FE FE FE */
637 if (n == 0x66666666)
638 goto weak;
639 }
640 }
641 }
642 }
643 return 0;
644 weak:
645 return 1;
646 }
647 /**
648 * sep_sg_nents
649 */
650 static u32 sep_sg_nents(struct scatterlist *sg)
651 {
652 u32 ct1 = 0;
653 while (sg) {
654 ct1 += 1;
655 sg = sg_next(sg);
656 }
657
658 return ct1;
659 }
660
661 /**
662 * sep_start_msg -
663 * @ta_ctx: pointer to struct this_task_ctx
664 * @returns: offset to place for the next word in the message
665 * Set up pointer in message pool for new message
666 */
667 static u32 sep_start_msg(struct this_task_ctx *ta_ctx)
668 {
669 u32 *word_ptr;
670 ta_ctx->msg_len_words = 2;
671 ta_ctx->msgptr = ta_ctx->msg;
672 memset(ta_ctx->msg, 0, SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
673 ta_ctx->msgptr += sizeof(u32) * 2;
674 word_ptr = (u32 *)ta_ctx->msgptr;
675 *word_ptr = SEP_START_MSG_TOKEN;
676 return sizeof(u32) * 2;
677 }
678
679 /**
680 * sep_end_msg -
681 * @ta_ctx: pointer to struct this_task_ctx
682 * @messages_offset: current message offset
683 * Returns: 0 for success; <0 otherwise
684 * End message; set length and CRC; and
685 * send interrupt to the SEP
686 */
687 static void sep_end_msg(struct this_task_ctx *ta_ctx, u32 msg_offset)
688 {
689 u32 *word_ptr;
690 /* Msg size goes into msg after token */
691 ta_ctx->msg_len_words = msg_offset / sizeof(u32) + 1;
692 word_ptr = (u32 *)ta_ctx->msgptr;
693 word_ptr += 1;
694 *word_ptr = ta_ctx->msg_len_words;
695
696 /* CRC (currently 0) goes at end of msg */
697 word_ptr = (u32 *)(ta_ctx->msgptr + msg_offset);
698 *word_ptr = 0;
699 }
700
701 /**
702 * sep_start_inbound_msg -
703 * @ta_ctx: pointer to struct this_task_ctx
704 * @msg_offset: offset to place for the next word in the message
705 * @returns: 0 for success; error value for failure
706 * Set up pointer in message pool for inbound message
707 */
708 static u32 sep_start_inbound_msg(struct this_task_ctx *ta_ctx, u32 *msg_offset)
709 {
710 u32 *word_ptr;
711 u32 token;
712 u32 error = SEP_OK;
713
714 *msg_offset = sizeof(u32) * 2;
715 word_ptr = (u32 *)ta_ctx->msgptr;
716 token = *word_ptr;
717 ta_ctx->msg_len_words = *(word_ptr + 1);
718
719 if (token != SEP_START_MSG_TOKEN) {
720 error = SEP_INVALID_START;
721 goto end_function;
722 }
723
724 end_function:
725
726 return error;
727 }
728
729 /**
730 * sep_write_msg -
731 * @ta_ctx: pointer to struct this_task_ctx
732 * @in_addr: pointer to start of parameter
733 * @size: size of parameter to copy (in bytes)
734 * @max_size: size to move up offset; SEP mesg is in word sizes
735 * @msg_offset: pointer to current offset (is updated)
736 * @byte_array: flag ti indicate whether endian must be changed
737 * Copies data into the message area from caller
738 */
739 static void sep_write_msg(struct this_task_ctx *ta_ctx, void *in_addr,
740 u32 size, u32 max_size, u32 *msg_offset, u32 byte_array)
741 {
742 u32 *word_ptr;
743 void *void_ptr;
744 void_ptr = ta_ctx->msgptr + *msg_offset;
745 word_ptr = (u32 *)void_ptr;
746 memcpy(void_ptr, in_addr, size);
747 *msg_offset += max_size;
748
749 /* Do we need to manipulate endian? */
750 if (byte_array) {
751 u32 i;
752 for (i = 0; i < ((size + 3) / 4); i += 1)
753 *(word_ptr + i) = CHG_ENDIAN(*(word_ptr + i));
754 }
755 }
756
757 /**
758 * sep_make_header
759 * @ta_ctx: pointer to struct this_task_ctx
760 * @msg_offset: pointer to current offset (is updated)
761 * @op_code: op code to put into message
762 * Puts op code into message and updates offset
763 */
764 static void sep_make_header(struct this_task_ctx *ta_ctx, u32 *msg_offset,
765 u32 op_code)
766 {
767 u32 *word_ptr;
768
769 *msg_offset = sep_start_msg(ta_ctx);
770 word_ptr = (u32 *)(ta_ctx->msgptr + *msg_offset);
771 *word_ptr = op_code;
772 *msg_offset += sizeof(u32);
773 }
774
775
776
777 /**
778 * sep_read_msg -
779 * @ta_ctx: pointer to struct this_task_ctx
780 * @in_addr: pointer to start of parameter
781 * @size: size of parameter to copy (in bytes)
782 * @max_size: size to move up offset; SEP mesg is in word sizes
783 * @msg_offset: pointer to current offset (is updated)
784 * @byte_array: flag ti indicate whether endian must be changed
785 * Copies data out of the message area to caller
786 */
787 static void sep_read_msg(struct this_task_ctx *ta_ctx, void *in_addr,
788 u32 size, u32 max_size, u32 *msg_offset, u32 byte_array)
789 {
790 u32 *word_ptr;
791 void *void_ptr;
792 void_ptr = ta_ctx->msgptr + *msg_offset;
793 word_ptr = (u32 *)void_ptr;
794
795 /* Do we need to manipulate endian? */
796 if (byte_array) {
797 u32 i;
798 for (i = 0; i < ((size + 3) / 4); i += 1)
799 *(word_ptr + i) = CHG_ENDIAN(*(word_ptr + i));
800 }
801
802 memcpy(in_addr, void_ptr, size);
803 *msg_offset += max_size;
804 }
805
806 /**
807 * sep_verify_op -
808 * @ta_ctx: pointer to struct this_task_ctx
809 * @op_code: expected op_code
810 * @msg_offset: pointer to current offset (is updated)
811 * @returns: 0 for success; error for failure
812 */
813 static u32 sep_verify_op(struct this_task_ctx *ta_ctx, u32 op_code,
814 u32 *msg_offset)
815 {
816 u32 error;
817 u32 in_ary[2];
818
819 struct sep_device *sep = ta_ctx->sep_used;
820
821 dev_dbg(&sep->pdev->dev, "dumping return message\n");
822 error = sep_start_inbound_msg(ta_ctx, msg_offset);
823 if (error) {
824 dev_warn(&sep->pdev->dev,
825 "sep_start_inbound_msg error\n");
826 return error;
827 }
828
829 sep_read_msg(ta_ctx, in_ary, sizeof(u32) * 2, sizeof(u32) * 2,
830 msg_offset, 0);
831
832 if (in_ary[0] != op_code) {
833 dev_warn(&sep->pdev->dev,
834 "sep got back wrong opcode\n");
835 dev_warn(&sep->pdev->dev,
836 "got back %x; expected %x\n",
837 in_ary[0], op_code);
838 return SEP_WRONG_OPCODE;
839 }
840
841 if (in_ary[1] != SEP_OK) {
842 dev_warn(&sep->pdev->dev,
843 "sep execution error\n");
844 dev_warn(&sep->pdev->dev,
845 "got back %x; expected %x\n",
846 in_ary[1], SEP_OK);
847 return in_ary[0];
848 }
849
850 return 0;
851 }
852
853 /**
854 * sep_read_context -
855 * @ta_ctx: pointer to struct this_task_ctx
856 * @msg_offset: point to current place in SEP msg; is updated
857 * @dst: pointer to place to put the context
858 * @len: size of the context structure (differs for crypro/hash)
859 * This function reads the context from the msg area
860 * There is a special way the vendor needs to have the maximum
861 * length calculated so that the msg_offset is updated properly;
862 * it skips over some words in the msg area depending on the size
863 * of the context
864 */
865 static void sep_read_context(struct this_task_ctx *ta_ctx, u32 *msg_offset,
866 void *dst, u32 len)
867 {
868 u32 max_length = ((len + 3) / sizeof(u32)) * sizeof(u32);
869 sep_read_msg(ta_ctx, dst, len, max_length, msg_offset, 0);
870 }
871
872 /**
873 * sep_write_context -
874 * @ta_ctx: pointer to struct this_task_ctx
875 * @msg_offset: point to current place in SEP msg; is updated
876 * @src: pointer to the current context
877 * @len: size of the context structure (differs for crypro/hash)
878 * This function writes the context to the msg area
879 * There is a special way the vendor needs to have the maximum
880 * length calculated so that the msg_offset is updated properly;
881 * it skips over some words in the msg area depending on the size
882 * of the context
883 */
884 static void sep_write_context(struct this_task_ctx *ta_ctx, u32 *msg_offset,
885 void *src, u32 len)
886 {
887 u32 max_length = ((len + 3) / sizeof(u32)) * sizeof(u32);
888 sep_write_msg(ta_ctx, src, len, max_length, msg_offset, 0);
889 }
890
891 /**
892 * sep_clear_out -
893 * @ta_ctx: pointer to struct this_task_ctx
894 * Clear out crypto related values in sep device structure
895 * to enable device to be used by anyone; either kernel
896 * crypto or userspace app via middleware
897 */
898 static void sep_clear_out(struct this_task_ctx *ta_ctx)
899 {
900 if (ta_ctx->src_sg_hold) {
901 sep_free_sg_buf(ta_ctx->src_sg_hold);
902 ta_ctx->src_sg_hold = NULL;
903 }
904
905 if (ta_ctx->dst_sg_hold) {
906 sep_free_sg_buf(ta_ctx->dst_sg_hold);
907 ta_ctx->dst_sg_hold = NULL;
908 }
909
910 ta_ctx->src_sg = NULL;
911 ta_ctx->dst_sg = NULL;
912
913 sep_free_dma_table_data_handler(ta_ctx->sep_used, &ta_ctx->dma_ctx);
914
915 if (ta_ctx->i_own_sep) {
916 /**
917 * The following unlocks the sep and makes it available
918 * to any other application
919 * First, null out crypto entries in sep before releasing it
920 */
921 ta_ctx->sep_used->current_hash_req = NULL;
922 ta_ctx->sep_used->current_cypher_req = NULL;
923 ta_ctx->sep_used->current_request = 0;
924 ta_ctx->sep_used->current_hash_stage = 0;
925 ta_ctx->sep_used->ta_ctx = NULL;
926 ta_ctx->sep_used->in_kernel = 0;
927
928 ta_ctx->call_status.status = 0;
929
930 /* Remove anything confidential */
931 memset(ta_ctx->sep_used->shared_addr, 0,
932 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
933
934 sep_queue_status_remove(ta_ctx->sep_used, &ta_ctx->queue_elem);
935
936 #ifdef SEP_ENABLE_RUNTIME_PM
937 ta_ctx->sep_used->in_use = 0;
938 pm_runtime_mark_last_busy(&ta_ctx->sep_used->pdev->dev);
939 pm_runtime_put_autosuspend(&ta_ctx->sep_used->pdev->dev);
940 #endif
941
942 clear_bit(SEP_WORKING_LOCK_BIT,
943 &ta_ctx->sep_used->in_use_flags);
944 ta_ctx->sep_used->pid_doing_transaction = 0;
945
946 dev_dbg(&ta_ctx->sep_used->pdev->dev,
947 "[PID%d] waking up next transaction\n",
948 current->pid);
949
950 clear_bit(SEP_TRANSACTION_STARTED_LOCK_BIT,
951 &ta_ctx->sep_used->in_use_flags);
952 wake_up(&ta_ctx->sep_used->event_transactions);
953
954 ta_ctx->i_own_sep = 0;
955 }
956 }
957
958 /**
959 * Release crypto infrastructure from EINPROGRESS and
960 * clear sep_dev so that SEP is available to anyone
961 */
962 static void sep_crypto_release(struct sep_system_ctx *sctx,
963 struct this_task_ctx *ta_ctx, u32 error)
964 {
965 struct ahash_request *hash_req = ta_ctx->current_hash_req;
966 struct ablkcipher_request *cypher_req =
967 ta_ctx->current_cypher_req;
968 struct sep_device *sep = ta_ctx->sep_used;
969
970 sep_clear_out(ta_ctx);
971
972 /**
973 * This may not yet exist depending when we
974 * chose to bail out. If it does exist, set
975 * it to 1
976 */
977 if (ta_ctx->are_we_done_yet != NULL)
978 *ta_ctx->are_we_done_yet = 1;
979
980 if (cypher_req != NULL) {
981 if ((sctx->key_sent == 1) ||
982 ((error != 0) && (error != -EINPROGRESS))) {
983 if (cypher_req->base.complete == NULL) {
984 dev_dbg(&sep->pdev->dev,
985 "release is null for cypher!");
986 } else {
987 cypher_req->base.complete(
988 &cypher_req->base, error);
989 }
990 }
991 }
992
993 if (hash_req != NULL) {
994 if (hash_req->base.complete == NULL) {
995 dev_dbg(&sep->pdev->dev,
996 "release is null for hash!");
997 } else {
998 hash_req->base.complete(
999 &hash_req->base, error);
1000 }
1001 }
1002 }
1003
1004 /**
1005 * This is where we grab the sep itself and tell it to do something.
1006 * It will sleep if the sep is currently busy
1007 * and it will return 0 if sep is now ours; error value if there
1008 * were problems
1009 */
1010 static int sep_crypto_take_sep(struct this_task_ctx *ta_ctx)
1011 {
1012 struct sep_device *sep = ta_ctx->sep_used;
1013 int result;
1014 struct sep_msgarea_hdr *my_msg_header;
1015
1016 my_msg_header = (struct sep_msgarea_hdr *)ta_ctx->msg;
1017
1018 /* add to status queue */
1019 ta_ctx->queue_elem = sep_queue_status_add(sep, my_msg_header->opcode,
1020 ta_ctx->nbytes, current->pid,
1021 current->comm, sizeof(current->comm));
1022
1023 if (!ta_ctx->queue_elem) {
1024 dev_dbg(&sep->pdev->dev,
1025 "[PID%d] updating queue status error\n", current->pid);
1026 return -EINVAL;
1027 }
1028
1029 /* get the device; this can sleep */
1030 result = sep_wait_transaction(sep);
1031 if (result)
1032 return result;
1033
1034 if (sep_dev->power_save_setup == 1)
1035 pm_runtime_get_sync(&sep_dev->pdev->dev);
1036
1037 /* Copy in the message */
1038 memcpy(sep->shared_addr, ta_ctx->msg,
1039 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
1040
1041 /* Copy in the dcb information if there is any */
1042 if (ta_ctx->dcb_region) {
1043 result = sep_activate_dcb_dmatables_context(sep,
1044 &ta_ctx->dcb_region, &ta_ctx->dmatables_region,
1045 ta_ctx->dma_ctx);
1046 if (result)
1047 return result;
1048 }
1049
1050 /* Mark the device so we know how to finish the job in the tasklet */
1051 if (ta_ctx->current_hash_req)
1052 sep->current_hash_req = ta_ctx->current_hash_req;
1053 else
1054 sep->current_cypher_req = ta_ctx->current_cypher_req;
1055
1056 sep->current_request = ta_ctx->current_request;
1057 sep->current_hash_stage = ta_ctx->current_hash_stage;
1058 sep->ta_ctx = ta_ctx;
1059 sep->in_kernel = 1;
1060 ta_ctx->i_own_sep = 1;
1061
1062 /* need to set bit first to avoid race condition with interrupt */
1063 set_bit(SEP_LEGACY_SENDMSG_DONE_OFFSET, &ta_ctx->call_status.status);
1064
1065 result = sep_send_command_handler(sep);
1066
1067 dev_dbg(&sep->pdev->dev, "[PID%d]: sending command to the sep\n",
1068 current->pid);
1069
1070 if (!result)
1071 dev_dbg(&sep->pdev->dev, "[PID%d]: command sent okay\n",
1072 current->pid);
1073 else {
1074 dev_dbg(&sep->pdev->dev, "[PID%d]: cant send command\n",
1075 current->pid);
1076 clear_bit(SEP_LEGACY_SENDMSG_DONE_OFFSET,
1077 &ta_ctx->call_status.status);
1078 }
1079
1080 return result;
1081 }
1082
1083 /**
1084 * This function sets things up for a crypto data block process
1085 * This does all preparation, but does not try to grab the
1086 * sep
1087 * @req: pointer to struct ablkcipher_request
1088 * returns: 0 if all went well, non zero if error
1089 */
1090 static int sep_crypto_block_data(struct ablkcipher_request *req)
1091 {
1092
1093 int int_error;
1094 u32 msg_offset;
1095 static u32 msg[10];
1096 void *src_ptr;
1097 void *dst_ptr;
1098
1099 static char small_buf[100];
1100 ssize_t copy_result;
1101 int result;
1102
1103 struct scatterlist *new_sg;
1104 struct this_task_ctx *ta_ctx;
1105 struct crypto_ablkcipher *tfm;
1106 struct sep_system_ctx *sctx;
1107
1108 struct sep_des_internal_context *des_internal;
1109 struct sep_aes_internal_context *aes_internal;
1110
1111 ta_ctx = ablkcipher_request_ctx(req);
1112 tfm = crypto_ablkcipher_reqtfm(req);
1113 sctx = crypto_ablkcipher_ctx(tfm);
1114
1115 /* start the walk on scatterlists */
1116 ablkcipher_walk_init(&ta_ctx->walk, req->src, req->dst, req->nbytes);
1117 dev_dbg(&ta_ctx->sep_used->pdev->dev, "sep crypto block data size of %x\n",
1118 req->nbytes);
1119
1120 int_error = ablkcipher_walk_phys(req, &ta_ctx->walk);
1121 if (int_error) {
1122 dev_warn(&ta_ctx->sep_used->pdev->dev, "walk phys error %x\n",
1123 int_error);
1124 return -ENOMEM;
1125 }
1126
1127 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1128 "crypto block: src is %lx dst is %lx\n",
1129 (unsigned long)req->src, (unsigned long)req->dst);
1130
1131 /* Make sure all pages are even block */
1132 int_error = sep_oddball_pages(ta_ctx->sep_used, req->src,
1133 req->nbytes, ta_ctx->walk.blocksize, &new_sg, 1);
1134
1135 if (int_error < 0) {
1136 dev_warn(&ta_ctx->sep_used->pdev->dev, "oddball page error\n");
1137 return -ENOMEM;
1138 } else if (int_error == 1) {
1139 ta_ctx->src_sg = new_sg;
1140 ta_ctx->src_sg_hold = new_sg;
1141 } else {
1142 ta_ctx->src_sg = req->src;
1143 ta_ctx->src_sg_hold = NULL;
1144 }
1145
1146 int_error = sep_oddball_pages(ta_ctx->sep_used, req->dst,
1147 req->nbytes, ta_ctx->walk.blocksize, &new_sg, 0);
1148
1149 if (int_error < 0) {
1150 dev_warn(&ta_ctx->sep_used->pdev->dev, "walk phys error %x\n",
1151 int_error);
1152 return -ENOMEM;
1153 } else if (int_error == 1) {
1154 ta_ctx->dst_sg = new_sg;
1155 ta_ctx->dst_sg_hold = new_sg;
1156 } else {
1157 ta_ctx->dst_sg = req->dst;
1158 ta_ctx->dst_sg_hold = NULL;
1159 }
1160
1161 /* set nbytes for queue status */
1162 ta_ctx->nbytes = req->nbytes;
1163
1164 /* Key already done; this is for data */
1165 dev_dbg(&ta_ctx->sep_used->pdev->dev, "sending data\n");
1166
1167 /* check for valid data and proper spacing */
1168 src_ptr = sg_virt(ta_ctx->src_sg);
1169 dst_ptr = sg_virt(ta_ctx->dst_sg);
1170
1171 if (!src_ptr || !dst_ptr ||
1172 (ta_ctx->current_cypher_req->nbytes %
1173 crypto_ablkcipher_blocksize(tfm))) {
1174
1175 dev_warn(&ta_ctx->sep_used->pdev->dev,
1176 "cipher block size odd\n");
1177 dev_warn(&ta_ctx->sep_used->pdev->dev,
1178 "cipher block size is %x\n",
1179 crypto_ablkcipher_blocksize(tfm));
1180 dev_warn(&ta_ctx->sep_used->pdev->dev,
1181 "cipher data size is %x\n",
1182 ta_ctx->current_cypher_req->nbytes);
1183 return -EINVAL;
1184 }
1185
1186 if (partial_overlap(src_ptr, dst_ptr,
1187 ta_ctx->current_cypher_req->nbytes)) {
1188 dev_warn(&ta_ctx->sep_used->pdev->dev,
1189 "block partial overlap\n");
1190 return -EINVAL;
1191 }
1192
1193 /* Put together the message */
1194 sep_make_header(ta_ctx, &msg_offset, ta_ctx->block_opcode);
1195
1196 /* If des, and size is 1 block, put directly in msg */
1197 if ((ta_ctx->block_opcode == SEP_DES_BLOCK_OPCODE) &&
1198 (req->nbytes == crypto_ablkcipher_blocksize(tfm))) {
1199
1200 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1201 "writing out one block des\n");
1202
1203 copy_result = sg_copy_to_buffer(
1204 ta_ctx->src_sg, sep_sg_nents(ta_ctx->src_sg),
1205 small_buf, crypto_ablkcipher_blocksize(tfm));
1206
1207 if (copy_result != crypto_ablkcipher_blocksize(tfm)) {
1208 dev_warn(&ta_ctx->sep_used->pdev->dev,
1209 "des block copy faild\n");
1210 return -ENOMEM;
1211 }
1212
1213 /* Put data into message */
1214 sep_write_msg(ta_ctx, small_buf,
1215 crypto_ablkcipher_blocksize(tfm),
1216 crypto_ablkcipher_blocksize(tfm) * 2,
1217 &msg_offset, 1);
1218
1219 /* Put size into message */
1220 sep_write_msg(ta_ctx, &req->nbytes,
1221 sizeof(u32), sizeof(u32), &msg_offset, 0);
1222 } else {
1223 /* Otherwise, fill out dma tables */
1224 ta_ctx->dcb_input_data.app_in_address = src_ptr;
1225 ta_ctx->dcb_input_data.data_in_size = req->nbytes;
1226 ta_ctx->dcb_input_data.app_out_address = dst_ptr;
1227 ta_ctx->dcb_input_data.block_size =
1228 crypto_ablkcipher_blocksize(tfm);
1229 ta_ctx->dcb_input_data.tail_block_size = 0;
1230 ta_ctx->dcb_input_data.is_applet = 0;
1231 ta_ctx->dcb_input_data.src_sg = ta_ctx->src_sg;
1232 ta_ctx->dcb_input_data.dst_sg = ta_ctx->dst_sg;
1233
1234 result = sep_create_dcb_dmatables_context_kernel(
1235 ta_ctx->sep_used,
1236 &ta_ctx->dcb_region,
1237 &ta_ctx->dmatables_region,
1238 &ta_ctx->dma_ctx,
1239 &ta_ctx->dcb_input_data,
1240 1);
1241 if (result) {
1242 dev_warn(&ta_ctx->sep_used->pdev->dev,
1243 "crypto dma table create failed\n");
1244 return -EINVAL;
1245 }
1246
1247 /* Portion of msg is nulled (no data) */
1248 msg[0] = (u32)0;
1249 msg[1] = (u32)0;
1250 msg[2] = (u32)0;
1251 msg[3] = (u32)0;
1252 msg[4] = (u32)0;
1253 sep_write_msg(ta_ctx, (void *)msg, sizeof(u32) * 5,
1254 sizeof(u32) * 5, &msg_offset, 0);
1255 }
1256
1257 /**
1258 * Before we write the message, we need to overwrite the
1259 * vendor's IV with the one from our own ablkcipher walk
1260 * iv because this is needed for dm-crypt
1261 */
1262 sep_dump_ivs(req, "sending data block to sep\n");
1263 if ((ta_ctx->current_request == DES_CBC) &&
1264 (ta_ctx->des_opmode == SEP_DES_CBC)) {
1265
1266 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1267 "overwrite vendor iv on DES\n");
1268 des_internal = (struct sep_des_internal_context *)
1269 sctx->des_private_ctx.ctx_buf;
1270 memcpy((void *)des_internal->iv_context,
1271 ta_ctx->walk.iv, crypto_ablkcipher_ivsize(tfm));
1272 } else if ((ta_ctx->current_request == AES_CBC) &&
1273 (ta_ctx->aes_opmode == SEP_AES_CBC)) {
1274
1275 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1276 "overwrite vendor iv on AES\n");
1277 aes_internal = (struct sep_aes_internal_context *)
1278 sctx->aes_private_ctx.cbuff;
1279 memcpy((void *)aes_internal->aes_ctx_iv,
1280 ta_ctx->walk.iv, crypto_ablkcipher_ivsize(tfm));
1281 }
1282
1283 /* Write context into message */
1284 if (ta_ctx->block_opcode == SEP_DES_BLOCK_OPCODE) {
1285 sep_write_context(ta_ctx, &msg_offset,
1286 &sctx->des_private_ctx,
1287 sizeof(struct sep_des_private_context));
1288 } else {
1289 sep_write_context(ta_ctx, &msg_offset,
1290 &sctx->aes_private_ctx,
1291 sizeof(struct sep_aes_private_context));
1292 }
1293
1294 /* conclude message */
1295 sep_end_msg(ta_ctx, msg_offset);
1296
1297 /* Parent (caller) is now ready to tell the sep to do ahead */
1298 return 0;
1299 }
1300
1301
1302 /**
1303 * This function sets things up for a crypto key submit process
1304 * This does all preparation, but does not try to grab the
1305 * sep
1306 * @req: pointer to struct ablkcipher_request
1307 * returns: 0 if all went well, non zero if error
1308 */
1309 static int sep_crypto_send_key(struct ablkcipher_request *req)
1310 {
1311
1312 int int_error;
1313 u32 msg_offset;
1314 static u32 msg[10];
1315
1316 u32 max_length;
1317 struct this_task_ctx *ta_ctx;
1318 struct crypto_ablkcipher *tfm;
1319 struct sep_system_ctx *sctx;
1320
1321 ta_ctx = ablkcipher_request_ctx(req);
1322 tfm = crypto_ablkcipher_reqtfm(req);
1323 sctx = crypto_ablkcipher_ctx(tfm);
1324
1325 dev_dbg(&ta_ctx->sep_used->pdev->dev, "sending key\n");
1326
1327 /* start the walk on scatterlists */
1328 ablkcipher_walk_init(&ta_ctx->walk, req->src, req->dst, req->nbytes);
1329 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1330 "sep crypto block data size of %x\n", req->nbytes);
1331
1332 int_error = ablkcipher_walk_phys(req, &ta_ctx->walk);
1333 if (int_error) {
1334 dev_warn(&ta_ctx->sep_used->pdev->dev, "walk phys error %x\n",
1335 int_error);
1336 return -ENOMEM;
1337 }
1338
1339 /* check iv */
1340 if ((ta_ctx->current_request == DES_CBC) &&
1341 (ta_ctx->des_opmode == SEP_DES_CBC)) {
1342 if (!ta_ctx->walk.iv) {
1343 dev_warn(&ta_ctx->sep_used->pdev->dev, "no iv found\n");
1344 return -EINVAL;
1345 }
1346
1347 memcpy(ta_ctx->iv, ta_ctx->walk.iv, SEP_DES_IV_SIZE_BYTES);
1348 }
1349
1350 if ((ta_ctx->current_request == AES_CBC) &&
1351 (ta_ctx->aes_opmode == SEP_AES_CBC)) {
1352 if (!ta_ctx->walk.iv) {
1353 dev_warn(&ta_ctx->sep_used->pdev->dev, "no iv found\n");
1354 return -EINVAL;
1355 }
1356
1357 memcpy(ta_ctx->iv, ta_ctx->walk.iv, SEP_AES_IV_SIZE_BYTES);
1358 }
1359
1360 /* put together message to SEP */
1361 /* Start with op code */
1362 sep_make_header(ta_ctx, &msg_offset, ta_ctx->init_opcode);
1363
1364 /* now deal with IV */
1365 if (ta_ctx->init_opcode == SEP_DES_INIT_OPCODE) {
1366 if (ta_ctx->des_opmode == SEP_DES_CBC) {
1367 sep_write_msg(ta_ctx, ta_ctx->iv,
1368 SEP_DES_IV_SIZE_BYTES, sizeof(u32) * 4,
1369 &msg_offset, 1);
1370 } else {
1371 /* Skip if ECB */
1372 msg_offset += 4 * sizeof(u32);
1373 }
1374 } else {
1375 max_length = ((SEP_AES_IV_SIZE_BYTES + 3) /
1376 sizeof(u32)) * sizeof(u32);
1377 if (ta_ctx->aes_opmode == SEP_AES_CBC) {
1378 sep_write_msg(ta_ctx, ta_ctx->iv,
1379 SEP_AES_IV_SIZE_BYTES, max_length,
1380 &msg_offset, 1);
1381 } else {
1382 /* Skip if ECB */
1383 msg_offset += max_length;
1384 }
1385 }
1386
1387 /* load the key */
1388 if (ta_ctx->init_opcode == SEP_DES_INIT_OPCODE) {
1389 sep_write_msg(ta_ctx, (void *)&sctx->key.des.key1,
1390 sizeof(u32) * 8, sizeof(u32) * 8,
1391 &msg_offset, 1);
1392
1393 msg[0] = (u32)sctx->des_nbr_keys;
1394 msg[1] = (u32)ta_ctx->des_encmode;
1395 msg[2] = (u32)ta_ctx->des_opmode;
1396
1397 sep_write_msg(ta_ctx, (void *)msg,
1398 sizeof(u32) * 3, sizeof(u32) * 3,
1399 &msg_offset, 0);
1400 } else {
1401 sep_write_msg(ta_ctx, (void *)&sctx->key.aes,
1402 sctx->keylen,
1403 SEP_AES_MAX_KEY_SIZE_BYTES,
1404 &msg_offset, 1);
1405
1406 msg[0] = (u32)sctx->aes_key_size;
1407 msg[1] = (u32)ta_ctx->aes_encmode;
1408 msg[2] = (u32)ta_ctx->aes_opmode;
1409 msg[3] = (u32)0; /* Secret key is not used */
1410 sep_write_msg(ta_ctx, (void *)msg,
1411 sizeof(u32) * 4, sizeof(u32) * 4,
1412 &msg_offset, 0);
1413 }
1414
1415 /* conclude message */
1416 sep_end_msg(ta_ctx, msg_offset);
1417
1418 /* Parent (caller) is now ready to tell the sep to do ahead */
1419 return 0;
1420 }
1421
1422
1423 /* This needs to be run as a work queue as it can be put asleep */
1424 static void sep_crypto_block(void *data)
1425 {
1426 unsigned long end_time;
1427
1428 int result;
1429
1430 struct ablkcipher_request *req;
1431 struct this_task_ctx *ta_ctx;
1432 struct crypto_ablkcipher *tfm;
1433 struct sep_system_ctx *sctx;
1434 int are_we_done_yet;
1435
1436 req = (struct ablkcipher_request *)data;
1437 ta_ctx = ablkcipher_request_ctx(req);
1438 tfm = crypto_ablkcipher_reqtfm(req);
1439 sctx = crypto_ablkcipher_ctx(tfm);
1440
1441 ta_ctx->are_we_done_yet = &are_we_done_yet;
1442
1443 pr_debug("sep_crypto_block\n");
1444 pr_debug("tfm is %p sctx is %p ta_ctx is %p\n",
1445 tfm, sctx, ta_ctx);
1446 pr_debug("key_sent is %d\n", sctx->key_sent);
1447
1448 /* do we need to send the key */
1449 if (sctx->key_sent == 0) {
1450 are_we_done_yet = 0;
1451 result = sep_crypto_send_key(req); /* prep to send key */
1452 if (result != 0) {
1453 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1454 "could not prep key %x\n", result);
1455 sep_crypto_release(sctx, ta_ctx, result);
1456 return;
1457 }
1458
1459 result = sep_crypto_take_sep(ta_ctx);
1460 if (result) {
1461 dev_warn(&ta_ctx->sep_used->pdev->dev,
1462 "sep_crypto_take_sep for key send failed\n");
1463 sep_crypto_release(sctx, ta_ctx, result);
1464 return;
1465 }
1466
1467 /* now we sit and wait up to a fixed time for completion */
1468 end_time = jiffies + (WAIT_TIME * HZ);
1469 while ((time_before(jiffies, end_time)) &&
1470 (are_we_done_yet == 0))
1471 schedule();
1472
1473 /* Done waiting; still not done yet? */
1474 if (are_we_done_yet == 0) {
1475 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1476 "Send key job never got done\n");
1477 sep_crypto_release(sctx, ta_ctx, -EINVAL);
1478 return;
1479 }
1480
1481 /* Set the key sent variable so this can be skipped later */
1482 sctx->key_sent = 1;
1483 }
1484
1485 /* Key sent (or maybe not if we did not have to), now send block */
1486 are_we_done_yet = 0;
1487
1488 result = sep_crypto_block_data(req);
1489
1490 if (result != 0) {
1491 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1492 "could prep not send block %x\n", result);
1493 sep_crypto_release(sctx, ta_ctx, result);
1494 return;
1495 }
1496
1497 result = sep_crypto_take_sep(ta_ctx);
1498 if (result) {
1499 dev_warn(&ta_ctx->sep_used->pdev->dev,
1500 "sep_crypto_take_sep for block send failed\n");
1501 sep_crypto_release(sctx, ta_ctx, result);
1502 return;
1503 }
1504
1505 /* now we sit and wait up to a fixed time for completion */
1506 end_time = jiffies + (WAIT_TIME * HZ);
1507 while ((time_before(jiffies, end_time)) && (are_we_done_yet == 0))
1508 schedule();
1509
1510 /* Done waiting; still not done yet? */
1511 if (are_we_done_yet == 0) {
1512 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1513 "Send block job never got done\n");
1514 sep_crypto_release(sctx, ta_ctx, -EINVAL);
1515 return;
1516 }
1517
1518 /* That's it; entire thing done, get out of queue */
1519
1520 pr_debug("crypto_block leaving\n");
1521 pr_debug("tfm is %p sctx is %p ta_ctx is %p\n", tfm, sctx, ta_ctx);
1522 }
1523
1524 /**
1525 * Post operation (after interrupt) for crypto block
1526 */
1527 static u32 crypto_post_op(struct sep_device *sep)
1528 {
1529 /* HERE */
1530 u32 u32_error;
1531 u32 msg_offset;
1532
1533 ssize_t copy_result;
1534 static char small_buf[100];
1535
1536 struct ablkcipher_request *req;
1537 struct this_task_ctx *ta_ctx;
1538 struct sep_system_ctx *sctx;
1539 struct crypto_ablkcipher *tfm;
1540
1541 struct sep_des_internal_context *des_internal;
1542 struct sep_aes_internal_context *aes_internal;
1543
1544 if (!sep->current_cypher_req)
1545 return -EINVAL;
1546
1547 /* hold req since we need to submit work after clearing sep */
1548 req = sep->current_cypher_req;
1549
1550 ta_ctx = ablkcipher_request_ctx(sep->current_cypher_req);
1551 tfm = crypto_ablkcipher_reqtfm(sep->current_cypher_req);
1552 sctx = crypto_ablkcipher_ctx(tfm);
1553
1554 pr_debug("crypto_post op\n");
1555 pr_debug("key_sent is %d tfm is %p sctx is %p ta_ctx is %p\n",
1556 sctx->key_sent, tfm, sctx, ta_ctx);
1557
1558 dev_dbg(&ta_ctx->sep_used->pdev->dev, "crypto post_op\n");
1559 dev_dbg(&ta_ctx->sep_used->pdev->dev, "crypto post_op message dump\n");
1560
1561 /* first bring msg from shared area to local area */
1562 memcpy(ta_ctx->msg, sep->shared_addr,
1563 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
1564
1565 /* Is this the result of performing init (key to SEP */
1566 if (sctx->key_sent == 0) {
1567
1568 /* Did SEP do it okay */
1569 u32_error = sep_verify_op(ta_ctx, ta_ctx->init_opcode,
1570 &msg_offset);
1571 if (u32_error) {
1572 dev_warn(&ta_ctx->sep_used->pdev->dev,
1573 "aes init error %x\n", u32_error);
1574 sep_crypto_release(sctx, ta_ctx, u32_error);
1575 return u32_error;
1576 }
1577
1578 /* Read Context */
1579 if (ta_ctx->init_opcode == SEP_DES_INIT_OPCODE) {
1580 sep_read_context(ta_ctx, &msg_offset,
1581 &sctx->des_private_ctx,
1582 sizeof(struct sep_des_private_context));
1583 } else {
1584 sep_read_context(ta_ctx, &msg_offset,
1585 &sctx->aes_private_ctx,
1586 sizeof(struct sep_aes_private_context));
1587 }
1588
1589 sep_dump_ivs(req, "after sending key to sep\n");
1590
1591 /* key sent went okay; release sep, and set are_we_done_yet */
1592 sctx->key_sent = 1;
1593 sep_crypto_release(sctx, ta_ctx, -EINPROGRESS);
1594
1595 } else {
1596
1597 /**
1598 * This is the result of a block request
1599 */
1600 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1601 "crypto_post_op block response\n");
1602
1603 u32_error = sep_verify_op(ta_ctx, ta_ctx->block_opcode,
1604 &msg_offset);
1605
1606 if (u32_error) {
1607 dev_warn(&ta_ctx->sep_used->pdev->dev,
1608 "sep block error %x\n", u32_error);
1609 sep_crypto_release(sctx, ta_ctx, u32_error);
1610 return -EINVAL;
1611 }
1612
1613 if (ta_ctx->block_opcode == SEP_DES_BLOCK_OPCODE) {
1614
1615 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1616 "post op for DES\n");
1617
1618 /* special case for 1 block des */
1619 if (sep->current_cypher_req->nbytes ==
1620 crypto_ablkcipher_blocksize(tfm)) {
1621
1622 sep_read_msg(ta_ctx, small_buf,
1623 crypto_ablkcipher_blocksize(tfm),
1624 crypto_ablkcipher_blocksize(tfm) * 2,
1625 &msg_offset, 1);
1626
1627 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1628 "reading in block des\n");
1629
1630 copy_result = sg_copy_from_buffer(
1631 ta_ctx->dst_sg,
1632 sep_sg_nents(ta_ctx->dst_sg),
1633 small_buf,
1634 crypto_ablkcipher_blocksize(tfm));
1635
1636 if (copy_result !=
1637 crypto_ablkcipher_blocksize(tfm)) {
1638
1639 dev_warn(&ta_ctx->sep_used->pdev->dev,
1640 "des block copy faild\n");
1641 sep_crypto_release(sctx, ta_ctx,
1642 -ENOMEM);
1643 return -ENOMEM;
1644 }
1645 }
1646
1647 /* Read Context */
1648 sep_read_context(ta_ctx, &msg_offset,
1649 &sctx->des_private_ctx,
1650 sizeof(struct sep_des_private_context));
1651 } else {
1652
1653 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1654 "post op for AES\n");
1655
1656 /* Skip the MAC Output */
1657 msg_offset += (sizeof(u32) * 4);
1658
1659 /* Read Context */
1660 sep_read_context(ta_ctx, &msg_offset,
1661 &sctx->aes_private_ctx,
1662 sizeof(struct sep_aes_private_context));
1663 }
1664
1665 /* Copy to correct sg if this block had oddball pages */
1666 if (ta_ctx->dst_sg_hold)
1667 sep_copy_sg(ta_ctx->sep_used,
1668 ta_ctx->dst_sg,
1669 ta_ctx->current_cypher_req->dst,
1670 ta_ctx->current_cypher_req->nbytes);
1671
1672 /**
1673 * Copy the iv's back to the walk.iv
1674 * This is required for dm_crypt
1675 */
1676 sep_dump_ivs(req, "got data block from sep\n");
1677 if ((ta_ctx->current_request == DES_CBC) &&
1678 (ta_ctx->des_opmode == SEP_DES_CBC)) {
1679
1680 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1681 "returning result iv to walk on DES\n");
1682 des_internal = (struct sep_des_internal_context *)
1683 sctx->des_private_ctx.ctx_buf;
1684 memcpy(ta_ctx->walk.iv,
1685 (void *)des_internal->iv_context,
1686 crypto_ablkcipher_ivsize(tfm));
1687 } else if ((ta_ctx->current_request == AES_CBC) &&
1688 (ta_ctx->aes_opmode == SEP_AES_CBC)) {
1689
1690 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1691 "returning result iv to walk on AES\n");
1692 aes_internal = (struct sep_aes_internal_context *)
1693 sctx->aes_private_ctx.cbuff;
1694 memcpy(ta_ctx->walk.iv,
1695 (void *)aes_internal->aes_ctx_iv,
1696 crypto_ablkcipher_ivsize(tfm));
1697 }
1698
1699 /* finished, release everything */
1700 sep_crypto_release(sctx, ta_ctx, 0);
1701 }
1702 pr_debug("crypto_post_op done\n");
1703 pr_debug("key_sent is %d tfm is %p sctx is %p ta_ctx is %p\n",
1704 sctx->key_sent, tfm, sctx, ta_ctx);
1705
1706 return 0;
1707 }
1708
1709 static u32 hash_init_post_op(struct sep_device *sep)
1710 {
1711 u32 u32_error;
1712 u32 msg_offset;
1713 struct crypto_ahash *tfm = crypto_ahash_reqtfm(sep->current_hash_req);
1714 struct this_task_ctx *ta_ctx = ahash_request_ctx(sep->current_hash_req);
1715 struct sep_system_ctx *sctx = crypto_ahash_ctx(tfm);
1716 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1717 "hash init post op\n");
1718
1719 /* first bring msg from shared area to local area */
1720 memcpy(ta_ctx->msg, sep->shared_addr,
1721 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
1722
1723 u32_error = sep_verify_op(ta_ctx, SEP_HASH_INIT_OPCODE,
1724 &msg_offset);
1725
1726 if (u32_error) {
1727 dev_warn(&ta_ctx->sep_used->pdev->dev, "hash init error %x\n",
1728 u32_error);
1729 sep_crypto_release(sctx, ta_ctx, u32_error);
1730 return u32_error;
1731 }
1732
1733 /* Read Context */
1734 sep_read_context(ta_ctx, &msg_offset,
1735 &sctx->hash_private_ctx,
1736 sizeof(struct sep_hash_private_context));
1737
1738 /* Signal to crypto infrastructure and clear out */
1739 dev_dbg(&ta_ctx->sep_used->pdev->dev, "hash init post op done\n");
1740 sep_crypto_release(sctx, ta_ctx, 0);
1741 return 0;
1742 }
1743
1744 static u32 hash_update_post_op(struct sep_device *sep)
1745 {
1746 u32 u32_error;
1747 u32 msg_offset;
1748 struct crypto_ahash *tfm = crypto_ahash_reqtfm(sep->current_hash_req);
1749 struct this_task_ctx *ta_ctx = ahash_request_ctx(sep->current_hash_req);
1750 struct sep_system_ctx *sctx = crypto_ahash_ctx(tfm);
1751 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1752 "hash update post op\n");
1753
1754 /* first bring msg from shared area to local area */
1755 memcpy(ta_ctx->msg, sep->shared_addr,
1756 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
1757
1758 u32_error = sep_verify_op(ta_ctx, SEP_HASH_UPDATE_OPCODE,
1759 &msg_offset);
1760
1761 if (u32_error) {
1762 dev_warn(&ta_ctx->sep_used->pdev->dev, "hash init error %x\n",
1763 u32_error);
1764 sep_crypto_release(sctx, ta_ctx, u32_error);
1765 return u32_error;
1766 }
1767
1768 /* Read Context */
1769 sep_read_context(ta_ctx, &msg_offset,
1770 &sctx->hash_private_ctx,
1771 sizeof(struct sep_hash_private_context));
1772
1773 /**
1774 * Following is only for finup; if we just completed the
1775 * data portion of finup, we now need to kick off the
1776 * finish portion of finup.
1777 */
1778
1779 if (ta_ctx->sep_used->current_hash_stage == HASH_FINUP_DATA) {
1780
1781 /* first reset stage to HASH_FINUP_FINISH */
1782 ta_ctx->sep_used->current_hash_stage = HASH_FINUP_FINISH;
1783
1784 /* now enqueue the finish operation */
1785 spin_lock_irq(&queue_lock);
1786 u32_error = crypto_enqueue_request(&sep_queue,
1787 &ta_ctx->sep_used->current_hash_req->base);
1788 spin_unlock_irq(&queue_lock);
1789
1790 if ((u32_error != 0) && (u32_error != -EINPROGRESS)) {
1791 dev_warn(&ta_ctx->sep_used->pdev->dev,
1792 "spe cypher post op cant queue\n");
1793 sep_crypto_release(sctx, ta_ctx, u32_error);
1794 return u32_error;
1795 }
1796
1797 /* schedule the data send */
1798 u32_error = sep_submit_work(ta_ctx->sep_used->workqueue,
1799 sep_dequeuer, (void *)&sep_queue);
1800
1801 if (u32_error) {
1802 dev_warn(&ta_ctx->sep_used->pdev->dev,
1803 "cant submit work sep_crypto_block\n");
1804 sep_crypto_release(sctx, ta_ctx, -EINVAL);
1805 return -EINVAL;
1806 }
1807 }
1808
1809 /* Signal to crypto infrastructure and clear out */
1810 dev_dbg(&ta_ctx->sep_used->pdev->dev, "hash update post op done\n");
1811 sep_crypto_release(sctx, ta_ctx, 0);
1812 return 0;
1813 }
1814
1815 static u32 hash_final_post_op(struct sep_device *sep)
1816 {
1817 int max_length;
1818 u32 u32_error;
1819 u32 msg_offset;
1820 struct crypto_ahash *tfm = crypto_ahash_reqtfm(sep->current_hash_req);
1821 struct sep_system_ctx *sctx = crypto_ahash_ctx(tfm);
1822 struct this_task_ctx *ta_ctx = ahash_request_ctx(sep->current_hash_req);
1823 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1824 "hash final post op\n");
1825
1826 /* first bring msg from shared area to local area */
1827 memcpy(ta_ctx->msg, sep->shared_addr,
1828 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
1829
1830 u32_error = sep_verify_op(ta_ctx, SEP_HASH_FINISH_OPCODE,
1831 &msg_offset);
1832
1833 if (u32_error) {
1834 dev_warn(&ta_ctx->sep_used->pdev->dev, "hash finish error %x\n",
1835 u32_error);
1836 sep_crypto_release(sctx, ta_ctx, u32_error);
1837 return u32_error;
1838 }
1839
1840 /* Grab the result */
1841 if (ta_ctx->current_hash_req->result == NULL) {
1842 /* Oops, null buffer; error out here */
1843 dev_warn(&ta_ctx->sep_used->pdev->dev,
1844 "hash finish null buffer\n");
1845 sep_crypto_release(sctx, ta_ctx, (u32)-ENOMEM);
1846 return -ENOMEM;
1847 }
1848
1849 max_length = (((SEP_HASH_RESULT_SIZE_WORDS * sizeof(u32)) + 3) /
1850 sizeof(u32)) * sizeof(u32);
1851
1852 sep_read_msg(ta_ctx,
1853 ta_ctx->current_hash_req->result,
1854 crypto_ahash_digestsize(tfm), max_length,
1855 &msg_offset, 0);
1856
1857 /* Signal to crypto infrastructure and clear out */
1858 dev_dbg(&ta_ctx->sep_used->pdev->dev, "hash finish post op done\n");
1859 sep_crypto_release(sctx, ta_ctx, 0);
1860 return 0;
1861 }
1862
1863 static u32 hash_digest_post_op(struct sep_device *sep)
1864 {
1865 int max_length;
1866 u32 u32_error;
1867 u32 msg_offset;
1868 struct crypto_ahash *tfm = crypto_ahash_reqtfm(sep->current_hash_req);
1869 struct sep_system_ctx *sctx = crypto_ahash_ctx(tfm);
1870 struct this_task_ctx *ta_ctx = ahash_request_ctx(sep->current_hash_req);
1871 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1872 "hash digest post op\n");
1873
1874 /* first bring msg from shared area to local area */
1875 memcpy(ta_ctx->msg, sep->shared_addr,
1876 SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES);
1877
1878 u32_error = sep_verify_op(ta_ctx, SEP_HASH_SINGLE_OPCODE,
1879 &msg_offset);
1880
1881 if (u32_error) {
1882 dev_warn(&ta_ctx->sep_used->pdev->dev,
1883 "hash digest finish error %x\n", u32_error);
1884
1885 sep_crypto_release(sctx, ta_ctx, u32_error);
1886 return u32_error;
1887 }
1888
1889 /* Grab the result */
1890 if (ta_ctx->current_hash_req->result == NULL) {
1891 /* Oops, null buffer; error out here */
1892 dev_warn(&ta_ctx->sep_used->pdev->dev,
1893 "hash digest finish null buffer\n");
1894 sep_crypto_release(sctx, ta_ctx, (u32)-ENOMEM);
1895 return -ENOMEM;
1896 }
1897
1898 max_length = (((SEP_HASH_RESULT_SIZE_WORDS * sizeof(u32)) + 3) /
1899 sizeof(u32)) * sizeof(u32);
1900
1901 sep_read_msg(ta_ctx,
1902 ta_ctx->current_hash_req->result,
1903 crypto_ahash_digestsize(tfm), max_length,
1904 &msg_offset, 0);
1905
1906 /* Signal to crypto infrastructure and clear out */
1907 dev_dbg(&ta_ctx->sep_used->pdev->dev,
1908 "hash digest finish post op done\n");
1909
1910 sep_crypto_release(sctx, ta_ctx, 0);
1911 return 0;
1912 }
1913
1914 /**
1915 * The sep_finish function is the function that is scheduled (via tasklet)
1916 * by the interrupt service routine when the SEP sends and interrupt
1917 * This is only called by the interrupt handler as a tasklet.
1918 */
1919 static void sep_finish(unsigned long data)
1920 {
1921 struct sep_device *sep_dev;
1922 int res;
1923
1924 res = 0;
1925
1926 if (data == 0) {
1927 pr_debug("sep_finish called with null data\n");
1928 return;
1929 }
1930
1931 sep_dev = (struct sep_device *)data;
1932 if (sep_dev == NULL) {
1933 pr_debug("sep_finish; sep_dev is NULL\n");
1934 return;
1935 }
1936
1937 if (sep_dev->in_kernel == (u32)0) {
1938 dev_warn(&sep_dev->pdev->dev,
1939 "sep_finish; not in kernel operation\n");
1940 return;
1941 }
1942
1943 /* Did we really do a sep command prior to this? */
1944 if (0 == test_bit(SEP_LEGACY_SENDMSG_DONE_OFFSET,
1945 &sep_dev->ta_ctx->call_status.status)) {
1946
1947 dev_warn(&sep_dev->pdev->dev, "[PID%d] sendmsg not called\n",
1948 current->pid);
1949 return;
1950 }
1951
1952 if (sep_dev->send_ct != sep_dev->reply_ct) {
1953 dev_warn(&sep_dev->pdev->dev,
1954 "[PID%d] poll; no message came back\n",
1955 current->pid);
1956 return;
1957 }
1958
1959 /* Check for error (In case time ran out) */
1960 if ((res != 0x0) && (res != 0x8)) {
1961 dev_warn(&sep_dev->pdev->dev,
1962 "[PID%d] poll; poll error GPR3 is %x\n",
1963 current->pid, res);
1964 return;
1965 }
1966
1967 /* What kind of interrupt from sep was this? */
1968 res = sep_read_reg(sep_dev, HW_HOST_SEP_HOST_GPR2_REG_ADDR);
1969
1970 dev_dbg(&sep_dev->pdev->dev, "[PID%d] GPR2 at crypto finish is %x\n",
1971 current->pid, res);
1972
1973 /* Print request? */
1974 if ((res >> 30) & 0x1) {
1975 dev_dbg(&sep_dev->pdev->dev, "[PID%d] sep print req\n",
1976 current->pid);
1977 dev_dbg(&sep_dev->pdev->dev, "[PID%d] contents: %s\n",
1978 current->pid,
1979 (char *)(sep_dev->shared_addr +
1980 SEP_DRIVER_PRINTF_OFFSET_IN_BYTES));
1981 return;
1982 }
1983
1984 /* Request for daemon (not currently in POR)? */
1985 if (res >> 31) {
1986 dev_dbg(&sep_dev->pdev->dev,
1987 "[PID%d] sep request; ignoring\n",
1988 current->pid);
1989 return;
1990 }
1991
1992 /* If we got here, then we have a replay to a sep command */
1993
1994 dev_dbg(&sep_dev->pdev->dev,
1995 "[PID%d] sep reply to command; processing request: %x\n",
1996 current->pid, sep_dev->current_request);
1997
1998 switch (sep_dev->current_request) {
1999 case AES_CBC:
2000 case AES_ECB:
2001 case DES_CBC:
2002 case DES_ECB:
2003 res = crypto_post_op(sep_dev);
2004 break;
2005 case SHA1:
2006 case MD5:
2007 case SHA224:
2008 case SHA256:
2009 switch (sep_dev->current_hash_stage) {
2010 case HASH_INIT:
2011 res = hash_init_post_op(sep_dev);
2012 break;
2013 case HASH_UPDATE:
2014 case HASH_FINUP_DATA:
2015 res = hash_update_post_op(sep_dev);
2016 break;
2017 case HASH_FINUP_FINISH:
2018 case HASH_FINISH:
2019 res = hash_final_post_op(sep_dev);
2020 break;
2021 case HASH_DIGEST:
2022 res = hash_digest_post_op(sep_dev);
2023 break;
2024 default:
2025 pr_debug("sep - invalid stage for hash finish\n");
2026 }
2027 break;
2028 default:
2029 pr_debug("sep - invalid request for finish\n");
2030 }
2031
2032 if (res)
2033 pr_debug("sep - finish returned error %x\n", res);
2034 }
2035
2036 static int sep_hash_cra_init(struct crypto_tfm *tfm)
2037 {
2038 const char *alg_name = crypto_tfm_alg_name(tfm);
2039
2040 pr_debug("sep_hash_cra_init name is %s\n", alg_name);
2041
2042 crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
2043 sizeof(struct this_task_ctx));
2044 return 0;
2045 }
2046
2047 static void sep_hash_cra_exit(struct crypto_tfm *tfm)
2048 {
2049 pr_debug("sep_hash_cra_exit\n");
2050 }
2051
2052 static void sep_hash_init(void *data)
2053 {
2054 u32 msg_offset;
2055 int result;
2056 struct ahash_request *req;
2057 struct crypto_ahash *tfm;
2058 struct this_task_ctx *ta_ctx;
2059 struct sep_system_ctx *sctx;
2060 unsigned long end_time;
2061 int are_we_done_yet;
2062
2063 req = (struct ahash_request *)data;
2064 tfm = crypto_ahash_reqtfm(req);
2065 sctx = crypto_ahash_ctx(tfm);
2066 ta_ctx = ahash_request_ctx(req);
2067 ta_ctx->sep_used = sep_dev;
2068
2069 ta_ctx->are_we_done_yet = &are_we_done_yet;
2070
2071 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2072 "sep_hash_init\n");
2073 ta_ctx->current_hash_stage = HASH_INIT;
2074 /* opcode and mode */
2075 sep_make_header(ta_ctx, &msg_offset, SEP_HASH_INIT_OPCODE);
2076 sep_write_msg(ta_ctx, &ta_ctx->hash_opmode,
2077 sizeof(u32), sizeof(u32), &msg_offset, 0);
2078 sep_end_msg(ta_ctx, msg_offset);
2079
2080 are_we_done_yet = 0;
2081 result = sep_crypto_take_sep(ta_ctx);
2082 if (result) {
2083 dev_warn(&ta_ctx->sep_used->pdev->dev,
2084 "sep_hash_init take sep failed\n");
2085 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2086 }
2087
2088 /* now we sit and wait up to a fixed time for completion */
2089 end_time = jiffies + (WAIT_TIME * HZ);
2090 while ((time_before(jiffies, end_time)) && (are_we_done_yet == 0))
2091 schedule();
2092
2093 /* Done waiting; still not done yet? */
2094 if (are_we_done_yet == 0) {
2095 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2096 "hash init never got done\n");
2097 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2098 return;
2099 }
2100
2101 }
2102
2103 static void sep_hash_update(void *data)
2104 {
2105 int int_error;
2106 u32 msg_offset;
2107 u32 len;
2108 struct sep_hash_internal_context *int_ctx;
2109 u32 block_size;
2110 u32 head_len;
2111 u32 tail_len;
2112 int are_we_done_yet;
2113
2114 static u32 msg[10];
2115 static char small_buf[100];
2116 void *src_ptr;
2117 struct scatterlist *new_sg;
2118 ssize_t copy_result;
2119 struct ahash_request *req;
2120 struct crypto_ahash *tfm;
2121 struct this_task_ctx *ta_ctx;
2122 struct sep_system_ctx *sctx;
2123 unsigned long end_time;
2124
2125 req = (struct ahash_request *)data;
2126 tfm = crypto_ahash_reqtfm(req);
2127 sctx = crypto_ahash_ctx(tfm);
2128 ta_ctx = ahash_request_ctx(req);
2129 ta_ctx->sep_used = sep_dev;
2130
2131 ta_ctx->are_we_done_yet = &are_we_done_yet;
2132
2133 /* length for queue status */
2134 ta_ctx->nbytes = req->nbytes;
2135
2136 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2137 "sep_hash_update\n");
2138 ta_ctx->current_hash_stage = HASH_UPDATE;
2139 len = req->nbytes;
2140
2141 block_size = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2142 tail_len = req->nbytes % block_size;
2143 dev_dbg(&ta_ctx->sep_used->pdev->dev, "length is %x\n", len);
2144 dev_dbg(&ta_ctx->sep_used->pdev->dev, "block_size is %x\n", block_size);
2145 dev_dbg(&ta_ctx->sep_used->pdev->dev, "tail len is %x\n", tail_len);
2146
2147 /* Compute header/tail sizes */
2148 int_ctx = (struct sep_hash_internal_context *)&sctx->
2149 hash_private_ctx.internal_context;
2150 head_len = (block_size - int_ctx->prev_update_bytes) % block_size;
2151 tail_len = (req->nbytes - head_len) % block_size;
2152
2153 /* Make sure all pages are an even block */
2154 int_error = sep_oddball_pages(ta_ctx->sep_used, req->src,
2155 req->nbytes,
2156 block_size, &new_sg, 1);
2157
2158 if (int_error < 0) {
2159 dev_warn(&ta_ctx->sep_used->pdev->dev,
2160 "oddball pages error in crash update\n");
2161 sep_crypto_release(sctx, ta_ctx, -ENOMEM);
2162 return;
2163 } else if (int_error == 1) {
2164 ta_ctx->src_sg = new_sg;
2165 ta_ctx->src_sg_hold = new_sg;
2166 } else {
2167 ta_ctx->src_sg = req->src;
2168 ta_ctx->src_sg_hold = NULL;
2169 }
2170
2171 src_ptr = sg_virt(ta_ctx->src_sg);
2172
2173 if ((!req->nbytes) || (!ta_ctx->src_sg)) {
2174 /* null data */
2175 src_ptr = NULL;
2176 }
2177
2178 ta_ctx->dcb_input_data.app_in_address = src_ptr;
2179 ta_ctx->dcb_input_data.data_in_size =
2180 req->nbytes - (head_len + tail_len);
2181 ta_ctx->dcb_input_data.app_out_address = NULL;
2182 ta_ctx->dcb_input_data.block_size = block_size;
2183 ta_ctx->dcb_input_data.tail_block_size = 0;
2184 ta_ctx->dcb_input_data.is_applet = 0;
2185 ta_ctx->dcb_input_data.src_sg = ta_ctx->src_sg;
2186 ta_ctx->dcb_input_data.dst_sg = NULL;
2187
2188 int_error = sep_create_dcb_dmatables_context_kernel(
2189 ta_ctx->sep_used,
2190 &ta_ctx->dcb_region,
2191 &ta_ctx->dmatables_region,
2192 &ta_ctx->dma_ctx,
2193 &ta_ctx->dcb_input_data,
2194 1);
2195 if (int_error) {
2196 dev_warn(&ta_ctx->sep_used->pdev->dev,
2197 "hash update dma table create failed\n");
2198 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2199 return;
2200 }
2201
2202 /* Construct message to SEP */
2203 sep_make_header(ta_ctx, &msg_offset, SEP_HASH_UPDATE_OPCODE);
2204
2205 msg[0] = (u32)0;
2206 msg[1] = (u32)0;
2207 msg[2] = (u32)0;
2208
2209 sep_write_msg(ta_ctx, msg, sizeof(u32) * 3, sizeof(u32) * 3,
2210 &msg_offset, 0);
2211
2212 /* Handle remainders */
2213
2214 /* Head */
2215 sep_write_msg(ta_ctx, &head_len, sizeof(u32),
2216 sizeof(u32), &msg_offset, 0);
2217
2218 if (head_len) {
2219 copy_result = sg_copy_to_buffer(
2220 req->src,
2221 sep_sg_nents(ta_ctx->src_sg),
2222 small_buf, head_len);
2223
2224 if (copy_result != head_len) {
2225 dev_warn(&ta_ctx->sep_used->pdev->dev,
2226 "sg head copy failure in hash block\n");
2227 sep_crypto_release(sctx, ta_ctx, -ENOMEM);
2228 return;
2229 }
2230
2231 sep_write_msg(ta_ctx, small_buf, head_len,
2232 sizeof(u32) * 32, &msg_offset, 1);
2233 } else {
2234 msg_offset += sizeof(u32) * 32;
2235 }
2236
2237 /* Tail */
2238 sep_write_msg(ta_ctx, &tail_len, sizeof(u32),
2239 sizeof(u32), &msg_offset, 0);
2240
2241 if (tail_len) {
2242 copy_result = sep_copy_offset_sg(
2243 ta_ctx->sep_used,
2244 ta_ctx->src_sg,
2245 req->nbytes - tail_len,
2246 small_buf, tail_len);
2247
2248 if (copy_result != tail_len) {
2249 dev_warn(&ta_ctx->sep_used->pdev->dev,
2250 "sg tail copy failure in hash block\n");
2251 sep_crypto_release(sctx, ta_ctx, -ENOMEM);
2252 return;
2253 }
2254
2255 sep_write_msg(ta_ctx, small_buf, tail_len,
2256 sizeof(u32) * 32, &msg_offset, 1);
2257 } else {
2258 msg_offset += sizeof(u32) * 32;
2259 }
2260
2261 /* Context */
2262 sep_write_context(ta_ctx, &msg_offset, &sctx->hash_private_ctx,
2263 sizeof(struct sep_hash_private_context));
2264
2265 sep_end_msg(ta_ctx, msg_offset);
2266 are_we_done_yet = 0;
2267 int_error = sep_crypto_take_sep(ta_ctx);
2268 if (int_error) {
2269 dev_warn(&ta_ctx->sep_used->pdev->dev,
2270 "sep_hash_update take sep failed\n");
2271 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2272 }
2273
2274 /* now we sit and wait up to a fixed time for completion */
2275 end_time = jiffies + (WAIT_TIME * HZ);
2276 while ((time_before(jiffies, end_time)) && (are_we_done_yet == 0))
2277 schedule();
2278
2279 /* Done waiting; still not done yet? */
2280 if (are_we_done_yet == 0) {
2281 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2282 "hash update never got done\n");
2283 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2284 return;
2285 }
2286
2287 }
2288
2289 static void sep_hash_final(void *data)
2290 {
2291 u32 msg_offset;
2292 struct ahash_request *req;
2293 struct crypto_ahash *tfm;
2294 struct this_task_ctx *ta_ctx;
2295 struct sep_system_ctx *sctx;
2296 int result;
2297 unsigned long end_time;
2298 int are_we_done_yet;
2299
2300 req = (struct ahash_request *)data;
2301 tfm = crypto_ahash_reqtfm(req);
2302 sctx = crypto_ahash_ctx(tfm);
2303 ta_ctx = ahash_request_ctx(req);
2304 ta_ctx->sep_used = sep_dev;
2305
2306 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2307 "sep_hash_final\n");
2308 ta_ctx->current_hash_stage = HASH_FINISH;
2309
2310 ta_ctx->are_we_done_yet = &are_we_done_yet;
2311
2312 /* opcode and mode */
2313 sep_make_header(ta_ctx, &msg_offset, SEP_HASH_FINISH_OPCODE);
2314
2315 /* Context */
2316 sep_write_context(ta_ctx, &msg_offset, &sctx->hash_private_ctx,
2317 sizeof(struct sep_hash_private_context));
2318
2319 sep_end_msg(ta_ctx, msg_offset);
2320 are_we_done_yet = 0;
2321 result = sep_crypto_take_sep(ta_ctx);
2322 if (result) {
2323 dev_warn(&ta_ctx->sep_used->pdev->dev,
2324 "sep_hash_final take sep failed\n");
2325 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2326 }
2327
2328 /* now we sit and wait up to a fixed time for completion */
2329 end_time = jiffies + (WAIT_TIME * HZ);
2330 while ((time_before(jiffies, end_time)) && (are_we_done_yet == 0))
2331 schedule();
2332
2333 /* Done waiting; still not done yet? */
2334 if (are_we_done_yet == 0) {
2335 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2336 "hash final job never got done\n");
2337 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2338 return;
2339 }
2340
2341 }
2342
2343 static void sep_hash_digest(void *data)
2344 {
2345 int int_error;
2346 u32 msg_offset;
2347 u32 block_size;
2348 u32 msg[10];
2349 size_t copy_result;
2350 int result;
2351 int are_we_done_yet;
2352 u32 tail_len;
2353 static char small_buf[100];
2354 struct scatterlist *new_sg;
2355 void *src_ptr;
2356
2357 struct ahash_request *req;
2358 struct crypto_ahash *tfm;
2359 struct this_task_ctx *ta_ctx;
2360 struct sep_system_ctx *sctx;
2361 unsigned long end_time;
2362
2363 req = (struct ahash_request *)data;
2364 tfm = crypto_ahash_reqtfm(req);
2365 sctx = crypto_ahash_ctx(tfm);
2366 ta_ctx = ahash_request_ctx(req);
2367 ta_ctx->sep_used = sep_dev;
2368
2369 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2370 "sep_hash_digest\n");
2371 ta_ctx->current_hash_stage = HASH_DIGEST;
2372
2373 ta_ctx->are_we_done_yet = &are_we_done_yet;
2374
2375 /* length for queue status */
2376 ta_ctx->nbytes = req->nbytes;
2377
2378 block_size = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2379 tail_len = req->nbytes % block_size;
2380 dev_dbg(&ta_ctx->sep_used->pdev->dev, "length is %x\n", req->nbytes);
2381 dev_dbg(&ta_ctx->sep_used->pdev->dev, "block_size is %x\n", block_size);
2382 dev_dbg(&ta_ctx->sep_used->pdev->dev, "tail len is %x\n", tail_len);
2383
2384 /* Make sure all pages are an even block */
2385 int_error = sep_oddball_pages(ta_ctx->sep_used, req->src,
2386 req->nbytes,
2387 block_size, &new_sg, 1);
2388
2389 if (int_error < 0) {
2390 dev_warn(&ta_ctx->sep_used->pdev->dev,
2391 "oddball pages error in crash update\n");
2392 sep_crypto_release(sctx, ta_ctx, -ENOMEM);
2393 return;
2394 } else if (int_error == 1) {
2395 ta_ctx->src_sg = new_sg;
2396 ta_ctx->src_sg_hold = new_sg;
2397 } else {
2398 ta_ctx->src_sg = req->src;
2399 ta_ctx->src_sg_hold = NULL;
2400 }
2401
2402 src_ptr = sg_virt(ta_ctx->src_sg);
2403
2404 if ((!req->nbytes) || (!ta_ctx->src_sg)) {
2405 /* null data */
2406 src_ptr = NULL;
2407 }
2408
2409 ta_ctx->dcb_input_data.app_in_address = src_ptr;
2410 ta_ctx->dcb_input_data.data_in_size = req->nbytes - tail_len;
2411 ta_ctx->dcb_input_data.app_out_address = NULL;
2412 ta_ctx->dcb_input_data.block_size = block_size;
2413 ta_ctx->dcb_input_data.tail_block_size = 0;
2414 ta_ctx->dcb_input_data.is_applet = 0;
2415 ta_ctx->dcb_input_data.src_sg = ta_ctx->src_sg;
2416 ta_ctx->dcb_input_data.dst_sg = NULL;
2417
2418 int_error = sep_create_dcb_dmatables_context_kernel(
2419 ta_ctx->sep_used,
2420 &ta_ctx->dcb_region,
2421 &ta_ctx->dmatables_region,
2422 &ta_ctx->dma_ctx,
2423 &ta_ctx->dcb_input_data,
2424 1);
2425 if (int_error) {
2426 dev_warn(&ta_ctx->sep_used->pdev->dev,
2427 "hash update dma table create failed\n");
2428 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2429 return;
2430 }
2431
2432 /* Construct message to SEP */
2433 sep_make_header(ta_ctx, &msg_offset, SEP_HASH_SINGLE_OPCODE);
2434 sep_write_msg(ta_ctx, &ta_ctx->hash_opmode,
2435 sizeof(u32), sizeof(u32), &msg_offset, 0);
2436
2437 msg[0] = (u32)0;
2438 msg[1] = (u32)0;
2439 msg[2] = (u32)0;
2440
2441 sep_write_msg(ta_ctx, msg, sizeof(u32) * 3, sizeof(u32) * 3,
2442 &msg_offset, 0);
2443
2444 /* Tail */
2445 sep_write_msg(ta_ctx, &tail_len, sizeof(u32),
2446 sizeof(u32), &msg_offset, 0);
2447
2448 if (tail_len) {
2449 copy_result = sep_copy_offset_sg(
2450 ta_ctx->sep_used,
2451 ta_ctx->src_sg,
2452 req->nbytes - tail_len,
2453 small_buf, tail_len);
2454
2455 if (copy_result != tail_len) {
2456 dev_warn(&ta_ctx->sep_used->pdev->dev,
2457 "sg tail copy failure in hash block\n");
2458 sep_crypto_release(sctx, ta_ctx, -ENOMEM);
2459 return;
2460 }
2461
2462 sep_write_msg(ta_ctx, small_buf, tail_len,
2463 sizeof(u32) * 32, &msg_offset, 1);
2464 } else {
2465 msg_offset += sizeof(u32) * 32;
2466 }
2467
2468 sep_end_msg(ta_ctx, msg_offset);
2469
2470 are_we_done_yet = 0;
2471 result = sep_crypto_take_sep(ta_ctx);
2472 if (result) {
2473 dev_warn(&ta_ctx->sep_used->pdev->dev,
2474 "sep_hash_digest take sep failed\n");
2475 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2476 }
2477
2478 /* now we sit and wait up to a fixed time for completion */
2479 end_time = jiffies + (WAIT_TIME * HZ);
2480 while ((time_before(jiffies, end_time)) && (are_we_done_yet == 0))
2481 schedule();
2482
2483 /* Done waiting; still not done yet? */
2484 if (are_we_done_yet == 0) {
2485 dev_dbg(&ta_ctx->sep_used->pdev->dev,
2486 "hash digest job never got done\n");
2487 sep_crypto_release(sctx, ta_ctx, -EINVAL);
2488 return;
2489 }
2490
2491 }
2492
2493 /**
2494 * This is what is called by each of the API's provided
2495 * in the kernel crypto descriptors. It is run in a process
2496 * context using the kernel workqueues. Therefore it can
2497 * be put to sleep.
2498 */
2499 static void sep_dequeuer(void *data)
2500 {
2501 struct crypto_queue *this_queue;
2502 struct crypto_async_request *async_req;
2503 struct crypto_async_request *backlog;
2504 struct ablkcipher_request *cypher_req;
2505 struct ahash_request *hash_req;
2506 struct sep_system_ctx *sctx;
2507 struct crypto_ahash *hash_tfm;
2508 struct this_task_ctx *ta_ctx;
2509
2510
2511 this_queue = (struct crypto_queue *)data;
2512
2513 spin_lock_irq(&queue_lock);
2514 backlog = crypto_get_backlog(this_queue);
2515 async_req = crypto_dequeue_request(this_queue);
2516 spin_unlock_irq(&queue_lock);
2517
2518 if (!async_req) {
2519 pr_debug("sep crypto queue is empty\n");
2520 return;
2521 }
2522
2523 if (backlog) {
2524 pr_debug("sep crypto backlog set\n");
2525 if (backlog->complete)
2526 backlog->complete(backlog, -EINPROGRESS);
2527 backlog = NULL;
2528 }
2529
2530 if (!async_req->tfm) {
2531 pr_debug("sep crypto queue null tfm\n");
2532 return;
2533 }
2534
2535 if (!async_req->tfm->__crt_alg) {
2536 pr_debug("sep crypto queue null __crt_alg\n");
2537 return;
2538 }
2539
2540 if (!async_req->tfm->__crt_alg->cra_type) {
2541 pr_debug("sep crypto queue null cra_type\n");
2542 return;
2543 }
2544
2545 /* we have stuff in the queue */
2546 if (async_req->tfm->__crt_alg->cra_type !=
2547 &crypto_ahash_type) {
2548 /* This is for a cypher */
2549 pr_debug("sep crypto queue doing cipher\n");
2550 cypher_req = container_of(async_req,
2551 struct ablkcipher_request,
2552 base);
2553 if (!cypher_req) {
2554 pr_debug("sep crypto queue null cypher_req\n");
2555 return;
2556 }
2557
2558 sep_crypto_block((void *)cypher_req);
2559 return;
2560 } else {
2561 /* This is a hash */
2562 pr_debug("sep crypto queue doing hash\n");
2563 /**
2564 * This is a bit more complex than cipher; we
2565 * need to figure out what type of operation
2566 */
2567 hash_req = ahash_request_cast(async_req);
2568 if (!hash_req) {
2569 pr_debug("sep crypto queue null hash_req\n");
2570 return;
2571 }
2572
2573 hash_tfm = crypto_ahash_reqtfm(hash_req);
2574 if (!hash_tfm) {
2575 pr_debug("sep crypto queue null hash_tfm\n");
2576 return;
2577 }
2578
2579
2580 sctx = crypto_ahash_ctx(hash_tfm);
2581 if (!sctx) {
2582 pr_debug("sep crypto queue null sctx\n");
2583 return;
2584 }
2585
2586 ta_ctx = ahash_request_ctx(hash_req);
2587
2588 if (ta_ctx->current_hash_stage == HASH_INIT) {
2589 pr_debug("sep crypto queue hash init\n");
2590 sep_hash_init((void *)hash_req);
2591 return;
2592 } else if (ta_ctx->current_hash_stage == HASH_UPDATE) {
2593 pr_debug("sep crypto queue hash update\n");
2594 sep_hash_update((void *)hash_req);
2595 return;
2596 } else if (ta_ctx->current_hash_stage == HASH_FINISH) {
2597 pr_debug("sep crypto queue hash final\n");
2598 sep_hash_final((void *)hash_req);
2599 return;
2600 } else if (ta_ctx->current_hash_stage == HASH_DIGEST) {
2601 pr_debug("sep crypto queue hash digest\n");
2602 sep_hash_digest((void *)hash_req);
2603 return;
2604 } else if (ta_ctx->current_hash_stage == HASH_FINUP_DATA) {
2605 pr_debug("sep crypto queue hash digest\n");
2606 sep_hash_update((void *)hash_req);
2607 return;
2608 } else if (ta_ctx->current_hash_stage == HASH_FINUP_FINISH) {
2609 pr_debug("sep crypto queue hash digest\n");
2610 sep_hash_final((void *)hash_req);
2611 return;
2612 } else {
2613 pr_debug("sep crypto queue hash oops nothing\n");
2614 return;
2615 }
2616 }
2617 }
2618
2619 static int sep_sha1_init(struct ahash_request *req)
2620 {
2621 int error;
2622 int error1;
2623 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2624
2625 pr_debug("sep - doing sha1 init\n");
2626
2627 /* Clear out task context */
2628 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
2629
2630 ta_ctx->sep_used = sep_dev;
2631 ta_ctx->current_request = SHA1;
2632 ta_ctx->current_hash_req = req;
2633 ta_ctx->current_cypher_req = NULL;
2634 ta_ctx->hash_opmode = SEP_HASH_SHA1;
2635 ta_ctx->current_hash_stage = HASH_INIT;
2636
2637 /* lock necessary so that only one entity touches the queues */
2638 spin_lock_irq(&queue_lock);
2639 error = crypto_enqueue_request(&sep_queue, &req->base);
2640
2641 if ((error != 0) && (error != -EINPROGRESS))
2642 pr_debug(" sep - crypto enqueue failed: %x\n",
2643 error);
2644 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2645 sep_dequeuer, (void *)&sep_queue);
2646 if (error1)
2647 pr_debug(" sep - workqueue submit failed: %x\n",
2648 error1);
2649 spin_unlock_irq(&queue_lock);
2650 /* We return result of crypto enqueue */
2651 return error;
2652 }
2653
2654 static int sep_sha1_update(struct ahash_request *req)
2655 {
2656 int error;
2657 int error1;
2658 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2659
2660 pr_debug("sep - doing sha1 update\n");
2661
2662 ta_ctx->sep_used = sep_dev;
2663 ta_ctx->current_request = SHA1;
2664 ta_ctx->current_hash_req = req;
2665 ta_ctx->current_cypher_req = NULL;
2666 ta_ctx->hash_opmode = SEP_HASH_SHA1;
2667 ta_ctx->current_hash_stage = HASH_UPDATE;
2668
2669 /* lock necessary so that only one entity touches the queues */
2670 spin_lock_irq(&queue_lock);
2671 error = crypto_enqueue_request(&sep_queue, &req->base);
2672
2673 if ((error != 0) && (error != -EINPROGRESS))
2674 pr_debug(" sep - crypto enqueue failed: %x\n",
2675 error);
2676 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2677 sep_dequeuer, (void *)&sep_queue);
2678 if (error1)
2679 pr_debug(" sep - workqueue submit failed: %x\n",
2680 error1);
2681 spin_unlock_irq(&queue_lock);
2682 /* We return result of crypto enqueue */
2683 return error;
2684 }
2685
2686 static int sep_sha1_final(struct ahash_request *req)
2687 {
2688 int error;
2689 int error1;
2690 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2691 pr_debug("sep - doing sha1 final\n");
2692
2693 ta_ctx->sep_used = sep_dev;
2694 ta_ctx->current_request = SHA1;
2695 ta_ctx->current_hash_req = req;
2696 ta_ctx->current_cypher_req = NULL;
2697 ta_ctx->hash_opmode = SEP_HASH_SHA1;
2698 ta_ctx->current_hash_stage = HASH_FINISH;
2699
2700 /* lock necessary so that only one entity touches the queues */
2701 spin_lock_irq(&queue_lock);
2702 error = crypto_enqueue_request(&sep_queue, &req->base);
2703
2704 if ((error != 0) && (error != -EINPROGRESS))
2705 pr_debug(" sep - crypto enqueue failed: %x\n",
2706 error);
2707 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2708 sep_dequeuer, (void *)&sep_queue);
2709 if (error1)
2710 pr_debug(" sep - workqueue submit failed: %x\n",
2711 error1);
2712 spin_unlock_irq(&queue_lock);
2713 /* We return result of crypto enqueue */
2714 return error;
2715 }
2716
2717 static int sep_sha1_digest(struct ahash_request *req)
2718 {
2719 int error;
2720 int error1;
2721 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2722 pr_debug("sep - doing sha1 digest\n");
2723
2724 /* Clear out task context */
2725 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
2726
2727 ta_ctx->sep_used = sep_dev;
2728 ta_ctx->current_request = SHA1;
2729 ta_ctx->current_hash_req = req;
2730 ta_ctx->current_cypher_req = NULL;
2731 ta_ctx->hash_opmode = SEP_HASH_SHA1;
2732 ta_ctx->current_hash_stage = HASH_DIGEST;
2733
2734 /* lock necessary so that only one entity touches the queues */
2735 spin_lock_irq(&queue_lock);
2736 error = crypto_enqueue_request(&sep_queue, &req->base);
2737
2738 if ((error != 0) && (error != -EINPROGRESS))
2739 pr_debug(" sep - crypto enqueue failed: %x\n",
2740 error);
2741 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2742 sep_dequeuer, (void *)&sep_queue);
2743 if (error1)
2744 pr_debug(" sep - workqueue submit failed: %x\n",
2745 error1);
2746 spin_unlock_irq(&queue_lock);
2747 /* We return result of crypto enqueue */
2748 return error;
2749 }
2750
2751 static int sep_sha1_finup(struct ahash_request *req)
2752 {
2753 int error;
2754 int error1;
2755 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2756 pr_debug("sep - doing sha1 finup\n");
2757
2758 ta_ctx->sep_used = sep_dev;
2759 ta_ctx->current_request = SHA1;
2760 ta_ctx->current_hash_req = req;
2761 ta_ctx->current_cypher_req = NULL;
2762 ta_ctx->hash_opmode = SEP_HASH_SHA1;
2763 ta_ctx->current_hash_stage = HASH_FINUP_DATA;
2764
2765 /* lock necessary so that only one entity touches the queues */
2766 spin_lock_irq(&queue_lock);
2767 error = crypto_enqueue_request(&sep_queue, &req->base);
2768
2769 if ((error != 0) && (error != -EINPROGRESS))
2770 pr_debug(" sep - crypto enqueue failed: %x\n",
2771 error);
2772 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2773 sep_dequeuer, (void *)&sep_queue);
2774 if (error1)
2775 pr_debug(" sep - workqueue submit failed: %x\n",
2776 error1);
2777 spin_unlock_irq(&queue_lock);
2778 /* We return result of crypto enqueue */
2779 return error;
2780 }
2781
2782 static int sep_md5_init(struct ahash_request *req)
2783 {
2784 int error;
2785 int error1;
2786 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2787 pr_debug("sep - doing md5 init\n");
2788
2789 /* Clear out task context */
2790 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
2791
2792 ta_ctx->sep_used = sep_dev;
2793 ta_ctx->current_request = MD5;
2794 ta_ctx->current_hash_req = req;
2795 ta_ctx->current_cypher_req = NULL;
2796 ta_ctx->hash_opmode = SEP_HASH_MD5;
2797 ta_ctx->current_hash_stage = HASH_INIT;
2798
2799 /* lock necessary so that only one entity touches the queues */
2800 spin_lock_irq(&queue_lock);
2801 error = crypto_enqueue_request(&sep_queue, &req->base);
2802
2803 if ((error != 0) && (error != -EINPROGRESS))
2804 pr_debug(" sep - crypto enqueue failed: %x\n",
2805 error);
2806 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2807 sep_dequeuer, (void *)&sep_queue);
2808 if (error1)
2809 pr_debug(" sep - workqueue submit failed: %x\n",
2810 error1);
2811 spin_unlock_irq(&queue_lock);
2812 /* We return result of crypto enqueue */
2813 return error;
2814 }
2815
2816 static int sep_md5_update(struct ahash_request *req)
2817 {
2818 int error;
2819 int error1;
2820 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2821 pr_debug("sep - doing md5 update\n");
2822
2823 ta_ctx->sep_used = sep_dev;
2824 ta_ctx->current_request = MD5;
2825 ta_ctx->current_hash_req = req;
2826 ta_ctx->current_cypher_req = NULL;
2827 ta_ctx->hash_opmode = SEP_HASH_MD5;
2828 ta_ctx->current_hash_stage = HASH_UPDATE;
2829
2830 /* lock necessary so that only one entity touches the queues */
2831 spin_lock_irq(&queue_lock);
2832 error = crypto_enqueue_request(&sep_queue, &req->base);
2833
2834 if ((error != 0) && (error != -EINPROGRESS))
2835 pr_debug(" sep - crypto enqueue failed: %x\n",
2836 error);
2837 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2838 sep_dequeuer, (void *)&sep_queue);
2839 if (error1)
2840 pr_debug(" sep - workqueue submit failed: %x\n",
2841 error1);
2842 spin_unlock_irq(&queue_lock);
2843 /* We return result of crypto enqueue */
2844 return error;
2845 }
2846
2847 static int sep_md5_final(struct ahash_request *req)
2848 {
2849 int error;
2850 int error1;
2851 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2852 pr_debug("sep - doing md5 final\n");
2853
2854 ta_ctx->sep_used = sep_dev;
2855 ta_ctx->current_request = MD5;
2856 ta_ctx->current_hash_req = req;
2857 ta_ctx->current_cypher_req = NULL;
2858 ta_ctx->hash_opmode = SEP_HASH_MD5;
2859 ta_ctx->current_hash_stage = HASH_FINISH;
2860
2861 /* lock necessary so that only one entity touches the queues */
2862 spin_lock_irq(&queue_lock);
2863 error = crypto_enqueue_request(&sep_queue, &req->base);
2864
2865 if ((error != 0) && (error != -EINPROGRESS))
2866 pr_debug(" sep - crypto enqueue failed: %x\n",
2867 error);
2868 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2869 sep_dequeuer, (void *)&sep_queue);
2870 if (error1)
2871 pr_debug(" sep - workqueue submit failed: %x\n",
2872 error1);
2873 spin_unlock_irq(&queue_lock);
2874 /* We return result of crypto enqueue */
2875 return error;
2876 }
2877
2878 static int sep_md5_digest(struct ahash_request *req)
2879 {
2880 int error;
2881 int error1;
2882 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2883
2884 pr_debug("sep - doing md5 digest\n");
2885
2886 /* Clear out task context */
2887 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
2888
2889 ta_ctx->sep_used = sep_dev;
2890 ta_ctx->current_request = MD5;
2891 ta_ctx->current_hash_req = req;
2892 ta_ctx->current_cypher_req = NULL;
2893 ta_ctx->hash_opmode = SEP_HASH_MD5;
2894 ta_ctx->current_hash_stage = HASH_DIGEST;
2895
2896 /* lock necessary so that only one entity touches the queues */
2897 spin_lock_irq(&queue_lock);
2898 error = crypto_enqueue_request(&sep_queue, &req->base);
2899
2900 if ((error != 0) && (error != -EINPROGRESS))
2901 pr_debug(" sep - crypto enqueue failed: %x\n",
2902 error);
2903 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2904 sep_dequeuer, (void *)&sep_queue);
2905 if (error1)
2906 pr_debug(" sep - workqueue submit failed: %x\n",
2907 error1);
2908 spin_unlock_irq(&queue_lock);
2909 /* We return result of crypto enqueue */
2910 return error;
2911 }
2912
2913 static int sep_md5_finup(struct ahash_request *req)
2914 {
2915 int error;
2916 int error1;
2917 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2918
2919 pr_debug("sep - doing md5 finup\n");
2920
2921 ta_ctx->sep_used = sep_dev;
2922 ta_ctx->current_request = MD5;
2923 ta_ctx->current_hash_req = req;
2924 ta_ctx->current_cypher_req = NULL;
2925 ta_ctx->hash_opmode = SEP_HASH_MD5;
2926 ta_ctx->current_hash_stage = HASH_FINUP_DATA;
2927
2928 /* lock necessary so that only one entity touches the queues */
2929 spin_lock_irq(&queue_lock);
2930 error = crypto_enqueue_request(&sep_queue, &req->base);
2931
2932 if ((error != 0) && (error != -EINPROGRESS))
2933 pr_debug(" sep - crypto enqueue failed: %x\n",
2934 error);
2935 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2936 sep_dequeuer, (void *)&sep_queue);
2937 if (error1)
2938 pr_debug(" sep - workqueue submit failed: %x\n",
2939 error1);
2940 spin_unlock_irq(&queue_lock);
2941 /* We return result of crypto enqueue */
2942 return error;
2943 }
2944
2945 static int sep_sha224_init(struct ahash_request *req)
2946 {
2947 int error;
2948 int error1;
2949 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2950 pr_debug("sep - doing sha224 init\n");
2951
2952 /* Clear out task context */
2953 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
2954
2955 ta_ctx->sep_used = sep_dev;
2956 ta_ctx->current_request = SHA224;
2957 ta_ctx->current_hash_req = req;
2958 ta_ctx->current_cypher_req = NULL;
2959 ta_ctx->hash_opmode = SEP_HASH_SHA224;
2960 ta_ctx->current_hash_stage = HASH_INIT;
2961
2962 /* lock necessary so that only one entity touches the queues */
2963 spin_lock_irq(&queue_lock);
2964 error = crypto_enqueue_request(&sep_queue, &req->base);
2965
2966 if ((error != 0) && (error != -EINPROGRESS))
2967 pr_debug(" sep - crypto enqueue failed: %x\n",
2968 error);
2969 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
2970 sep_dequeuer, (void *)&sep_queue);
2971 if (error1)
2972 pr_debug(" sep - workqueue submit failed: %x\n",
2973 error1);
2974 spin_unlock_irq(&queue_lock);
2975 /* We return result of crypto enqueue */
2976 return error;
2977 }
2978
2979 static int sep_sha224_update(struct ahash_request *req)
2980 {
2981 int error;
2982 int error1;
2983 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
2984 pr_debug("sep - doing sha224 update\n");
2985
2986 ta_ctx->sep_used = sep_dev;
2987 ta_ctx->current_request = SHA224;
2988 ta_ctx->current_hash_req = req;
2989 ta_ctx->current_cypher_req = NULL;
2990 ta_ctx->hash_opmode = SEP_HASH_SHA224;
2991 ta_ctx->current_hash_stage = HASH_UPDATE;
2992
2993 /* lock necessary so that only one entity touches the queues */
2994 spin_lock_irq(&queue_lock);
2995 error = crypto_enqueue_request(&sep_queue, &req->base);
2996
2997 if ((error != 0) && (error != -EINPROGRESS))
2998 pr_debug(" sep - crypto enqueue failed: %x\n",
2999 error);
3000 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3001 sep_dequeuer, (void *)&sep_queue);
3002 if (error1)
3003 pr_debug(" sep - workqueue submit failed: %x\n",
3004 error1);
3005 spin_unlock_irq(&queue_lock);
3006 /* We return result of crypto enqueue */
3007 return error;
3008 }
3009
3010 static int sep_sha224_final(struct ahash_request *req)
3011 {
3012 int error;
3013 int error1;
3014 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3015 pr_debug("sep - doing sha224 final\n");
3016
3017 ta_ctx->sep_used = sep_dev;
3018 ta_ctx->current_request = SHA224;
3019 ta_ctx->current_hash_req = req;
3020 ta_ctx->current_cypher_req = NULL;
3021 ta_ctx->hash_opmode = SEP_HASH_SHA224;
3022 ta_ctx->current_hash_stage = HASH_FINISH;
3023
3024 /* lock necessary so that only one entity touches the queues */
3025 spin_lock_irq(&queue_lock);
3026 error = crypto_enqueue_request(&sep_queue, &req->base);
3027
3028 if ((error != 0) && (error != -EINPROGRESS))
3029 pr_debug(" sep - crypto enqueue failed: %x\n",
3030 error);
3031 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3032 sep_dequeuer, (void *)&sep_queue);
3033 if (error1)
3034 pr_debug(" sep - workqueue submit failed: %x\n",
3035 error1);
3036 spin_unlock_irq(&queue_lock);
3037 /* We return result of crypto enqueue */
3038 return error;
3039 }
3040
3041 static int sep_sha224_digest(struct ahash_request *req)
3042 {
3043 int error;
3044 int error1;
3045 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3046
3047 pr_debug("sep - doing sha224 digest\n");
3048
3049 /* Clear out task context */
3050 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3051
3052 ta_ctx->sep_used = sep_dev;
3053 ta_ctx->current_request = SHA224;
3054 ta_ctx->current_hash_req = req;
3055 ta_ctx->current_cypher_req = NULL;
3056 ta_ctx->hash_opmode = SEP_HASH_SHA224;
3057 ta_ctx->current_hash_stage = HASH_DIGEST;
3058
3059 /* lock necessary so that only one entity touches the queues */
3060 spin_lock_irq(&queue_lock);
3061 error = crypto_enqueue_request(&sep_queue, &req->base);
3062
3063 if ((error != 0) && (error != -EINPROGRESS))
3064 pr_debug(" sep - crypto enqueue failed: %x\n",
3065 error);
3066 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3067 sep_dequeuer, (void *)&sep_queue);
3068 if (error1)
3069 pr_debug(" sep - workqueue submit failed: %x\n",
3070 error1);
3071 spin_unlock_irq(&queue_lock);
3072 /* We return result of crypto enqueue */
3073 return error;
3074 }
3075
3076 static int sep_sha224_finup(struct ahash_request *req)
3077 {
3078 int error;
3079 int error1;
3080 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3081
3082 pr_debug("sep - doing sha224 finup\n");
3083
3084 ta_ctx->sep_used = sep_dev;
3085 ta_ctx->current_request = SHA224;
3086 ta_ctx->current_hash_req = req;
3087 ta_ctx->current_cypher_req = NULL;
3088 ta_ctx->hash_opmode = SEP_HASH_SHA224;
3089 ta_ctx->current_hash_stage = HASH_FINUP_DATA;
3090
3091 /* lock necessary so that only one entity touches the queues */
3092 spin_lock_irq(&queue_lock);
3093 error = crypto_enqueue_request(&sep_queue, &req->base);
3094
3095 if ((error != 0) && (error != -EINPROGRESS))
3096 pr_debug(" sep - crypto enqueue failed: %x\n",
3097 error);
3098 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3099 sep_dequeuer, (void *)&sep_queue);
3100 if (error1)
3101 pr_debug(" sep - workqueue submit failed: %x\n",
3102 error1);
3103 spin_unlock_irq(&queue_lock);
3104 /* We return result of crypto enqueue */
3105 return error;
3106 }
3107
3108 static int sep_sha256_init(struct ahash_request *req)
3109 {
3110 int error;
3111 int error1;
3112 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3113 pr_debug("sep - doing sha256 init\n");
3114
3115 /* Clear out task context */
3116 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3117
3118 ta_ctx->sep_used = sep_dev;
3119 ta_ctx->current_request = SHA256;
3120 ta_ctx->current_hash_req = req;
3121 ta_ctx->current_cypher_req = NULL;
3122 ta_ctx->hash_opmode = SEP_HASH_SHA256;
3123 ta_ctx->current_hash_stage = HASH_INIT;
3124
3125 /* lock necessary so that only one entity touches the queues */
3126 spin_lock_irq(&queue_lock);
3127 error = crypto_enqueue_request(&sep_queue, &req->base);
3128
3129 if ((error != 0) && (error != -EINPROGRESS))
3130 pr_debug(" sep - crypto enqueue failed: %x\n",
3131 error);
3132 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3133 sep_dequeuer, (void *)&sep_queue);
3134 if (error1)
3135 pr_debug(" sep - workqueue submit failed: %x\n",
3136 error1);
3137 spin_unlock_irq(&queue_lock);
3138 /* We return result of crypto enqueue */
3139 return error;
3140 }
3141
3142 static int sep_sha256_update(struct ahash_request *req)
3143 {
3144 int error;
3145 int error1;
3146 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3147 pr_debug("sep - doing sha256 update\n");
3148
3149 ta_ctx->sep_used = sep_dev;
3150 ta_ctx->current_request = SHA256;
3151 ta_ctx->current_hash_req = req;
3152 ta_ctx->current_cypher_req = NULL;
3153 ta_ctx->hash_opmode = SEP_HASH_SHA256;
3154 ta_ctx->current_hash_stage = HASH_UPDATE;
3155
3156 /* lock necessary so that only one entity touches the queues */
3157 spin_lock_irq(&queue_lock);
3158 error = crypto_enqueue_request(&sep_queue, &req->base);
3159
3160 if ((error != 0) && (error != -EINPROGRESS))
3161 pr_debug(" sep - crypto enqueue failed: %x\n",
3162 error);
3163 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3164 sep_dequeuer, (void *)&sep_queue);
3165 if (error1)
3166 pr_debug(" sep - workqueue submit failed: %x\n",
3167 error1);
3168 spin_unlock_irq(&queue_lock);
3169 /* We return result of crypto enqueue */
3170 return error;
3171 }
3172
3173 static int sep_sha256_final(struct ahash_request *req)
3174 {
3175 int error;
3176 int error1;
3177 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3178 pr_debug("sep - doing sha256 final\n");
3179
3180 ta_ctx->sep_used = sep_dev;
3181 ta_ctx->current_request = SHA256;
3182 ta_ctx->current_hash_req = req;
3183 ta_ctx->current_cypher_req = NULL;
3184 ta_ctx->hash_opmode = SEP_HASH_SHA256;
3185 ta_ctx->current_hash_stage = HASH_FINISH;
3186
3187 /* lock necessary so that only one entity touches the queues */
3188 spin_lock_irq(&queue_lock);
3189 error = crypto_enqueue_request(&sep_queue, &req->base);
3190
3191 if ((error != 0) && (error != -EINPROGRESS))
3192 pr_debug(" sep - crypto enqueue failed: %x\n",
3193 error);
3194 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3195 sep_dequeuer, (void *)&sep_queue);
3196 if (error1)
3197 pr_debug(" sep - workqueue submit failed: %x\n",
3198 error1);
3199 spin_unlock_irq(&queue_lock);
3200 /* We return result of crypto enqueue */
3201 return error;
3202 }
3203
3204 static int sep_sha256_digest(struct ahash_request *req)
3205 {
3206 int error;
3207 int error1;
3208 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3209
3210 pr_debug("sep - doing sha256 digest\n");
3211
3212 /* Clear out task context */
3213 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3214
3215 ta_ctx->sep_used = sep_dev;
3216 ta_ctx->current_request = SHA256;
3217 ta_ctx->current_hash_req = req;
3218 ta_ctx->current_cypher_req = NULL;
3219 ta_ctx->hash_opmode = SEP_HASH_SHA256;
3220 ta_ctx->current_hash_stage = HASH_DIGEST;
3221
3222 /* lock necessary so that only one entity touches the queues */
3223 spin_lock_irq(&queue_lock);
3224 error = crypto_enqueue_request(&sep_queue, &req->base);
3225
3226 if ((error != 0) && (error != -EINPROGRESS))
3227 pr_debug(" sep - crypto enqueue failed: %x\n",
3228 error);
3229 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3230 sep_dequeuer, (void *)&sep_queue);
3231 if (error1)
3232 pr_debug(" sep - workqueue submit failed: %x\n",
3233 error1);
3234 spin_unlock_irq(&queue_lock);
3235 /* We return result of crypto enqueue */
3236 return error;
3237 }
3238
3239 static int sep_sha256_finup(struct ahash_request *req)
3240 {
3241 int error;
3242 int error1;
3243 struct this_task_ctx *ta_ctx = ahash_request_ctx(req);
3244
3245 pr_debug("sep - doing sha256 finup\n");
3246
3247 ta_ctx->sep_used = sep_dev;
3248 ta_ctx->current_request = SHA256;
3249 ta_ctx->current_hash_req = req;
3250 ta_ctx->current_cypher_req = NULL;
3251 ta_ctx->hash_opmode = SEP_HASH_SHA256;
3252 ta_ctx->current_hash_stage = HASH_FINUP_DATA;
3253
3254 /* lock necessary so that only one entity touches the queues */
3255 spin_lock_irq(&queue_lock);
3256 error = crypto_enqueue_request(&sep_queue, &req->base);
3257
3258 if ((error != 0) && (error != -EINPROGRESS))
3259 pr_debug(" sep - crypto enqueue failed: %x\n",
3260 error);
3261 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3262 sep_dequeuer, (void *)&sep_queue);
3263 if (error1)
3264 pr_debug(" sep - workqueue submit failed: %x\n",
3265 error1);
3266 spin_unlock_irq(&queue_lock);
3267 /* We return result of crypto enqueue */
3268 return error;
3269 }
3270
3271 static int sep_crypto_init(struct crypto_tfm *tfm)
3272 {
3273 const char *alg_name = crypto_tfm_alg_name(tfm);
3274
3275 if (alg_name == NULL)
3276 pr_debug("sep_crypto_init alg is NULL\n");
3277 else
3278 pr_debug("sep_crypto_init alg is %s\n", alg_name);
3279
3280 tfm->crt_ablkcipher.reqsize = sizeof(struct this_task_ctx);
3281 return 0;
3282 }
3283
3284 static void sep_crypto_exit(struct crypto_tfm *tfm)
3285 {
3286 pr_debug("sep_crypto_exit\n");
3287 }
3288
3289 static int sep_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
3290 unsigned int keylen)
3291 {
3292 struct sep_system_ctx *sctx = crypto_ablkcipher_ctx(tfm);
3293
3294 pr_debug("sep aes setkey\n");
3295
3296 pr_debug("tfm is %p sctx is %p\n", tfm, sctx);
3297 switch (keylen) {
3298 case SEP_AES_KEY_128_SIZE:
3299 sctx->aes_key_size = AES_128;
3300 break;
3301 case SEP_AES_KEY_192_SIZE:
3302 sctx->aes_key_size = AES_192;
3303 break;
3304 case SEP_AES_KEY_256_SIZE:
3305 sctx->aes_key_size = AES_256;
3306 break;
3307 case SEP_AES_KEY_512_SIZE:
3308 sctx->aes_key_size = AES_512;
3309 break;
3310 default:
3311 pr_debug("invalid sep aes key size %x\n",
3312 keylen);
3313 return -EINVAL;
3314 }
3315
3316 memset(&sctx->key.aes, 0, sizeof(u32) *
3317 SEP_AES_MAX_KEY_SIZE_WORDS);
3318 memcpy(&sctx->key.aes, key, keylen);
3319 sctx->keylen = keylen;
3320 /* Indicate to encrypt/decrypt function to send key to SEP */
3321 sctx->key_sent = 0;
3322
3323 return 0;
3324 }
3325
3326 static int sep_aes_ecb_encrypt(struct ablkcipher_request *req)
3327 {
3328 int error;
3329 int error1;
3330 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3331
3332 pr_debug("sep - doing aes ecb encrypt\n");
3333
3334 /* Clear out task context */
3335 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3336
3337 ta_ctx->sep_used = sep_dev;
3338 ta_ctx->current_request = AES_ECB;
3339 ta_ctx->current_hash_req = NULL;
3340 ta_ctx->current_cypher_req = req;
3341 ta_ctx->aes_encmode = SEP_AES_ENCRYPT;
3342 ta_ctx->aes_opmode = SEP_AES_ECB;
3343 ta_ctx->init_opcode = SEP_AES_INIT_OPCODE;
3344 ta_ctx->block_opcode = SEP_AES_BLOCK_OPCODE;
3345
3346 /* lock necessary so that only one entity touches the queues */
3347 spin_lock_irq(&queue_lock);
3348 error = crypto_enqueue_request(&sep_queue, &req->base);
3349
3350 if ((error != 0) && (error != -EINPROGRESS))
3351 pr_debug(" sep - crypto enqueue failed: %x\n",
3352 error);
3353 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3354 sep_dequeuer, (void *)&sep_queue);
3355 if (error1)
3356 pr_debug(" sep - workqueue submit failed: %x\n",
3357 error1);
3358 spin_unlock_irq(&queue_lock);
3359 /* We return result of crypto enqueue */
3360 return error;
3361 }
3362
3363 static int sep_aes_ecb_decrypt(struct ablkcipher_request *req)
3364 {
3365 int error;
3366 int error1;
3367 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3368
3369 pr_debug("sep - doing aes ecb decrypt\n");
3370
3371 /* Clear out task context */
3372 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3373
3374 ta_ctx->sep_used = sep_dev;
3375 ta_ctx->current_request = AES_ECB;
3376 ta_ctx->current_hash_req = NULL;
3377 ta_ctx->current_cypher_req = req;
3378 ta_ctx->aes_encmode = SEP_AES_DECRYPT;
3379 ta_ctx->aes_opmode = SEP_AES_ECB;
3380 ta_ctx->init_opcode = SEP_AES_INIT_OPCODE;
3381 ta_ctx->block_opcode = SEP_AES_BLOCK_OPCODE;
3382
3383 /* lock necessary so that only one entity touches the queues */
3384 spin_lock_irq(&queue_lock);
3385 error = crypto_enqueue_request(&sep_queue, &req->base);
3386
3387 if ((error != 0) && (error != -EINPROGRESS))
3388 pr_debug(" sep - crypto enqueue failed: %x\n",
3389 error);
3390 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3391 sep_dequeuer, (void *)&sep_queue);
3392 if (error1)
3393 pr_debug(" sep - workqueue submit failed: %x\n",
3394 error1);
3395 spin_unlock_irq(&queue_lock);
3396 /* We return result of crypto enqueue */
3397 return error;
3398 }
3399
3400 static int sep_aes_cbc_encrypt(struct ablkcipher_request *req)
3401 {
3402 int error;
3403 int error1;
3404 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3405 struct sep_system_ctx *sctx = crypto_ablkcipher_ctx(
3406 crypto_ablkcipher_reqtfm(req));
3407
3408 pr_debug("sep - doing aes cbc encrypt\n");
3409
3410 /* Clear out task context */
3411 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3412
3413 pr_debug("tfm is %p sctx is %p and ta_ctx is %p\n",
3414 crypto_ablkcipher_reqtfm(req), sctx, ta_ctx);
3415
3416 ta_ctx->sep_used = sep_dev;
3417 ta_ctx->current_request = AES_CBC;
3418 ta_ctx->current_hash_req = NULL;
3419 ta_ctx->current_cypher_req = req;
3420 ta_ctx->aes_encmode = SEP_AES_ENCRYPT;
3421 ta_ctx->aes_opmode = SEP_AES_CBC;
3422 ta_ctx->init_opcode = SEP_AES_INIT_OPCODE;
3423 ta_ctx->block_opcode = SEP_AES_BLOCK_OPCODE;
3424
3425 /* lock necessary so that only one entity touches the queues */
3426 spin_lock_irq(&queue_lock);
3427 error = crypto_enqueue_request(&sep_queue, &req->base);
3428
3429 if ((error != 0) && (error != -EINPROGRESS))
3430 pr_debug(" sep - crypto enqueue failed: %x\n",
3431 error);
3432 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3433 sep_dequeuer, (void *)&sep_queue);
3434 if (error1)
3435 pr_debug(" sep - workqueue submit failed: %x\n",
3436 error1);
3437 spin_unlock_irq(&queue_lock);
3438 /* We return result of crypto enqueue */
3439 return error;
3440 }
3441
3442 static int sep_aes_cbc_decrypt(struct ablkcipher_request *req)
3443 {
3444 int error;
3445 int error1;
3446 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3447 struct sep_system_ctx *sctx = crypto_ablkcipher_ctx(
3448 crypto_ablkcipher_reqtfm(req));
3449
3450 pr_debug("sep - doing aes cbc decrypt\n");
3451
3452 pr_debug("tfm is %p sctx is %p and ta_ctx is %p\n",
3453 crypto_ablkcipher_reqtfm(req), sctx, ta_ctx);
3454
3455 /* Clear out task context */
3456 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3457
3458 ta_ctx->sep_used = sep_dev;
3459 ta_ctx->current_request = AES_CBC;
3460 ta_ctx->current_hash_req = NULL;
3461 ta_ctx->current_cypher_req = req;
3462 ta_ctx->aes_encmode = SEP_AES_DECRYPT;
3463 ta_ctx->aes_opmode = SEP_AES_CBC;
3464 ta_ctx->init_opcode = SEP_AES_INIT_OPCODE;
3465 ta_ctx->block_opcode = SEP_AES_BLOCK_OPCODE;
3466
3467 /* lock necessary so that only one entity touches the queues */
3468 spin_lock_irq(&queue_lock);
3469 error = crypto_enqueue_request(&sep_queue, &req->base);
3470
3471 if ((error != 0) && (error != -EINPROGRESS))
3472 pr_debug(" sep - crypto enqueue failed: %x\n",
3473 error);
3474 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3475 sep_dequeuer, (void *)&sep_queue);
3476 if (error1)
3477 pr_debug(" sep - workqueue submit failed: %x\n",
3478 error1);
3479 spin_unlock_irq(&queue_lock);
3480 /* We return result of crypto enqueue */
3481 return error;
3482 }
3483
3484 static int sep_des_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
3485 unsigned int keylen)
3486 {
3487 struct sep_system_ctx *sctx = crypto_ablkcipher_ctx(tfm);
3488 struct crypto_tfm *ctfm = crypto_ablkcipher_tfm(tfm);
3489 u32 *flags = &ctfm->crt_flags;
3490
3491 pr_debug("sep des setkey\n");
3492
3493 switch (keylen) {
3494 case DES_KEY_SIZE:
3495 sctx->des_nbr_keys = DES_KEY_1;
3496 break;
3497 case DES_KEY_SIZE * 2:
3498 sctx->des_nbr_keys = DES_KEY_2;
3499 break;
3500 case DES_KEY_SIZE * 3:
3501 sctx->des_nbr_keys = DES_KEY_3;
3502 break;
3503 default:
3504 pr_debug("invalid key size %x\n",
3505 keylen);
3506 return -EINVAL;
3507 }
3508
3509 if ((*flags & CRYPTO_TFM_REQ_WEAK_KEY) &&
3510 (sep_weak_key(key, keylen))) {
3511
3512 *flags |= CRYPTO_TFM_RES_WEAK_KEY;
3513 pr_debug("weak key\n");
3514 return -EINVAL;
3515 }
3516
3517 memset(&sctx->key.des, 0, sizeof(struct sep_des_key));
3518 memcpy(&sctx->key.des.key1, key, keylen);
3519 sctx->keylen = keylen;
3520 /* Indicate to encrypt/decrypt function to send key to SEP */
3521 sctx->key_sent = 0;
3522
3523 return 0;
3524 }
3525
3526 static int sep_des_ebc_encrypt(struct ablkcipher_request *req)
3527 {
3528 int error;
3529 int error1;
3530 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3531
3532 pr_debug("sep - doing des ecb encrypt\n");
3533
3534 /* Clear out task context */
3535 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3536
3537 ta_ctx->sep_used = sep_dev;
3538 ta_ctx->current_request = DES_ECB;
3539 ta_ctx->current_hash_req = NULL;
3540 ta_ctx->current_cypher_req = req;
3541 ta_ctx->des_encmode = SEP_DES_ENCRYPT;
3542 ta_ctx->des_opmode = SEP_DES_ECB;
3543 ta_ctx->init_opcode = SEP_DES_INIT_OPCODE;
3544 ta_ctx->block_opcode = SEP_DES_BLOCK_OPCODE;
3545
3546 /* lock necessary so that only one entity touches the queues */
3547 spin_lock_irq(&queue_lock);
3548 error = crypto_enqueue_request(&sep_queue, &req->base);
3549
3550 if ((error != 0) && (error != -EINPROGRESS))
3551 pr_debug(" sep - crypto enqueue failed: %x\n",
3552 error);
3553 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3554 sep_dequeuer, (void *)&sep_queue);
3555 if (error1)
3556 pr_debug(" sep - workqueue submit failed: %x\n",
3557 error1);
3558 spin_unlock_irq(&queue_lock);
3559 /* We return result of crypto enqueue */
3560 return error;
3561 }
3562
3563 static int sep_des_ebc_decrypt(struct ablkcipher_request *req)
3564 {
3565 int error;
3566 int error1;
3567 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3568
3569 pr_debug("sep - doing des ecb decrypt\n");
3570
3571 /* Clear out task context */
3572 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3573
3574 ta_ctx->sep_used = sep_dev;
3575 ta_ctx->current_request = DES_ECB;
3576 ta_ctx->current_hash_req = NULL;
3577 ta_ctx->current_cypher_req = req;
3578 ta_ctx->des_encmode = SEP_DES_DECRYPT;
3579 ta_ctx->des_opmode = SEP_DES_ECB;
3580 ta_ctx->init_opcode = SEP_DES_INIT_OPCODE;
3581 ta_ctx->block_opcode = SEP_DES_BLOCK_OPCODE;
3582
3583 /* lock necessary so that only one entity touches the queues */
3584 spin_lock_irq(&queue_lock);
3585 error = crypto_enqueue_request(&sep_queue, &req->base);
3586
3587 if ((error != 0) && (error != -EINPROGRESS))
3588 pr_debug(" sep - crypto enqueue failed: %x\n",
3589 error);
3590 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3591 sep_dequeuer, (void *)&sep_queue);
3592 if (error1)
3593 pr_debug(" sep - workqueue submit failed: %x\n",
3594 error1);
3595 spin_unlock_irq(&queue_lock);
3596 /* We return result of crypto enqueue */
3597 return error;
3598 }
3599
3600 static int sep_des_cbc_encrypt(struct ablkcipher_request *req)
3601 {
3602 int error;
3603 int error1;
3604 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3605
3606 pr_debug("sep - doing des cbc encrypt\n");
3607
3608 /* Clear out task context */
3609 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3610
3611 ta_ctx->sep_used = sep_dev;
3612 ta_ctx->current_request = DES_CBC;
3613 ta_ctx->current_hash_req = NULL;
3614 ta_ctx->current_cypher_req = req;
3615 ta_ctx->des_encmode = SEP_DES_ENCRYPT;
3616 ta_ctx->des_opmode = SEP_DES_CBC;
3617 ta_ctx->init_opcode = SEP_DES_INIT_OPCODE;
3618 ta_ctx->block_opcode = SEP_DES_BLOCK_OPCODE;
3619
3620 /* lock necessary so that only one entity touches the queues */
3621 spin_lock_irq(&queue_lock);
3622 error = crypto_enqueue_request(&sep_queue, &req->base);
3623
3624 if ((error != 0) && (error != -EINPROGRESS))
3625 pr_debug(" sep - crypto enqueue failed: %x\n",
3626 error);
3627 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3628 sep_dequeuer, (void *)&sep_queue);
3629 if (error1)
3630 pr_debug(" sep - workqueue submit failed: %x\n",
3631 error1);
3632 spin_unlock_irq(&queue_lock);
3633 /* We return result of crypto enqueue */
3634 return error;
3635 }
3636
3637 static int sep_des_cbc_decrypt(struct ablkcipher_request *req)
3638 {
3639 int error;
3640 int error1;
3641 struct this_task_ctx *ta_ctx = ablkcipher_request_ctx(req);
3642
3643 pr_debug("sep - doing des ecb decrypt\n");
3644
3645 /* Clear out task context */
3646 memset(ta_ctx, 0, sizeof(struct this_task_ctx));
3647
3648 ta_ctx->sep_used = sep_dev;
3649 ta_ctx->current_request = DES_CBC;
3650 ta_ctx->current_hash_req = NULL;
3651 ta_ctx->current_cypher_req = req;
3652 ta_ctx->des_encmode = SEP_DES_DECRYPT;
3653 ta_ctx->des_opmode = SEP_DES_CBC;
3654 ta_ctx->init_opcode = SEP_DES_INIT_OPCODE;
3655 ta_ctx->block_opcode = SEP_DES_BLOCK_OPCODE;
3656
3657 /* lock necessary so that only one entity touches the queues */
3658 spin_lock_irq(&queue_lock);
3659 error = crypto_enqueue_request(&sep_queue, &req->base);
3660
3661 if ((error != 0) && (error != -EINPROGRESS))
3662 pr_debug(" sep - crypto enqueue failed: %x\n",
3663 error);
3664 error1 = sep_submit_work(ta_ctx->sep_used->workqueue,
3665 sep_dequeuer, (void *)&sep_queue);
3666 if (error1)
3667 pr_debug(" sep - workqueue submit failed: %x\n",
3668 error1);
3669 spin_unlock_irq(&queue_lock);
3670 /* We return result of crypto enqueue */
3671 return error;
3672 }
3673
3674 static struct ahash_alg hash_algs[] = {
3675 {
3676 .init = sep_sha1_init,
3677 .update = sep_sha1_update,
3678 .final = sep_sha1_final,
3679 .digest = sep_sha1_digest,
3680 .finup = sep_sha1_finup,
3681 .halg = {
3682 .digestsize = SHA1_DIGEST_SIZE,
3683 .base = {
3684 .cra_name = "sha1",
3685 .cra_driver_name = "sha1-sep",
3686 .cra_priority = 100,
3687 .cra_flags = CRYPTO_ALG_TYPE_AHASH |
3688 CRYPTO_ALG_ASYNC,
3689 .cra_blocksize = SHA1_BLOCK_SIZE,
3690 .cra_ctxsize = sizeof(struct sep_system_ctx),
3691 .cra_alignmask = 0,
3692 .cra_module = THIS_MODULE,
3693 .cra_init = sep_hash_cra_init,
3694 .cra_exit = sep_hash_cra_exit,
3695 }
3696 }
3697 },
3698 {
3699 .init = sep_md5_init,
3700 .update = sep_md5_update,
3701 .final = sep_md5_final,
3702 .digest = sep_md5_digest,
3703 .finup = sep_md5_finup,
3704 .halg = {
3705 .digestsize = MD5_DIGEST_SIZE,
3706 .base = {
3707 .cra_name = "md5",
3708 .cra_driver_name = "md5-sep",
3709 .cra_priority = 100,
3710 .cra_flags = CRYPTO_ALG_TYPE_AHASH |
3711 CRYPTO_ALG_ASYNC,
3712 .cra_blocksize = SHA1_BLOCK_SIZE,
3713 .cra_ctxsize = sizeof(struct sep_system_ctx),
3714 .cra_alignmask = 0,
3715 .cra_module = THIS_MODULE,
3716 .cra_init = sep_hash_cra_init,
3717 .cra_exit = sep_hash_cra_exit,
3718 }
3719 }
3720 },
3721 {
3722 .init = sep_sha224_init,
3723 .update = sep_sha224_update,
3724 .final = sep_sha224_final,
3725 .digest = sep_sha224_digest,
3726 .finup = sep_sha224_finup,
3727 .halg = {
3728 .digestsize = SHA224_DIGEST_SIZE,
3729 .base = {
3730 .cra_name = "sha224",
3731 .cra_driver_name = "sha224-sep",
3732 .cra_priority = 100,
3733 .cra_flags = CRYPTO_ALG_TYPE_AHASH |
3734 CRYPTO_ALG_ASYNC,
3735 .cra_blocksize = SHA224_BLOCK_SIZE,
3736 .cra_ctxsize = sizeof(struct sep_system_ctx),
3737 .cra_alignmask = 0,
3738 .cra_module = THIS_MODULE,
3739 .cra_init = sep_hash_cra_init,
3740 .cra_exit = sep_hash_cra_exit,
3741 }
3742 }
3743 },
3744 {
3745 .init = sep_sha256_init,
3746 .update = sep_sha256_update,
3747 .final = sep_sha256_final,
3748 .digest = sep_sha256_digest,
3749 .finup = sep_sha256_finup,
3750 .halg = {
3751 .digestsize = SHA256_DIGEST_SIZE,
3752 .base = {
3753 .cra_name = "sha256",
3754 .cra_driver_name = "sha256-sep",
3755 .cra_priority = 100,
3756 .cra_flags = CRYPTO_ALG_TYPE_AHASH |
3757 CRYPTO_ALG_ASYNC,
3758 .cra_blocksize = SHA256_BLOCK_SIZE,
3759 .cra_ctxsize = sizeof(struct sep_system_ctx),
3760 .cra_alignmask = 0,
3761 .cra_module = THIS_MODULE,
3762 .cra_init = sep_hash_cra_init,
3763 .cra_exit = sep_hash_cra_exit,
3764 }
3765 }
3766 }
3767 };
3768
3769 static struct crypto_alg crypto_algs[] = {
3770 {
3771 .cra_name = "ecb(aes)",
3772 .cra_driver_name = "ecb-aes-sep",
3773 .cra_priority = 100,
3774 .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
3775 .cra_blocksize = AES_BLOCK_SIZE,
3776 .cra_ctxsize = sizeof(struct sep_system_ctx),
3777 .cra_alignmask = 0,
3778 .cra_type = &crypto_ablkcipher_type,
3779 .cra_module = THIS_MODULE,
3780 .cra_init = sep_crypto_init,
3781 .cra_exit = sep_crypto_exit,
3782 .cra_u.ablkcipher = {
3783 .min_keysize = AES_MIN_KEY_SIZE,
3784 .max_keysize = AES_MAX_KEY_SIZE,
3785 .setkey = sep_aes_setkey,
3786 .encrypt = sep_aes_ecb_encrypt,
3787 .decrypt = sep_aes_ecb_decrypt,
3788 }
3789 },
3790 {
3791 .cra_name = "cbc(aes)",
3792 .cra_driver_name = "cbc-aes-sep",
3793 .cra_priority = 100,
3794 .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
3795 .cra_blocksize = AES_BLOCK_SIZE,
3796 .cra_ctxsize = sizeof(struct sep_system_ctx),
3797 .cra_alignmask = 0,
3798 .cra_type = &crypto_ablkcipher_type,
3799 .cra_module = THIS_MODULE,
3800 .cra_init = sep_crypto_init,
3801 .cra_exit = sep_crypto_exit,
3802 .cra_u.ablkcipher = {
3803 .min_keysize = AES_MIN_KEY_SIZE,
3804 .max_keysize = AES_MAX_KEY_SIZE,
3805 .setkey = sep_aes_setkey,
3806 .encrypt = sep_aes_cbc_encrypt,
3807 .ivsize = AES_BLOCK_SIZE,
3808 .decrypt = sep_aes_cbc_decrypt,
3809 }
3810 },
3811 {
3812 .cra_name = "ebc(des)",
3813 .cra_driver_name = "ebc-des-sep",
3814 .cra_priority = 100,
3815 .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
3816 .cra_blocksize = DES_BLOCK_SIZE,
3817 .cra_ctxsize = sizeof(struct sep_system_ctx),
3818 .cra_alignmask = 0,
3819 .cra_type = &crypto_ablkcipher_type,
3820 .cra_module = THIS_MODULE,
3821 .cra_init = sep_crypto_init,
3822 .cra_exit = sep_crypto_exit,
3823 .cra_u.ablkcipher = {
3824 .min_keysize = DES_KEY_SIZE,
3825 .max_keysize = DES_KEY_SIZE,
3826 .setkey = sep_des_setkey,
3827 .encrypt = sep_des_ebc_encrypt,
3828 .decrypt = sep_des_ebc_decrypt,
3829 }
3830 },
3831 {
3832 .cra_name = "cbc(des)",
3833 .cra_driver_name = "cbc-des-sep",
3834 .cra_priority = 100,
3835 .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
3836 .cra_blocksize = DES_BLOCK_SIZE,
3837 .cra_ctxsize = sizeof(struct sep_system_ctx),
3838 .cra_alignmask = 0,
3839 .cra_type = &crypto_ablkcipher_type,
3840 .cra_module = THIS_MODULE,
3841 .cra_init = sep_crypto_init,
3842 .cra_exit = sep_crypto_exit,
3843 .cra_u.ablkcipher = {
3844 .min_keysize = DES_KEY_SIZE,
3845 .max_keysize = DES_KEY_SIZE,
3846 .setkey = sep_des_setkey,
3847 .encrypt = sep_des_cbc_encrypt,
3848 .ivsize = DES_BLOCK_SIZE,
3849 .decrypt = sep_des_cbc_decrypt,
3850 }
3851 },
3852 {
3853 .cra_name = "ebc(des3-ede)",
3854 .cra_driver_name = "ebc-des3-ede-sep",
3855 .cra_priority = 100,
3856 .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
3857 .cra_blocksize = DES_BLOCK_SIZE,
3858 .cra_ctxsize = sizeof(struct sep_system_ctx),
3859 .cra_alignmask = 0,
3860 .cra_type = &crypto_ablkcipher_type,
3861 .cra_module = THIS_MODULE,
3862 .cra_init = sep_crypto_init,
3863 .cra_exit = sep_crypto_exit,
3864 .cra_u.ablkcipher = {
3865 .min_keysize = DES3_EDE_KEY_SIZE,
3866 .max_keysize = DES3_EDE_KEY_SIZE,
3867 .setkey = sep_des_setkey,
3868 .encrypt = sep_des_ebc_encrypt,
3869 .decrypt = sep_des_ebc_decrypt,
3870 }
3871 },
3872 {
3873 .cra_name = "cbc(des3-ede)",
3874 .cra_driver_name = "cbc-des3--ede-sep",
3875 .cra_priority = 100,
3876 .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
3877 .cra_blocksize = DES_BLOCK_SIZE,
3878 .cra_ctxsize = sizeof(struct sep_system_ctx),
3879 .cra_alignmask = 0,
3880 .cra_type = &crypto_ablkcipher_type,
3881 .cra_module = THIS_MODULE,
3882 .cra_init = sep_crypto_init,
3883 .cra_exit = sep_crypto_exit,
3884 .cra_u.ablkcipher = {
3885 .min_keysize = DES3_EDE_KEY_SIZE,
3886 .max_keysize = DES3_EDE_KEY_SIZE,
3887 .setkey = sep_des_setkey,
3888 .encrypt = sep_des_cbc_encrypt,
3889 .decrypt = sep_des_cbc_decrypt,
3890 }
3891 }
3892 };
3893
3894 int sep_crypto_setup(void)
3895 {
3896 int err, i, j, k;
3897 tasklet_init(&sep_dev->finish_tasklet, sep_finish,
3898 (unsigned long)sep_dev);
3899
3900 crypto_init_queue(&sep_queue, SEP_QUEUE_LENGTH);
3901
3902 sep_dev->workqueue = create_singlethread_workqueue(
3903 "sep_crypto_workqueue");
3904 if (!sep_dev->workqueue) {
3905 dev_warn(&sep_dev->pdev->dev, "cant create workqueue\n");
3906 return -ENOMEM;
3907 }
3908
3909 spin_lock_init(&queue_lock);
3910
3911 err = 0;
3912 for (i = 0; i < ARRAY_SIZE(hash_algs); i++) {
3913 err = crypto_register_ahash(&hash_algs[i]);
3914 if (err)
3915 goto err_algs;
3916 }
3917
3918 err = 0;
3919 for (j = 0; j < ARRAY_SIZE(crypto_algs); j++) {
3920 err = crypto_register_alg(&crypto_algs[j]);
3921 if (err)
3922 goto err_crypto_algs;
3923 }
3924
3925 return err;
3926
3927 err_algs:
3928 for (k = 0; k < i; k++)
3929 crypto_unregister_ahash(&hash_algs[k]);
3930 return err;
3931
3932 err_crypto_algs:
3933 for (k = 0; k < j; k++)
3934 crypto_unregister_alg(&crypto_algs[k]);
3935 goto err_algs;
3936 }
3937
3938 void sep_crypto_takedown(void)
3939 {
3940
3941 int i;
3942
3943 for (i = 0; i < ARRAY_SIZE(hash_algs); i++)
3944 crypto_unregister_ahash(&hash_algs[i]);
3945 for (i = 0; i < ARRAY_SIZE(crypto_algs); i++)
3946 crypto_unregister_alg(&crypto_algs[i]);
3947
3948 tasklet_kill(&sep_dev->finish_tasklet);
3949 }
3950
3951 #endif