1
2
3
4
5
6
7#include "compat.h"
8#include "desc_constr.h"
9#include "caamalg_desc.h"
10
11
12
13
14
15static inline void aead_append_src_dst(u32 *desc, u32 msg_type)
16{
17 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
18 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH |
19 KEY_VLF | msg_type | FIFOLD_TYPE_LASTBOTH);
20}
21
22
23static inline void append_dec_op1(u32 *desc, u32 type)
24{
25 u32 *jump_cmd, *uncond_jump_cmd;
26
27
28 if ((type & OP_ALG_ALGSEL_MASK) != OP_ALG_ALGSEL_AES) {
29 append_operation(desc, type | OP_ALG_AS_INITFINAL |
30 OP_ALG_DECRYPT);
31 return;
32 }
33
34 jump_cmd = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD);
35 append_operation(desc, type | OP_ALG_AS_INITFINAL |
36 OP_ALG_DECRYPT);
37 uncond_jump_cmd = append_jump(desc, JUMP_TEST_ALL);
38 set_jump_tgt_here(desc, jump_cmd);
39 append_operation(desc, type | OP_ALG_AS_INITFINAL |
40 OP_ALG_DECRYPT | OP_ALG_AAI_DK);
41 set_jump_tgt_here(desc, uncond_jump_cmd);
42}
43
44
45
46
47
48
49
50
51
52
53
54
55
56void cnstr_shdsc_aead_null_encap(u32 * const desc, struct alginfo *adata,
57 unsigned int icvsize)
58{
59 u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
60
61 init_sh_desc(desc, HDR_SHARE_SERIAL);
62
63
64 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
65 JUMP_COND_SHRD);
66 if (adata->key_inline)
67 append_key_as_imm(desc, adata->key_virt, adata->keylen_pad,
68 adata->keylen, CLASS_2 | KEY_DEST_MDHA_SPLIT |
69 KEY_ENC);
70 else
71 append_key(desc, adata->key_dma, adata->keylen, CLASS_2 |
72 KEY_DEST_MDHA_SPLIT | KEY_ENC);
73 set_jump_tgt_here(desc, key_jump_cmd);
74
75
76 append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
77
78
79 append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
80 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
81
82
83
84
85
86
87 read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
88 MOVE_DEST_MATH3 |
89 (0x6 << MOVE_LEN_SHIFT));
90 write_move_cmd = append_move(desc, MOVE_SRC_MATH3 |
91 MOVE_DEST_DESCBUF |
92 MOVE_WAITCOMP |
93 (0x8 << MOVE_LEN_SHIFT));
94
95
96 append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
97 OP_ALG_ENCRYPT);
98
99
100 aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
101
102 set_move_tgt_here(desc, read_move_cmd);
103 set_move_tgt_here(desc, write_move_cmd);
104 append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
105 append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
106 MOVE_AUX_LS);
107
108
109 append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
110 LDST_SRCDST_BYTE_CONTEXT);
111
112#ifdef DEBUG
113 print_hex_dump(KERN_ERR,
114 "aead null enc shdesc@" __stringify(__LINE__)": ",
115 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
116#endif
117}
118EXPORT_SYMBOL(cnstr_shdsc_aead_null_encap);
119
120
121
122
123
124
125
126
127
128
129
130
131
132void cnstr_shdsc_aead_null_decap(u32 * const desc, struct alginfo *adata,
133 unsigned int icvsize)
134{
135 u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd, *jump_cmd;
136
137 init_sh_desc(desc, HDR_SHARE_SERIAL);
138
139
140 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
141 JUMP_COND_SHRD);
142 if (adata->key_inline)
143 append_key_as_imm(desc, adata->key_virt, adata->keylen_pad,
144 adata->keylen, CLASS_2 |
145 KEY_DEST_MDHA_SPLIT | KEY_ENC);
146 else
147 append_key(desc, adata->key_dma, adata->keylen, CLASS_2 |
148 KEY_DEST_MDHA_SPLIT | KEY_ENC);
149 set_jump_tgt_here(desc, key_jump_cmd);
150
151
152 append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
153 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
154
155
156 append_math_sub(desc, REG2, SEQOUTLEN, REG0, CAAM_CMD_SZ);
157
158
159 append_math_add(desc, VARSEQINLEN, ZERO, REG2, CAAM_CMD_SZ);
160 append_math_add(desc, VARSEQOUTLEN, ZERO, REG2, CAAM_CMD_SZ);
161
162
163
164
165
166
167 read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
168 MOVE_DEST_MATH2 |
169 (0x6 << MOVE_LEN_SHIFT));
170 write_move_cmd = append_move(desc, MOVE_SRC_MATH2 |
171 MOVE_DEST_DESCBUF |
172 MOVE_WAITCOMP |
173 (0x8 << MOVE_LEN_SHIFT));
174
175
176 aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
177
178
179
180
181
182 jump_cmd = append_jump(desc, JUMP_TEST_ALL);
183 set_jump_tgt_here(desc, jump_cmd);
184
185 set_move_tgt_here(desc, read_move_cmd);
186 set_move_tgt_here(desc, write_move_cmd);
187 append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
188 append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
189 MOVE_AUX_LS);
190 append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
191
192
193 append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
194 FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
195
196#ifdef DEBUG
197 print_hex_dump(KERN_ERR,
198 "aead null dec shdesc@" __stringify(__LINE__)": ",
199 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
200#endif
201}
202EXPORT_SYMBOL(cnstr_shdsc_aead_null_decap);
203
204static void init_sh_desc_key_aead(u32 * const desc,
205 struct alginfo * const cdata,
206 struct alginfo * const adata,
207 const bool is_rfc3686, u32 *nonce)
208{
209 u32 *key_jump_cmd;
210 unsigned int enckeylen = cdata->keylen;
211
212
213 init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
214
215
216 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
217 JUMP_COND_SHRD);
218
219
220
221
222
223
224 if (is_rfc3686)
225 enckeylen -= CTR_RFC3686_NONCE_SIZE;
226
227 if (adata->key_inline)
228 append_key_as_imm(desc, adata->key_virt, adata->keylen_pad,
229 adata->keylen, CLASS_2 |
230 KEY_DEST_MDHA_SPLIT | KEY_ENC);
231 else
232 append_key(desc, adata->key_dma, adata->keylen, CLASS_2 |
233 KEY_DEST_MDHA_SPLIT | KEY_ENC);
234
235 if (cdata->key_inline)
236 append_key_as_imm(desc, cdata->key_virt, enckeylen,
237 enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
238 else
239 append_key(desc, cdata->key_dma, enckeylen, CLASS_1 |
240 KEY_DEST_CLASS_REG);
241
242
243 if (is_rfc3686) {
244 append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
245 LDST_CLASS_IND_CCB |
246 LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
247 append_move(desc,
248 MOVE_SRC_OUTFIFO |
249 MOVE_DEST_CLASS1CTX |
250 (16 << MOVE_OFFSET_SHIFT) |
251 (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
252 }
253
254 set_jump_tgt_here(desc, key_jump_cmd);
255}
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277void cnstr_shdsc_aead_encap(u32 * const desc, struct alginfo *cdata,
278 struct alginfo *adata, unsigned int ivsize,
279 unsigned int icvsize, const bool is_rfc3686,
280 u32 *nonce, const u32 ctx1_iv_off, const bool is_qi)
281{
282
283 init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce);
284
285
286 append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
287 OP_ALG_ENCRYPT);
288
289 if (is_qi) {
290 u32 *wait_load_cmd;
291
292
293 append_seq_load(desc, 4, LDST_CLASS_DECO |
294 LDST_SRCDST_WORD_DECO_MATH3 |
295 (4 << LDST_OFFSET_SHIFT));
296
297 wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
298 JUMP_COND_CALM | JUMP_COND_NCP |
299 JUMP_COND_NOP | JUMP_COND_NIP |
300 JUMP_COND_NIFP);
301 set_jump_tgt_here(desc, wait_load_cmd);
302
303 append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
304 LDST_SRCDST_BYTE_CONTEXT |
305 (ctx1_iv_off << LDST_OFFSET_SHIFT));
306 }
307
308
309 append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
310 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
311
312
313 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
314
315
316 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
317 FIFOLDST_VLF);
318
319
320 if (is_rfc3686)
321 append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
322 LDST_SRCDST_BYTE_CONTEXT |
323 ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
324 LDST_OFFSET_SHIFT));
325
326
327 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
328 OP_ALG_ENCRYPT);
329
330
331 append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
332 append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
333 aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
334
335
336 append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
337 LDST_SRCDST_BYTE_CONTEXT);
338
339#ifdef DEBUG
340 print_hex_dump(KERN_ERR, "aead enc shdesc@" __stringify(__LINE__)": ",
341 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
342#endif
343}
344EXPORT_SYMBOL(cnstr_shdsc_aead_encap);
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366void cnstr_shdsc_aead_decap(u32 * const desc, struct alginfo *cdata,
367 struct alginfo *adata, unsigned int ivsize,
368 unsigned int icvsize, const bool geniv,
369 const bool is_rfc3686, u32 *nonce,
370 const u32 ctx1_iv_off, const bool is_qi)
371{
372
373 init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce);
374
375
376 append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
377 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
378
379 if (is_qi) {
380 u32 *wait_load_cmd;
381
382
383 append_seq_load(desc, 4, LDST_CLASS_DECO |
384 LDST_SRCDST_WORD_DECO_MATH3 |
385 (4 << LDST_OFFSET_SHIFT));
386
387 wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
388 JUMP_COND_CALM | JUMP_COND_NCP |
389 JUMP_COND_NOP | JUMP_COND_NIP |
390 JUMP_COND_NIFP);
391 set_jump_tgt_here(desc, wait_load_cmd);
392
393 if (!geniv)
394 append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
395 LDST_SRCDST_BYTE_CONTEXT |
396 (ctx1_iv_off << LDST_OFFSET_SHIFT));
397 }
398
399
400 append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
401 if (geniv)
402 append_math_add_imm_u32(desc, VARSEQOUTLEN, REG3, IMM, ivsize);
403 else
404 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
405
406
407 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
408
409
410 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
411 KEY_VLF);
412
413 if (geniv) {
414 append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
415 LDST_SRCDST_BYTE_CONTEXT |
416 (ctx1_iv_off << LDST_OFFSET_SHIFT));
417 append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_CLASS2INFIFO |
418 (ctx1_iv_off << MOVE_OFFSET_SHIFT) | ivsize);
419 }
420
421
422 if (is_rfc3686)
423 append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
424 LDST_SRCDST_BYTE_CONTEXT |
425 ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
426 LDST_OFFSET_SHIFT));
427
428
429 if (ctx1_iv_off)
430 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
431 OP_ALG_DECRYPT);
432 else
433 append_dec_op1(desc, cdata->algtype);
434
435
436 append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
437 append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
438 aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
439
440
441 append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
442 FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
443
444#ifdef DEBUG
445 print_hex_dump(KERN_ERR, "aead dec shdesc@" __stringify(__LINE__)": ",
446 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
447#endif
448}
449EXPORT_SYMBOL(cnstr_shdsc_aead_decap);
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472void cnstr_shdsc_aead_givencap(u32 * const desc, struct alginfo *cdata,
473 struct alginfo *adata, unsigned int ivsize,
474 unsigned int icvsize, const bool is_rfc3686,
475 u32 *nonce, const u32 ctx1_iv_off,
476 const bool is_qi)
477{
478 u32 geniv, moveiv;
479
480
481 init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce);
482
483 if (is_qi) {
484 u32 *wait_load_cmd;
485
486
487 append_seq_load(desc, 4, LDST_CLASS_DECO |
488 LDST_SRCDST_WORD_DECO_MATH3 |
489 (4 << LDST_OFFSET_SHIFT));
490
491 wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
492 JUMP_COND_CALM | JUMP_COND_NCP |
493 JUMP_COND_NOP | JUMP_COND_NIP |
494 JUMP_COND_NIFP);
495 set_jump_tgt_here(desc, wait_load_cmd);
496 }
497
498 if (is_rfc3686) {
499 if (is_qi)
500 append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
501 LDST_SRCDST_BYTE_CONTEXT |
502 (ctx1_iv_off << LDST_OFFSET_SHIFT));
503
504 goto copy_iv;
505 }
506
507
508 geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
509 NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 |
510 NFIFOENTRY_PTYPE_RND | (ivsize << NFIFOENTRY_DLEN_SHIFT);
511 append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
512 LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
513 append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
514 append_move(desc, MOVE_WAITCOMP |
515 MOVE_SRC_INFIFO | MOVE_DEST_CLASS1CTX |
516 (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
517 (ivsize << MOVE_LEN_SHIFT));
518 append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
519
520copy_iv:
521
522 append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_OUTFIFO |
523 (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
524 (ivsize << MOVE_LEN_SHIFT));
525
526
527 append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
528 OP_ALG_ENCRYPT);
529
530
531 append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
532 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
533
534
535 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
536
537
538 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
539 KEY_VLF);
540
541
542 moveiv = NFIFOENTRY_STYPE_OFIFO | NFIFOENTRY_DEST_CLASS2 |
543 NFIFOENTRY_DTYPE_MSG | (ivsize << NFIFOENTRY_DLEN_SHIFT);
544 append_load_imm_u32(desc, moveiv, LDST_CLASS_IND_CCB |
545 LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
546 append_load_imm_u32(desc, ivsize, LDST_CLASS_2_CCB |
547 LDST_SRCDST_WORD_DATASZ_REG | LDST_IMM);
548
549
550 if (is_rfc3686)
551 append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
552 LDST_SRCDST_BYTE_CONTEXT |
553 ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
554 LDST_OFFSET_SHIFT));
555
556
557 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
558 OP_ALG_ENCRYPT);
559
560
561 append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
562
563
564 append_seq_fifo_load(desc, ivsize,
565 FIFOLD_CLASS_SKIP);
566
567
568 append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
569 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | KEY_VLF |
570 FIFOLD_TYPE_MSG1OUT2 | FIFOLD_TYPE_LASTBOTH);
571 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
572
573
574 append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
575 LDST_SRCDST_BYTE_CONTEXT);
576
577#ifdef DEBUG
578 print_hex_dump(KERN_ERR,
579 "aead givenc shdesc@" __stringify(__LINE__)": ",
580 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
581#endif
582}
583EXPORT_SYMBOL(cnstr_shdsc_aead_givencap);
584
585
586
587
588
589
590
591
592void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
593 unsigned int icvsize)
594{
595 u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1,
596 *zero_assoc_jump_cmd2;
597
598 init_sh_desc(desc, HDR_SHARE_SERIAL);
599
600
601 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
602 JUMP_COND_SHRD);
603 if (cdata->key_inline)
604 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
605 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
606 else
607 append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
608 KEY_DEST_CLASS_REG);
609 set_jump_tgt_here(desc, key_jump_cmd);
610
611
612 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
613 OP_ALG_ENCRYPT);
614
615
616 append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
617 zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL |
618 JUMP_COND_MATH_Z);
619
620
621 append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
622 zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
623 JUMP_COND_MATH_Z);
624
625 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
626
627
628 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
629
630
631 append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
632
633
634 zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
635 JUMP_COND_MATH_Z);
636
637
638 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
639 FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
640 set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
641
642 append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
643
644
645 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
646
647
648 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
649 FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
650
651
652 append_jump(desc, JUMP_TEST_ALL | 2);
653
654
655 set_jump_tgt_here(desc, zero_payload_jump_cmd);
656
657
658 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
659 FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
660
661
662 set_jump_tgt_here(desc, zero_assoc_jump_cmd2);
663
664
665 append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
666 LDST_SRCDST_BYTE_CONTEXT);
667
668#ifdef DEBUG
669 print_hex_dump(KERN_ERR, "gcm enc shdesc@" __stringify(__LINE__)": ",
670 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
671#endif
672}
673EXPORT_SYMBOL(cnstr_shdsc_gcm_encap);
674
675
676
677
678
679
680
681
682void cnstr_shdsc_gcm_decap(u32 * const desc, struct alginfo *cdata,
683 unsigned int icvsize)
684{
685 u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1;
686
687 init_sh_desc(desc, HDR_SHARE_SERIAL);
688
689
690 key_jump_cmd = append_jump(desc, JUMP_JSL |
691 JUMP_TEST_ALL | JUMP_COND_SHRD);
692 if (cdata->key_inline)
693 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
694 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
695 else
696 append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
697 KEY_DEST_CLASS_REG);
698 set_jump_tgt_here(desc, key_jump_cmd);
699
700
701 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
702 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
703
704
705 append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
706 zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
707 JUMP_COND_MATH_Z);
708
709 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
710
711
712 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
713
714
715 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
716 FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
717
718 set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
719
720
721 append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
722
723
724 zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
725 JUMP_COND_MATH_Z);
726
727 append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
728
729
730 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
731
732
733 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
734 FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
735
736
737 set_jump_tgt_here(desc, zero_payload_jump_cmd);
738
739
740 append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
741 FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
742
743#ifdef DEBUG
744 print_hex_dump(KERN_ERR, "gcm dec shdesc@" __stringify(__LINE__)": ",
745 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
746#endif
747}
748EXPORT_SYMBOL(cnstr_shdsc_gcm_decap);
749
750
751
752
753
754
755
756
757
758void cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
759 unsigned int icvsize)
760{
761 u32 *key_jump_cmd;
762
763 init_sh_desc(desc, HDR_SHARE_SERIAL);
764
765
766 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
767 JUMP_COND_SHRD);
768 if (cdata->key_inline)
769 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
770 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
771 else
772 append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
773 KEY_DEST_CLASS_REG);
774 set_jump_tgt_here(desc, key_jump_cmd);
775
776
777 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
778 OP_ALG_ENCRYPT);
779
780 append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8);
781 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
782
783
784 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
785 FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
786
787
788 append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
789
790
791 append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
792
793
794 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
795
796
797 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
798
799
800 append_math_sub(desc, VARSEQOUTLEN, VARSEQINLEN, REG0, CAAM_CMD_SZ);
801
802
803 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
804
805
806 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
807 FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
808
809
810 append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
811 LDST_SRCDST_BYTE_CONTEXT);
812
813#ifdef DEBUG
814 print_hex_dump(KERN_ERR,
815 "rfc4106 enc shdesc@" __stringify(__LINE__)": ",
816 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
817#endif
818}
819EXPORT_SYMBOL(cnstr_shdsc_rfc4106_encap);
820
821
822
823
824
825
826
827
828
829void cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
830 unsigned int icvsize)
831{
832 u32 *key_jump_cmd;
833
834 init_sh_desc(desc, HDR_SHARE_SERIAL);
835
836
837 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
838 JUMP_COND_SHRD);
839 if (cdata->key_inline)
840 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
841 cdata->keylen, CLASS_1 |
842 KEY_DEST_CLASS_REG);
843 else
844 append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
845 KEY_DEST_CLASS_REG);
846 set_jump_tgt_here(desc, key_jump_cmd);
847
848
849 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
850 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
851
852 append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8);
853 append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
854
855
856 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
857 FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
858
859
860 append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
861
862
863 append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ);
864
865
866 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
867
868
869 append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
870
871
872 append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
873
874
875 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
876
877
878 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
879 FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
880
881
882 append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
883 FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
884
885#ifdef DEBUG
886 print_hex_dump(KERN_ERR,
887 "rfc4106 dec shdesc@" __stringify(__LINE__)": ",
888 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
889#endif
890}
891EXPORT_SYMBOL(cnstr_shdsc_rfc4106_decap);
892
893
894
895
896
897
898
899
900
901void cnstr_shdsc_rfc4543_encap(u32 * const desc, struct alginfo *cdata,
902 unsigned int icvsize)
903{
904 u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
905
906 init_sh_desc(desc, HDR_SHARE_SERIAL);
907
908
909 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
910 JUMP_COND_SHRD);
911 if (cdata->key_inline)
912 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
913 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
914 else
915 append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
916 KEY_DEST_CLASS_REG);
917 set_jump_tgt_here(desc, key_jump_cmd);
918
919
920 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
921 OP_ALG_ENCRYPT);
922
923
924 append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
925
926
927
928
929
930
931 read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
932 (0x6 << MOVE_LEN_SHIFT));
933 write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
934 (0x8 << MOVE_LEN_SHIFT));
935
936
937 append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
938
939
940 append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
941
942
943 aead_append_src_dst(desc, FIFOLD_TYPE_AAD);
944
945 set_move_tgt_here(desc, read_move_cmd);
946 set_move_tgt_here(desc, write_move_cmd);
947 append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
948
949 append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
950
951
952 append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
953 LDST_SRCDST_BYTE_CONTEXT);
954
955#ifdef DEBUG
956 print_hex_dump(KERN_ERR,
957 "rfc4543 enc shdesc@" __stringify(__LINE__)": ",
958 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
959#endif
960}
961EXPORT_SYMBOL(cnstr_shdsc_rfc4543_encap);
962
963
964
965
966
967
968
969
970
971void cnstr_shdsc_rfc4543_decap(u32 * const desc, struct alginfo *cdata,
972 unsigned int icvsize)
973{
974 u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
975
976 init_sh_desc(desc, HDR_SHARE_SERIAL);
977
978
979 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
980 JUMP_COND_SHRD);
981 if (cdata->key_inline)
982 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
983 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
984 else
985 append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
986 KEY_DEST_CLASS_REG);
987 set_jump_tgt_here(desc, key_jump_cmd);
988
989
990 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
991 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
992
993
994 append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ);
995
996
997
998
999
1000
1001 read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
1002 (0x6 << MOVE_LEN_SHIFT));
1003 write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
1004 (0x8 << MOVE_LEN_SHIFT));
1005
1006
1007 append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
1008
1009
1010 append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
1011
1012
1013 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
1014
1015
1016 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | FIFOLDST_VLF |
1017 FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST2FLUSH1);
1018
1019 set_move_tgt_here(desc, read_move_cmd);
1020 set_move_tgt_here(desc, write_move_cmd);
1021 append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
1022
1023 append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
1024 append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
1025
1026
1027 append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
1028 FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
1029
1030#ifdef DEBUG
1031 print_hex_dump(KERN_ERR,
1032 "rfc4543 dec shdesc@" __stringify(__LINE__)": ",
1033 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1034#endif
1035}
1036EXPORT_SYMBOL(cnstr_shdsc_rfc4543_decap);
1037
1038
1039
1040
1041
1042static inline void ablkcipher_append_src_dst(u32 *desc)
1043{
1044 append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
1045 append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
1046 append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 |
1047 KEY_VLF | FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
1048 append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
1049}
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061void cnstr_shdsc_ablkcipher_encap(u32 * const desc, struct alginfo *cdata,
1062 unsigned int ivsize, const bool is_rfc3686,
1063 const u32 ctx1_iv_off)
1064{
1065 u32 *key_jump_cmd;
1066
1067 init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1068
1069 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1070 JUMP_COND_SHRD);
1071
1072
1073 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
1074 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
1075
1076
1077 if (is_rfc3686) {
1078 u8 *nonce = cdata->key_virt + cdata->keylen;
1079
1080 append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
1081 LDST_CLASS_IND_CCB |
1082 LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
1083 append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
1084 MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
1085 (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
1086 }
1087
1088 set_jump_tgt_here(desc, key_jump_cmd);
1089
1090
1091 append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
1092 LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT));
1093
1094
1095 if (is_rfc3686)
1096 append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
1097 LDST_SRCDST_BYTE_CONTEXT |
1098 ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
1099 LDST_OFFSET_SHIFT));
1100
1101
1102 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
1103 OP_ALG_ENCRYPT);
1104
1105
1106 ablkcipher_append_src_dst(desc);
1107
1108#ifdef DEBUG
1109 print_hex_dump(KERN_ERR,
1110 "ablkcipher enc shdesc@" __stringify(__LINE__)": ",
1111 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1112#endif
1113}
1114EXPORT_SYMBOL(cnstr_shdsc_ablkcipher_encap);
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126void cnstr_shdsc_ablkcipher_decap(u32 * const desc, struct alginfo *cdata,
1127 unsigned int ivsize, const bool is_rfc3686,
1128 const u32 ctx1_iv_off)
1129{
1130 u32 *key_jump_cmd;
1131
1132 init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1133
1134 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1135 JUMP_COND_SHRD);
1136
1137
1138 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
1139 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
1140
1141
1142 if (is_rfc3686) {
1143 u8 *nonce = cdata->key_virt + cdata->keylen;
1144
1145 append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
1146 LDST_CLASS_IND_CCB |
1147 LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
1148 append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
1149 MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
1150 (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
1151 }
1152
1153 set_jump_tgt_here(desc, key_jump_cmd);
1154
1155
1156 append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
1157 LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT));
1158
1159
1160 if (is_rfc3686)
1161 append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
1162 LDST_SRCDST_BYTE_CONTEXT |
1163 ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
1164 LDST_OFFSET_SHIFT));
1165
1166
1167 if (ctx1_iv_off)
1168 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
1169 OP_ALG_DECRYPT);
1170 else
1171 append_dec_op1(desc, cdata->algtype);
1172
1173
1174 ablkcipher_append_src_dst(desc);
1175
1176#ifdef DEBUG
1177 print_hex_dump(KERN_ERR,
1178 "ablkcipher dec shdesc@" __stringify(__LINE__)": ",
1179 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1180#endif
1181}
1182EXPORT_SYMBOL(cnstr_shdsc_ablkcipher_decap);
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195void cnstr_shdsc_ablkcipher_givencap(u32 * const desc, struct alginfo *cdata,
1196 unsigned int ivsize, const bool is_rfc3686,
1197 const u32 ctx1_iv_off)
1198{
1199 u32 *key_jump_cmd, geniv;
1200
1201 init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1202
1203 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1204 JUMP_COND_SHRD);
1205
1206
1207 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
1208 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
1209
1210
1211 if (is_rfc3686) {
1212 u8 *nonce = cdata->key_virt + cdata->keylen;
1213
1214 append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
1215 LDST_CLASS_IND_CCB |
1216 LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
1217 append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
1218 MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
1219 (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
1220 }
1221 set_jump_tgt_here(desc, key_jump_cmd);
1222
1223
1224 geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
1225 NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 | NFIFOENTRY_PTYPE_RND |
1226 (ivsize << NFIFOENTRY_DLEN_SHIFT);
1227 append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
1228 LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
1229 append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
1230 append_move(desc, MOVE_WAITCOMP | MOVE_SRC_INFIFO |
1231 MOVE_DEST_CLASS1CTX | (ivsize << MOVE_LEN_SHIFT) |
1232 (ctx1_iv_off << MOVE_OFFSET_SHIFT));
1233 append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
1234
1235
1236 append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
1237 LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT));
1238
1239
1240 if (is_rfc3686)
1241 append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
1242 LDST_SRCDST_BYTE_CONTEXT |
1243 ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
1244 LDST_OFFSET_SHIFT));
1245
1246 if (ctx1_iv_off)
1247 append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | JUMP_COND_NCP |
1248 (1 << JUMP_OFFSET_SHIFT));
1249
1250
1251 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
1252 OP_ALG_ENCRYPT);
1253
1254
1255 ablkcipher_append_src_dst(desc);
1256
1257#ifdef DEBUG
1258 print_hex_dump(KERN_ERR,
1259 "ablkcipher givenc shdesc@" __stringify(__LINE__) ": ",
1260 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1261#endif
1262}
1263EXPORT_SYMBOL(cnstr_shdsc_ablkcipher_givencap);
1264
1265
1266
1267
1268
1269
1270
1271
1272void cnstr_shdsc_xts_ablkcipher_encap(u32 * const desc, struct alginfo *cdata)
1273{
1274 __be64 sector_size = cpu_to_be64(512);
1275 u32 *key_jump_cmd;
1276
1277 init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1278
1279 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1280 JUMP_COND_SHRD);
1281
1282
1283 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
1284 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
1285
1286
1287 append_load_as_imm(desc, (void *)§or_size, 8, LDST_CLASS_1_CCB |
1288 LDST_SRCDST_BYTE_CONTEXT |
1289 (0x28 << LDST_OFFSET_SHIFT));
1290
1291 set_jump_tgt_here(desc, key_jump_cmd);
1292
1293
1294
1295
1296
1297
1298 append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
1299 (0x20 << LDST_OFFSET_SHIFT));
1300 append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
1301
1302
1303 append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
1304 OP_ALG_ENCRYPT);
1305
1306
1307 ablkcipher_append_src_dst(desc);
1308
1309#ifdef DEBUG
1310 print_hex_dump(KERN_ERR,
1311 "xts ablkcipher enc shdesc@" __stringify(__LINE__) ": ",
1312 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1313#endif
1314}
1315EXPORT_SYMBOL(cnstr_shdsc_xts_ablkcipher_encap);
1316
1317
1318
1319
1320
1321
1322
1323
1324void cnstr_shdsc_xts_ablkcipher_decap(u32 * const desc, struct alginfo *cdata)
1325{
1326 __be64 sector_size = cpu_to_be64(512);
1327 u32 *key_jump_cmd;
1328
1329 init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1330
1331 key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1332 JUMP_COND_SHRD);
1333
1334
1335 append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
1336 cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
1337
1338
1339 append_load_as_imm(desc, (void *)§or_size, 8, LDST_CLASS_1_CCB |
1340 LDST_SRCDST_BYTE_CONTEXT |
1341 (0x28 << LDST_OFFSET_SHIFT));
1342
1343 set_jump_tgt_here(desc, key_jump_cmd);
1344
1345
1346
1347
1348
1349
1350 append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
1351 (0x20 << LDST_OFFSET_SHIFT));
1352 append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
1353
1354
1355 append_dec_op1(desc, cdata->algtype);
1356
1357
1358 ablkcipher_append_src_dst(desc);
1359
1360#ifdef DEBUG
1361 print_hex_dump(KERN_ERR,
1362 "xts ablkcipher dec shdesc@" __stringify(__LINE__) ": ",
1363 DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1364#endif
1365}
1366EXPORT_SYMBOL(cnstr_shdsc_xts_ablkcipher_decap);
1367
1368MODULE_LICENSE("GPL");
1369MODULE_DESCRIPTION("FSL CAAM descriptor support");
1370MODULE_AUTHOR("Freescale Semiconductor - NMG/STC");
1371