Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/crypto/chelsio/chcr_algo.c
29524 views
1
/*
2
* This file is part of the Chelsio T6 Crypto driver for Linux.
3
*
4
* Copyright (c) 2003-2016 Chelsio Communications, Inc. All rights reserved.
5
*
6
* This software is available to you under a choice of one of two
7
* licenses. You may choose to be licensed under the terms of the GNU
8
* General Public License (GPL) Version 2, available from the file
9
* COPYING in the main directory of this source tree, or the
10
* OpenIB.org BSD license below:
11
*
12
* Redistribution and use in source and binary forms, with or
13
* without modification, are permitted provided that the following
14
* conditions are met:
15
*
16
* - Redistributions of source code must retain the above
17
* copyright notice, this list of conditions and the following
18
* disclaimer.
19
*
20
* - Redistributions in binary form must reproduce the above
21
* copyright notice, this list of conditions and the following
22
* disclaimer in the documentation and/or other materials
23
* provided with the distribution.
24
*
25
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
* SOFTWARE.
33
*
34
* Written and Maintained by:
35
* Manoj Malviya ([email protected])
36
* Atul Gupta ([email protected])
37
* Jitendra Lulla ([email protected])
38
* Yeshaswi M R Gowda ([email protected])
39
* Harsh Jain ([email protected])
40
*/
41
42
#define pr_fmt(fmt) "chcr:" fmt
43
44
#include <linux/kernel.h>
45
#include <linux/module.h>
46
#include <linux/crypto.h>
47
#include <linux/skbuff.h>
48
#include <linux/rtnetlink.h>
49
#include <linux/highmem.h>
50
#include <linux/scatterlist.h>
51
52
#include <crypto/aes.h>
53
#include <crypto/algapi.h>
54
#include <crypto/gcm.h>
55
#include <crypto/sha1.h>
56
#include <crypto/sha2.h>
57
#include <crypto/authenc.h>
58
#include <crypto/ctr.h>
59
#include <crypto/gf128mul.h>
60
#include <crypto/internal/aead.h>
61
#include <crypto/null.h>
62
#include <crypto/internal/skcipher.h>
63
#include <crypto/aead.h>
64
#include <crypto/scatterwalk.h>
65
#include <crypto/internal/hash.h>
66
67
#include "t4fw_api.h"
68
#include "t4_msg.h"
69
#include "chcr_core.h"
70
#include "chcr_algo.h"
71
#include "chcr_crypto.h"
72
73
#define IV AES_BLOCK_SIZE
74
75
static unsigned int sgl_ent_len[] = {
76
0, 0, 16, 24, 40, 48, 64, 72, 88,
77
96, 112, 120, 136, 144, 160, 168, 184,
78
192, 208, 216, 232, 240, 256, 264, 280,
79
288, 304, 312, 328, 336, 352, 360, 376
80
};
81
82
static unsigned int dsgl_ent_len[] = {
83
0, 32, 32, 48, 48, 64, 64, 80, 80,
84
112, 112, 128, 128, 144, 144, 160, 160,
85
192, 192, 208, 208, 224, 224, 240, 240,
86
272, 272, 288, 288, 304, 304, 320, 320
87
};
88
89
static u32 round_constant[11] = {
90
0x01000000, 0x02000000, 0x04000000, 0x08000000,
91
0x10000000, 0x20000000, 0x40000000, 0x80000000,
92
0x1B000000, 0x36000000, 0x6C000000
93
};
94
95
static int chcr_handle_cipher_resp(struct skcipher_request *req,
96
unsigned char *input, int err);
97
98
static inline struct chcr_aead_ctx *AEAD_CTX(struct chcr_context *ctx)
99
{
100
return &ctx->crypto_ctx->aeadctx;
101
}
102
103
static inline struct ablk_ctx *ABLK_CTX(struct chcr_context *ctx)
104
{
105
return &ctx->crypto_ctx->ablkctx;
106
}
107
108
static inline struct hmac_ctx *HMAC_CTX(struct chcr_context *ctx)
109
{
110
return &ctx->crypto_ctx->hmacctx;
111
}
112
113
static inline struct chcr_gcm_ctx *GCM_CTX(struct chcr_aead_ctx *gctx)
114
{
115
return gctx->ctx->gcm;
116
}
117
118
static inline struct chcr_authenc_ctx *AUTHENC_CTX(struct chcr_aead_ctx *gctx)
119
{
120
return gctx->ctx->authenc;
121
}
122
123
static inline struct uld_ctx *ULD_CTX(struct chcr_context *ctx)
124
{
125
return container_of(ctx->dev, struct uld_ctx, dev);
126
}
127
128
static inline void chcr_init_hctx_per_wr(struct chcr_ahash_req_ctx *reqctx)
129
{
130
memset(&reqctx->hctx_wr, 0, sizeof(struct chcr_hctx_per_wr));
131
}
132
133
static int sg_nents_xlen(struct scatterlist *sg, unsigned int reqlen,
134
unsigned int entlen,
135
unsigned int skip)
136
{
137
int nents = 0;
138
unsigned int less;
139
unsigned int skip_len = 0;
140
141
while (sg && skip) {
142
if (sg_dma_len(sg) <= skip) {
143
skip -= sg_dma_len(sg);
144
skip_len = 0;
145
sg = sg_next(sg);
146
} else {
147
skip_len = skip;
148
skip = 0;
149
}
150
}
151
152
while (sg && reqlen) {
153
less = min(reqlen, sg_dma_len(sg) - skip_len);
154
nents += DIV_ROUND_UP(less, entlen);
155
reqlen -= less;
156
skip_len = 0;
157
sg = sg_next(sg);
158
}
159
return nents;
160
}
161
162
static inline int get_aead_subtype(struct crypto_aead *aead)
163
{
164
struct aead_alg *alg = crypto_aead_alg(aead);
165
struct chcr_alg_template *chcr_crypto_alg =
166
container_of(alg, struct chcr_alg_template, alg.aead);
167
return chcr_crypto_alg->type & CRYPTO_ALG_SUB_TYPE_MASK;
168
}
169
170
void chcr_verify_tag(struct aead_request *req, u8 *input, int *err)
171
{
172
u8 temp[SHA512_DIGEST_SIZE];
173
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
174
int authsize = crypto_aead_authsize(tfm);
175
struct cpl_fw6_pld *fw6_pld;
176
int cmp = 0;
177
178
fw6_pld = (struct cpl_fw6_pld *)input;
179
if ((get_aead_subtype(tfm) == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106) ||
180
(get_aead_subtype(tfm) == CRYPTO_ALG_SUB_TYPE_AEAD_GCM)) {
181
cmp = crypto_memneq(&fw6_pld->data[2], (fw6_pld + 1), authsize);
182
} else {
183
184
sg_pcopy_to_buffer(req->src, sg_nents(req->src), temp,
185
authsize, req->assoclen +
186
req->cryptlen - authsize);
187
cmp = crypto_memneq(temp, (fw6_pld + 1), authsize);
188
}
189
if (cmp)
190
*err = -EBADMSG;
191
else
192
*err = 0;
193
}
194
195
static int chcr_inc_wrcount(struct chcr_dev *dev)
196
{
197
if (dev->state == CHCR_DETACH)
198
return 1;
199
atomic_inc(&dev->inflight);
200
return 0;
201
}
202
203
static inline void chcr_dec_wrcount(struct chcr_dev *dev)
204
{
205
atomic_dec(&dev->inflight);
206
}
207
208
static inline int chcr_handle_aead_resp(struct aead_request *req,
209
unsigned char *input,
210
int err)
211
{
212
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
213
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
214
struct chcr_dev *dev = a_ctx(tfm)->dev;
215
216
chcr_aead_common_exit(req);
217
if (reqctx->verify == VERIFY_SW) {
218
chcr_verify_tag(req, input, &err);
219
reqctx->verify = VERIFY_HW;
220
}
221
chcr_dec_wrcount(dev);
222
aead_request_complete(req, err);
223
224
return err;
225
}
226
227
static void get_aes_decrypt_key(unsigned char *dec_key,
228
const unsigned char *key,
229
unsigned int keylength)
230
{
231
u32 temp;
232
u32 w_ring[MAX_NK];
233
int i, j, k;
234
u8 nr, nk;
235
236
switch (keylength) {
237
case AES_KEYLENGTH_128BIT:
238
nk = KEYLENGTH_4BYTES;
239
nr = NUMBER_OF_ROUNDS_10;
240
break;
241
case AES_KEYLENGTH_192BIT:
242
nk = KEYLENGTH_6BYTES;
243
nr = NUMBER_OF_ROUNDS_12;
244
break;
245
case AES_KEYLENGTH_256BIT:
246
nk = KEYLENGTH_8BYTES;
247
nr = NUMBER_OF_ROUNDS_14;
248
break;
249
default:
250
return;
251
}
252
for (i = 0; i < nk; i++)
253
w_ring[i] = get_unaligned_be32(&key[i * 4]);
254
255
i = 0;
256
temp = w_ring[nk - 1];
257
while (i + nk < (nr + 1) * 4) {
258
if (!(i % nk)) {
259
/* RotWord(temp) */
260
temp = (temp << 8) | (temp >> 24);
261
temp = aes_ks_subword(temp);
262
temp ^= round_constant[i / nk];
263
} else if (nk == 8 && (i % 4 == 0)) {
264
temp = aes_ks_subword(temp);
265
}
266
w_ring[i % nk] ^= temp;
267
temp = w_ring[i % nk];
268
i++;
269
}
270
i--;
271
for (k = 0, j = i % nk; k < nk; k++) {
272
put_unaligned_be32(w_ring[j], &dec_key[k * 4]);
273
j--;
274
if (j < 0)
275
j += nk;
276
}
277
}
278
279
static int chcr_prepare_hmac_key(const u8 *raw_key, unsigned int raw_key_len,
280
int digestsize, void *istate, void *ostate)
281
{
282
__be32 *istate32 = istate, *ostate32 = ostate;
283
__be64 *istate64 = istate, *ostate64 = ostate;
284
union {
285
struct hmac_sha1_key sha1;
286
struct hmac_sha224_key sha224;
287
struct hmac_sha256_key sha256;
288
struct hmac_sha384_key sha384;
289
struct hmac_sha512_key sha512;
290
} k;
291
292
switch (digestsize) {
293
case SHA1_DIGEST_SIZE:
294
hmac_sha1_preparekey(&k.sha1, raw_key, raw_key_len);
295
for (int i = 0; i < ARRAY_SIZE(k.sha1.istate.h); i++) {
296
istate32[i] = cpu_to_be32(k.sha1.istate.h[i]);
297
ostate32[i] = cpu_to_be32(k.sha1.ostate.h[i]);
298
}
299
break;
300
case SHA224_DIGEST_SIZE:
301
hmac_sha224_preparekey(&k.sha224, raw_key, raw_key_len);
302
for (int i = 0; i < ARRAY_SIZE(k.sha224.key.istate.h); i++) {
303
istate32[i] = cpu_to_be32(k.sha224.key.istate.h[i]);
304
ostate32[i] = cpu_to_be32(k.sha224.key.ostate.h[i]);
305
}
306
break;
307
case SHA256_DIGEST_SIZE:
308
hmac_sha256_preparekey(&k.sha256, raw_key, raw_key_len);
309
for (int i = 0; i < ARRAY_SIZE(k.sha256.key.istate.h); i++) {
310
istate32[i] = cpu_to_be32(k.sha256.key.istate.h[i]);
311
ostate32[i] = cpu_to_be32(k.sha256.key.ostate.h[i]);
312
}
313
break;
314
case SHA384_DIGEST_SIZE:
315
hmac_sha384_preparekey(&k.sha384, raw_key, raw_key_len);
316
for (int i = 0; i < ARRAY_SIZE(k.sha384.key.istate.h); i++) {
317
istate64[i] = cpu_to_be64(k.sha384.key.istate.h[i]);
318
ostate64[i] = cpu_to_be64(k.sha384.key.ostate.h[i]);
319
}
320
break;
321
case SHA512_DIGEST_SIZE:
322
hmac_sha512_preparekey(&k.sha512, raw_key, raw_key_len);
323
for (int i = 0; i < ARRAY_SIZE(k.sha512.key.istate.h); i++) {
324
istate64[i] = cpu_to_be64(k.sha512.key.istate.h[i]);
325
ostate64[i] = cpu_to_be64(k.sha512.key.ostate.h[i]);
326
}
327
break;
328
default:
329
return -EINVAL;
330
}
331
memzero_explicit(&k, sizeof(k));
332
return 0;
333
}
334
335
static inline int is_hmac(struct crypto_tfm *tfm)
336
{
337
struct crypto_alg *alg = tfm->__crt_alg;
338
struct chcr_alg_template *chcr_crypto_alg =
339
container_of(__crypto_ahash_alg(alg), struct chcr_alg_template,
340
alg.hash);
341
if (chcr_crypto_alg->type == CRYPTO_ALG_TYPE_HMAC)
342
return 1;
343
return 0;
344
}
345
346
static inline void dsgl_walk_init(struct dsgl_walk *walk,
347
struct cpl_rx_phys_dsgl *dsgl)
348
{
349
walk->dsgl = dsgl;
350
walk->nents = 0;
351
walk->to = (struct phys_sge_pairs *)(dsgl + 1);
352
}
353
354
static inline void dsgl_walk_end(struct dsgl_walk *walk, unsigned short qid,
355
int pci_chan_id)
356
{
357
struct cpl_rx_phys_dsgl *phys_cpl;
358
359
phys_cpl = walk->dsgl;
360
361
phys_cpl->op_to_tid = htonl(CPL_RX_PHYS_DSGL_OPCODE_V(CPL_RX_PHYS_DSGL)
362
| CPL_RX_PHYS_DSGL_ISRDMA_V(0));
363
phys_cpl->pcirlxorder_to_noofsgentr =
364
htonl(CPL_RX_PHYS_DSGL_PCIRLXORDER_V(0) |
365
CPL_RX_PHYS_DSGL_PCINOSNOOP_V(0) |
366
CPL_RX_PHYS_DSGL_PCITPHNTENB_V(0) |
367
CPL_RX_PHYS_DSGL_PCITPHNT_V(0) |
368
CPL_RX_PHYS_DSGL_DCAID_V(0) |
369
CPL_RX_PHYS_DSGL_NOOFSGENTR_V(walk->nents));
370
phys_cpl->rss_hdr_int.opcode = CPL_RX_PHYS_ADDR;
371
phys_cpl->rss_hdr_int.qid = htons(qid);
372
phys_cpl->rss_hdr_int.hash_val = 0;
373
phys_cpl->rss_hdr_int.channel = pci_chan_id;
374
}
375
376
static inline void dsgl_walk_add_page(struct dsgl_walk *walk,
377
size_t size,
378
dma_addr_t addr)
379
{
380
int j;
381
382
if (!size)
383
return;
384
j = walk->nents;
385
walk->to->len[j % 8] = htons(size);
386
walk->to->addr[j % 8] = cpu_to_be64(addr);
387
j++;
388
if ((j % 8) == 0)
389
walk->to++;
390
walk->nents = j;
391
}
392
393
static void dsgl_walk_add_sg(struct dsgl_walk *walk,
394
struct scatterlist *sg,
395
unsigned int slen,
396
unsigned int skip)
397
{
398
int skip_len = 0;
399
unsigned int left_size = slen, len = 0;
400
unsigned int j = walk->nents;
401
int offset, ent_len;
402
403
if (!slen)
404
return;
405
while (sg && skip) {
406
if (sg_dma_len(sg) <= skip) {
407
skip -= sg_dma_len(sg);
408
skip_len = 0;
409
sg = sg_next(sg);
410
} else {
411
skip_len = skip;
412
skip = 0;
413
}
414
}
415
416
while (left_size && sg) {
417
len = min_t(u32, left_size, sg_dma_len(sg) - skip_len);
418
offset = 0;
419
while (len) {
420
ent_len = min_t(u32, len, CHCR_DST_SG_SIZE);
421
walk->to->len[j % 8] = htons(ent_len);
422
walk->to->addr[j % 8] = cpu_to_be64(sg_dma_address(sg) +
423
offset + skip_len);
424
offset += ent_len;
425
len -= ent_len;
426
j++;
427
if ((j % 8) == 0)
428
walk->to++;
429
}
430
walk->last_sg = sg;
431
walk->last_sg_len = min_t(u32, left_size, sg_dma_len(sg) -
432
skip_len) + skip_len;
433
left_size -= min_t(u32, left_size, sg_dma_len(sg) - skip_len);
434
skip_len = 0;
435
sg = sg_next(sg);
436
}
437
walk->nents = j;
438
}
439
440
static inline void ulptx_walk_init(struct ulptx_walk *walk,
441
struct ulptx_sgl *ulp)
442
{
443
walk->sgl = ulp;
444
walk->nents = 0;
445
walk->pair_idx = 0;
446
walk->pair = ulp->sge;
447
walk->last_sg = NULL;
448
walk->last_sg_len = 0;
449
}
450
451
static inline void ulptx_walk_end(struct ulptx_walk *walk)
452
{
453
walk->sgl->cmd_nsge = htonl(ULPTX_CMD_V(ULP_TX_SC_DSGL) |
454
ULPTX_NSGE_V(walk->nents));
455
}
456
457
458
static inline void ulptx_walk_add_page(struct ulptx_walk *walk,
459
size_t size,
460
dma_addr_t addr)
461
{
462
if (!size)
463
return;
464
465
if (walk->nents == 0) {
466
walk->sgl->len0 = cpu_to_be32(size);
467
walk->sgl->addr0 = cpu_to_be64(addr);
468
} else {
469
walk->pair->addr[walk->pair_idx] = cpu_to_be64(addr);
470
walk->pair->len[walk->pair_idx] = cpu_to_be32(size);
471
walk->pair_idx = !walk->pair_idx;
472
if (!walk->pair_idx)
473
walk->pair++;
474
}
475
walk->nents++;
476
}
477
478
static void ulptx_walk_add_sg(struct ulptx_walk *walk,
479
struct scatterlist *sg,
480
unsigned int len,
481
unsigned int skip)
482
{
483
int small;
484
int skip_len = 0;
485
unsigned int sgmin;
486
487
if (!len)
488
return;
489
while (sg && skip) {
490
if (sg_dma_len(sg) <= skip) {
491
skip -= sg_dma_len(sg);
492
skip_len = 0;
493
sg = sg_next(sg);
494
} else {
495
skip_len = skip;
496
skip = 0;
497
}
498
}
499
WARN(!sg, "SG should not be null here\n");
500
if (sg && (walk->nents == 0)) {
501
small = min_t(unsigned int, sg_dma_len(sg) - skip_len, len);
502
sgmin = min_t(unsigned int, small, CHCR_SRC_SG_SIZE);
503
walk->sgl->len0 = cpu_to_be32(sgmin);
504
walk->sgl->addr0 = cpu_to_be64(sg_dma_address(sg) + skip_len);
505
walk->nents++;
506
len -= sgmin;
507
walk->last_sg = sg;
508
walk->last_sg_len = sgmin + skip_len;
509
skip_len += sgmin;
510
if (sg_dma_len(sg) == skip_len) {
511
sg = sg_next(sg);
512
skip_len = 0;
513
}
514
}
515
516
while (sg && len) {
517
small = min(sg_dma_len(sg) - skip_len, len);
518
sgmin = min_t(unsigned int, small, CHCR_SRC_SG_SIZE);
519
walk->pair->len[walk->pair_idx] = cpu_to_be32(sgmin);
520
walk->pair->addr[walk->pair_idx] =
521
cpu_to_be64(sg_dma_address(sg) + skip_len);
522
walk->pair_idx = !walk->pair_idx;
523
walk->nents++;
524
if (!walk->pair_idx)
525
walk->pair++;
526
len -= sgmin;
527
skip_len += sgmin;
528
walk->last_sg = sg;
529
walk->last_sg_len = skip_len;
530
if (sg_dma_len(sg) == skip_len) {
531
sg = sg_next(sg);
532
skip_len = 0;
533
}
534
}
535
}
536
537
static inline int get_cryptoalg_subtype(struct crypto_skcipher *tfm)
538
{
539
struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
540
struct chcr_alg_template *chcr_crypto_alg =
541
container_of(alg, struct chcr_alg_template, alg.skcipher);
542
543
return chcr_crypto_alg->type & CRYPTO_ALG_SUB_TYPE_MASK;
544
}
545
546
static int cxgb4_is_crypto_q_full(struct net_device *dev, unsigned int idx)
547
{
548
struct adapter *adap = netdev2adap(dev);
549
struct sge_uld_txq_info *txq_info =
550
adap->sge.uld_txq_info[CXGB4_TX_CRYPTO];
551
struct sge_uld_txq *txq;
552
int ret = 0;
553
554
local_bh_disable();
555
txq = &txq_info->uldtxq[idx];
556
spin_lock(&txq->sendq.lock);
557
if (txq->full)
558
ret = -1;
559
spin_unlock(&txq->sendq.lock);
560
local_bh_enable();
561
return ret;
562
}
563
564
static int generate_copy_rrkey(struct ablk_ctx *ablkctx,
565
struct _key_ctx *key_ctx)
566
{
567
if (ablkctx->ciph_mode == CHCR_SCMD_CIPHER_MODE_AES_CBC) {
568
memcpy(key_ctx->key, ablkctx->rrkey, ablkctx->enckey_len);
569
} else {
570
memcpy(key_ctx->key,
571
ablkctx->key + (ablkctx->enckey_len >> 1),
572
ablkctx->enckey_len >> 1);
573
memcpy(key_ctx->key + (ablkctx->enckey_len >> 1),
574
ablkctx->rrkey, ablkctx->enckey_len >> 1);
575
}
576
return 0;
577
}
578
579
static int chcr_hash_ent_in_wr(struct scatterlist *src,
580
unsigned int minsg,
581
unsigned int space,
582
unsigned int srcskip)
583
{
584
int srclen = 0;
585
int srcsg = minsg;
586
int soffset = 0, sless;
587
588
if (sg_dma_len(src) == srcskip) {
589
src = sg_next(src);
590
srcskip = 0;
591
}
592
while (src && space > (sgl_ent_len[srcsg + 1])) {
593
sless = min_t(unsigned int, sg_dma_len(src) - soffset - srcskip,
594
CHCR_SRC_SG_SIZE);
595
srclen += sless;
596
soffset += sless;
597
srcsg++;
598
if (sg_dma_len(src) == (soffset + srcskip)) {
599
src = sg_next(src);
600
soffset = 0;
601
srcskip = 0;
602
}
603
}
604
return srclen;
605
}
606
607
static int chcr_sg_ent_in_wr(struct scatterlist *src,
608
struct scatterlist *dst,
609
unsigned int minsg,
610
unsigned int space,
611
unsigned int srcskip,
612
unsigned int dstskip)
613
{
614
int srclen = 0, dstlen = 0;
615
int srcsg = minsg, dstsg = minsg;
616
int offset = 0, soffset = 0, less, sless = 0;
617
618
if (sg_dma_len(src) == srcskip) {
619
src = sg_next(src);
620
srcskip = 0;
621
}
622
if (sg_dma_len(dst) == dstskip) {
623
dst = sg_next(dst);
624
dstskip = 0;
625
}
626
627
while (src && dst &&
628
space > (sgl_ent_len[srcsg + 1] + dsgl_ent_len[dstsg])) {
629
sless = min_t(unsigned int, sg_dma_len(src) - srcskip - soffset,
630
CHCR_SRC_SG_SIZE);
631
srclen += sless;
632
srcsg++;
633
offset = 0;
634
while (dst && ((dstsg + 1) <= MAX_DSGL_ENT) &&
635
space > (sgl_ent_len[srcsg] + dsgl_ent_len[dstsg + 1])) {
636
if (srclen <= dstlen)
637
break;
638
less = min_t(unsigned int, sg_dma_len(dst) - offset -
639
dstskip, CHCR_DST_SG_SIZE);
640
dstlen += less;
641
offset += less;
642
if ((offset + dstskip) == sg_dma_len(dst)) {
643
dst = sg_next(dst);
644
offset = 0;
645
}
646
dstsg++;
647
dstskip = 0;
648
}
649
soffset += sless;
650
if ((soffset + srcskip) == sg_dma_len(src)) {
651
src = sg_next(src);
652
srcskip = 0;
653
soffset = 0;
654
}
655
656
}
657
return min(srclen, dstlen);
658
}
659
660
static int chcr_cipher_fallback(struct crypto_skcipher *cipher,
661
struct skcipher_request *req,
662
u8 *iv,
663
unsigned short op_type)
664
{
665
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
666
int err;
667
668
skcipher_request_set_tfm(&reqctx->fallback_req, cipher);
669
skcipher_request_set_callback(&reqctx->fallback_req, req->base.flags,
670
req->base.complete, req->base.data);
671
skcipher_request_set_crypt(&reqctx->fallback_req, req->src, req->dst,
672
req->cryptlen, iv);
673
674
err = op_type ? crypto_skcipher_decrypt(&reqctx->fallback_req) :
675
crypto_skcipher_encrypt(&reqctx->fallback_req);
676
677
return err;
678
679
}
680
681
static inline int get_qidxs(struct crypto_async_request *req,
682
unsigned int *txqidx, unsigned int *rxqidx)
683
{
684
struct crypto_tfm *tfm = req->tfm;
685
int ret = 0;
686
687
switch (tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
688
case CRYPTO_ALG_TYPE_AEAD:
689
{
690
struct aead_request *aead_req =
691
container_of(req, struct aead_request, base);
692
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(aead_req);
693
*txqidx = reqctx->txqidx;
694
*rxqidx = reqctx->rxqidx;
695
break;
696
}
697
case CRYPTO_ALG_TYPE_SKCIPHER:
698
{
699
struct skcipher_request *sk_req =
700
container_of(req, struct skcipher_request, base);
701
struct chcr_skcipher_req_ctx *reqctx =
702
skcipher_request_ctx(sk_req);
703
*txqidx = reqctx->txqidx;
704
*rxqidx = reqctx->rxqidx;
705
break;
706
}
707
case CRYPTO_ALG_TYPE_AHASH:
708
{
709
struct ahash_request *ahash_req =
710
container_of(req, struct ahash_request, base);
711
struct chcr_ahash_req_ctx *reqctx =
712
ahash_request_ctx(ahash_req);
713
*txqidx = reqctx->txqidx;
714
*rxqidx = reqctx->rxqidx;
715
break;
716
}
717
default:
718
ret = -EINVAL;
719
/* should never get here */
720
BUG();
721
break;
722
}
723
return ret;
724
}
725
726
static inline void create_wreq(struct chcr_context *ctx,
727
struct chcr_wr *chcr_req,
728
struct crypto_async_request *req,
729
unsigned int imm,
730
int hash_sz,
731
unsigned int len16,
732
unsigned int sc_len,
733
unsigned int lcb)
734
{
735
struct uld_ctx *u_ctx = ULD_CTX(ctx);
736
unsigned int tx_channel_id, rx_channel_id;
737
unsigned int txqidx = 0, rxqidx = 0;
738
unsigned int qid, fid, portno;
739
740
get_qidxs(req, &txqidx, &rxqidx);
741
qid = u_ctx->lldi.rxq_ids[rxqidx];
742
fid = u_ctx->lldi.rxq_ids[0];
743
portno = rxqidx / ctx->rxq_perchan;
744
tx_channel_id = txqidx / ctx->txq_perchan;
745
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[portno]);
746
747
748
chcr_req->wreq.op_to_cctx_size = FILL_WR_OP_CCTX_SIZE;
749
chcr_req->wreq.pld_size_hash_size =
750
htonl(FW_CRYPTO_LOOKASIDE_WR_HASH_SIZE_V(hash_sz));
751
chcr_req->wreq.len16_pkd =
752
htonl(FW_CRYPTO_LOOKASIDE_WR_LEN16_V(DIV_ROUND_UP(len16, 16)));
753
chcr_req->wreq.cookie = cpu_to_be64((uintptr_t)req);
754
chcr_req->wreq.rx_chid_to_rx_q_id = FILL_WR_RX_Q_ID(rx_channel_id, qid,
755
!!lcb, txqidx);
756
757
chcr_req->ulptx.cmd_dest = FILL_ULPTX_CMD_DEST(tx_channel_id, fid);
758
chcr_req->ulptx.len = htonl((DIV_ROUND_UP(len16, 16) -
759
((sizeof(chcr_req->wreq)) >> 4)));
760
chcr_req->sc_imm.cmd_more = FILL_CMD_MORE(!imm);
761
chcr_req->sc_imm.len = cpu_to_be32(sizeof(struct cpl_tx_sec_pdu) +
762
sizeof(chcr_req->key_ctx) + sc_len);
763
}
764
765
/**
766
* create_cipher_wr - form the WR for cipher operations
767
* @wrparam: Container for create_cipher_wr()'s parameters
768
*/
769
static struct sk_buff *create_cipher_wr(struct cipher_wr_param *wrparam)
770
{
771
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(wrparam->req);
772
struct chcr_context *ctx = c_ctx(tfm);
773
struct uld_ctx *u_ctx = ULD_CTX(ctx);
774
struct ablk_ctx *ablkctx = ABLK_CTX(ctx);
775
struct sk_buff *skb = NULL;
776
struct chcr_wr *chcr_req;
777
struct cpl_rx_phys_dsgl *phys_cpl;
778
struct ulptx_sgl *ulptx;
779
struct chcr_skcipher_req_ctx *reqctx =
780
skcipher_request_ctx(wrparam->req);
781
unsigned int temp = 0, transhdr_len, dst_size;
782
int error;
783
int nents;
784
unsigned int kctx_len;
785
gfp_t flags = wrparam->req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
786
GFP_KERNEL : GFP_ATOMIC;
787
struct adapter *adap = padap(ctx->dev);
788
unsigned int rx_channel_id = reqctx->rxqidx / ctx->rxq_perchan;
789
790
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
791
nents = sg_nents_xlen(reqctx->dstsg, wrparam->bytes, CHCR_DST_SG_SIZE,
792
reqctx->dst_ofst);
793
dst_size = get_space_for_phys_dsgl(nents);
794
kctx_len = roundup(ablkctx->enckey_len, 16);
795
transhdr_len = CIPHER_TRANSHDR_SIZE(kctx_len, dst_size);
796
nents = sg_nents_xlen(reqctx->srcsg, wrparam->bytes,
797
CHCR_SRC_SG_SIZE, reqctx->src_ofst);
798
temp = reqctx->imm ? roundup(wrparam->bytes, 16) :
799
(sgl_len(nents) * 8);
800
transhdr_len += temp;
801
transhdr_len = roundup(transhdr_len, 16);
802
skb = alloc_skb(SGE_MAX_WR_LEN, flags);
803
if (!skb) {
804
error = -ENOMEM;
805
goto err;
806
}
807
chcr_req = __skb_put_zero(skb, transhdr_len);
808
chcr_req->sec_cpl.op_ivinsrtofst =
809
FILL_SEC_CPL_OP_IVINSR(rx_channel_id, 2, 1);
810
811
chcr_req->sec_cpl.pldlen = htonl(IV + wrparam->bytes);
812
chcr_req->sec_cpl.aadstart_cipherstop_hi =
813
FILL_SEC_CPL_CIPHERSTOP_HI(0, 0, IV + 1, 0);
814
815
chcr_req->sec_cpl.cipherstop_lo_authinsert =
816
FILL_SEC_CPL_AUTHINSERT(0, 0, 0, 0);
817
chcr_req->sec_cpl.seqno_numivs = FILL_SEC_CPL_SCMD0_SEQNO(reqctx->op, 0,
818
ablkctx->ciph_mode,
819
0, 0, IV >> 1);
820
chcr_req->sec_cpl.ivgen_hdrlen = FILL_SEC_CPL_IVGEN_HDRLEN(0, 0, 0,
821
0, 1, dst_size);
822
823
chcr_req->key_ctx.ctx_hdr = ablkctx->key_ctx_hdr;
824
if ((reqctx->op == CHCR_DECRYPT_OP) &&
825
(!(get_cryptoalg_subtype(tfm) ==
826
CRYPTO_ALG_SUB_TYPE_CTR)) &&
827
(!(get_cryptoalg_subtype(tfm) ==
828
CRYPTO_ALG_SUB_TYPE_CTR_RFC3686))) {
829
generate_copy_rrkey(ablkctx, &chcr_req->key_ctx);
830
} else {
831
if ((ablkctx->ciph_mode == CHCR_SCMD_CIPHER_MODE_AES_CBC) ||
832
(ablkctx->ciph_mode == CHCR_SCMD_CIPHER_MODE_AES_CTR)) {
833
memcpy(chcr_req->key_ctx.key, ablkctx->key,
834
ablkctx->enckey_len);
835
} else {
836
memcpy(chcr_req->key_ctx.key, ablkctx->key +
837
(ablkctx->enckey_len >> 1),
838
ablkctx->enckey_len >> 1);
839
memcpy(chcr_req->key_ctx.key +
840
(ablkctx->enckey_len >> 1),
841
ablkctx->key,
842
ablkctx->enckey_len >> 1);
843
}
844
}
845
phys_cpl = (struct cpl_rx_phys_dsgl *)((u8 *)(chcr_req + 1) + kctx_len);
846
ulptx = (struct ulptx_sgl *)((u8 *)(phys_cpl + 1) + dst_size);
847
chcr_add_cipher_src_ent(wrparam->req, ulptx, wrparam);
848
chcr_add_cipher_dst_ent(wrparam->req, phys_cpl, wrparam, wrparam->qid);
849
850
atomic_inc(&adap->chcr_stats.cipher_rqst);
851
temp = sizeof(struct cpl_rx_phys_dsgl) + dst_size + kctx_len + IV
852
+ (reqctx->imm ? (wrparam->bytes) : 0);
853
create_wreq(c_ctx(tfm), chcr_req, &(wrparam->req->base), reqctx->imm, 0,
854
transhdr_len, temp,
855
ablkctx->ciph_mode == CHCR_SCMD_CIPHER_MODE_AES_CBC);
856
reqctx->skb = skb;
857
858
if (reqctx->op && (ablkctx->ciph_mode ==
859
CHCR_SCMD_CIPHER_MODE_AES_CBC))
860
sg_pcopy_to_buffer(wrparam->req->src,
861
sg_nents(wrparam->req->src), wrparam->req->iv, 16,
862
reqctx->processed + wrparam->bytes - AES_BLOCK_SIZE);
863
864
return skb;
865
err:
866
return ERR_PTR(error);
867
}
868
869
static inline int chcr_keyctx_ck_size(unsigned int keylen)
870
{
871
int ck_size = 0;
872
873
if (keylen == AES_KEYSIZE_128)
874
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
875
else if (keylen == AES_KEYSIZE_192)
876
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_192;
877
else if (keylen == AES_KEYSIZE_256)
878
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
879
else
880
ck_size = 0;
881
882
return ck_size;
883
}
884
static int chcr_cipher_fallback_setkey(struct crypto_skcipher *cipher,
885
const u8 *key,
886
unsigned int keylen)
887
{
888
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(cipher));
889
890
crypto_skcipher_clear_flags(ablkctx->sw_cipher,
891
CRYPTO_TFM_REQ_MASK);
892
crypto_skcipher_set_flags(ablkctx->sw_cipher,
893
cipher->base.crt_flags & CRYPTO_TFM_REQ_MASK);
894
return crypto_skcipher_setkey(ablkctx->sw_cipher, key, keylen);
895
}
896
897
static int chcr_aes_cbc_setkey(struct crypto_skcipher *cipher,
898
const u8 *key,
899
unsigned int keylen)
900
{
901
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(cipher));
902
unsigned int ck_size, context_size;
903
u16 alignment = 0;
904
int err;
905
906
err = chcr_cipher_fallback_setkey(cipher, key, keylen);
907
if (err)
908
goto badkey_err;
909
910
ck_size = chcr_keyctx_ck_size(keylen);
911
alignment = ck_size == CHCR_KEYCTX_CIPHER_KEY_SIZE_192 ? 8 : 0;
912
memcpy(ablkctx->key, key, keylen);
913
ablkctx->enckey_len = keylen;
914
get_aes_decrypt_key(ablkctx->rrkey, ablkctx->key, keylen << 3);
915
context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD +
916
keylen + alignment) >> 4;
917
918
ablkctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size, CHCR_KEYCTX_NO_KEY,
919
0, 0, context_size);
920
ablkctx->ciph_mode = CHCR_SCMD_CIPHER_MODE_AES_CBC;
921
return 0;
922
badkey_err:
923
ablkctx->enckey_len = 0;
924
925
return err;
926
}
927
928
static int chcr_aes_ctr_setkey(struct crypto_skcipher *cipher,
929
const u8 *key,
930
unsigned int keylen)
931
{
932
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(cipher));
933
unsigned int ck_size, context_size;
934
u16 alignment = 0;
935
int err;
936
937
err = chcr_cipher_fallback_setkey(cipher, key, keylen);
938
if (err)
939
goto badkey_err;
940
ck_size = chcr_keyctx_ck_size(keylen);
941
alignment = (ck_size == CHCR_KEYCTX_CIPHER_KEY_SIZE_192) ? 8 : 0;
942
memcpy(ablkctx->key, key, keylen);
943
ablkctx->enckey_len = keylen;
944
context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD +
945
keylen + alignment) >> 4;
946
947
ablkctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size, CHCR_KEYCTX_NO_KEY,
948
0, 0, context_size);
949
ablkctx->ciph_mode = CHCR_SCMD_CIPHER_MODE_AES_CTR;
950
951
return 0;
952
badkey_err:
953
ablkctx->enckey_len = 0;
954
955
return err;
956
}
957
958
static int chcr_aes_rfc3686_setkey(struct crypto_skcipher *cipher,
959
const u8 *key,
960
unsigned int keylen)
961
{
962
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(cipher));
963
unsigned int ck_size, context_size;
964
u16 alignment = 0;
965
int err;
966
967
if (keylen < CTR_RFC3686_NONCE_SIZE)
968
return -EINVAL;
969
memcpy(ablkctx->nonce, key + (keylen - CTR_RFC3686_NONCE_SIZE),
970
CTR_RFC3686_NONCE_SIZE);
971
972
keylen -= CTR_RFC3686_NONCE_SIZE;
973
err = chcr_cipher_fallback_setkey(cipher, key, keylen);
974
if (err)
975
goto badkey_err;
976
977
ck_size = chcr_keyctx_ck_size(keylen);
978
alignment = (ck_size == CHCR_KEYCTX_CIPHER_KEY_SIZE_192) ? 8 : 0;
979
memcpy(ablkctx->key, key, keylen);
980
ablkctx->enckey_len = keylen;
981
context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD +
982
keylen + alignment) >> 4;
983
984
ablkctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size, CHCR_KEYCTX_NO_KEY,
985
0, 0, context_size);
986
ablkctx->ciph_mode = CHCR_SCMD_CIPHER_MODE_AES_CTR;
987
988
return 0;
989
badkey_err:
990
ablkctx->enckey_len = 0;
991
992
return err;
993
}
994
static void ctr_add_iv(u8 *dstiv, u8 *srciv, u32 add)
995
{
996
unsigned int size = AES_BLOCK_SIZE;
997
__be32 *b = (__be32 *)(dstiv + size);
998
u32 c, prev;
999
1000
memcpy(dstiv, srciv, AES_BLOCK_SIZE);
1001
for (; size >= 4; size -= 4) {
1002
prev = be32_to_cpu(*--b);
1003
c = prev + add;
1004
*b = cpu_to_be32(c);
1005
if (prev < c)
1006
break;
1007
add = 1;
1008
}
1009
1010
}
1011
1012
static unsigned int adjust_ctr_overflow(u8 *iv, u32 bytes)
1013
{
1014
__be32 *b = (__be32 *)(iv + AES_BLOCK_SIZE);
1015
u64 c;
1016
u32 temp = be32_to_cpu(*--b);
1017
1018
temp = ~temp;
1019
c = (u64)temp + 1; // No of block can processed without overflow
1020
if ((bytes / AES_BLOCK_SIZE) >= c)
1021
bytes = c * AES_BLOCK_SIZE;
1022
return bytes;
1023
}
1024
1025
static int chcr_update_tweak(struct skcipher_request *req, u8 *iv,
1026
u32 isfinal)
1027
{
1028
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1029
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(tfm));
1030
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1031
struct crypto_aes_ctx aes;
1032
int ret, i;
1033
u8 *key;
1034
unsigned int keylen;
1035
int round = reqctx->last_req_len / AES_BLOCK_SIZE;
1036
int round8 = round / 8;
1037
1038
memcpy(iv, reqctx->iv, AES_BLOCK_SIZE);
1039
1040
keylen = ablkctx->enckey_len / 2;
1041
key = ablkctx->key + keylen;
1042
/* For a 192 bit key remove the padded zeroes which was
1043
* added in chcr_xts_setkey
1044
*/
1045
if (KEY_CONTEXT_CK_SIZE_G(ntohl(ablkctx->key_ctx_hdr))
1046
== CHCR_KEYCTX_CIPHER_KEY_SIZE_192)
1047
ret = aes_expandkey(&aes, key, keylen - 8);
1048
else
1049
ret = aes_expandkey(&aes, key, keylen);
1050
if (ret)
1051
return ret;
1052
aes_encrypt(&aes, iv, iv);
1053
for (i = 0; i < round8; i++)
1054
gf128mul_x8_ble((le128 *)iv, (le128 *)iv);
1055
1056
for (i = 0; i < (round % 8); i++)
1057
gf128mul_x_ble((le128 *)iv, (le128 *)iv);
1058
1059
if (!isfinal)
1060
aes_decrypt(&aes, iv, iv);
1061
1062
memzero_explicit(&aes, sizeof(aes));
1063
return 0;
1064
}
1065
1066
static int chcr_update_cipher_iv(struct skcipher_request *req,
1067
struct cpl_fw6_pld *fw6_pld, u8 *iv)
1068
{
1069
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1070
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1071
int subtype = get_cryptoalg_subtype(tfm);
1072
int ret = 0;
1073
1074
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR)
1075
ctr_add_iv(iv, req->iv, (reqctx->processed /
1076
AES_BLOCK_SIZE));
1077
else if (subtype == CRYPTO_ALG_SUB_TYPE_CTR_RFC3686)
1078
*(__be32 *)(reqctx->iv + CTR_RFC3686_NONCE_SIZE +
1079
CTR_RFC3686_IV_SIZE) = cpu_to_be32((reqctx->processed /
1080
AES_BLOCK_SIZE) + 1);
1081
else if (subtype == CRYPTO_ALG_SUB_TYPE_XTS)
1082
ret = chcr_update_tweak(req, iv, 0);
1083
else if (subtype == CRYPTO_ALG_SUB_TYPE_CBC) {
1084
if (reqctx->op)
1085
/*Updated before sending last WR*/
1086
memcpy(iv, req->iv, AES_BLOCK_SIZE);
1087
else
1088
memcpy(iv, &fw6_pld->data[2], AES_BLOCK_SIZE);
1089
}
1090
1091
return ret;
1092
1093
}
1094
1095
/* We need separate function for final iv because in rfc3686 Initial counter
1096
* starts from 1 and buffer size of iv is 8 byte only which remains constant
1097
* for subsequent update requests
1098
*/
1099
1100
static int chcr_final_cipher_iv(struct skcipher_request *req,
1101
struct cpl_fw6_pld *fw6_pld, u8 *iv)
1102
{
1103
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1104
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1105
int subtype = get_cryptoalg_subtype(tfm);
1106
int ret = 0;
1107
1108
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR)
1109
ctr_add_iv(iv, req->iv, DIV_ROUND_UP(reqctx->processed,
1110
AES_BLOCK_SIZE));
1111
else if (subtype == CRYPTO_ALG_SUB_TYPE_XTS) {
1112
if (!reqctx->partial_req)
1113
memcpy(iv, reqctx->iv, AES_BLOCK_SIZE);
1114
else
1115
ret = chcr_update_tweak(req, iv, 1);
1116
}
1117
else if (subtype == CRYPTO_ALG_SUB_TYPE_CBC) {
1118
/*Already updated for Decrypt*/
1119
if (!reqctx->op)
1120
memcpy(iv, &fw6_pld->data[2], AES_BLOCK_SIZE);
1121
1122
}
1123
return ret;
1124
1125
}
1126
1127
static int chcr_handle_cipher_resp(struct skcipher_request *req,
1128
unsigned char *input, int err)
1129
{
1130
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1131
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1132
struct cpl_fw6_pld *fw6_pld = (struct cpl_fw6_pld *)input;
1133
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(tfm));
1134
struct uld_ctx *u_ctx = ULD_CTX(c_ctx(tfm));
1135
struct chcr_dev *dev = c_ctx(tfm)->dev;
1136
struct chcr_context *ctx = c_ctx(tfm);
1137
struct adapter *adap = padap(ctx->dev);
1138
struct cipher_wr_param wrparam;
1139
struct sk_buff *skb;
1140
int bytes;
1141
1142
if (err)
1143
goto unmap;
1144
if (req->cryptlen == reqctx->processed) {
1145
chcr_cipher_dma_unmap(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev,
1146
req);
1147
err = chcr_final_cipher_iv(req, fw6_pld, req->iv);
1148
goto complete;
1149
}
1150
1151
if (!reqctx->imm) {
1152
bytes = chcr_sg_ent_in_wr(reqctx->srcsg, reqctx->dstsg, 0,
1153
CIP_SPACE_LEFT(ablkctx->enckey_len),
1154
reqctx->src_ofst, reqctx->dst_ofst);
1155
if ((bytes + reqctx->processed) >= req->cryptlen)
1156
bytes = req->cryptlen - reqctx->processed;
1157
else
1158
bytes = rounddown(bytes, 16);
1159
} else {
1160
/*CTR mode counter overflow*/
1161
bytes = req->cryptlen - reqctx->processed;
1162
}
1163
err = chcr_update_cipher_iv(req, fw6_pld, reqctx->iv);
1164
if (err)
1165
goto unmap;
1166
1167
if (unlikely(bytes == 0)) {
1168
chcr_cipher_dma_unmap(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev,
1169
req);
1170
memcpy(req->iv, reqctx->init_iv, IV);
1171
atomic_inc(&adap->chcr_stats.fallback);
1172
err = chcr_cipher_fallback(ablkctx->sw_cipher, req, req->iv,
1173
reqctx->op);
1174
goto complete;
1175
}
1176
1177
if (get_cryptoalg_subtype(tfm) ==
1178
CRYPTO_ALG_SUB_TYPE_CTR)
1179
bytes = adjust_ctr_overflow(reqctx->iv, bytes);
1180
wrparam.qid = u_ctx->lldi.rxq_ids[reqctx->rxqidx];
1181
wrparam.req = req;
1182
wrparam.bytes = bytes;
1183
skb = create_cipher_wr(&wrparam);
1184
if (IS_ERR(skb)) {
1185
pr_err("%s : Failed to form WR. No memory\n", __func__);
1186
err = PTR_ERR(skb);
1187
goto unmap;
1188
}
1189
skb->dev = u_ctx->lldi.ports[0];
1190
set_wr_txq(skb, CPL_PRIORITY_DATA, reqctx->txqidx);
1191
chcr_send_wr(skb);
1192
reqctx->last_req_len = bytes;
1193
reqctx->processed += bytes;
1194
if (get_cryptoalg_subtype(tfm) ==
1195
CRYPTO_ALG_SUB_TYPE_CBC && req->base.flags ==
1196
CRYPTO_TFM_REQ_MAY_SLEEP ) {
1197
complete(&ctx->cbc_aes_aio_done);
1198
}
1199
return 0;
1200
unmap:
1201
chcr_cipher_dma_unmap(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev, req);
1202
complete:
1203
if (get_cryptoalg_subtype(tfm) ==
1204
CRYPTO_ALG_SUB_TYPE_CBC && req->base.flags ==
1205
CRYPTO_TFM_REQ_MAY_SLEEP ) {
1206
complete(&ctx->cbc_aes_aio_done);
1207
}
1208
chcr_dec_wrcount(dev);
1209
skcipher_request_complete(req, err);
1210
return err;
1211
}
1212
1213
static int process_cipher(struct skcipher_request *req,
1214
unsigned short qid,
1215
struct sk_buff **skb,
1216
unsigned short op_type)
1217
{
1218
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1219
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1220
unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1221
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(tfm));
1222
struct adapter *adap = padap(c_ctx(tfm)->dev);
1223
struct cipher_wr_param wrparam;
1224
int bytes, err = -EINVAL;
1225
int subtype;
1226
1227
reqctx->processed = 0;
1228
reqctx->partial_req = 0;
1229
if (!req->iv)
1230
goto error;
1231
subtype = get_cryptoalg_subtype(tfm);
1232
if ((ablkctx->enckey_len == 0) || (ivsize > AES_BLOCK_SIZE) ||
1233
(req->cryptlen == 0) ||
1234
(req->cryptlen % crypto_skcipher_blocksize(tfm))) {
1235
if (req->cryptlen == 0 && subtype != CRYPTO_ALG_SUB_TYPE_XTS)
1236
goto fallback;
1237
else if (req->cryptlen % crypto_skcipher_blocksize(tfm) &&
1238
subtype == CRYPTO_ALG_SUB_TYPE_XTS)
1239
goto fallback;
1240
pr_err("AES: Invalid value of Key Len %d nbytes %d IV Len %d\n",
1241
ablkctx->enckey_len, req->cryptlen, ivsize);
1242
goto error;
1243
}
1244
1245
err = chcr_cipher_dma_map(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev, req);
1246
if (err)
1247
goto error;
1248
if (req->cryptlen < (SGE_MAX_WR_LEN - (sizeof(struct chcr_wr) +
1249
AES_MIN_KEY_SIZE +
1250
sizeof(struct cpl_rx_phys_dsgl) +
1251
/*Min dsgl size*/
1252
32))) {
1253
/* Can be sent as Imm*/
1254
unsigned int dnents = 0, transhdr_len, phys_dsgl, kctx_len;
1255
1256
dnents = sg_nents_xlen(req->dst, req->cryptlen,
1257
CHCR_DST_SG_SIZE, 0);
1258
phys_dsgl = get_space_for_phys_dsgl(dnents);
1259
kctx_len = roundup(ablkctx->enckey_len, 16);
1260
transhdr_len = CIPHER_TRANSHDR_SIZE(kctx_len, phys_dsgl);
1261
reqctx->imm = (transhdr_len + IV + req->cryptlen) <=
1262
SGE_MAX_WR_LEN;
1263
bytes = IV + req->cryptlen;
1264
1265
} else {
1266
reqctx->imm = 0;
1267
}
1268
1269
if (!reqctx->imm) {
1270
bytes = chcr_sg_ent_in_wr(req->src, req->dst, 0,
1271
CIP_SPACE_LEFT(ablkctx->enckey_len),
1272
0, 0);
1273
if ((bytes + reqctx->processed) >= req->cryptlen)
1274
bytes = req->cryptlen - reqctx->processed;
1275
else
1276
bytes = rounddown(bytes, 16);
1277
} else {
1278
bytes = req->cryptlen;
1279
}
1280
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR) {
1281
bytes = adjust_ctr_overflow(req->iv, bytes);
1282
}
1283
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR_RFC3686) {
1284
memcpy(reqctx->iv, ablkctx->nonce, CTR_RFC3686_NONCE_SIZE);
1285
memcpy(reqctx->iv + CTR_RFC3686_NONCE_SIZE, req->iv,
1286
CTR_RFC3686_IV_SIZE);
1287
1288
/* initialize counter portion of counter block */
1289
*(__be32 *)(reqctx->iv + CTR_RFC3686_NONCE_SIZE +
1290
CTR_RFC3686_IV_SIZE) = cpu_to_be32(1);
1291
memcpy(reqctx->init_iv, reqctx->iv, IV);
1292
1293
} else {
1294
1295
memcpy(reqctx->iv, req->iv, IV);
1296
memcpy(reqctx->init_iv, req->iv, IV);
1297
}
1298
if (unlikely(bytes == 0)) {
1299
chcr_cipher_dma_unmap(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev,
1300
req);
1301
fallback: atomic_inc(&adap->chcr_stats.fallback);
1302
err = chcr_cipher_fallback(ablkctx->sw_cipher, req,
1303
subtype ==
1304
CRYPTO_ALG_SUB_TYPE_CTR_RFC3686 ?
1305
reqctx->iv : req->iv,
1306
op_type);
1307
goto error;
1308
}
1309
reqctx->op = op_type;
1310
reqctx->srcsg = req->src;
1311
reqctx->dstsg = req->dst;
1312
reqctx->src_ofst = 0;
1313
reqctx->dst_ofst = 0;
1314
wrparam.qid = qid;
1315
wrparam.req = req;
1316
wrparam.bytes = bytes;
1317
*skb = create_cipher_wr(&wrparam);
1318
if (IS_ERR(*skb)) {
1319
err = PTR_ERR(*skb);
1320
goto unmap;
1321
}
1322
reqctx->processed = bytes;
1323
reqctx->last_req_len = bytes;
1324
reqctx->partial_req = !!(req->cryptlen - reqctx->processed);
1325
1326
return 0;
1327
unmap:
1328
chcr_cipher_dma_unmap(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev, req);
1329
error:
1330
return err;
1331
}
1332
1333
static int chcr_aes_encrypt(struct skcipher_request *req)
1334
{
1335
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1336
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1337
struct chcr_dev *dev = c_ctx(tfm)->dev;
1338
struct sk_buff *skb = NULL;
1339
int err;
1340
struct uld_ctx *u_ctx = ULD_CTX(c_ctx(tfm));
1341
struct chcr_context *ctx = c_ctx(tfm);
1342
unsigned int cpu;
1343
1344
cpu = get_cpu();
1345
reqctx->txqidx = cpu % ctx->ntxq;
1346
reqctx->rxqidx = cpu % ctx->nrxq;
1347
put_cpu();
1348
1349
err = chcr_inc_wrcount(dev);
1350
if (err)
1351
return -ENXIO;
1352
if (unlikely(cxgb4_is_crypto_q_full(u_ctx->lldi.ports[0],
1353
reqctx->txqidx) &&
1354
(!(req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)))) {
1355
err = -ENOSPC;
1356
goto error;
1357
}
1358
1359
err = process_cipher(req, u_ctx->lldi.rxq_ids[reqctx->rxqidx],
1360
&skb, CHCR_ENCRYPT_OP);
1361
if (err || !skb)
1362
return err;
1363
skb->dev = u_ctx->lldi.ports[0];
1364
set_wr_txq(skb, CPL_PRIORITY_DATA, reqctx->txqidx);
1365
chcr_send_wr(skb);
1366
if (get_cryptoalg_subtype(tfm) ==
1367
CRYPTO_ALG_SUB_TYPE_CBC && req->base.flags ==
1368
CRYPTO_TFM_REQ_MAY_SLEEP ) {
1369
reqctx->partial_req = 1;
1370
wait_for_completion(&ctx->cbc_aes_aio_done);
1371
}
1372
return -EINPROGRESS;
1373
error:
1374
chcr_dec_wrcount(dev);
1375
return err;
1376
}
1377
1378
static int chcr_aes_decrypt(struct skcipher_request *req)
1379
{
1380
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1381
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
1382
struct uld_ctx *u_ctx = ULD_CTX(c_ctx(tfm));
1383
struct chcr_dev *dev = c_ctx(tfm)->dev;
1384
struct sk_buff *skb = NULL;
1385
int err;
1386
struct chcr_context *ctx = c_ctx(tfm);
1387
unsigned int cpu;
1388
1389
cpu = get_cpu();
1390
reqctx->txqidx = cpu % ctx->ntxq;
1391
reqctx->rxqidx = cpu % ctx->nrxq;
1392
put_cpu();
1393
1394
err = chcr_inc_wrcount(dev);
1395
if (err)
1396
return -ENXIO;
1397
1398
if (unlikely(cxgb4_is_crypto_q_full(u_ctx->lldi.ports[0],
1399
reqctx->txqidx) &&
1400
(!(req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))))
1401
return -ENOSPC;
1402
err = process_cipher(req, u_ctx->lldi.rxq_ids[reqctx->rxqidx],
1403
&skb, CHCR_DECRYPT_OP);
1404
if (err || !skb)
1405
return err;
1406
skb->dev = u_ctx->lldi.ports[0];
1407
set_wr_txq(skb, CPL_PRIORITY_DATA, reqctx->txqidx);
1408
chcr_send_wr(skb);
1409
return -EINPROGRESS;
1410
}
1411
static int chcr_device_init(struct chcr_context *ctx)
1412
{
1413
struct uld_ctx *u_ctx = NULL;
1414
int txq_perchan, ntxq;
1415
int err = 0, rxq_perchan;
1416
1417
if (!ctx->dev) {
1418
u_ctx = assign_chcr_device();
1419
if (!u_ctx) {
1420
err = -ENXIO;
1421
pr_err("chcr device assignment fails\n");
1422
goto out;
1423
}
1424
ctx->dev = &u_ctx->dev;
1425
ntxq = u_ctx->lldi.ntxq;
1426
rxq_perchan = u_ctx->lldi.nrxq / u_ctx->lldi.nchan;
1427
txq_perchan = ntxq / u_ctx->lldi.nchan;
1428
ctx->ntxq = ntxq;
1429
ctx->nrxq = u_ctx->lldi.nrxq;
1430
ctx->rxq_perchan = rxq_perchan;
1431
ctx->txq_perchan = txq_perchan;
1432
}
1433
out:
1434
return err;
1435
}
1436
1437
static int chcr_init_tfm(struct crypto_skcipher *tfm)
1438
{
1439
struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
1440
struct chcr_context *ctx = crypto_skcipher_ctx(tfm);
1441
struct ablk_ctx *ablkctx = ABLK_CTX(ctx);
1442
1443
ablkctx->sw_cipher = crypto_alloc_skcipher(alg->base.cra_name, 0,
1444
CRYPTO_ALG_NEED_FALLBACK);
1445
if (IS_ERR(ablkctx->sw_cipher)) {
1446
pr_err("failed to allocate fallback for %s\n", alg->base.cra_name);
1447
return PTR_ERR(ablkctx->sw_cipher);
1448
}
1449
init_completion(&ctx->cbc_aes_aio_done);
1450
crypto_skcipher_set_reqsize(tfm, sizeof(struct chcr_skcipher_req_ctx) +
1451
crypto_skcipher_reqsize(ablkctx->sw_cipher));
1452
1453
return chcr_device_init(ctx);
1454
}
1455
1456
static int chcr_rfc3686_init(struct crypto_skcipher *tfm)
1457
{
1458
struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
1459
struct chcr_context *ctx = crypto_skcipher_ctx(tfm);
1460
struct ablk_ctx *ablkctx = ABLK_CTX(ctx);
1461
1462
/*RFC3686 initialises IV counter value to 1, rfc3686(ctr(aes))
1463
* cannot be used as fallback in chcr_handle_cipher_response
1464
*/
1465
ablkctx->sw_cipher = crypto_alloc_skcipher("ctr(aes)", 0,
1466
CRYPTO_ALG_NEED_FALLBACK);
1467
if (IS_ERR(ablkctx->sw_cipher)) {
1468
pr_err("failed to allocate fallback for %s\n", alg->base.cra_name);
1469
return PTR_ERR(ablkctx->sw_cipher);
1470
}
1471
crypto_skcipher_set_reqsize(tfm, sizeof(struct chcr_skcipher_req_ctx) +
1472
crypto_skcipher_reqsize(ablkctx->sw_cipher));
1473
return chcr_device_init(ctx);
1474
}
1475
1476
1477
static void chcr_exit_tfm(struct crypto_skcipher *tfm)
1478
{
1479
struct chcr_context *ctx = crypto_skcipher_ctx(tfm);
1480
struct ablk_ctx *ablkctx = ABLK_CTX(ctx);
1481
1482
crypto_free_skcipher(ablkctx->sw_cipher);
1483
}
1484
1485
static int get_alg_config(struct algo_param *params,
1486
unsigned int auth_size)
1487
{
1488
switch (auth_size) {
1489
case SHA1_DIGEST_SIZE:
1490
params->mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_160;
1491
params->auth_mode = CHCR_SCMD_AUTH_MODE_SHA1;
1492
params->result_size = SHA1_DIGEST_SIZE;
1493
break;
1494
case SHA224_DIGEST_SIZE:
1495
params->mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256;
1496
params->auth_mode = CHCR_SCMD_AUTH_MODE_SHA224;
1497
params->result_size = SHA256_DIGEST_SIZE;
1498
break;
1499
case SHA256_DIGEST_SIZE:
1500
params->mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256;
1501
params->auth_mode = CHCR_SCMD_AUTH_MODE_SHA256;
1502
params->result_size = SHA256_DIGEST_SIZE;
1503
break;
1504
case SHA384_DIGEST_SIZE:
1505
params->mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_512;
1506
params->auth_mode = CHCR_SCMD_AUTH_MODE_SHA512_384;
1507
params->result_size = SHA512_DIGEST_SIZE;
1508
break;
1509
case SHA512_DIGEST_SIZE:
1510
params->mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_512;
1511
params->auth_mode = CHCR_SCMD_AUTH_MODE_SHA512_512;
1512
params->result_size = SHA512_DIGEST_SIZE;
1513
break;
1514
default:
1515
pr_err("ERROR, unsupported digest size\n");
1516
return -EINVAL;
1517
}
1518
return 0;
1519
}
1520
1521
/**
1522
* create_hash_wr - Create hash work request
1523
* @req: Cipher req base
1524
* @param: Container for create_hash_wr()'s parameters
1525
*/
1526
static struct sk_buff *create_hash_wr(struct ahash_request *req,
1527
struct hash_wr_param *param)
1528
{
1529
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
1530
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1531
struct chcr_context *ctx = h_ctx(tfm);
1532
struct hmac_ctx *hmacctx = HMAC_CTX(ctx);
1533
struct sk_buff *skb = NULL;
1534
struct uld_ctx *u_ctx = ULD_CTX(ctx);
1535
struct chcr_wr *chcr_req;
1536
struct ulptx_sgl *ulptx;
1537
unsigned int nents = 0, transhdr_len;
1538
unsigned int temp = 0;
1539
gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
1540
GFP_ATOMIC;
1541
struct adapter *adap = padap(h_ctx(tfm)->dev);
1542
int error = 0;
1543
unsigned int rx_channel_id = req_ctx->rxqidx / ctx->rxq_perchan;
1544
1545
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
1546
transhdr_len = HASH_TRANSHDR_SIZE(param->kctx_len);
1547
req_ctx->hctx_wr.imm = (transhdr_len + param->bfr_len +
1548
param->sg_len) <= SGE_MAX_WR_LEN;
1549
nents = sg_nents_xlen(req_ctx->hctx_wr.srcsg, param->sg_len,
1550
CHCR_SRC_SG_SIZE, req_ctx->hctx_wr.src_ofst);
1551
nents += param->bfr_len ? 1 : 0;
1552
transhdr_len += req_ctx->hctx_wr.imm ? roundup(param->bfr_len +
1553
param->sg_len, 16) : (sgl_len(nents) * 8);
1554
transhdr_len = roundup(transhdr_len, 16);
1555
1556
skb = alloc_skb(transhdr_len, flags);
1557
if (!skb)
1558
return ERR_PTR(-ENOMEM);
1559
chcr_req = __skb_put_zero(skb, transhdr_len);
1560
1561
chcr_req->sec_cpl.op_ivinsrtofst =
1562
FILL_SEC_CPL_OP_IVINSR(rx_channel_id, 2, 0);
1563
1564
chcr_req->sec_cpl.pldlen = htonl(param->bfr_len + param->sg_len);
1565
1566
chcr_req->sec_cpl.aadstart_cipherstop_hi =
1567
FILL_SEC_CPL_CIPHERSTOP_HI(0, 0, 0, 0);
1568
chcr_req->sec_cpl.cipherstop_lo_authinsert =
1569
FILL_SEC_CPL_AUTHINSERT(0, 1, 0, 0);
1570
chcr_req->sec_cpl.seqno_numivs =
1571
FILL_SEC_CPL_SCMD0_SEQNO(0, 0, 0, param->alg_prm.auth_mode,
1572
param->opad_needed, 0);
1573
1574
chcr_req->sec_cpl.ivgen_hdrlen =
1575
FILL_SEC_CPL_IVGEN_HDRLEN(param->last, param->more, 0, 1, 0, 0);
1576
1577
memcpy(chcr_req->key_ctx.key, req_ctx->partial_hash,
1578
param->alg_prm.result_size);
1579
1580
if (param->opad_needed)
1581
memcpy(chcr_req->key_ctx.key +
1582
((param->alg_prm.result_size <= 32) ? 32 :
1583
CHCR_HASH_MAX_DIGEST_SIZE),
1584
hmacctx->opad, param->alg_prm.result_size);
1585
1586
chcr_req->key_ctx.ctx_hdr = FILL_KEY_CTX_HDR(CHCR_KEYCTX_NO_KEY,
1587
param->alg_prm.mk_size, 0,
1588
param->opad_needed,
1589
((param->kctx_len +
1590
sizeof(chcr_req->key_ctx)) >> 4));
1591
chcr_req->sec_cpl.scmd1 = cpu_to_be64((u64)param->scmd1);
1592
ulptx = (struct ulptx_sgl *)((u8 *)(chcr_req + 1) + param->kctx_len +
1593
DUMMY_BYTES);
1594
if (param->bfr_len != 0) {
1595
req_ctx->hctx_wr.dma_addr =
1596
dma_map_single(&u_ctx->lldi.pdev->dev, req_ctx->reqbfr,
1597
param->bfr_len, DMA_TO_DEVICE);
1598
if (dma_mapping_error(&u_ctx->lldi.pdev->dev,
1599
req_ctx->hctx_wr. dma_addr)) {
1600
error = -ENOMEM;
1601
goto err;
1602
}
1603
req_ctx->hctx_wr.dma_len = param->bfr_len;
1604
} else {
1605
req_ctx->hctx_wr.dma_addr = 0;
1606
}
1607
chcr_add_hash_src_ent(req, ulptx, param);
1608
/* Request upto max wr size */
1609
temp = param->kctx_len + DUMMY_BYTES + (req_ctx->hctx_wr.imm ?
1610
(param->sg_len + param->bfr_len) : 0);
1611
atomic_inc(&adap->chcr_stats.digest_rqst);
1612
create_wreq(h_ctx(tfm), chcr_req, &req->base, req_ctx->hctx_wr.imm,
1613
param->hash_size, transhdr_len,
1614
temp, 0);
1615
req_ctx->hctx_wr.skb = skb;
1616
return skb;
1617
err:
1618
kfree_skb(skb);
1619
return ERR_PTR(error);
1620
}
1621
1622
static int chcr_ahash_update(struct ahash_request *req)
1623
{
1624
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
1625
struct crypto_ahash *rtfm = crypto_ahash_reqtfm(req);
1626
struct uld_ctx *u_ctx = ULD_CTX(h_ctx(rtfm));
1627
struct chcr_context *ctx = h_ctx(rtfm);
1628
struct chcr_dev *dev = h_ctx(rtfm)->dev;
1629
struct sk_buff *skb;
1630
u8 remainder = 0, bs;
1631
unsigned int nbytes = req->nbytes;
1632
struct hash_wr_param params;
1633
int error;
1634
unsigned int cpu;
1635
1636
cpu = get_cpu();
1637
req_ctx->txqidx = cpu % ctx->ntxq;
1638
req_ctx->rxqidx = cpu % ctx->nrxq;
1639
put_cpu();
1640
1641
bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(rtfm));
1642
1643
if (nbytes + req_ctx->reqlen >= bs) {
1644
remainder = (nbytes + req_ctx->reqlen) % bs;
1645
nbytes = nbytes + req_ctx->reqlen - remainder;
1646
} else {
1647
sg_pcopy_to_buffer(req->src, sg_nents(req->src), req_ctx->reqbfr
1648
+ req_ctx->reqlen, nbytes, 0);
1649
req_ctx->reqlen += nbytes;
1650
return 0;
1651
}
1652
error = chcr_inc_wrcount(dev);
1653
if (error)
1654
return -ENXIO;
1655
/* Detach state for CHCR means lldi or padap is freed. Increasing
1656
* inflight count for dev guarantees that lldi and padap is valid
1657
*/
1658
if (unlikely(cxgb4_is_crypto_q_full(u_ctx->lldi.ports[0],
1659
req_ctx->txqidx) &&
1660
(!(req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)))) {
1661
error = -ENOSPC;
1662
goto err;
1663
}
1664
1665
chcr_init_hctx_per_wr(req_ctx);
1666
error = chcr_hash_dma_map(&u_ctx->lldi.pdev->dev, req);
1667
if (error) {
1668
error = -ENOMEM;
1669
goto err;
1670
}
1671
get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
1672
params.kctx_len = roundup(params.alg_prm.result_size, 16);
1673
params.sg_len = chcr_hash_ent_in_wr(req->src, !!req_ctx->reqlen,
1674
HASH_SPACE_LEFT(params.kctx_len), 0);
1675
if (params.sg_len > req->nbytes)
1676
params.sg_len = req->nbytes;
1677
params.sg_len = rounddown(params.sg_len + req_ctx->reqlen, bs) -
1678
req_ctx->reqlen;
1679
params.opad_needed = 0;
1680
params.more = 1;
1681
params.last = 0;
1682
params.bfr_len = req_ctx->reqlen;
1683
params.scmd1 = 0;
1684
req_ctx->hctx_wr.srcsg = req->src;
1685
1686
params.hash_size = params.alg_prm.result_size;
1687
req_ctx->data_len += params.sg_len + params.bfr_len;
1688
skb = create_hash_wr(req, &params);
1689
if (IS_ERR(skb)) {
1690
error = PTR_ERR(skb);
1691
goto unmap;
1692
}
1693
1694
req_ctx->hctx_wr.processed += params.sg_len;
1695
if (remainder) {
1696
/* Swap buffers */
1697
swap(req_ctx->reqbfr, req_ctx->skbfr);
1698
sg_pcopy_to_buffer(req->src, sg_nents(req->src),
1699
req_ctx->reqbfr, remainder, req->nbytes -
1700
remainder);
1701
}
1702
req_ctx->reqlen = remainder;
1703
skb->dev = u_ctx->lldi.ports[0];
1704
set_wr_txq(skb, CPL_PRIORITY_DATA, req_ctx->txqidx);
1705
chcr_send_wr(skb);
1706
return -EINPROGRESS;
1707
unmap:
1708
chcr_hash_dma_unmap(&u_ctx->lldi.pdev->dev, req);
1709
err:
1710
chcr_dec_wrcount(dev);
1711
return error;
1712
}
1713
1714
static void create_last_hash_block(char *bfr_ptr, unsigned int bs, u64 scmd1)
1715
{
1716
memset(bfr_ptr, 0, bs);
1717
*bfr_ptr = 0x80;
1718
if (bs == 64)
1719
*(__be64 *)(bfr_ptr + 56) = cpu_to_be64(scmd1 << 3);
1720
else
1721
*(__be64 *)(bfr_ptr + 120) = cpu_to_be64(scmd1 << 3);
1722
}
1723
1724
static int chcr_ahash_final(struct ahash_request *req)
1725
{
1726
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
1727
struct crypto_ahash *rtfm = crypto_ahash_reqtfm(req);
1728
struct chcr_dev *dev = h_ctx(rtfm)->dev;
1729
struct hash_wr_param params;
1730
struct sk_buff *skb;
1731
struct uld_ctx *u_ctx = ULD_CTX(h_ctx(rtfm));
1732
struct chcr_context *ctx = h_ctx(rtfm);
1733
u8 bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(rtfm));
1734
int error;
1735
unsigned int cpu;
1736
1737
cpu = get_cpu();
1738
req_ctx->txqidx = cpu % ctx->ntxq;
1739
req_ctx->rxqidx = cpu % ctx->nrxq;
1740
put_cpu();
1741
1742
error = chcr_inc_wrcount(dev);
1743
if (error)
1744
return -ENXIO;
1745
1746
chcr_init_hctx_per_wr(req_ctx);
1747
if (is_hmac(crypto_ahash_tfm(rtfm)))
1748
params.opad_needed = 1;
1749
else
1750
params.opad_needed = 0;
1751
params.sg_len = 0;
1752
req_ctx->hctx_wr.isfinal = 1;
1753
get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
1754
params.kctx_len = roundup(params.alg_prm.result_size, 16);
1755
if (is_hmac(crypto_ahash_tfm(rtfm))) {
1756
params.opad_needed = 1;
1757
params.kctx_len *= 2;
1758
} else {
1759
params.opad_needed = 0;
1760
}
1761
1762
req_ctx->hctx_wr.result = 1;
1763
params.bfr_len = req_ctx->reqlen;
1764
req_ctx->data_len += params.bfr_len + params.sg_len;
1765
req_ctx->hctx_wr.srcsg = req->src;
1766
if (req_ctx->reqlen == 0) {
1767
create_last_hash_block(req_ctx->reqbfr, bs, req_ctx->data_len);
1768
params.last = 0;
1769
params.more = 1;
1770
params.scmd1 = 0;
1771
params.bfr_len = bs;
1772
1773
} else {
1774
params.scmd1 = req_ctx->data_len;
1775
params.last = 1;
1776
params.more = 0;
1777
}
1778
params.hash_size = crypto_ahash_digestsize(rtfm);
1779
skb = create_hash_wr(req, &params);
1780
if (IS_ERR(skb)) {
1781
error = PTR_ERR(skb);
1782
goto err;
1783
}
1784
req_ctx->reqlen = 0;
1785
skb->dev = u_ctx->lldi.ports[0];
1786
set_wr_txq(skb, CPL_PRIORITY_DATA, req_ctx->txqidx);
1787
chcr_send_wr(skb);
1788
return -EINPROGRESS;
1789
err:
1790
chcr_dec_wrcount(dev);
1791
return error;
1792
}
1793
1794
static int chcr_ahash_finup(struct ahash_request *req)
1795
{
1796
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
1797
struct crypto_ahash *rtfm = crypto_ahash_reqtfm(req);
1798
struct chcr_dev *dev = h_ctx(rtfm)->dev;
1799
struct uld_ctx *u_ctx = ULD_CTX(h_ctx(rtfm));
1800
struct chcr_context *ctx = h_ctx(rtfm);
1801
struct sk_buff *skb;
1802
struct hash_wr_param params;
1803
u8 bs;
1804
int error;
1805
unsigned int cpu;
1806
1807
cpu = get_cpu();
1808
req_ctx->txqidx = cpu % ctx->ntxq;
1809
req_ctx->rxqidx = cpu % ctx->nrxq;
1810
put_cpu();
1811
1812
bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(rtfm));
1813
error = chcr_inc_wrcount(dev);
1814
if (error)
1815
return -ENXIO;
1816
1817
if (unlikely(cxgb4_is_crypto_q_full(u_ctx->lldi.ports[0],
1818
req_ctx->txqidx) &&
1819
(!(req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)))) {
1820
error = -ENOSPC;
1821
goto err;
1822
}
1823
chcr_init_hctx_per_wr(req_ctx);
1824
error = chcr_hash_dma_map(&u_ctx->lldi.pdev->dev, req);
1825
if (error) {
1826
error = -ENOMEM;
1827
goto err;
1828
}
1829
1830
get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
1831
params.kctx_len = roundup(params.alg_prm.result_size, 16);
1832
if (is_hmac(crypto_ahash_tfm(rtfm))) {
1833
params.kctx_len *= 2;
1834
params.opad_needed = 1;
1835
} else {
1836
params.opad_needed = 0;
1837
}
1838
1839
params.sg_len = chcr_hash_ent_in_wr(req->src, !!req_ctx->reqlen,
1840
HASH_SPACE_LEFT(params.kctx_len), 0);
1841
if (params.sg_len < req->nbytes) {
1842
if (is_hmac(crypto_ahash_tfm(rtfm))) {
1843
params.kctx_len /= 2;
1844
params.opad_needed = 0;
1845
}
1846
params.last = 0;
1847
params.more = 1;
1848
params.sg_len = rounddown(params.sg_len + req_ctx->reqlen, bs)
1849
- req_ctx->reqlen;
1850
params.hash_size = params.alg_prm.result_size;
1851
params.scmd1 = 0;
1852
} else {
1853
params.last = 1;
1854
params.more = 0;
1855
params.sg_len = req->nbytes;
1856
params.hash_size = crypto_ahash_digestsize(rtfm);
1857
params.scmd1 = req_ctx->data_len + req_ctx->reqlen +
1858
params.sg_len;
1859
}
1860
params.bfr_len = req_ctx->reqlen;
1861
req_ctx->data_len += params.bfr_len + params.sg_len;
1862
req_ctx->hctx_wr.result = 1;
1863
req_ctx->hctx_wr.srcsg = req->src;
1864
if ((req_ctx->reqlen + req->nbytes) == 0) {
1865
create_last_hash_block(req_ctx->reqbfr, bs, req_ctx->data_len);
1866
params.last = 0;
1867
params.more = 1;
1868
params.scmd1 = 0;
1869
params.bfr_len = bs;
1870
}
1871
skb = create_hash_wr(req, &params);
1872
if (IS_ERR(skb)) {
1873
error = PTR_ERR(skb);
1874
goto unmap;
1875
}
1876
req_ctx->reqlen = 0;
1877
req_ctx->hctx_wr.processed += params.sg_len;
1878
skb->dev = u_ctx->lldi.ports[0];
1879
set_wr_txq(skb, CPL_PRIORITY_DATA, req_ctx->txqidx);
1880
chcr_send_wr(skb);
1881
return -EINPROGRESS;
1882
unmap:
1883
chcr_hash_dma_unmap(&u_ctx->lldi.pdev->dev, req);
1884
err:
1885
chcr_dec_wrcount(dev);
1886
return error;
1887
}
1888
1889
static int chcr_hmac_init(struct ahash_request *areq);
1890
static int chcr_sha_init(struct ahash_request *areq);
1891
1892
static int chcr_ahash_digest(struct ahash_request *req)
1893
{
1894
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
1895
struct crypto_ahash *rtfm = crypto_ahash_reqtfm(req);
1896
struct chcr_dev *dev = h_ctx(rtfm)->dev;
1897
struct uld_ctx *u_ctx = ULD_CTX(h_ctx(rtfm));
1898
struct chcr_context *ctx = h_ctx(rtfm);
1899
struct sk_buff *skb;
1900
struct hash_wr_param params;
1901
u8 bs;
1902
int error;
1903
unsigned int cpu;
1904
1905
cpu = get_cpu();
1906
req_ctx->txqidx = cpu % ctx->ntxq;
1907
req_ctx->rxqidx = cpu % ctx->nrxq;
1908
put_cpu();
1909
1910
if (is_hmac(crypto_ahash_tfm(rtfm)))
1911
chcr_hmac_init(req);
1912
else
1913
chcr_sha_init(req);
1914
1915
bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(rtfm));
1916
error = chcr_inc_wrcount(dev);
1917
if (error)
1918
return -ENXIO;
1919
1920
if (unlikely(cxgb4_is_crypto_q_full(u_ctx->lldi.ports[0],
1921
req_ctx->txqidx) &&
1922
(!(req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)))) {
1923
error = -ENOSPC;
1924
goto err;
1925
}
1926
1927
chcr_init_hctx_per_wr(req_ctx);
1928
error = chcr_hash_dma_map(&u_ctx->lldi.pdev->dev, req);
1929
if (error) {
1930
error = -ENOMEM;
1931
goto err;
1932
}
1933
1934
get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
1935
params.kctx_len = roundup(params.alg_prm.result_size, 16);
1936
if (is_hmac(crypto_ahash_tfm(rtfm))) {
1937
params.kctx_len *= 2;
1938
params.opad_needed = 1;
1939
} else {
1940
params.opad_needed = 0;
1941
}
1942
params.sg_len = chcr_hash_ent_in_wr(req->src, !!req_ctx->reqlen,
1943
HASH_SPACE_LEFT(params.kctx_len), 0);
1944
if (params.sg_len < req->nbytes) {
1945
if (is_hmac(crypto_ahash_tfm(rtfm))) {
1946
params.kctx_len /= 2;
1947
params.opad_needed = 0;
1948
}
1949
params.last = 0;
1950
params.more = 1;
1951
params.scmd1 = 0;
1952
params.sg_len = rounddown(params.sg_len, bs);
1953
params.hash_size = params.alg_prm.result_size;
1954
} else {
1955
params.sg_len = req->nbytes;
1956
params.hash_size = crypto_ahash_digestsize(rtfm);
1957
params.last = 1;
1958
params.more = 0;
1959
params.scmd1 = req->nbytes + req_ctx->data_len;
1960
1961
}
1962
params.bfr_len = 0;
1963
req_ctx->hctx_wr.result = 1;
1964
req_ctx->hctx_wr.srcsg = req->src;
1965
req_ctx->data_len += params.bfr_len + params.sg_len;
1966
1967
if (req->nbytes == 0) {
1968
create_last_hash_block(req_ctx->reqbfr, bs, req_ctx->data_len);
1969
params.more = 1;
1970
params.bfr_len = bs;
1971
}
1972
1973
skb = create_hash_wr(req, &params);
1974
if (IS_ERR(skb)) {
1975
error = PTR_ERR(skb);
1976
goto unmap;
1977
}
1978
req_ctx->hctx_wr.processed += params.sg_len;
1979
skb->dev = u_ctx->lldi.ports[0];
1980
set_wr_txq(skb, CPL_PRIORITY_DATA, req_ctx->txqidx);
1981
chcr_send_wr(skb);
1982
return -EINPROGRESS;
1983
unmap:
1984
chcr_hash_dma_unmap(&u_ctx->lldi.pdev->dev, req);
1985
err:
1986
chcr_dec_wrcount(dev);
1987
return error;
1988
}
1989
1990
static int chcr_ahash_continue(struct ahash_request *req)
1991
{
1992
struct chcr_ahash_req_ctx *reqctx = ahash_request_ctx(req);
1993
struct chcr_hctx_per_wr *hctx_wr = &reqctx->hctx_wr;
1994
struct crypto_ahash *rtfm = crypto_ahash_reqtfm(req);
1995
struct chcr_context *ctx = h_ctx(rtfm);
1996
struct uld_ctx *u_ctx = ULD_CTX(ctx);
1997
struct sk_buff *skb;
1998
struct hash_wr_param params;
1999
u8 bs;
2000
int error;
2001
unsigned int cpu;
2002
2003
cpu = get_cpu();
2004
reqctx->txqidx = cpu % ctx->ntxq;
2005
reqctx->rxqidx = cpu % ctx->nrxq;
2006
put_cpu();
2007
2008
bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(rtfm));
2009
get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
2010
params.kctx_len = roundup(params.alg_prm.result_size, 16);
2011
if (is_hmac(crypto_ahash_tfm(rtfm))) {
2012
params.kctx_len *= 2;
2013
params.opad_needed = 1;
2014
} else {
2015
params.opad_needed = 0;
2016
}
2017
params.sg_len = chcr_hash_ent_in_wr(hctx_wr->srcsg, 0,
2018
HASH_SPACE_LEFT(params.kctx_len),
2019
hctx_wr->src_ofst);
2020
if ((params.sg_len + hctx_wr->processed) > req->nbytes)
2021
params.sg_len = req->nbytes - hctx_wr->processed;
2022
if (!hctx_wr->result ||
2023
((params.sg_len + hctx_wr->processed) < req->nbytes)) {
2024
if (is_hmac(crypto_ahash_tfm(rtfm))) {
2025
params.kctx_len /= 2;
2026
params.opad_needed = 0;
2027
}
2028
params.last = 0;
2029
params.more = 1;
2030
params.sg_len = rounddown(params.sg_len, bs);
2031
params.hash_size = params.alg_prm.result_size;
2032
params.scmd1 = 0;
2033
} else {
2034
params.last = 1;
2035
params.more = 0;
2036
params.hash_size = crypto_ahash_digestsize(rtfm);
2037
params.scmd1 = reqctx->data_len + params.sg_len;
2038
}
2039
params.bfr_len = 0;
2040
reqctx->data_len += params.sg_len;
2041
skb = create_hash_wr(req, &params);
2042
if (IS_ERR(skb)) {
2043
error = PTR_ERR(skb);
2044
goto err;
2045
}
2046
hctx_wr->processed += params.sg_len;
2047
skb->dev = u_ctx->lldi.ports[0];
2048
set_wr_txq(skb, CPL_PRIORITY_DATA, reqctx->txqidx);
2049
chcr_send_wr(skb);
2050
return 0;
2051
err:
2052
return error;
2053
}
2054
2055
static inline void chcr_handle_ahash_resp(struct ahash_request *req,
2056
unsigned char *input,
2057
int err)
2058
{
2059
struct chcr_ahash_req_ctx *reqctx = ahash_request_ctx(req);
2060
struct chcr_hctx_per_wr *hctx_wr = &reqctx->hctx_wr;
2061
int digestsize, updated_digestsize;
2062
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
2063
struct uld_ctx *u_ctx = ULD_CTX(h_ctx(tfm));
2064
struct chcr_dev *dev = h_ctx(tfm)->dev;
2065
2066
if (input == NULL)
2067
goto out;
2068
digestsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req));
2069
updated_digestsize = digestsize;
2070
if (digestsize == SHA224_DIGEST_SIZE)
2071
updated_digestsize = SHA256_DIGEST_SIZE;
2072
else if (digestsize == SHA384_DIGEST_SIZE)
2073
updated_digestsize = SHA512_DIGEST_SIZE;
2074
2075
if (hctx_wr->dma_addr) {
2076
dma_unmap_single(&u_ctx->lldi.pdev->dev, hctx_wr->dma_addr,
2077
hctx_wr->dma_len, DMA_TO_DEVICE);
2078
hctx_wr->dma_addr = 0;
2079
}
2080
if (hctx_wr->isfinal || ((hctx_wr->processed + reqctx->reqlen) ==
2081
req->nbytes)) {
2082
if (hctx_wr->result == 1) {
2083
hctx_wr->result = 0;
2084
memcpy(req->result, input + sizeof(struct cpl_fw6_pld),
2085
digestsize);
2086
} else {
2087
memcpy(reqctx->partial_hash,
2088
input + sizeof(struct cpl_fw6_pld),
2089
updated_digestsize);
2090
2091
}
2092
goto unmap;
2093
}
2094
memcpy(reqctx->partial_hash, input + sizeof(struct cpl_fw6_pld),
2095
updated_digestsize);
2096
2097
err = chcr_ahash_continue(req);
2098
if (err)
2099
goto unmap;
2100
return;
2101
unmap:
2102
if (hctx_wr->is_sg_map)
2103
chcr_hash_dma_unmap(&u_ctx->lldi.pdev->dev, req);
2104
2105
2106
out:
2107
chcr_dec_wrcount(dev);
2108
ahash_request_complete(req, err);
2109
}
2110
2111
/*
2112
* chcr_handle_resp - Unmap the DMA buffers associated with the request
2113
* @req: crypto request
2114
*/
2115
int chcr_handle_resp(struct crypto_async_request *req, unsigned char *input,
2116
int err)
2117
{
2118
struct crypto_tfm *tfm = req->tfm;
2119
struct chcr_context *ctx = crypto_tfm_ctx(tfm);
2120
struct adapter *adap = padap(ctx->dev);
2121
2122
switch (tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
2123
case CRYPTO_ALG_TYPE_AEAD:
2124
err = chcr_handle_aead_resp(aead_request_cast(req), input, err);
2125
break;
2126
2127
case CRYPTO_ALG_TYPE_SKCIPHER:
2128
chcr_handle_cipher_resp(skcipher_request_cast(req),
2129
input, err);
2130
break;
2131
case CRYPTO_ALG_TYPE_AHASH:
2132
chcr_handle_ahash_resp(ahash_request_cast(req), input, err);
2133
}
2134
atomic_inc(&adap->chcr_stats.complete);
2135
return err;
2136
}
2137
static int chcr_ahash_export(struct ahash_request *areq, void *out)
2138
{
2139
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2140
struct chcr_ahash_req_ctx *state = out;
2141
2142
state->reqlen = req_ctx->reqlen;
2143
state->data_len = req_ctx->data_len;
2144
memcpy(state->bfr1, req_ctx->reqbfr, req_ctx->reqlen);
2145
memcpy(state->partial_hash, req_ctx->partial_hash,
2146
CHCR_HASH_MAX_DIGEST_SIZE);
2147
chcr_init_hctx_per_wr(state);
2148
return 0;
2149
}
2150
2151
static int chcr_ahash_import(struct ahash_request *areq, const void *in)
2152
{
2153
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2154
struct chcr_ahash_req_ctx *state = (struct chcr_ahash_req_ctx *)in;
2155
2156
req_ctx->reqlen = state->reqlen;
2157
req_ctx->data_len = state->data_len;
2158
req_ctx->reqbfr = req_ctx->bfr1;
2159
req_ctx->skbfr = req_ctx->bfr2;
2160
memcpy(req_ctx->bfr1, state->bfr1, CHCR_HASH_MAX_BLOCK_SIZE_128);
2161
memcpy(req_ctx->partial_hash, state->partial_hash,
2162
CHCR_HASH_MAX_DIGEST_SIZE);
2163
chcr_init_hctx_per_wr(req_ctx);
2164
return 0;
2165
}
2166
2167
static int chcr_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
2168
unsigned int keylen)
2169
{
2170
struct hmac_ctx *hmacctx = HMAC_CTX(h_ctx(tfm));
2171
2172
/* use the key to calculate the ipad and opad. ipad will sent with the
2173
* first request's data. opad will be sent with the final hash result
2174
* ipad in hmacctx->ipad and opad in hmacctx->opad location
2175
*/
2176
return chcr_prepare_hmac_key(key, keylen, crypto_ahash_digestsize(tfm),
2177
hmacctx->ipad, hmacctx->opad);
2178
}
2179
2180
static int chcr_aes_xts_setkey(struct crypto_skcipher *cipher, const u8 *key,
2181
unsigned int key_len)
2182
{
2183
struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(cipher));
2184
unsigned short context_size = 0;
2185
int err;
2186
2187
err = chcr_cipher_fallback_setkey(cipher, key, key_len);
2188
if (err)
2189
goto badkey_err;
2190
2191
memcpy(ablkctx->key, key, key_len);
2192
ablkctx->enckey_len = key_len;
2193
get_aes_decrypt_key(ablkctx->rrkey, ablkctx->key, key_len << 2);
2194
context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD + key_len) >> 4;
2195
/* Both keys for xts must be aligned to 16 byte boundary
2196
* by padding with zeros. So for 24 byte keys padding 8 zeroes.
2197
*/
2198
if (key_len == 48) {
2199
context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD + key_len
2200
+ 16) >> 4;
2201
memmove(ablkctx->key + 32, ablkctx->key + 24, 24);
2202
memset(ablkctx->key + 24, 0, 8);
2203
memset(ablkctx->key + 56, 0, 8);
2204
ablkctx->enckey_len = 64;
2205
ablkctx->key_ctx_hdr =
2206
FILL_KEY_CTX_HDR(CHCR_KEYCTX_CIPHER_KEY_SIZE_192,
2207
CHCR_KEYCTX_NO_KEY, 1,
2208
0, context_size);
2209
} else {
2210
ablkctx->key_ctx_hdr =
2211
FILL_KEY_CTX_HDR((key_len == AES_KEYSIZE_256) ?
2212
CHCR_KEYCTX_CIPHER_KEY_SIZE_128 :
2213
CHCR_KEYCTX_CIPHER_KEY_SIZE_256,
2214
CHCR_KEYCTX_NO_KEY, 1,
2215
0, context_size);
2216
}
2217
ablkctx->ciph_mode = CHCR_SCMD_CIPHER_MODE_AES_XTS;
2218
return 0;
2219
badkey_err:
2220
ablkctx->enckey_len = 0;
2221
2222
return err;
2223
}
2224
2225
static int chcr_sha_init(struct ahash_request *areq)
2226
{
2227
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2228
struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2229
int digestsize = crypto_ahash_digestsize(tfm);
2230
2231
req_ctx->data_len = 0;
2232
req_ctx->reqlen = 0;
2233
req_ctx->reqbfr = req_ctx->bfr1;
2234
req_ctx->skbfr = req_ctx->bfr2;
2235
copy_hash_init_values(req_ctx->partial_hash, digestsize);
2236
2237
return 0;
2238
}
2239
2240
static int chcr_sha_cra_init(struct crypto_tfm *tfm)
2241
{
2242
crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
2243
sizeof(struct chcr_ahash_req_ctx));
2244
return chcr_device_init(crypto_tfm_ctx(tfm));
2245
}
2246
2247
static int chcr_hmac_init(struct ahash_request *areq)
2248
{
2249
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2250
struct crypto_ahash *rtfm = crypto_ahash_reqtfm(areq);
2251
struct hmac_ctx *hmacctx = HMAC_CTX(h_ctx(rtfm));
2252
unsigned int digestsize = crypto_ahash_digestsize(rtfm);
2253
unsigned int bs = crypto_tfm_alg_blocksize(crypto_ahash_tfm(rtfm));
2254
2255
chcr_sha_init(areq);
2256
req_ctx->data_len = bs;
2257
if (is_hmac(crypto_ahash_tfm(rtfm))) {
2258
if (digestsize == SHA224_DIGEST_SIZE)
2259
memcpy(req_ctx->partial_hash, hmacctx->ipad,
2260
SHA256_DIGEST_SIZE);
2261
else if (digestsize == SHA384_DIGEST_SIZE)
2262
memcpy(req_ctx->partial_hash, hmacctx->ipad,
2263
SHA512_DIGEST_SIZE);
2264
else
2265
memcpy(req_ctx->partial_hash, hmacctx->ipad,
2266
digestsize);
2267
}
2268
return 0;
2269
}
2270
2271
static int chcr_hmac_cra_init(struct crypto_tfm *tfm)
2272
{
2273
crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
2274
sizeof(struct chcr_ahash_req_ctx));
2275
return chcr_device_init(crypto_tfm_ctx(tfm));
2276
}
2277
2278
inline void chcr_aead_common_exit(struct aead_request *req)
2279
{
2280
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2281
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2282
struct uld_ctx *u_ctx = ULD_CTX(a_ctx(tfm));
2283
2284
chcr_aead_dma_unmap(&u_ctx->lldi.pdev->dev, req, reqctx->op);
2285
}
2286
2287
static int chcr_aead_common_init(struct aead_request *req)
2288
{
2289
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2290
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
2291
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2292
unsigned int authsize = crypto_aead_authsize(tfm);
2293
int error = -EINVAL;
2294
2295
/* validate key size */
2296
if (aeadctx->enckey_len == 0)
2297
goto err;
2298
if (reqctx->op && req->cryptlen < authsize)
2299
goto err;
2300
if (reqctx->b0_len)
2301
reqctx->scratch_pad = reqctx->iv + IV;
2302
else
2303
reqctx->scratch_pad = NULL;
2304
2305
error = chcr_aead_dma_map(&ULD_CTX(a_ctx(tfm))->lldi.pdev->dev, req,
2306
reqctx->op);
2307
if (error) {
2308
error = -ENOMEM;
2309
goto err;
2310
}
2311
2312
return 0;
2313
err:
2314
return error;
2315
}
2316
2317
static int chcr_aead_need_fallback(struct aead_request *req, int dst_nents,
2318
int aadmax, int wrlen,
2319
unsigned short op_type)
2320
{
2321
unsigned int authsize = crypto_aead_authsize(crypto_aead_reqtfm(req));
2322
2323
if (((req->cryptlen - (op_type ? authsize : 0)) == 0) ||
2324
dst_nents > MAX_DSGL_ENT ||
2325
(req->assoclen > aadmax) ||
2326
(wrlen > SGE_MAX_WR_LEN))
2327
return 1;
2328
return 0;
2329
}
2330
2331
static int chcr_aead_fallback(struct aead_request *req, unsigned short op_type)
2332
{
2333
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2334
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
2335
struct aead_request *subreq = aead_request_ctx_dma(req);
2336
2337
aead_request_set_tfm(subreq, aeadctx->sw_cipher);
2338
aead_request_set_callback(subreq, req->base.flags,
2339
req->base.complete, req->base.data);
2340
aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
2341
req->iv);
2342
aead_request_set_ad(subreq, req->assoclen);
2343
return op_type ? crypto_aead_decrypt(subreq) :
2344
crypto_aead_encrypt(subreq);
2345
}
2346
2347
static struct sk_buff *create_authenc_wr(struct aead_request *req,
2348
unsigned short qid,
2349
int size)
2350
{
2351
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2352
struct chcr_context *ctx = a_ctx(tfm);
2353
struct uld_ctx *u_ctx = ULD_CTX(ctx);
2354
struct chcr_aead_ctx *aeadctx = AEAD_CTX(ctx);
2355
struct chcr_authenc_ctx *actx = AUTHENC_CTX(aeadctx);
2356
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2357
struct sk_buff *skb = NULL;
2358
struct chcr_wr *chcr_req;
2359
struct cpl_rx_phys_dsgl *phys_cpl;
2360
struct ulptx_sgl *ulptx;
2361
unsigned int transhdr_len;
2362
unsigned int dst_size = 0, temp, subtype = get_aead_subtype(tfm);
2363
unsigned int kctx_len = 0, dnents, snents;
2364
unsigned int authsize = crypto_aead_authsize(tfm);
2365
int error = -EINVAL;
2366
u8 *ivptr;
2367
int null = 0;
2368
gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
2369
GFP_ATOMIC;
2370
struct adapter *adap = padap(ctx->dev);
2371
unsigned int rx_channel_id = reqctx->rxqidx / ctx->rxq_perchan;
2372
2373
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
2374
if (req->cryptlen == 0)
2375
return NULL;
2376
2377
reqctx->b0_len = 0;
2378
error = chcr_aead_common_init(req);
2379
if (error)
2380
return ERR_PTR(error);
2381
2382
if (subtype == CRYPTO_ALG_SUB_TYPE_CBC_NULL ||
2383
subtype == CRYPTO_ALG_SUB_TYPE_CTR_NULL) {
2384
null = 1;
2385
}
2386
dnents = sg_nents_xlen(req->dst, req->assoclen + req->cryptlen +
2387
(reqctx->op ? -authsize : authsize), CHCR_DST_SG_SIZE, 0);
2388
dnents += MIN_AUTH_SG; // For IV
2389
snents = sg_nents_xlen(req->src, req->assoclen + req->cryptlen,
2390
CHCR_SRC_SG_SIZE, 0);
2391
dst_size = get_space_for_phys_dsgl(dnents);
2392
kctx_len = (KEY_CONTEXT_CTX_LEN_G(ntohl(aeadctx->key_ctx_hdr)) << 4)
2393
- sizeof(chcr_req->key_ctx);
2394
transhdr_len = CIPHER_TRANSHDR_SIZE(kctx_len, dst_size);
2395
reqctx->imm = (transhdr_len + req->assoclen + req->cryptlen) <
2396
SGE_MAX_WR_LEN;
2397
temp = reqctx->imm ? roundup(req->assoclen + req->cryptlen, 16)
2398
: (sgl_len(snents) * 8);
2399
transhdr_len += temp;
2400
transhdr_len = roundup(transhdr_len, 16);
2401
2402
if (chcr_aead_need_fallback(req, dnents, T6_MAX_AAD_SIZE,
2403
transhdr_len, reqctx->op)) {
2404
atomic_inc(&adap->chcr_stats.fallback);
2405
chcr_aead_common_exit(req);
2406
return ERR_PTR(chcr_aead_fallback(req, reqctx->op));
2407
}
2408
skb = alloc_skb(transhdr_len, flags);
2409
if (!skb) {
2410
error = -ENOMEM;
2411
goto err;
2412
}
2413
2414
chcr_req = __skb_put_zero(skb, transhdr_len);
2415
2416
temp = (reqctx->op == CHCR_ENCRYPT_OP) ? 0 : authsize;
2417
2418
/*
2419
* Input order is AAD,IV and Payload. where IV should be included as
2420
* the part of authdata. All other fields should be filled according
2421
* to the hardware spec
2422
*/
2423
chcr_req->sec_cpl.op_ivinsrtofst =
2424
FILL_SEC_CPL_OP_IVINSR(rx_channel_id, 2, 1);
2425
chcr_req->sec_cpl.pldlen = htonl(req->assoclen + IV + req->cryptlen);
2426
chcr_req->sec_cpl.aadstart_cipherstop_hi = FILL_SEC_CPL_CIPHERSTOP_HI(
2427
null ? 0 : 1 + IV,
2428
null ? 0 : IV + req->assoclen,
2429
req->assoclen + IV + 1,
2430
(temp & 0x1F0) >> 4);
2431
chcr_req->sec_cpl.cipherstop_lo_authinsert = FILL_SEC_CPL_AUTHINSERT(
2432
temp & 0xF,
2433
null ? 0 : req->assoclen + IV + 1,
2434
temp, temp);
2435
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR_NULL ||
2436
subtype == CRYPTO_ALG_SUB_TYPE_CTR_SHA)
2437
temp = CHCR_SCMD_CIPHER_MODE_AES_CTR;
2438
else
2439
temp = CHCR_SCMD_CIPHER_MODE_AES_CBC;
2440
chcr_req->sec_cpl.seqno_numivs = FILL_SEC_CPL_SCMD0_SEQNO(reqctx->op,
2441
(reqctx->op == CHCR_ENCRYPT_OP) ? 1 : 0,
2442
temp,
2443
actx->auth_mode, aeadctx->hmac_ctrl,
2444
IV >> 1);
2445
chcr_req->sec_cpl.ivgen_hdrlen = FILL_SEC_CPL_IVGEN_HDRLEN(0, 0, 1,
2446
0, 0, dst_size);
2447
2448
chcr_req->key_ctx.ctx_hdr = aeadctx->key_ctx_hdr;
2449
if (reqctx->op == CHCR_ENCRYPT_OP ||
2450
subtype == CRYPTO_ALG_SUB_TYPE_CTR_SHA ||
2451
subtype == CRYPTO_ALG_SUB_TYPE_CTR_NULL)
2452
memcpy(chcr_req->key_ctx.key, aeadctx->key,
2453
aeadctx->enckey_len);
2454
else
2455
memcpy(chcr_req->key_ctx.key, actx->dec_rrkey,
2456
aeadctx->enckey_len);
2457
2458
memcpy(chcr_req->key_ctx.key + roundup(aeadctx->enckey_len, 16),
2459
actx->h_iopad, kctx_len - roundup(aeadctx->enckey_len, 16));
2460
phys_cpl = (struct cpl_rx_phys_dsgl *)((u8 *)(chcr_req + 1) + kctx_len);
2461
ivptr = (u8 *)(phys_cpl + 1) + dst_size;
2462
ulptx = (struct ulptx_sgl *)(ivptr + IV);
2463
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR_SHA ||
2464
subtype == CRYPTO_ALG_SUB_TYPE_CTR_NULL) {
2465
memcpy(ivptr, aeadctx->nonce, CTR_RFC3686_NONCE_SIZE);
2466
memcpy(ivptr + CTR_RFC3686_NONCE_SIZE, req->iv,
2467
CTR_RFC3686_IV_SIZE);
2468
*(__be32 *)(ivptr + CTR_RFC3686_NONCE_SIZE +
2469
CTR_RFC3686_IV_SIZE) = cpu_to_be32(1);
2470
} else {
2471
memcpy(ivptr, req->iv, IV);
2472
}
2473
chcr_add_aead_dst_ent(req, phys_cpl, qid);
2474
chcr_add_aead_src_ent(req, ulptx);
2475
atomic_inc(&adap->chcr_stats.cipher_rqst);
2476
temp = sizeof(struct cpl_rx_phys_dsgl) + dst_size + IV +
2477
kctx_len + (reqctx->imm ? (req->assoclen + req->cryptlen) : 0);
2478
create_wreq(a_ctx(tfm), chcr_req, &req->base, reqctx->imm, size,
2479
transhdr_len, temp, 0);
2480
reqctx->skb = skb;
2481
2482
return skb;
2483
err:
2484
chcr_aead_common_exit(req);
2485
2486
return ERR_PTR(error);
2487
}
2488
2489
int chcr_aead_dma_map(struct device *dev,
2490
struct aead_request *req,
2491
unsigned short op_type)
2492
{
2493
int error;
2494
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2495
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2496
unsigned int authsize = crypto_aead_authsize(tfm);
2497
int src_len, dst_len;
2498
2499
/* calculate and handle src and dst sg length separately
2500
* for inplace and out-of place operations
2501
*/
2502
if (req->src == req->dst) {
2503
src_len = req->assoclen + req->cryptlen + (op_type ?
2504
0 : authsize);
2505
dst_len = src_len;
2506
} else {
2507
src_len = req->assoclen + req->cryptlen;
2508
dst_len = req->assoclen + req->cryptlen + (op_type ?
2509
-authsize : authsize);
2510
}
2511
2512
if (!req->cryptlen || !src_len || !dst_len)
2513
return 0;
2514
reqctx->iv_dma = dma_map_single(dev, reqctx->iv, (IV + reqctx->b0_len),
2515
DMA_BIDIRECTIONAL);
2516
if (dma_mapping_error(dev, reqctx->iv_dma))
2517
return -ENOMEM;
2518
if (reqctx->b0_len)
2519
reqctx->b0_dma = reqctx->iv_dma + IV;
2520
else
2521
reqctx->b0_dma = 0;
2522
if (req->src == req->dst) {
2523
error = dma_map_sg(dev, req->src,
2524
sg_nents_for_len(req->src, src_len),
2525
DMA_BIDIRECTIONAL);
2526
if (!error)
2527
goto err;
2528
} else {
2529
error = dma_map_sg(dev, req->src,
2530
sg_nents_for_len(req->src, src_len),
2531
DMA_TO_DEVICE);
2532
if (!error)
2533
goto err;
2534
error = dma_map_sg(dev, req->dst,
2535
sg_nents_for_len(req->dst, dst_len),
2536
DMA_FROM_DEVICE);
2537
if (!error) {
2538
dma_unmap_sg(dev, req->src,
2539
sg_nents_for_len(req->src, src_len),
2540
DMA_TO_DEVICE);
2541
goto err;
2542
}
2543
}
2544
2545
return 0;
2546
err:
2547
dma_unmap_single(dev, reqctx->iv_dma, IV, DMA_BIDIRECTIONAL);
2548
return -ENOMEM;
2549
}
2550
2551
void chcr_aead_dma_unmap(struct device *dev,
2552
struct aead_request *req,
2553
unsigned short op_type)
2554
{
2555
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2556
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2557
unsigned int authsize = crypto_aead_authsize(tfm);
2558
int src_len, dst_len;
2559
2560
/* calculate and handle src and dst sg length separately
2561
* for inplace and out-of place operations
2562
*/
2563
if (req->src == req->dst) {
2564
src_len = req->assoclen + req->cryptlen + (op_type ?
2565
0 : authsize);
2566
dst_len = src_len;
2567
} else {
2568
src_len = req->assoclen + req->cryptlen;
2569
dst_len = req->assoclen + req->cryptlen + (op_type ?
2570
-authsize : authsize);
2571
}
2572
2573
if (!req->cryptlen || !src_len || !dst_len)
2574
return;
2575
2576
dma_unmap_single(dev, reqctx->iv_dma, (IV + reqctx->b0_len),
2577
DMA_BIDIRECTIONAL);
2578
if (req->src == req->dst) {
2579
dma_unmap_sg(dev, req->src,
2580
sg_nents_for_len(req->src, src_len),
2581
DMA_BIDIRECTIONAL);
2582
} else {
2583
dma_unmap_sg(dev, req->src,
2584
sg_nents_for_len(req->src, src_len),
2585
DMA_TO_DEVICE);
2586
dma_unmap_sg(dev, req->dst,
2587
sg_nents_for_len(req->dst, dst_len),
2588
DMA_FROM_DEVICE);
2589
}
2590
}
2591
2592
void chcr_add_aead_src_ent(struct aead_request *req,
2593
struct ulptx_sgl *ulptx)
2594
{
2595
struct ulptx_walk ulp_walk;
2596
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2597
2598
if (reqctx->imm) {
2599
u8 *buf = (u8 *)ulptx;
2600
2601
if (reqctx->b0_len) {
2602
memcpy(buf, reqctx->scratch_pad, reqctx->b0_len);
2603
buf += reqctx->b0_len;
2604
}
2605
sg_pcopy_to_buffer(req->src, sg_nents(req->src),
2606
buf, req->cryptlen + req->assoclen, 0);
2607
} else {
2608
ulptx_walk_init(&ulp_walk, ulptx);
2609
if (reqctx->b0_len)
2610
ulptx_walk_add_page(&ulp_walk, reqctx->b0_len,
2611
reqctx->b0_dma);
2612
ulptx_walk_add_sg(&ulp_walk, req->src, req->cryptlen +
2613
req->assoclen, 0);
2614
ulptx_walk_end(&ulp_walk);
2615
}
2616
}
2617
2618
void chcr_add_aead_dst_ent(struct aead_request *req,
2619
struct cpl_rx_phys_dsgl *phys_cpl,
2620
unsigned short qid)
2621
{
2622
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2623
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2624
struct dsgl_walk dsgl_walk;
2625
unsigned int authsize = crypto_aead_authsize(tfm);
2626
struct chcr_context *ctx = a_ctx(tfm);
2627
struct uld_ctx *u_ctx = ULD_CTX(ctx);
2628
u32 temp;
2629
unsigned int rx_channel_id = reqctx->rxqidx / ctx->rxq_perchan;
2630
2631
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
2632
dsgl_walk_init(&dsgl_walk, phys_cpl);
2633
dsgl_walk_add_page(&dsgl_walk, IV + reqctx->b0_len, reqctx->iv_dma);
2634
temp = req->assoclen + req->cryptlen +
2635
(reqctx->op ? -authsize : authsize);
2636
dsgl_walk_add_sg(&dsgl_walk, req->dst, temp, 0);
2637
dsgl_walk_end(&dsgl_walk, qid, rx_channel_id);
2638
}
2639
2640
void chcr_add_cipher_src_ent(struct skcipher_request *req,
2641
void *ulptx,
2642
struct cipher_wr_param *wrparam)
2643
{
2644
struct ulptx_walk ulp_walk;
2645
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
2646
u8 *buf = ulptx;
2647
2648
memcpy(buf, reqctx->iv, IV);
2649
buf += IV;
2650
if (reqctx->imm) {
2651
sg_pcopy_to_buffer(req->src, sg_nents(req->src),
2652
buf, wrparam->bytes, reqctx->processed);
2653
} else {
2654
ulptx_walk_init(&ulp_walk, (struct ulptx_sgl *)buf);
2655
ulptx_walk_add_sg(&ulp_walk, reqctx->srcsg, wrparam->bytes,
2656
reqctx->src_ofst);
2657
reqctx->srcsg = ulp_walk.last_sg;
2658
reqctx->src_ofst = ulp_walk.last_sg_len;
2659
ulptx_walk_end(&ulp_walk);
2660
}
2661
}
2662
2663
void chcr_add_cipher_dst_ent(struct skcipher_request *req,
2664
struct cpl_rx_phys_dsgl *phys_cpl,
2665
struct cipher_wr_param *wrparam,
2666
unsigned short qid)
2667
{
2668
struct chcr_skcipher_req_ctx *reqctx = skcipher_request_ctx(req);
2669
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(wrparam->req);
2670
struct chcr_context *ctx = c_ctx(tfm);
2671
struct uld_ctx *u_ctx = ULD_CTX(ctx);
2672
struct dsgl_walk dsgl_walk;
2673
unsigned int rx_channel_id = reqctx->rxqidx / ctx->rxq_perchan;
2674
2675
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
2676
dsgl_walk_init(&dsgl_walk, phys_cpl);
2677
dsgl_walk_add_sg(&dsgl_walk, reqctx->dstsg, wrparam->bytes,
2678
reqctx->dst_ofst);
2679
reqctx->dstsg = dsgl_walk.last_sg;
2680
reqctx->dst_ofst = dsgl_walk.last_sg_len;
2681
dsgl_walk_end(&dsgl_walk, qid, rx_channel_id);
2682
}
2683
2684
void chcr_add_hash_src_ent(struct ahash_request *req,
2685
struct ulptx_sgl *ulptx,
2686
struct hash_wr_param *param)
2687
{
2688
struct ulptx_walk ulp_walk;
2689
struct chcr_ahash_req_ctx *reqctx = ahash_request_ctx(req);
2690
2691
if (reqctx->hctx_wr.imm) {
2692
u8 *buf = (u8 *)ulptx;
2693
2694
if (param->bfr_len) {
2695
memcpy(buf, reqctx->reqbfr, param->bfr_len);
2696
buf += param->bfr_len;
2697
}
2698
2699
sg_pcopy_to_buffer(reqctx->hctx_wr.srcsg,
2700
sg_nents(reqctx->hctx_wr.srcsg), buf,
2701
param->sg_len, 0);
2702
} else {
2703
ulptx_walk_init(&ulp_walk, ulptx);
2704
if (param->bfr_len)
2705
ulptx_walk_add_page(&ulp_walk, param->bfr_len,
2706
reqctx->hctx_wr.dma_addr);
2707
ulptx_walk_add_sg(&ulp_walk, reqctx->hctx_wr.srcsg,
2708
param->sg_len, reqctx->hctx_wr.src_ofst);
2709
reqctx->hctx_wr.srcsg = ulp_walk.last_sg;
2710
reqctx->hctx_wr.src_ofst = ulp_walk.last_sg_len;
2711
ulptx_walk_end(&ulp_walk);
2712
}
2713
}
2714
2715
int chcr_hash_dma_map(struct device *dev,
2716
struct ahash_request *req)
2717
{
2718
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
2719
int error = 0;
2720
2721
if (!req->nbytes)
2722
return 0;
2723
error = dma_map_sg(dev, req->src, sg_nents(req->src),
2724
DMA_TO_DEVICE);
2725
if (!error)
2726
return -ENOMEM;
2727
req_ctx->hctx_wr.is_sg_map = 1;
2728
return 0;
2729
}
2730
2731
void chcr_hash_dma_unmap(struct device *dev,
2732
struct ahash_request *req)
2733
{
2734
struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(req);
2735
2736
if (!req->nbytes)
2737
return;
2738
2739
dma_unmap_sg(dev, req->src, sg_nents(req->src),
2740
DMA_TO_DEVICE);
2741
req_ctx->hctx_wr.is_sg_map = 0;
2742
2743
}
2744
2745
int chcr_cipher_dma_map(struct device *dev,
2746
struct skcipher_request *req)
2747
{
2748
int error;
2749
2750
if (req->src == req->dst) {
2751
error = dma_map_sg(dev, req->src, sg_nents(req->src),
2752
DMA_BIDIRECTIONAL);
2753
if (!error)
2754
goto err;
2755
} else {
2756
error = dma_map_sg(dev, req->src, sg_nents(req->src),
2757
DMA_TO_DEVICE);
2758
if (!error)
2759
goto err;
2760
error = dma_map_sg(dev, req->dst, sg_nents(req->dst),
2761
DMA_FROM_DEVICE);
2762
if (!error) {
2763
dma_unmap_sg(dev, req->src, sg_nents(req->src),
2764
DMA_TO_DEVICE);
2765
goto err;
2766
}
2767
}
2768
2769
return 0;
2770
err:
2771
return -ENOMEM;
2772
}
2773
2774
void chcr_cipher_dma_unmap(struct device *dev,
2775
struct skcipher_request *req)
2776
{
2777
if (req->src == req->dst) {
2778
dma_unmap_sg(dev, req->src, sg_nents(req->src),
2779
DMA_BIDIRECTIONAL);
2780
} else {
2781
dma_unmap_sg(dev, req->src, sg_nents(req->src),
2782
DMA_TO_DEVICE);
2783
dma_unmap_sg(dev, req->dst, sg_nents(req->dst),
2784
DMA_FROM_DEVICE);
2785
}
2786
}
2787
2788
static int set_msg_len(u8 *block, unsigned int msglen, int csize)
2789
{
2790
__be32 data;
2791
2792
memset(block, 0, csize);
2793
block += csize;
2794
2795
if (csize >= 4)
2796
csize = 4;
2797
else if (msglen > (unsigned int)(1 << (8 * csize)))
2798
return -EOVERFLOW;
2799
2800
data = cpu_to_be32(msglen);
2801
memcpy(block - csize, (u8 *)&data + 4 - csize, csize);
2802
2803
return 0;
2804
}
2805
2806
static int generate_b0(struct aead_request *req, u8 *ivptr,
2807
unsigned short op_type)
2808
{
2809
unsigned int l, lp, m;
2810
int rc;
2811
struct crypto_aead *aead = crypto_aead_reqtfm(req);
2812
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2813
u8 *b0 = reqctx->scratch_pad;
2814
2815
m = crypto_aead_authsize(aead);
2816
2817
memcpy(b0, ivptr, 16);
2818
2819
lp = b0[0];
2820
l = lp + 1;
2821
2822
/* set m, bits 3-5 */
2823
*b0 |= (8 * ((m - 2) / 2));
2824
2825
/* set adata, bit 6, if associated data is used */
2826
if (req->assoclen)
2827
*b0 |= 64;
2828
rc = set_msg_len(b0 + 16 - l,
2829
(op_type == CHCR_DECRYPT_OP) ?
2830
req->cryptlen - m : req->cryptlen, l);
2831
2832
return rc;
2833
}
2834
2835
static inline int crypto_ccm_check_iv(const u8 *iv)
2836
{
2837
/* 2 <= L <= 8, so 1 <= L' <= 7. */
2838
if (iv[0] < 1 || iv[0] > 7)
2839
return -EINVAL;
2840
2841
return 0;
2842
}
2843
2844
static int ccm_format_packet(struct aead_request *req,
2845
u8 *ivptr,
2846
unsigned int sub_type,
2847
unsigned short op_type,
2848
unsigned int assoclen)
2849
{
2850
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2851
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2852
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
2853
int rc = 0;
2854
2855
if (sub_type == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309) {
2856
ivptr[0] = 3;
2857
memcpy(ivptr + 1, &aeadctx->salt[0], 3);
2858
memcpy(ivptr + 4, req->iv, 8);
2859
memset(ivptr + 12, 0, 4);
2860
} else {
2861
memcpy(ivptr, req->iv, 16);
2862
}
2863
if (assoclen)
2864
put_unaligned_be16(assoclen, &reqctx->scratch_pad[16]);
2865
2866
rc = generate_b0(req, ivptr, op_type);
2867
/* zero the ctr value */
2868
memset(ivptr + 15 - ivptr[0], 0, ivptr[0] + 1);
2869
return rc;
2870
}
2871
2872
static void fill_sec_cpl_for_aead(struct cpl_tx_sec_pdu *sec_cpl,
2873
unsigned int dst_size,
2874
struct aead_request *req,
2875
unsigned short op_type)
2876
{
2877
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2878
struct chcr_context *ctx = a_ctx(tfm);
2879
struct uld_ctx *u_ctx = ULD_CTX(ctx);
2880
struct chcr_aead_ctx *aeadctx = AEAD_CTX(ctx);
2881
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2882
unsigned int cipher_mode = CHCR_SCMD_CIPHER_MODE_AES_CCM;
2883
unsigned int mac_mode = CHCR_SCMD_AUTH_MODE_CBCMAC;
2884
unsigned int rx_channel_id = reqctx->rxqidx / ctx->rxq_perchan;
2885
unsigned int ccm_xtra;
2886
unsigned int tag_offset = 0, auth_offset = 0;
2887
unsigned int assoclen;
2888
2889
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
2890
2891
if (get_aead_subtype(tfm) == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309)
2892
assoclen = req->assoclen - 8;
2893
else
2894
assoclen = req->assoclen;
2895
ccm_xtra = CCM_B0_SIZE +
2896
((assoclen) ? CCM_AAD_FIELD_SIZE : 0);
2897
2898
auth_offset = req->cryptlen ?
2899
(req->assoclen + IV + 1 + ccm_xtra) : 0;
2900
if (op_type == CHCR_DECRYPT_OP) {
2901
if (crypto_aead_authsize(tfm) != req->cryptlen)
2902
tag_offset = crypto_aead_authsize(tfm);
2903
else
2904
auth_offset = 0;
2905
}
2906
2907
sec_cpl->op_ivinsrtofst = FILL_SEC_CPL_OP_IVINSR(rx_channel_id, 2, 1);
2908
sec_cpl->pldlen =
2909
htonl(req->assoclen + IV + req->cryptlen + ccm_xtra);
2910
/* For CCM there wil be b0 always. So AAD start will be 1 always */
2911
sec_cpl->aadstart_cipherstop_hi = FILL_SEC_CPL_CIPHERSTOP_HI(
2912
1 + IV, IV + assoclen + ccm_xtra,
2913
req->assoclen + IV + 1 + ccm_xtra, 0);
2914
2915
sec_cpl->cipherstop_lo_authinsert = FILL_SEC_CPL_AUTHINSERT(0,
2916
auth_offset, tag_offset,
2917
(op_type == CHCR_ENCRYPT_OP) ? 0 :
2918
crypto_aead_authsize(tfm));
2919
sec_cpl->seqno_numivs = FILL_SEC_CPL_SCMD0_SEQNO(op_type,
2920
(op_type == CHCR_ENCRYPT_OP) ? 0 : 1,
2921
cipher_mode, mac_mode,
2922
aeadctx->hmac_ctrl, IV >> 1);
2923
2924
sec_cpl->ivgen_hdrlen = FILL_SEC_CPL_IVGEN_HDRLEN(0, 0, 1, 0,
2925
0, dst_size);
2926
}
2927
2928
static int aead_ccm_validate_input(unsigned short op_type,
2929
struct aead_request *req,
2930
struct chcr_aead_ctx *aeadctx,
2931
unsigned int sub_type)
2932
{
2933
if (sub_type != CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309) {
2934
if (crypto_ccm_check_iv(req->iv)) {
2935
pr_err("CCM: IV check fails\n");
2936
return -EINVAL;
2937
}
2938
} else {
2939
if (req->assoclen != 16 && req->assoclen != 20) {
2940
pr_err("RFC4309: Invalid AAD length %d\n",
2941
req->assoclen);
2942
return -EINVAL;
2943
}
2944
}
2945
return 0;
2946
}
2947
2948
static struct sk_buff *create_aead_ccm_wr(struct aead_request *req,
2949
unsigned short qid,
2950
int size)
2951
{
2952
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2953
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
2954
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
2955
struct sk_buff *skb = NULL;
2956
struct chcr_wr *chcr_req;
2957
struct cpl_rx_phys_dsgl *phys_cpl;
2958
struct ulptx_sgl *ulptx;
2959
unsigned int transhdr_len;
2960
unsigned int dst_size = 0, kctx_len, dnents, temp, snents;
2961
unsigned int sub_type, assoclen = req->assoclen;
2962
unsigned int authsize = crypto_aead_authsize(tfm);
2963
int error = -EINVAL;
2964
u8 *ivptr;
2965
gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
2966
GFP_ATOMIC;
2967
struct adapter *adap = padap(a_ctx(tfm)->dev);
2968
2969
sub_type = get_aead_subtype(tfm);
2970
if (sub_type == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309)
2971
assoclen -= 8;
2972
reqctx->b0_len = CCM_B0_SIZE + (assoclen ? CCM_AAD_FIELD_SIZE : 0);
2973
error = chcr_aead_common_init(req);
2974
if (error)
2975
return ERR_PTR(error);
2976
2977
error = aead_ccm_validate_input(reqctx->op, req, aeadctx, sub_type);
2978
if (error)
2979
goto err;
2980
dnents = sg_nents_xlen(req->dst, req->assoclen + req->cryptlen
2981
+ (reqctx->op ? -authsize : authsize),
2982
CHCR_DST_SG_SIZE, 0);
2983
dnents += MIN_CCM_SG; // For IV and B0
2984
dst_size = get_space_for_phys_dsgl(dnents);
2985
snents = sg_nents_xlen(req->src, req->assoclen + req->cryptlen,
2986
CHCR_SRC_SG_SIZE, 0);
2987
snents += MIN_CCM_SG; //For B0
2988
kctx_len = roundup(aeadctx->enckey_len, 16) * 2;
2989
transhdr_len = CIPHER_TRANSHDR_SIZE(kctx_len, dst_size);
2990
reqctx->imm = (transhdr_len + req->assoclen + req->cryptlen +
2991
reqctx->b0_len) <= SGE_MAX_WR_LEN;
2992
temp = reqctx->imm ? roundup(req->assoclen + req->cryptlen +
2993
reqctx->b0_len, 16) :
2994
(sgl_len(snents) * 8);
2995
transhdr_len += temp;
2996
transhdr_len = roundup(transhdr_len, 16);
2997
2998
if (chcr_aead_need_fallback(req, dnents, T6_MAX_AAD_SIZE -
2999
reqctx->b0_len, transhdr_len, reqctx->op)) {
3000
atomic_inc(&adap->chcr_stats.fallback);
3001
chcr_aead_common_exit(req);
3002
return ERR_PTR(chcr_aead_fallback(req, reqctx->op));
3003
}
3004
skb = alloc_skb(transhdr_len, flags);
3005
3006
if (!skb) {
3007
error = -ENOMEM;
3008
goto err;
3009
}
3010
3011
chcr_req = __skb_put_zero(skb, transhdr_len);
3012
3013
fill_sec_cpl_for_aead(&chcr_req->sec_cpl, dst_size, req, reqctx->op);
3014
3015
chcr_req->key_ctx.ctx_hdr = aeadctx->key_ctx_hdr;
3016
memcpy(chcr_req->key_ctx.key, aeadctx->key, aeadctx->enckey_len);
3017
memcpy(chcr_req->key_ctx.key + roundup(aeadctx->enckey_len, 16),
3018
aeadctx->key, aeadctx->enckey_len);
3019
3020
phys_cpl = (struct cpl_rx_phys_dsgl *)((u8 *)(chcr_req + 1) + kctx_len);
3021
ivptr = (u8 *)(phys_cpl + 1) + dst_size;
3022
ulptx = (struct ulptx_sgl *)(ivptr + IV);
3023
error = ccm_format_packet(req, ivptr, sub_type, reqctx->op, assoclen);
3024
if (error)
3025
goto dstmap_fail;
3026
chcr_add_aead_dst_ent(req, phys_cpl, qid);
3027
chcr_add_aead_src_ent(req, ulptx);
3028
3029
atomic_inc(&adap->chcr_stats.aead_rqst);
3030
temp = sizeof(struct cpl_rx_phys_dsgl) + dst_size + IV +
3031
kctx_len + (reqctx->imm ? (req->assoclen + req->cryptlen +
3032
reqctx->b0_len) : 0);
3033
create_wreq(a_ctx(tfm), chcr_req, &req->base, reqctx->imm, 0,
3034
transhdr_len, temp, 0);
3035
reqctx->skb = skb;
3036
3037
return skb;
3038
dstmap_fail:
3039
kfree_skb(skb);
3040
err:
3041
chcr_aead_common_exit(req);
3042
return ERR_PTR(error);
3043
}
3044
3045
static struct sk_buff *create_gcm_wr(struct aead_request *req,
3046
unsigned short qid,
3047
int size)
3048
{
3049
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
3050
struct chcr_context *ctx = a_ctx(tfm);
3051
struct uld_ctx *u_ctx = ULD_CTX(ctx);
3052
struct chcr_aead_ctx *aeadctx = AEAD_CTX(ctx);
3053
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
3054
struct sk_buff *skb = NULL;
3055
struct chcr_wr *chcr_req;
3056
struct cpl_rx_phys_dsgl *phys_cpl;
3057
struct ulptx_sgl *ulptx;
3058
unsigned int transhdr_len, dnents = 0, snents;
3059
unsigned int dst_size = 0, temp = 0, kctx_len, assoclen = req->assoclen;
3060
unsigned int authsize = crypto_aead_authsize(tfm);
3061
int error = -EINVAL;
3062
u8 *ivptr;
3063
gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
3064
GFP_ATOMIC;
3065
struct adapter *adap = padap(ctx->dev);
3066
unsigned int rx_channel_id = reqctx->rxqidx / ctx->rxq_perchan;
3067
3068
rx_channel_id = cxgb4_port_e2cchan(u_ctx->lldi.ports[rx_channel_id]);
3069
if (get_aead_subtype(tfm) == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106)
3070
assoclen = req->assoclen - 8;
3071
3072
reqctx->b0_len = 0;
3073
error = chcr_aead_common_init(req);
3074
if (error)
3075
return ERR_PTR(error);
3076
dnents = sg_nents_xlen(req->dst, req->assoclen + req->cryptlen +
3077
(reqctx->op ? -authsize : authsize),
3078
CHCR_DST_SG_SIZE, 0);
3079
snents = sg_nents_xlen(req->src, req->assoclen + req->cryptlen,
3080
CHCR_SRC_SG_SIZE, 0);
3081
dnents += MIN_GCM_SG; // For IV
3082
dst_size = get_space_for_phys_dsgl(dnents);
3083
kctx_len = roundup(aeadctx->enckey_len, 16) + AEAD_H_SIZE;
3084
transhdr_len = CIPHER_TRANSHDR_SIZE(kctx_len, dst_size);
3085
reqctx->imm = (transhdr_len + req->assoclen + req->cryptlen) <=
3086
SGE_MAX_WR_LEN;
3087
temp = reqctx->imm ? roundup(req->assoclen + req->cryptlen, 16) :
3088
(sgl_len(snents) * 8);
3089
transhdr_len += temp;
3090
transhdr_len = roundup(transhdr_len, 16);
3091
if (chcr_aead_need_fallback(req, dnents, T6_MAX_AAD_SIZE,
3092
transhdr_len, reqctx->op)) {
3093
3094
atomic_inc(&adap->chcr_stats.fallback);
3095
chcr_aead_common_exit(req);
3096
return ERR_PTR(chcr_aead_fallback(req, reqctx->op));
3097
}
3098
skb = alloc_skb(transhdr_len, flags);
3099
if (!skb) {
3100
error = -ENOMEM;
3101
goto err;
3102
}
3103
3104
chcr_req = __skb_put_zero(skb, transhdr_len);
3105
3106
//Offset of tag from end
3107
temp = (reqctx->op == CHCR_ENCRYPT_OP) ? 0 : authsize;
3108
chcr_req->sec_cpl.op_ivinsrtofst = FILL_SEC_CPL_OP_IVINSR(
3109
rx_channel_id, 2, 1);
3110
chcr_req->sec_cpl.pldlen =
3111
htonl(req->assoclen + IV + req->cryptlen);
3112
chcr_req->sec_cpl.aadstart_cipherstop_hi = FILL_SEC_CPL_CIPHERSTOP_HI(
3113
assoclen ? 1 + IV : 0,
3114
assoclen ? IV + assoclen : 0,
3115
req->assoclen + IV + 1, 0);
3116
chcr_req->sec_cpl.cipherstop_lo_authinsert =
3117
FILL_SEC_CPL_AUTHINSERT(0, req->assoclen + IV + 1,
3118
temp, temp);
3119
chcr_req->sec_cpl.seqno_numivs =
3120
FILL_SEC_CPL_SCMD0_SEQNO(reqctx->op, (reqctx->op ==
3121
CHCR_ENCRYPT_OP) ? 1 : 0,
3122
CHCR_SCMD_CIPHER_MODE_AES_GCM,
3123
CHCR_SCMD_AUTH_MODE_GHASH,
3124
aeadctx->hmac_ctrl, IV >> 1);
3125
chcr_req->sec_cpl.ivgen_hdrlen = FILL_SEC_CPL_IVGEN_HDRLEN(0, 0, 1,
3126
0, 0, dst_size);
3127
chcr_req->key_ctx.ctx_hdr = aeadctx->key_ctx_hdr;
3128
memcpy(chcr_req->key_ctx.key, aeadctx->key, aeadctx->enckey_len);
3129
memcpy(chcr_req->key_ctx.key + roundup(aeadctx->enckey_len, 16),
3130
GCM_CTX(aeadctx)->ghash_h, AEAD_H_SIZE);
3131
3132
phys_cpl = (struct cpl_rx_phys_dsgl *)((u8 *)(chcr_req + 1) + kctx_len);
3133
ivptr = (u8 *)(phys_cpl + 1) + dst_size;
3134
/* prepare a 16 byte iv */
3135
/* S A L T | IV | 0x00000001 */
3136
if (get_aead_subtype(tfm) ==
3137
CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106) {
3138
memcpy(ivptr, aeadctx->salt, 4);
3139
memcpy(ivptr + 4, req->iv, GCM_RFC4106_IV_SIZE);
3140
} else {
3141
memcpy(ivptr, req->iv, GCM_AES_IV_SIZE);
3142
}
3143
put_unaligned_be32(0x01, &ivptr[12]);
3144
ulptx = (struct ulptx_sgl *)(ivptr + 16);
3145
3146
chcr_add_aead_dst_ent(req, phys_cpl, qid);
3147
chcr_add_aead_src_ent(req, ulptx);
3148
atomic_inc(&adap->chcr_stats.aead_rqst);
3149
temp = sizeof(struct cpl_rx_phys_dsgl) + dst_size + IV +
3150
kctx_len + (reqctx->imm ? (req->assoclen + req->cryptlen) : 0);
3151
create_wreq(a_ctx(tfm), chcr_req, &req->base, reqctx->imm, size,
3152
transhdr_len, temp, reqctx->verify);
3153
reqctx->skb = skb;
3154
return skb;
3155
3156
err:
3157
chcr_aead_common_exit(req);
3158
return ERR_PTR(error);
3159
}
3160
3161
3162
3163
static int chcr_aead_cra_init(struct crypto_aead *tfm)
3164
{
3165
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3166
struct aead_alg *alg = crypto_aead_alg(tfm);
3167
3168
aeadctx->sw_cipher = crypto_alloc_aead(alg->base.cra_name, 0,
3169
CRYPTO_ALG_NEED_FALLBACK |
3170
CRYPTO_ALG_ASYNC);
3171
if (IS_ERR(aeadctx->sw_cipher))
3172
return PTR_ERR(aeadctx->sw_cipher);
3173
crypto_aead_set_reqsize_dma(
3174
tfm, max(sizeof(struct chcr_aead_reqctx),
3175
sizeof(struct aead_request) +
3176
crypto_aead_reqsize(aeadctx->sw_cipher)));
3177
return chcr_device_init(a_ctx(tfm));
3178
}
3179
3180
static void chcr_aead_cra_exit(struct crypto_aead *tfm)
3181
{
3182
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3183
3184
crypto_free_aead(aeadctx->sw_cipher);
3185
}
3186
3187
static int chcr_authenc_null_setauthsize(struct crypto_aead *tfm,
3188
unsigned int authsize)
3189
{
3190
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3191
3192
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NOP;
3193
aeadctx->mayverify = VERIFY_HW;
3194
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
3195
}
3196
static int chcr_authenc_setauthsize(struct crypto_aead *tfm,
3197
unsigned int authsize)
3198
{
3199
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3200
u32 maxauth = crypto_aead_maxauthsize(tfm);
3201
3202
/*SHA1 authsize in ipsec is 12 instead of 10 i.e maxauthsize / 2 is not
3203
* true for sha1. authsize == 12 condition should be before
3204
* authsize == (maxauth >> 1)
3205
*/
3206
if (authsize == ICV_4) {
3207
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL1;
3208
aeadctx->mayverify = VERIFY_HW;
3209
} else if (authsize == ICV_6) {
3210
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL2;
3211
aeadctx->mayverify = VERIFY_HW;
3212
} else if (authsize == ICV_10) {
3213
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_TRUNC_RFC4366;
3214
aeadctx->mayverify = VERIFY_HW;
3215
} else if (authsize == ICV_12) {
3216
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_IPSEC_96BIT;
3217
aeadctx->mayverify = VERIFY_HW;
3218
} else if (authsize == ICV_14) {
3219
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL3;
3220
aeadctx->mayverify = VERIFY_HW;
3221
} else if (authsize == (maxauth >> 1)) {
3222
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_DIV2;
3223
aeadctx->mayverify = VERIFY_HW;
3224
} else if (authsize == maxauth) {
3225
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NO_TRUNC;
3226
aeadctx->mayverify = VERIFY_HW;
3227
} else {
3228
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NO_TRUNC;
3229
aeadctx->mayverify = VERIFY_SW;
3230
}
3231
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
3232
}
3233
3234
3235
static int chcr_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
3236
{
3237
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3238
3239
switch (authsize) {
3240
case ICV_4:
3241
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL1;
3242
aeadctx->mayverify = VERIFY_HW;
3243
break;
3244
case ICV_8:
3245
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_DIV2;
3246
aeadctx->mayverify = VERIFY_HW;
3247
break;
3248
case ICV_12:
3249
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_IPSEC_96BIT;
3250
aeadctx->mayverify = VERIFY_HW;
3251
break;
3252
case ICV_14:
3253
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL3;
3254
aeadctx->mayverify = VERIFY_HW;
3255
break;
3256
case ICV_16:
3257
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NO_TRUNC;
3258
aeadctx->mayverify = VERIFY_HW;
3259
break;
3260
case ICV_13:
3261
case ICV_15:
3262
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NO_TRUNC;
3263
aeadctx->mayverify = VERIFY_SW;
3264
break;
3265
default:
3266
return -EINVAL;
3267
}
3268
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
3269
}
3270
3271
static int chcr_4106_4309_setauthsize(struct crypto_aead *tfm,
3272
unsigned int authsize)
3273
{
3274
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3275
3276
switch (authsize) {
3277
case ICV_8:
3278
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_DIV2;
3279
aeadctx->mayverify = VERIFY_HW;
3280
break;
3281
case ICV_12:
3282
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_IPSEC_96BIT;
3283
aeadctx->mayverify = VERIFY_HW;
3284
break;
3285
case ICV_16:
3286
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NO_TRUNC;
3287
aeadctx->mayverify = VERIFY_HW;
3288
break;
3289
default:
3290
return -EINVAL;
3291
}
3292
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
3293
}
3294
3295
static int chcr_ccm_setauthsize(struct crypto_aead *tfm,
3296
unsigned int authsize)
3297
{
3298
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(tfm));
3299
3300
switch (authsize) {
3301
case ICV_4:
3302
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL1;
3303
aeadctx->mayverify = VERIFY_HW;
3304
break;
3305
case ICV_6:
3306
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL2;
3307
aeadctx->mayverify = VERIFY_HW;
3308
break;
3309
case ICV_8:
3310
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_DIV2;
3311
aeadctx->mayverify = VERIFY_HW;
3312
break;
3313
case ICV_10:
3314
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_TRUNC_RFC4366;
3315
aeadctx->mayverify = VERIFY_HW;
3316
break;
3317
case ICV_12:
3318
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_IPSEC_96BIT;
3319
aeadctx->mayverify = VERIFY_HW;
3320
break;
3321
case ICV_14:
3322
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_PL3;
3323
aeadctx->mayverify = VERIFY_HW;
3324
break;
3325
case ICV_16:
3326
aeadctx->hmac_ctrl = CHCR_SCMD_HMAC_CTRL_NO_TRUNC;
3327
aeadctx->mayverify = VERIFY_HW;
3328
break;
3329
default:
3330
return -EINVAL;
3331
}
3332
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
3333
}
3334
3335
static int chcr_ccm_common_setkey(struct crypto_aead *aead,
3336
const u8 *key,
3337
unsigned int keylen)
3338
{
3339
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(aead));
3340
unsigned char ck_size, mk_size;
3341
int key_ctx_size = 0;
3342
3343
key_ctx_size = sizeof(struct _key_ctx) + roundup(keylen, 16) * 2;
3344
if (keylen == AES_KEYSIZE_128) {
3345
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
3346
mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_128;
3347
} else if (keylen == AES_KEYSIZE_192) {
3348
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_192;
3349
mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_192;
3350
} else if (keylen == AES_KEYSIZE_256) {
3351
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
3352
mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256;
3353
} else {
3354
aeadctx->enckey_len = 0;
3355
return -EINVAL;
3356
}
3357
aeadctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size, mk_size, 0, 0,
3358
key_ctx_size >> 4);
3359
memcpy(aeadctx->key, key, keylen);
3360
aeadctx->enckey_len = keylen;
3361
3362
return 0;
3363
}
3364
3365
static int chcr_aead_ccm_setkey(struct crypto_aead *aead,
3366
const u8 *key,
3367
unsigned int keylen)
3368
{
3369
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(aead));
3370
int error;
3371
3372
crypto_aead_clear_flags(aeadctx->sw_cipher, CRYPTO_TFM_REQ_MASK);
3373
crypto_aead_set_flags(aeadctx->sw_cipher, crypto_aead_get_flags(aead) &
3374
CRYPTO_TFM_REQ_MASK);
3375
error = crypto_aead_setkey(aeadctx->sw_cipher, key, keylen);
3376
if (error)
3377
return error;
3378
return chcr_ccm_common_setkey(aead, key, keylen);
3379
}
3380
3381
static int chcr_aead_rfc4309_setkey(struct crypto_aead *aead, const u8 *key,
3382
unsigned int keylen)
3383
{
3384
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(aead));
3385
int error;
3386
3387
if (keylen < 3) {
3388
aeadctx->enckey_len = 0;
3389
return -EINVAL;
3390
}
3391
crypto_aead_clear_flags(aeadctx->sw_cipher, CRYPTO_TFM_REQ_MASK);
3392
crypto_aead_set_flags(aeadctx->sw_cipher, crypto_aead_get_flags(aead) &
3393
CRYPTO_TFM_REQ_MASK);
3394
error = crypto_aead_setkey(aeadctx->sw_cipher, key, keylen);
3395
if (error)
3396
return error;
3397
keylen -= 3;
3398
memcpy(aeadctx->salt, key + keylen, 3);
3399
return chcr_ccm_common_setkey(aead, key, keylen);
3400
}
3401
3402
static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,
3403
unsigned int keylen)
3404
{
3405
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(aead));
3406
struct chcr_gcm_ctx *gctx = GCM_CTX(aeadctx);
3407
unsigned int ck_size;
3408
int ret = 0, key_ctx_size = 0;
3409
struct crypto_aes_ctx aes;
3410
3411
aeadctx->enckey_len = 0;
3412
crypto_aead_clear_flags(aeadctx->sw_cipher, CRYPTO_TFM_REQ_MASK);
3413
crypto_aead_set_flags(aeadctx->sw_cipher, crypto_aead_get_flags(aead)
3414
& CRYPTO_TFM_REQ_MASK);
3415
ret = crypto_aead_setkey(aeadctx->sw_cipher, key, keylen);
3416
if (ret)
3417
goto out;
3418
3419
if (get_aead_subtype(aead) == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 &&
3420
keylen > 3) {
3421
keylen -= 4; /* nonce/salt is present in the last 4 bytes */
3422
memcpy(aeadctx->salt, key + keylen, 4);
3423
}
3424
if (keylen == AES_KEYSIZE_128) {
3425
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
3426
} else if (keylen == AES_KEYSIZE_192) {
3427
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_192;
3428
} else if (keylen == AES_KEYSIZE_256) {
3429
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
3430
} else {
3431
pr_err("GCM: Invalid key length %d\n", keylen);
3432
ret = -EINVAL;
3433
goto out;
3434
}
3435
3436
memcpy(aeadctx->key, key, keylen);
3437
aeadctx->enckey_len = keylen;
3438
key_ctx_size = sizeof(struct _key_ctx) + roundup(keylen, 16) +
3439
AEAD_H_SIZE;
3440
aeadctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size,
3441
CHCR_KEYCTX_MAC_KEY_SIZE_128,
3442
0, 0,
3443
key_ctx_size >> 4);
3444
/* Calculate the H = CIPH(K, 0 repeated 16 times).
3445
* It will go in key context
3446
*/
3447
ret = aes_expandkey(&aes, key, keylen);
3448
if (ret) {
3449
aeadctx->enckey_len = 0;
3450
goto out;
3451
}
3452
memset(gctx->ghash_h, 0, AEAD_H_SIZE);
3453
aes_encrypt(&aes, gctx->ghash_h, gctx->ghash_h);
3454
memzero_explicit(&aes, sizeof(aes));
3455
3456
out:
3457
return ret;
3458
}
3459
3460
static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
3461
unsigned int keylen)
3462
{
3463
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(authenc));
3464
struct chcr_authenc_ctx *actx = AUTHENC_CTX(aeadctx);
3465
/* it contains auth and cipher key both*/
3466
struct crypto_authenc_keys keys;
3467
unsigned int subtype;
3468
unsigned int max_authsize = crypto_aead_alg(authenc)->maxauthsize;
3469
int err = 0, key_ctx_len = 0;
3470
unsigned char ck_size = 0;
3471
struct algo_param param;
3472
int align;
3473
3474
crypto_aead_clear_flags(aeadctx->sw_cipher, CRYPTO_TFM_REQ_MASK);
3475
crypto_aead_set_flags(aeadctx->sw_cipher, crypto_aead_get_flags(authenc)
3476
& CRYPTO_TFM_REQ_MASK);
3477
err = crypto_aead_setkey(aeadctx->sw_cipher, key, keylen);
3478
if (err)
3479
goto out;
3480
3481
if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
3482
goto out;
3483
3484
if (get_alg_config(&param, max_authsize)) {
3485
pr_err("Unsupported digest size\n");
3486
goto out;
3487
}
3488
subtype = get_aead_subtype(authenc);
3489
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR_SHA ||
3490
subtype == CRYPTO_ALG_SUB_TYPE_CTR_NULL) {
3491
if (keys.enckeylen < CTR_RFC3686_NONCE_SIZE)
3492
goto out;
3493
memcpy(aeadctx->nonce, keys.enckey + (keys.enckeylen
3494
- CTR_RFC3686_NONCE_SIZE), CTR_RFC3686_NONCE_SIZE);
3495
keys.enckeylen -= CTR_RFC3686_NONCE_SIZE;
3496
}
3497
if (keys.enckeylen == AES_KEYSIZE_128) {
3498
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
3499
} else if (keys.enckeylen == AES_KEYSIZE_192) {
3500
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_192;
3501
} else if (keys.enckeylen == AES_KEYSIZE_256) {
3502
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
3503
} else {
3504
pr_err("Unsupported cipher key\n");
3505
goto out;
3506
}
3507
3508
/* Copy only encryption key. We use authkey to generate h(ipad) and
3509
* h(opad) so authkey is not needed again. authkeylen size have the
3510
* size of the hash digest size.
3511
*/
3512
memcpy(aeadctx->key, keys.enckey, keys.enckeylen);
3513
aeadctx->enckey_len = keys.enckeylen;
3514
if (subtype == CRYPTO_ALG_SUB_TYPE_CBC_SHA ||
3515
subtype == CRYPTO_ALG_SUB_TYPE_CBC_NULL) {
3516
3517
get_aes_decrypt_key(actx->dec_rrkey, aeadctx->key,
3518
aeadctx->enckey_len << 3);
3519
}
3520
3521
align = KEYCTX_ALIGN_PAD(max_authsize);
3522
err = chcr_prepare_hmac_key(keys.authkey, keys.authkeylen, max_authsize,
3523
actx->h_iopad,
3524
actx->h_iopad + param.result_size + align);
3525
if (err)
3526
goto out;
3527
3528
key_ctx_len = sizeof(struct _key_ctx) + roundup(keys.enckeylen, 16) +
3529
(param.result_size + align) * 2;
3530
aeadctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size, param.mk_size, 0, 1,
3531
key_ctx_len >> 4);
3532
actx->auth_mode = param.auth_mode;
3533
3534
memzero_explicit(&keys, sizeof(keys));
3535
return 0;
3536
3537
out:
3538
aeadctx->enckey_len = 0;
3539
memzero_explicit(&keys, sizeof(keys));
3540
return -EINVAL;
3541
}
3542
3543
static int chcr_aead_digest_null_setkey(struct crypto_aead *authenc,
3544
const u8 *key, unsigned int keylen)
3545
{
3546
struct chcr_aead_ctx *aeadctx = AEAD_CTX(a_ctx(authenc));
3547
struct chcr_authenc_ctx *actx = AUTHENC_CTX(aeadctx);
3548
struct crypto_authenc_keys keys;
3549
int err;
3550
/* it contains auth and cipher key both*/
3551
unsigned int subtype;
3552
int key_ctx_len = 0;
3553
unsigned char ck_size = 0;
3554
3555
crypto_aead_clear_flags(aeadctx->sw_cipher, CRYPTO_TFM_REQ_MASK);
3556
crypto_aead_set_flags(aeadctx->sw_cipher, crypto_aead_get_flags(authenc)
3557
& CRYPTO_TFM_REQ_MASK);
3558
err = crypto_aead_setkey(aeadctx->sw_cipher, key, keylen);
3559
if (err)
3560
goto out;
3561
3562
if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
3563
goto out;
3564
3565
subtype = get_aead_subtype(authenc);
3566
if (subtype == CRYPTO_ALG_SUB_TYPE_CTR_SHA ||
3567
subtype == CRYPTO_ALG_SUB_TYPE_CTR_NULL) {
3568
if (keys.enckeylen < CTR_RFC3686_NONCE_SIZE)
3569
goto out;
3570
memcpy(aeadctx->nonce, keys.enckey + (keys.enckeylen
3571
- CTR_RFC3686_NONCE_SIZE), CTR_RFC3686_NONCE_SIZE);
3572
keys.enckeylen -= CTR_RFC3686_NONCE_SIZE;
3573
}
3574
if (keys.enckeylen == AES_KEYSIZE_128) {
3575
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
3576
} else if (keys.enckeylen == AES_KEYSIZE_192) {
3577
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_192;
3578
} else if (keys.enckeylen == AES_KEYSIZE_256) {
3579
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
3580
} else {
3581
pr_err("Unsupported cipher key %d\n", keys.enckeylen);
3582
goto out;
3583
}
3584
memcpy(aeadctx->key, keys.enckey, keys.enckeylen);
3585
aeadctx->enckey_len = keys.enckeylen;
3586
if (subtype == CRYPTO_ALG_SUB_TYPE_CBC_SHA ||
3587
subtype == CRYPTO_ALG_SUB_TYPE_CBC_NULL) {
3588
get_aes_decrypt_key(actx->dec_rrkey, aeadctx->key,
3589
aeadctx->enckey_len << 3);
3590
}
3591
key_ctx_len = sizeof(struct _key_ctx) + roundup(keys.enckeylen, 16);
3592
3593
aeadctx->key_ctx_hdr = FILL_KEY_CTX_HDR(ck_size, CHCR_KEYCTX_NO_KEY, 0,
3594
0, key_ctx_len >> 4);
3595
actx->auth_mode = CHCR_SCMD_AUTH_MODE_NOP;
3596
memzero_explicit(&keys, sizeof(keys));
3597
return 0;
3598
out:
3599
aeadctx->enckey_len = 0;
3600
memzero_explicit(&keys, sizeof(keys));
3601
return -EINVAL;
3602
}
3603
3604
static int chcr_aead_op(struct aead_request *req,
3605
int size,
3606
create_wr_t create_wr_fn)
3607
{
3608
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
3609
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
3610
struct chcr_context *ctx = a_ctx(tfm);
3611
struct uld_ctx *u_ctx = ULD_CTX(ctx);
3612
struct sk_buff *skb;
3613
struct chcr_dev *cdev;
3614
3615
cdev = a_ctx(tfm)->dev;
3616
if (!cdev) {
3617
pr_err("%s : No crypto device.\n", __func__);
3618
return -ENXIO;
3619
}
3620
3621
if (chcr_inc_wrcount(cdev)) {
3622
/* Detach state for CHCR means lldi or padap is freed.
3623
* We cannot increment fallback here.
3624
*/
3625
return chcr_aead_fallback(req, reqctx->op);
3626
}
3627
3628
if (cxgb4_is_crypto_q_full(u_ctx->lldi.ports[0],
3629
reqctx->txqidx) &&
3630
(!(req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))) {
3631
chcr_dec_wrcount(cdev);
3632
return -ENOSPC;
3633
}
3634
3635
if (get_aead_subtype(tfm) == CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 &&
3636
crypto_ipsec_check_assoclen(req->assoclen) != 0) {
3637
pr_err("RFC4106: Invalid value of assoclen %d\n",
3638
req->assoclen);
3639
return -EINVAL;
3640
}
3641
3642
/* Form a WR from req */
3643
skb = create_wr_fn(req, u_ctx->lldi.rxq_ids[reqctx->rxqidx], size);
3644
3645
if (IS_ERR_OR_NULL(skb)) {
3646
chcr_dec_wrcount(cdev);
3647
return PTR_ERR_OR_ZERO(skb);
3648
}
3649
3650
skb->dev = u_ctx->lldi.ports[0];
3651
set_wr_txq(skb, CPL_PRIORITY_DATA, reqctx->txqidx);
3652
chcr_send_wr(skb);
3653
return -EINPROGRESS;
3654
}
3655
3656
static int chcr_aead_encrypt(struct aead_request *req)
3657
{
3658
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
3659
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
3660
struct chcr_context *ctx = a_ctx(tfm);
3661
unsigned int cpu;
3662
3663
cpu = get_cpu();
3664
reqctx->txqidx = cpu % ctx->ntxq;
3665
reqctx->rxqidx = cpu % ctx->nrxq;
3666
put_cpu();
3667
3668
reqctx->verify = VERIFY_HW;
3669
reqctx->op = CHCR_ENCRYPT_OP;
3670
3671
switch (get_aead_subtype(tfm)) {
3672
case CRYPTO_ALG_SUB_TYPE_CTR_SHA:
3673
case CRYPTO_ALG_SUB_TYPE_CBC_SHA:
3674
case CRYPTO_ALG_SUB_TYPE_CBC_NULL:
3675
case CRYPTO_ALG_SUB_TYPE_CTR_NULL:
3676
return chcr_aead_op(req, 0, create_authenc_wr);
3677
case CRYPTO_ALG_SUB_TYPE_AEAD_CCM:
3678
case CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309:
3679
return chcr_aead_op(req, 0, create_aead_ccm_wr);
3680
default:
3681
return chcr_aead_op(req, 0, create_gcm_wr);
3682
}
3683
}
3684
3685
static int chcr_aead_decrypt(struct aead_request *req)
3686
{
3687
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
3688
struct chcr_context *ctx = a_ctx(tfm);
3689
struct chcr_aead_ctx *aeadctx = AEAD_CTX(ctx);
3690
struct chcr_aead_reqctx *reqctx = aead_request_ctx_dma(req);
3691
int size;
3692
unsigned int cpu;
3693
3694
cpu = get_cpu();
3695
reqctx->txqidx = cpu % ctx->ntxq;
3696
reqctx->rxqidx = cpu % ctx->nrxq;
3697
put_cpu();
3698
3699
if (aeadctx->mayverify == VERIFY_SW) {
3700
size = crypto_aead_maxauthsize(tfm);
3701
reqctx->verify = VERIFY_SW;
3702
} else {
3703
size = 0;
3704
reqctx->verify = VERIFY_HW;
3705
}
3706
reqctx->op = CHCR_DECRYPT_OP;
3707
switch (get_aead_subtype(tfm)) {
3708
case CRYPTO_ALG_SUB_TYPE_CBC_SHA:
3709
case CRYPTO_ALG_SUB_TYPE_CTR_SHA:
3710
case CRYPTO_ALG_SUB_TYPE_CBC_NULL:
3711
case CRYPTO_ALG_SUB_TYPE_CTR_NULL:
3712
return chcr_aead_op(req, size, create_authenc_wr);
3713
case CRYPTO_ALG_SUB_TYPE_AEAD_CCM:
3714
case CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309:
3715
return chcr_aead_op(req, size, create_aead_ccm_wr);
3716
default:
3717
return chcr_aead_op(req, size, create_gcm_wr);
3718
}
3719
}
3720
3721
static struct chcr_alg_template driver_algs[] = {
3722
/* AES-CBC */
3723
{
3724
.type = CRYPTO_ALG_TYPE_SKCIPHER | CRYPTO_ALG_SUB_TYPE_CBC,
3725
.is_registered = 0,
3726
.alg.skcipher = {
3727
.base.cra_name = "cbc(aes)",
3728
.base.cra_driver_name = "cbc-aes-chcr",
3729
.base.cra_blocksize = AES_BLOCK_SIZE,
3730
3731
.init = chcr_init_tfm,
3732
.exit = chcr_exit_tfm,
3733
.min_keysize = AES_MIN_KEY_SIZE,
3734
.max_keysize = AES_MAX_KEY_SIZE,
3735
.ivsize = AES_BLOCK_SIZE,
3736
.setkey = chcr_aes_cbc_setkey,
3737
.encrypt = chcr_aes_encrypt,
3738
.decrypt = chcr_aes_decrypt,
3739
}
3740
},
3741
{
3742
.type = CRYPTO_ALG_TYPE_SKCIPHER | CRYPTO_ALG_SUB_TYPE_XTS,
3743
.is_registered = 0,
3744
.alg.skcipher = {
3745
.base.cra_name = "xts(aes)",
3746
.base.cra_driver_name = "xts-aes-chcr",
3747
.base.cra_blocksize = AES_BLOCK_SIZE,
3748
3749
.init = chcr_init_tfm,
3750
.exit = chcr_exit_tfm,
3751
.min_keysize = 2 * AES_MIN_KEY_SIZE,
3752
.max_keysize = 2 * AES_MAX_KEY_SIZE,
3753
.ivsize = AES_BLOCK_SIZE,
3754
.setkey = chcr_aes_xts_setkey,
3755
.encrypt = chcr_aes_encrypt,
3756
.decrypt = chcr_aes_decrypt,
3757
}
3758
},
3759
{
3760
.type = CRYPTO_ALG_TYPE_SKCIPHER | CRYPTO_ALG_SUB_TYPE_CTR,
3761
.is_registered = 0,
3762
.alg.skcipher = {
3763
.base.cra_name = "ctr(aes)",
3764
.base.cra_driver_name = "ctr-aes-chcr",
3765
.base.cra_blocksize = 1,
3766
3767
.init = chcr_init_tfm,
3768
.exit = chcr_exit_tfm,
3769
.min_keysize = AES_MIN_KEY_SIZE,
3770
.max_keysize = AES_MAX_KEY_SIZE,
3771
.ivsize = AES_BLOCK_SIZE,
3772
.setkey = chcr_aes_ctr_setkey,
3773
.encrypt = chcr_aes_encrypt,
3774
.decrypt = chcr_aes_decrypt,
3775
}
3776
},
3777
{
3778
.type = CRYPTO_ALG_TYPE_SKCIPHER |
3779
CRYPTO_ALG_SUB_TYPE_CTR_RFC3686,
3780
.is_registered = 0,
3781
.alg.skcipher = {
3782
.base.cra_name = "rfc3686(ctr(aes))",
3783
.base.cra_driver_name = "rfc3686-ctr-aes-chcr",
3784
.base.cra_blocksize = 1,
3785
3786
.init = chcr_rfc3686_init,
3787
.exit = chcr_exit_tfm,
3788
.min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
3789
.max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
3790
.ivsize = CTR_RFC3686_IV_SIZE,
3791
.setkey = chcr_aes_rfc3686_setkey,
3792
.encrypt = chcr_aes_encrypt,
3793
.decrypt = chcr_aes_decrypt,
3794
}
3795
},
3796
/* SHA */
3797
{
3798
.type = CRYPTO_ALG_TYPE_AHASH,
3799
.is_registered = 0,
3800
.alg.hash = {
3801
.halg.digestsize = SHA1_DIGEST_SIZE,
3802
.halg.base = {
3803
.cra_name = "sha1",
3804
.cra_driver_name = "sha1-chcr",
3805
.cra_blocksize = SHA1_BLOCK_SIZE,
3806
}
3807
}
3808
},
3809
{
3810
.type = CRYPTO_ALG_TYPE_AHASH,
3811
.is_registered = 0,
3812
.alg.hash = {
3813
.halg.digestsize = SHA256_DIGEST_SIZE,
3814
.halg.base = {
3815
.cra_name = "sha256",
3816
.cra_driver_name = "sha256-chcr",
3817
.cra_blocksize = SHA256_BLOCK_SIZE,
3818
}
3819
}
3820
},
3821
{
3822
.type = CRYPTO_ALG_TYPE_AHASH,
3823
.is_registered = 0,
3824
.alg.hash = {
3825
.halg.digestsize = SHA224_DIGEST_SIZE,
3826
.halg.base = {
3827
.cra_name = "sha224",
3828
.cra_driver_name = "sha224-chcr",
3829
.cra_blocksize = SHA224_BLOCK_SIZE,
3830
}
3831
}
3832
},
3833
{
3834
.type = CRYPTO_ALG_TYPE_AHASH,
3835
.is_registered = 0,
3836
.alg.hash = {
3837
.halg.digestsize = SHA384_DIGEST_SIZE,
3838
.halg.base = {
3839
.cra_name = "sha384",
3840
.cra_driver_name = "sha384-chcr",
3841
.cra_blocksize = SHA384_BLOCK_SIZE,
3842
}
3843
}
3844
},
3845
{
3846
.type = CRYPTO_ALG_TYPE_AHASH,
3847
.is_registered = 0,
3848
.alg.hash = {
3849
.halg.digestsize = SHA512_DIGEST_SIZE,
3850
.halg.base = {
3851
.cra_name = "sha512",
3852
.cra_driver_name = "sha512-chcr",
3853
.cra_blocksize = SHA512_BLOCK_SIZE,
3854
}
3855
}
3856
},
3857
/* HMAC */
3858
{
3859
.type = CRYPTO_ALG_TYPE_HMAC,
3860
.is_registered = 0,
3861
.alg.hash = {
3862
.halg.digestsize = SHA1_DIGEST_SIZE,
3863
.halg.base = {
3864
.cra_name = "hmac(sha1)",
3865
.cra_driver_name = "hmac-sha1-chcr",
3866
.cra_blocksize = SHA1_BLOCK_SIZE,
3867
}
3868
}
3869
},
3870
{
3871
.type = CRYPTO_ALG_TYPE_HMAC,
3872
.is_registered = 0,
3873
.alg.hash = {
3874
.halg.digestsize = SHA224_DIGEST_SIZE,
3875
.halg.base = {
3876
.cra_name = "hmac(sha224)",
3877
.cra_driver_name = "hmac-sha224-chcr",
3878
.cra_blocksize = SHA224_BLOCK_SIZE,
3879
}
3880
}
3881
},
3882
{
3883
.type = CRYPTO_ALG_TYPE_HMAC,
3884
.is_registered = 0,
3885
.alg.hash = {
3886
.halg.digestsize = SHA256_DIGEST_SIZE,
3887
.halg.base = {
3888
.cra_name = "hmac(sha256)",
3889
.cra_driver_name = "hmac-sha256-chcr",
3890
.cra_blocksize = SHA256_BLOCK_SIZE,
3891
}
3892
}
3893
},
3894
{
3895
.type = CRYPTO_ALG_TYPE_HMAC,
3896
.is_registered = 0,
3897
.alg.hash = {
3898
.halg.digestsize = SHA384_DIGEST_SIZE,
3899
.halg.base = {
3900
.cra_name = "hmac(sha384)",
3901
.cra_driver_name = "hmac-sha384-chcr",
3902
.cra_blocksize = SHA384_BLOCK_SIZE,
3903
}
3904
}
3905
},
3906
{
3907
.type = CRYPTO_ALG_TYPE_HMAC,
3908
.is_registered = 0,
3909
.alg.hash = {
3910
.halg.digestsize = SHA512_DIGEST_SIZE,
3911
.halg.base = {
3912
.cra_name = "hmac(sha512)",
3913
.cra_driver_name = "hmac-sha512-chcr",
3914
.cra_blocksize = SHA512_BLOCK_SIZE,
3915
}
3916
}
3917
},
3918
/* Add AEAD Algorithms */
3919
{
3920
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_AEAD_GCM,
3921
.is_registered = 0,
3922
.alg.aead = {
3923
.base = {
3924
.cra_name = "gcm(aes)",
3925
.cra_driver_name = "gcm-aes-chcr",
3926
.cra_blocksize = 1,
3927
.cra_priority = CHCR_AEAD_PRIORITY,
3928
.cra_ctxsize = sizeof(struct chcr_context) +
3929
sizeof(struct chcr_aead_ctx) +
3930
sizeof(struct chcr_gcm_ctx),
3931
},
3932
.ivsize = GCM_AES_IV_SIZE,
3933
.maxauthsize = GHASH_DIGEST_SIZE,
3934
.setkey = chcr_gcm_setkey,
3935
.setauthsize = chcr_gcm_setauthsize,
3936
}
3937
},
3938
{
3939
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106,
3940
.is_registered = 0,
3941
.alg.aead = {
3942
.base = {
3943
.cra_name = "rfc4106(gcm(aes))",
3944
.cra_driver_name = "rfc4106-gcm-aes-chcr",
3945
.cra_blocksize = 1,
3946
.cra_priority = CHCR_AEAD_PRIORITY + 1,
3947
.cra_ctxsize = sizeof(struct chcr_context) +
3948
sizeof(struct chcr_aead_ctx) +
3949
sizeof(struct chcr_gcm_ctx),
3950
3951
},
3952
.ivsize = GCM_RFC4106_IV_SIZE,
3953
.maxauthsize = GHASH_DIGEST_SIZE,
3954
.setkey = chcr_gcm_setkey,
3955
.setauthsize = chcr_4106_4309_setauthsize,
3956
}
3957
},
3958
{
3959
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_AEAD_CCM,
3960
.is_registered = 0,
3961
.alg.aead = {
3962
.base = {
3963
.cra_name = "ccm(aes)",
3964
.cra_driver_name = "ccm-aes-chcr",
3965
.cra_blocksize = 1,
3966
.cra_priority = CHCR_AEAD_PRIORITY,
3967
.cra_ctxsize = sizeof(struct chcr_context) +
3968
sizeof(struct chcr_aead_ctx),
3969
3970
},
3971
.ivsize = AES_BLOCK_SIZE,
3972
.maxauthsize = GHASH_DIGEST_SIZE,
3973
.setkey = chcr_aead_ccm_setkey,
3974
.setauthsize = chcr_ccm_setauthsize,
3975
}
3976
},
3977
{
3978
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_AEAD_RFC4309,
3979
.is_registered = 0,
3980
.alg.aead = {
3981
.base = {
3982
.cra_name = "rfc4309(ccm(aes))",
3983
.cra_driver_name = "rfc4309-ccm-aes-chcr",
3984
.cra_blocksize = 1,
3985
.cra_priority = CHCR_AEAD_PRIORITY + 1,
3986
.cra_ctxsize = sizeof(struct chcr_context) +
3987
sizeof(struct chcr_aead_ctx),
3988
3989
},
3990
.ivsize = 8,
3991
.maxauthsize = GHASH_DIGEST_SIZE,
3992
.setkey = chcr_aead_rfc4309_setkey,
3993
.setauthsize = chcr_4106_4309_setauthsize,
3994
}
3995
},
3996
{
3997
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CBC_SHA,
3998
.is_registered = 0,
3999
.alg.aead = {
4000
.base = {
4001
.cra_name = "authenc(hmac(sha1),cbc(aes))",
4002
.cra_driver_name =
4003
"authenc-hmac-sha1-cbc-aes-chcr",
4004
.cra_blocksize = AES_BLOCK_SIZE,
4005
.cra_priority = CHCR_AEAD_PRIORITY,
4006
.cra_ctxsize = sizeof(struct chcr_context) +
4007
sizeof(struct chcr_aead_ctx) +
4008
sizeof(struct chcr_authenc_ctx),
4009
4010
},
4011
.ivsize = AES_BLOCK_SIZE,
4012
.maxauthsize = SHA1_DIGEST_SIZE,
4013
.setkey = chcr_authenc_setkey,
4014
.setauthsize = chcr_authenc_setauthsize,
4015
}
4016
},
4017
{
4018
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CBC_SHA,
4019
.is_registered = 0,
4020
.alg.aead = {
4021
.base = {
4022
4023
.cra_name = "authenc(hmac(sha256),cbc(aes))",
4024
.cra_driver_name =
4025
"authenc-hmac-sha256-cbc-aes-chcr",
4026
.cra_blocksize = AES_BLOCK_SIZE,
4027
.cra_priority = CHCR_AEAD_PRIORITY,
4028
.cra_ctxsize = sizeof(struct chcr_context) +
4029
sizeof(struct chcr_aead_ctx) +
4030
sizeof(struct chcr_authenc_ctx),
4031
4032
},
4033
.ivsize = AES_BLOCK_SIZE,
4034
.maxauthsize = SHA256_DIGEST_SIZE,
4035
.setkey = chcr_authenc_setkey,
4036
.setauthsize = chcr_authenc_setauthsize,
4037
}
4038
},
4039
{
4040
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CBC_SHA,
4041
.is_registered = 0,
4042
.alg.aead = {
4043
.base = {
4044
.cra_name = "authenc(hmac(sha224),cbc(aes))",
4045
.cra_driver_name =
4046
"authenc-hmac-sha224-cbc-aes-chcr",
4047
.cra_blocksize = AES_BLOCK_SIZE,
4048
.cra_priority = CHCR_AEAD_PRIORITY,
4049
.cra_ctxsize = sizeof(struct chcr_context) +
4050
sizeof(struct chcr_aead_ctx) +
4051
sizeof(struct chcr_authenc_ctx),
4052
},
4053
.ivsize = AES_BLOCK_SIZE,
4054
.maxauthsize = SHA224_DIGEST_SIZE,
4055
.setkey = chcr_authenc_setkey,
4056
.setauthsize = chcr_authenc_setauthsize,
4057
}
4058
},
4059
{
4060
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CBC_SHA,
4061
.is_registered = 0,
4062
.alg.aead = {
4063
.base = {
4064
.cra_name = "authenc(hmac(sha384),cbc(aes))",
4065
.cra_driver_name =
4066
"authenc-hmac-sha384-cbc-aes-chcr",
4067
.cra_blocksize = AES_BLOCK_SIZE,
4068
.cra_priority = CHCR_AEAD_PRIORITY,
4069
.cra_ctxsize = sizeof(struct chcr_context) +
4070
sizeof(struct chcr_aead_ctx) +
4071
sizeof(struct chcr_authenc_ctx),
4072
4073
},
4074
.ivsize = AES_BLOCK_SIZE,
4075
.maxauthsize = SHA384_DIGEST_SIZE,
4076
.setkey = chcr_authenc_setkey,
4077
.setauthsize = chcr_authenc_setauthsize,
4078
}
4079
},
4080
{
4081
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CBC_SHA,
4082
.is_registered = 0,
4083
.alg.aead = {
4084
.base = {
4085
.cra_name = "authenc(hmac(sha512),cbc(aes))",
4086
.cra_driver_name =
4087
"authenc-hmac-sha512-cbc-aes-chcr",
4088
.cra_blocksize = AES_BLOCK_SIZE,
4089
.cra_priority = CHCR_AEAD_PRIORITY,
4090
.cra_ctxsize = sizeof(struct chcr_context) +
4091
sizeof(struct chcr_aead_ctx) +
4092
sizeof(struct chcr_authenc_ctx),
4093
4094
},
4095
.ivsize = AES_BLOCK_SIZE,
4096
.maxauthsize = SHA512_DIGEST_SIZE,
4097
.setkey = chcr_authenc_setkey,
4098
.setauthsize = chcr_authenc_setauthsize,
4099
}
4100
},
4101
{
4102
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CBC_NULL,
4103
.is_registered = 0,
4104
.alg.aead = {
4105
.base = {
4106
.cra_name = "authenc(digest_null,cbc(aes))",
4107
.cra_driver_name =
4108
"authenc-digest_null-cbc-aes-chcr",
4109
.cra_blocksize = AES_BLOCK_SIZE,
4110
.cra_priority = CHCR_AEAD_PRIORITY,
4111
.cra_ctxsize = sizeof(struct chcr_context) +
4112
sizeof(struct chcr_aead_ctx) +
4113
sizeof(struct chcr_authenc_ctx),
4114
4115
},
4116
.ivsize = AES_BLOCK_SIZE,
4117
.maxauthsize = 0,
4118
.setkey = chcr_aead_digest_null_setkey,
4119
.setauthsize = chcr_authenc_null_setauthsize,
4120
}
4121
},
4122
{
4123
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CTR_SHA,
4124
.is_registered = 0,
4125
.alg.aead = {
4126
.base = {
4127
.cra_name = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
4128
.cra_driver_name =
4129
"authenc-hmac-sha1-rfc3686-ctr-aes-chcr",
4130
.cra_blocksize = 1,
4131
.cra_priority = CHCR_AEAD_PRIORITY,
4132
.cra_ctxsize = sizeof(struct chcr_context) +
4133
sizeof(struct chcr_aead_ctx) +
4134
sizeof(struct chcr_authenc_ctx),
4135
4136
},
4137
.ivsize = CTR_RFC3686_IV_SIZE,
4138
.maxauthsize = SHA1_DIGEST_SIZE,
4139
.setkey = chcr_authenc_setkey,
4140
.setauthsize = chcr_authenc_setauthsize,
4141
}
4142
},
4143
{
4144
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CTR_SHA,
4145
.is_registered = 0,
4146
.alg.aead = {
4147
.base = {
4148
4149
.cra_name = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
4150
.cra_driver_name =
4151
"authenc-hmac-sha256-rfc3686-ctr-aes-chcr",
4152
.cra_blocksize = 1,
4153
.cra_priority = CHCR_AEAD_PRIORITY,
4154
.cra_ctxsize = sizeof(struct chcr_context) +
4155
sizeof(struct chcr_aead_ctx) +
4156
sizeof(struct chcr_authenc_ctx),
4157
4158
},
4159
.ivsize = CTR_RFC3686_IV_SIZE,
4160
.maxauthsize = SHA256_DIGEST_SIZE,
4161
.setkey = chcr_authenc_setkey,
4162
.setauthsize = chcr_authenc_setauthsize,
4163
}
4164
},
4165
{
4166
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CTR_SHA,
4167
.is_registered = 0,
4168
.alg.aead = {
4169
.base = {
4170
.cra_name = "authenc(hmac(sha224),rfc3686(ctr(aes)))",
4171
.cra_driver_name =
4172
"authenc-hmac-sha224-rfc3686-ctr-aes-chcr",
4173
.cra_blocksize = 1,
4174
.cra_priority = CHCR_AEAD_PRIORITY,
4175
.cra_ctxsize = sizeof(struct chcr_context) +
4176
sizeof(struct chcr_aead_ctx) +
4177
sizeof(struct chcr_authenc_ctx),
4178
},
4179
.ivsize = CTR_RFC3686_IV_SIZE,
4180
.maxauthsize = SHA224_DIGEST_SIZE,
4181
.setkey = chcr_authenc_setkey,
4182
.setauthsize = chcr_authenc_setauthsize,
4183
}
4184
},
4185
{
4186
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CTR_SHA,
4187
.is_registered = 0,
4188
.alg.aead = {
4189
.base = {
4190
.cra_name = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
4191
.cra_driver_name =
4192
"authenc-hmac-sha384-rfc3686-ctr-aes-chcr",
4193
.cra_blocksize = 1,
4194
.cra_priority = CHCR_AEAD_PRIORITY,
4195
.cra_ctxsize = sizeof(struct chcr_context) +
4196
sizeof(struct chcr_aead_ctx) +
4197
sizeof(struct chcr_authenc_ctx),
4198
4199
},
4200
.ivsize = CTR_RFC3686_IV_SIZE,
4201
.maxauthsize = SHA384_DIGEST_SIZE,
4202
.setkey = chcr_authenc_setkey,
4203
.setauthsize = chcr_authenc_setauthsize,
4204
}
4205
},
4206
{
4207
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CTR_SHA,
4208
.is_registered = 0,
4209
.alg.aead = {
4210
.base = {
4211
.cra_name = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
4212
.cra_driver_name =
4213
"authenc-hmac-sha512-rfc3686-ctr-aes-chcr",
4214
.cra_blocksize = 1,
4215
.cra_priority = CHCR_AEAD_PRIORITY,
4216
.cra_ctxsize = sizeof(struct chcr_context) +
4217
sizeof(struct chcr_aead_ctx) +
4218
sizeof(struct chcr_authenc_ctx),
4219
4220
},
4221
.ivsize = CTR_RFC3686_IV_SIZE,
4222
.maxauthsize = SHA512_DIGEST_SIZE,
4223
.setkey = chcr_authenc_setkey,
4224
.setauthsize = chcr_authenc_setauthsize,
4225
}
4226
},
4227
{
4228
.type = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_SUB_TYPE_CTR_NULL,
4229
.is_registered = 0,
4230
.alg.aead = {
4231
.base = {
4232
.cra_name = "authenc(digest_null,rfc3686(ctr(aes)))",
4233
.cra_driver_name =
4234
"authenc-digest_null-rfc3686-ctr-aes-chcr",
4235
.cra_blocksize = 1,
4236
.cra_priority = CHCR_AEAD_PRIORITY,
4237
.cra_ctxsize = sizeof(struct chcr_context) +
4238
sizeof(struct chcr_aead_ctx) +
4239
sizeof(struct chcr_authenc_ctx),
4240
4241
},
4242
.ivsize = CTR_RFC3686_IV_SIZE,
4243
.maxauthsize = 0,
4244
.setkey = chcr_aead_digest_null_setkey,
4245
.setauthsize = chcr_authenc_null_setauthsize,
4246
}
4247
},
4248
};
4249
4250
/*
4251
* chcr_unregister_alg - Deregister crypto algorithms with
4252
* kernel framework.
4253
*/
4254
static int chcr_unregister_alg(void)
4255
{
4256
int i;
4257
4258
for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
4259
switch (driver_algs[i].type & CRYPTO_ALG_TYPE_MASK) {
4260
case CRYPTO_ALG_TYPE_SKCIPHER:
4261
if (driver_algs[i].is_registered && refcount_read(
4262
&driver_algs[i].alg.skcipher.base.cra_refcnt)
4263
== 1) {
4264
crypto_unregister_skcipher(
4265
&driver_algs[i].alg.skcipher);
4266
driver_algs[i].is_registered = 0;
4267
}
4268
break;
4269
case CRYPTO_ALG_TYPE_AEAD:
4270
if (driver_algs[i].is_registered && refcount_read(
4271
&driver_algs[i].alg.aead.base.cra_refcnt) == 1) {
4272
crypto_unregister_aead(
4273
&driver_algs[i].alg.aead);
4274
driver_algs[i].is_registered = 0;
4275
}
4276
break;
4277
case CRYPTO_ALG_TYPE_AHASH:
4278
if (driver_algs[i].is_registered && refcount_read(
4279
&driver_algs[i].alg.hash.halg.base.cra_refcnt)
4280
== 1) {
4281
crypto_unregister_ahash(
4282
&driver_algs[i].alg.hash);
4283
driver_algs[i].is_registered = 0;
4284
}
4285
break;
4286
}
4287
}
4288
return 0;
4289
}
4290
4291
#define SZ_AHASH_CTX sizeof(struct chcr_context)
4292
#define SZ_AHASH_H_CTX (sizeof(struct chcr_context) + sizeof(struct hmac_ctx))
4293
#define SZ_AHASH_REQ_CTX sizeof(struct chcr_ahash_req_ctx)
4294
4295
/*
4296
* chcr_register_alg - Register crypto algorithms with kernel framework.
4297
*/
4298
static int chcr_register_alg(void)
4299
{
4300
struct crypto_alg ai;
4301
struct ahash_alg *a_hash;
4302
int err = 0, i;
4303
char *name = NULL;
4304
4305
for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
4306
if (driver_algs[i].is_registered)
4307
continue;
4308
switch (driver_algs[i].type & CRYPTO_ALG_TYPE_MASK) {
4309
case CRYPTO_ALG_TYPE_SKCIPHER:
4310
driver_algs[i].alg.skcipher.base.cra_priority =
4311
CHCR_CRA_PRIORITY;
4312
driver_algs[i].alg.skcipher.base.cra_module = THIS_MODULE;
4313
driver_algs[i].alg.skcipher.base.cra_flags =
4314
CRYPTO_ALG_TYPE_SKCIPHER | CRYPTO_ALG_ASYNC |
4315
CRYPTO_ALG_ALLOCATES_MEMORY |
4316
CRYPTO_ALG_NEED_FALLBACK;
4317
driver_algs[i].alg.skcipher.base.cra_ctxsize =
4318
sizeof(struct chcr_context) +
4319
sizeof(struct ablk_ctx);
4320
driver_algs[i].alg.skcipher.base.cra_alignmask = 0;
4321
4322
err = crypto_register_skcipher(&driver_algs[i].alg.skcipher);
4323
name = driver_algs[i].alg.skcipher.base.cra_driver_name;
4324
break;
4325
case CRYPTO_ALG_TYPE_AEAD:
4326
driver_algs[i].alg.aead.base.cra_flags =
4327
CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK |
4328
CRYPTO_ALG_ALLOCATES_MEMORY;
4329
driver_algs[i].alg.aead.encrypt = chcr_aead_encrypt;
4330
driver_algs[i].alg.aead.decrypt = chcr_aead_decrypt;
4331
driver_algs[i].alg.aead.init = chcr_aead_cra_init;
4332
driver_algs[i].alg.aead.exit = chcr_aead_cra_exit;
4333
driver_algs[i].alg.aead.base.cra_module = THIS_MODULE;
4334
err = crypto_register_aead(&driver_algs[i].alg.aead);
4335
name = driver_algs[i].alg.aead.base.cra_driver_name;
4336
break;
4337
case CRYPTO_ALG_TYPE_AHASH:
4338
a_hash = &driver_algs[i].alg.hash;
4339
a_hash->update = chcr_ahash_update;
4340
a_hash->final = chcr_ahash_final;
4341
a_hash->finup = chcr_ahash_finup;
4342
a_hash->digest = chcr_ahash_digest;
4343
a_hash->export = chcr_ahash_export;
4344
a_hash->import = chcr_ahash_import;
4345
a_hash->halg.statesize = SZ_AHASH_REQ_CTX;
4346
a_hash->halg.base.cra_priority = CHCR_CRA_PRIORITY;
4347
a_hash->halg.base.cra_module = THIS_MODULE;
4348
a_hash->halg.base.cra_flags =
4349
CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY;
4350
a_hash->halg.base.cra_alignmask = 0;
4351
a_hash->halg.base.cra_exit = NULL;
4352
4353
if (driver_algs[i].type == CRYPTO_ALG_TYPE_HMAC) {
4354
a_hash->halg.base.cra_init = chcr_hmac_cra_init;
4355
a_hash->init = chcr_hmac_init;
4356
a_hash->setkey = chcr_ahash_setkey;
4357
a_hash->halg.base.cra_ctxsize = SZ_AHASH_H_CTX;
4358
} else {
4359
a_hash->init = chcr_sha_init;
4360
a_hash->halg.base.cra_ctxsize = SZ_AHASH_CTX;
4361
a_hash->halg.base.cra_init = chcr_sha_cra_init;
4362
}
4363
err = crypto_register_ahash(&driver_algs[i].alg.hash);
4364
ai = driver_algs[i].alg.hash.halg.base;
4365
name = ai.cra_driver_name;
4366
break;
4367
}
4368
if (err) {
4369
pr_err("%s : Algorithm registration failed\n", name);
4370
goto register_err;
4371
} else {
4372
driver_algs[i].is_registered = 1;
4373
}
4374
}
4375
return 0;
4376
4377
register_err:
4378
chcr_unregister_alg();
4379
return err;
4380
}
4381
4382
/*
4383
* start_crypto - Register the crypto algorithms.
4384
* This should called once when the first device comesup. After this
4385
* kernel will start calling driver APIs for crypto operations.
4386
*/
4387
int start_crypto(void)
4388
{
4389
return chcr_register_alg();
4390
}
4391
4392
/*
4393
* stop_crypto - Deregister all the crypto algorithms with kernel.
4394
* This should be called once when the last device goes down. After this
4395
* kernel will not call the driver API for crypto operations.
4396
*/
4397
int stop_crypto(void)
4398
{
4399
chcr_unregister_alg();
4400
return 0;
4401
}
4402
4403