Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/crypto/inside-secure/safexcel_cipher.c
26285 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* Copyright (C) 2017 Marvell
4
*
5
* Antoine Tenart <[email protected]>
6
*/
7
8
#include <linux/unaligned.h>
9
#include <linux/device.h>
10
#include <linux/dma-mapping.h>
11
#include <linux/dmapool.h>
12
#include <crypto/aead.h>
13
#include <crypto/aes.h>
14
#include <crypto/authenc.h>
15
#include <crypto/chacha.h>
16
#include <crypto/ctr.h>
17
#include <crypto/internal/des.h>
18
#include <crypto/gcm.h>
19
#include <crypto/ghash.h>
20
#include <crypto/poly1305.h>
21
#include <crypto/sha1.h>
22
#include <crypto/sha2.h>
23
#include <crypto/sm3.h>
24
#include <crypto/sm4.h>
25
#include <crypto/xts.h>
26
#include <crypto/skcipher.h>
27
#include <crypto/internal/aead.h>
28
#include <crypto/internal/skcipher.h>
29
30
#include "safexcel.h"
31
32
enum safexcel_cipher_direction {
33
SAFEXCEL_ENCRYPT,
34
SAFEXCEL_DECRYPT,
35
};
36
37
enum safexcel_cipher_alg {
38
SAFEXCEL_DES,
39
SAFEXCEL_3DES,
40
SAFEXCEL_AES,
41
SAFEXCEL_CHACHA20,
42
SAFEXCEL_SM4,
43
};
44
45
struct safexcel_cipher_ctx {
46
struct safexcel_context base;
47
struct safexcel_crypto_priv *priv;
48
49
u32 mode;
50
enum safexcel_cipher_alg alg;
51
u8 aead; /* !=0=AEAD, 2=IPSec ESP AEAD, 3=IPsec ESP GMAC */
52
u8 xcm; /* 0=authenc, 1=GCM, 2 reserved for CCM */
53
u8 aadskip;
54
u8 blocksz;
55
u32 ivmask;
56
u32 ctrinit;
57
58
__le32 key[16];
59
u32 nonce;
60
unsigned int key_len, xts;
61
62
/* All the below is AEAD specific */
63
u32 hash_alg;
64
u32 state_sz;
65
66
struct crypto_aead *fback;
67
};
68
69
struct safexcel_cipher_req {
70
enum safexcel_cipher_direction direction;
71
/* Number of result descriptors associated to the request */
72
unsigned int rdescs;
73
bool needs_inv;
74
int nr_src, nr_dst;
75
};
76
77
static int safexcel_skcipher_iv(struct safexcel_cipher_ctx *ctx, u8 *iv,
78
struct safexcel_command_desc *cdesc)
79
{
80
if (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD) {
81
cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD;
82
/* 32 bit nonce */
83
cdesc->control_data.token[0] = ctx->nonce;
84
/* 64 bit IV part */
85
memcpy(&cdesc->control_data.token[1], iv, 8);
86
/* 32 bit counter, start at 0 or 1 (big endian!) */
87
cdesc->control_data.token[3] =
88
(__force u32)cpu_to_be32(ctx->ctrinit);
89
return 4;
90
}
91
if (ctx->alg == SAFEXCEL_CHACHA20) {
92
cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD;
93
/* 96 bit nonce part */
94
memcpy(&cdesc->control_data.token[0], &iv[4], 12);
95
/* 32 bit counter */
96
cdesc->control_data.token[3] = *(u32 *)iv;
97
return 4;
98
}
99
100
cdesc->control_data.options |= ctx->ivmask;
101
memcpy(cdesc->control_data.token, iv, ctx->blocksz);
102
return ctx->blocksz / sizeof(u32);
103
}
104
105
static void safexcel_skcipher_token(struct safexcel_cipher_ctx *ctx, u8 *iv,
106
struct safexcel_command_desc *cdesc,
107
struct safexcel_token *atoken,
108
u32 length)
109
{
110
struct safexcel_token *token;
111
int ivlen;
112
113
ivlen = safexcel_skcipher_iv(ctx, iv, cdesc);
114
if (ivlen == 4) {
115
/* No space in cdesc, instruction moves to atoken */
116
cdesc->additional_cdata_size = 1;
117
token = atoken;
118
} else {
119
/* Everything fits in cdesc */
120
token = (struct safexcel_token *)(cdesc->control_data.token + 2);
121
/* Need to pad with NOP */
122
eip197_noop_token(&token[1]);
123
}
124
125
token->opcode = EIP197_TOKEN_OPCODE_DIRECTION;
126
token->packet_length = length;
127
token->stat = EIP197_TOKEN_STAT_LAST_PACKET |
128
EIP197_TOKEN_STAT_LAST_HASH;
129
token->instructions = EIP197_TOKEN_INS_LAST |
130
EIP197_TOKEN_INS_TYPE_CRYPTO |
131
EIP197_TOKEN_INS_TYPE_OUTPUT;
132
}
133
134
static void safexcel_aead_iv(struct safexcel_cipher_ctx *ctx, u8 *iv,
135
struct safexcel_command_desc *cdesc)
136
{
137
if (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD ||
138
ctx->aead & EIP197_AEAD_TYPE_IPSEC_ESP) { /* _ESP and _ESP_GMAC */
139
/* 32 bit nonce */
140
cdesc->control_data.token[0] = ctx->nonce;
141
/* 64 bit IV part */
142
memcpy(&cdesc->control_data.token[1], iv, 8);
143
/* 32 bit counter, start at 0 or 1 (big endian!) */
144
cdesc->control_data.token[3] =
145
(__force u32)cpu_to_be32(ctx->ctrinit);
146
return;
147
}
148
if (ctx->xcm == EIP197_XCM_MODE_GCM || ctx->alg == SAFEXCEL_CHACHA20) {
149
/* 96 bit IV part */
150
memcpy(&cdesc->control_data.token[0], iv, 12);
151
/* 32 bit counter, start at 0 or 1 (big endian!) */
152
cdesc->control_data.token[3] =
153
(__force u32)cpu_to_be32(ctx->ctrinit);
154
return;
155
}
156
/* CBC */
157
memcpy(cdesc->control_data.token, iv, ctx->blocksz);
158
}
159
160
static void safexcel_aead_token(struct safexcel_cipher_ctx *ctx, u8 *iv,
161
struct safexcel_command_desc *cdesc,
162
struct safexcel_token *atoken,
163
enum safexcel_cipher_direction direction,
164
u32 cryptlen, u32 assoclen, u32 digestsize)
165
{
166
struct safexcel_token *aadref;
167
int atoksize = 2; /* Start with minimum size */
168
int assocadj = assoclen - ctx->aadskip, aadalign;
169
170
/* Always 4 dwords of embedded IV for AEAD modes */
171
cdesc->control_data.options |= EIP197_OPTION_4_TOKEN_IV_CMD;
172
173
if (direction == SAFEXCEL_DECRYPT)
174
cryptlen -= digestsize;
175
176
if (unlikely(ctx->xcm == EIP197_XCM_MODE_CCM)) {
177
/* Construct IV block B0 for the CBC-MAC */
178
u8 *final_iv = (u8 *)cdesc->control_data.token;
179
u8 *cbcmaciv = (u8 *)&atoken[1];
180
__le32 *aadlen = (__le32 *)&atoken[5];
181
182
if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP) {
183
/* Length + nonce */
184
cdesc->control_data.token[0] = ctx->nonce;
185
/* Fixup flags byte */
186
*(__le32 *)cbcmaciv =
187
cpu_to_le32(ctx->nonce |
188
((assocadj > 0) << 6) |
189
((digestsize - 2) << 2));
190
/* 64 bit IV part */
191
memcpy(&cdesc->control_data.token[1], iv, 8);
192
memcpy(cbcmaciv + 4, iv, 8);
193
/* Start counter at 0 */
194
cdesc->control_data.token[3] = 0;
195
/* Message length */
196
*(__be32 *)(cbcmaciv + 12) = cpu_to_be32(cryptlen);
197
} else {
198
/* Variable length IV part */
199
memcpy(final_iv, iv, 15 - iv[0]);
200
memcpy(cbcmaciv, iv, 15 - iv[0]);
201
/* Start variable length counter at 0 */
202
memset(final_iv + 15 - iv[0], 0, iv[0] + 1);
203
memset(cbcmaciv + 15 - iv[0], 0, iv[0] - 1);
204
/* fixup flags byte */
205
cbcmaciv[0] |= ((assocadj > 0) << 6) |
206
((digestsize - 2) << 2);
207
/* insert lower 2 bytes of message length */
208
cbcmaciv[14] = cryptlen >> 8;
209
cbcmaciv[15] = cryptlen & 255;
210
}
211
212
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT;
213
atoken->packet_length = AES_BLOCK_SIZE +
214
((assocadj > 0) << 1);
215
atoken->stat = 0;
216
atoken->instructions = EIP197_TOKEN_INS_ORIGIN_TOKEN |
217
EIP197_TOKEN_INS_TYPE_HASH;
218
219
if (likely(assocadj)) {
220
*aadlen = cpu_to_le32((assocadj >> 8) |
221
(assocadj & 255) << 8);
222
atoken += 6;
223
atoksize += 7;
224
} else {
225
atoken += 5;
226
atoksize += 6;
227
}
228
229
/* Process AAD data */
230
aadref = atoken;
231
atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION;
232
atoken->packet_length = assocadj;
233
atoken->stat = 0;
234
atoken->instructions = EIP197_TOKEN_INS_TYPE_HASH;
235
atoken++;
236
237
/* For CCM only, align AAD data towards hash engine */
238
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT;
239
aadalign = (assocadj + 2) & 15;
240
atoken->packet_length = assocadj && aadalign ?
241
16 - aadalign :
242
0;
243
if (likely(cryptlen)) {
244
atoken->stat = 0;
245
atoken->instructions = EIP197_TOKEN_INS_TYPE_HASH;
246
} else {
247
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH;
248
atoken->instructions = EIP197_TOKEN_INS_LAST |
249
EIP197_TOKEN_INS_TYPE_HASH;
250
}
251
} else {
252
safexcel_aead_iv(ctx, iv, cdesc);
253
254
/* Process AAD data */
255
aadref = atoken;
256
atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION;
257
atoken->packet_length = assocadj;
258
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH;
259
atoken->instructions = EIP197_TOKEN_INS_LAST |
260
EIP197_TOKEN_INS_TYPE_HASH;
261
}
262
atoken++;
263
264
if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP) {
265
/* For ESP mode (and not GMAC), skip over the IV */
266
atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION;
267
atoken->packet_length = EIP197_AEAD_IPSEC_IV_SIZE;
268
atoken->stat = 0;
269
atoken->instructions = 0;
270
atoken++;
271
atoksize++;
272
} else if (unlikely(ctx->alg == SAFEXCEL_CHACHA20 &&
273
direction == SAFEXCEL_DECRYPT)) {
274
/* Poly-chacha decryption needs a dummy NOP here ... */
275
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT;
276
atoken->packet_length = 16; /* According to Op Manual */
277
atoken->stat = 0;
278
atoken->instructions = 0;
279
atoken++;
280
atoksize++;
281
}
282
283
if (ctx->xcm) {
284
/* For GCM and CCM, obtain enc(Y0) */
285
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT_REMRES;
286
atoken->packet_length = 0;
287
atoken->stat = 0;
288
atoken->instructions = AES_BLOCK_SIZE;
289
atoken++;
290
291
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT;
292
atoken->packet_length = AES_BLOCK_SIZE;
293
atoken->stat = 0;
294
atoken->instructions = EIP197_TOKEN_INS_TYPE_OUTPUT |
295
EIP197_TOKEN_INS_TYPE_CRYPTO;
296
atoken++;
297
atoksize += 2;
298
}
299
300
if (likely(cryptlen || ctx->alg == SAFEXCEL_CHACHA20)) {
301
/* Fixup stat field for AAD direction instruction */
302
aadref->stat = 0;
303
304
/* Process crypto data */
305
atoken->opcode = EIP197_TOKEN_OPCODE_DIRECTION;
306
atoken->packet_length = cryptlen;
307
308
if (unlikely(ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP_GMAC)) {
309
/* Fixup instruction field for AAD dir instruction */
310
aadref->instructions = EIP197_TOKEN_INS_TYPE_HASH;
311
312
/* Do not send to crypt engine in case of GMAC */
313
atoken->instructions = EIP197_TOKEN_INS_LAST |
314
EIP197_TOKEN_INS_TYPE_HASH |
315
EIP197_TOKEN_INS_TYPE_OUTPUT;
316
} else {
317
atoken->instructions = EIP197_TOKEN_INS_LAST |
318
EIP197_TOKEN_INS_TYPE_CRYPTO |
319
EIP197_TOKEN_INS_TYPE_HASH |
320
EIP197_TOKEN_INS_TYPE_OUTPUT;
321
}
322
323
cryptlen &= 15;
324
if (unlikely(ctx->xcm == EIP197_XCM_MODE_CCM && cryptlen)) {
325
atoken->stat = 0;
326
/* For CCM only, pad crypto data to the hash engine */
327
atoken++;
328
atoksize++;
329
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT;
330
atoken->packet_length = 16 - cryptlen;
331
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH;
332
atoken->instructions = EIP197_TOKEN_INS_TYPE_HASH;
333
} else {
334
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH;
335
}
336
atoken++;
337
atoksize++;
338
}
339
340
if (direction == SAFEXCEL_ENCRYPT) {
341
/* Append ICV */
342
atoken->opcode = EIP197_TOKEN_OPCODE_INSERT;
343
atoken->packet_length = digestsize;
344
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH |
345
EIP197_TOKEN_STAT_LAST_PACKET;
346
atoken->instructions = EIP197_TOKEN_INS_TYPE_OUTPUT |
347
EIP197_TOKEN_INS_INSERT_HASH_DIGEST;
348
} else {
349
/* Extract ICV */
350
atoken->opcode = EIP197_TOKEN_OPCODE_RETRIEVE;
351
atoken->packet_length = digestsize;
352
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH |
353
EIP197_TOKEN_STAT_LAST_PACKET;
354
atoken->instructions = EIP197_TOKEN_INS_INSERT_HASH_DIGEST;
355
atoken++;
356
atoksize++;
357
358
/* Verify ICV */
359
atoken->opcode = EIP197_TOKEN_OPCODE_VERIFY;
360
atoken->packet_length = digestsize |
361
EIP197_TOKEN_HASH_RESULT_VERIFY;
362
atoken->stat = EIP197_TOKEN_STAT_LAST_HASH |
363
EIP197_TOKEN_STAT_LAST_PACKET;
364
atoken->instructions = EIP197_TOKEN_INS_TYPE_OUTPUT;
365
}
366
367
/* Fixup length of the token in the command descriptor */
368
cdesc->additional_cdata_size = atoksize;
369
}
370
371
static int safexcel_skcipher_aes_setkey(struct crypto_skcipher *ctfm,
372
const u8 *key, unsigned int len)
373
{
374
struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
375
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
376
struct safexcel_crypto_priv *priv = ctx->base.priv;
377
struct crypto_aes_ctx aes;
378
int ret, i;
379
380
ret = aes_expandkey(&aes, key, len);
381
if (ret)
382
return ret;
383
384
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
385
for (i = 0; i < len / sizeof(u32); i++) {
386
if (le32_to_cpu(ctx->key[i]) != aes.key_enc[i]) {
387
ctx->base.needs_inv = true;
388
break;
389
}
390
}
391
}
392
393
for (i = 0; i < len / sizeof(u32); i++)
394
ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
395
396
ctx->key_len = len;
397
398
memzero_explicit(&aes, sizeof(aes));
399
return 0;
400
}
401
402
static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
403
unsigned int len)
404
{
405
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
406
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
407
struct safexcel_crypto_priv *priv = ctx->base.priv;
408
struct crypto_authenc_keys keys;
409
struct crypto_aes_ctx aes;
410
int err = -EINVAL, i;
411
const char *alg;
412
413
if (unlikely(crypto_authenc_extractkeys(&keys, key, len)))
414
goto badkey;
415
416
if (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD) {
417
/* Must have at least space for the nonce here */
418
if (unlikely(keys.enckeylen < CTR_RFC3686_NONCE_SIZE))
419
goto badkey;
420
/* last 4 bytes of key are the nonce! */
421
ctx->nonce = *(u32 *)(keys.enckey + keys.enckeylen -
422
CTR_RFC3686_NONCE_SIZE);
423
/* exclude the nonce here */
424
keys.enckeylen -= CTR_RFC3686_NONCE_SIZE;
425
}
426
427
/* Encryption key */
428
switch (ctx->alg) {
429
case SAFEXCEL_DES:
430
err = verify_aead_des_key(ctfm, keys.enckey, keys.enckeylen);
431
if (unlikely(err))
432
goto badkey;
433
break;
434
case SAFEXCEL_3DES:
435
err = verify_aead_des3_key(ctfm, keys.enckey, keys.enckeylen);
436
if (unlikely(err))
437
goto badkey;
438
break;
439
case SAFEXCEL_AES:
440
err = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
441
if (unlikely(err))
442
goto badkey;
443
break;
444
case SAFEXCEL_SM4:
445
if (unlikely(keys.enckeylen != SM4_KEY_SIZE))
446
goto badkey;
447
break;
448
default:
449
dev_err(priv->dev, "aead: unsupported cipher algorithm\n");
450
goto badkey;
451
}
452
453
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
454
for (i = 0; i < keys.enckeylen / sizeof(u32); i++) {
455
if (le32_to_cpu(ctx->key[i]) !=
456
((u32 *)keys.enckey)[i]) {
457
ctx->base.needs_inv = true;
458
break;
459
}
460
}
461
}
462
463
/* Auth key */
464
switch (ctx->hash_alg) {
465
case CONTEXT_CONTROL_CRYPTO_ALG_SHA1:
466
alg = "safexcel-sha1";
467
break;
468
case CONTEXT_CONTROL_CRYPTO_ALG_SHA224:
469
alg = "safexcel-sha224";
470
break;
471
case CONTEXT_CONTROL_CRYPTO_ALG_SHA256:
472
alg = "safexcel-sha256";
473
break;
474
case CONTEXT_CONTROL_CRYPTO_ALG_SHA384:
475
alg = "safexcel-sha384";
476
break;
477
case CONTEXT_CONTROL_CRYPTO_ALG_SHA512:
478
alg = "safexcel-sha512";
479
break;
480
case CONTEXT_CONTROL_CRYPTO_ALG_SM3:
481
alg = "safexcel-sm3";
482
break;
483
default:
484
dev_err(priv->dev, "aead: unsupported hash algorithm\n");
485
goto badkey;
486
}
487
488
if (safexcel_hmac_setkey(&ctx->base, keys.authkey, keys.authkeylen,
489
alg, ctx->state_sz))
490
goto badkey;
491
492
/* Now copy the keys into the context */
493
for (i = 0; i < keys.enckeylen / sizeof(u32); i++)
494
ctx->key[i] = cpu_to_le32(((u32 *)keys.enckey)[i]);
495
ctx->key_len = keys.enckeylen;
496
497
memzero_explicit(&keys, sizeof(keys));
498
return 0;
499
500
badkey:
501
memzero_explicit(&keys, sizeof(keys));
502
return err;
503
}
504
505
static int safexcel_context_control(struct safexcel_cipher_ctx *ctx,
506
struct crypto_async_request *async,
507
struct safexcel_cipher_req *sreq,
508
struct safexcel_command_desc *cdesc)
509
{
510
struct safexcel_crypto_priv *priv = ctx->base.priv;
511
int ctrl_size = ctx->key_len / sizeof(u32);
512
513
cdesc->control_data.control1 = ctx->mode;
514
515
if (ctx->aead) {
516
/* Take in account the ipad+opad digests */
517
if (ctx->xcm) {
518
ctrl_size += ctx->state_sz / sizeof(u32);
519
cdesc->control_data.control0 =
520
CONTEXT_CONTROL_KEY_EN |
521
CONTEXT_CONTROL_DIGEST_XCM |
522
ctx->hash_alg |
523
CONTEXT_CONTROL_SIZE(ctrl_size);
524
} else if (ctx->alg == SAFEXCEL_CHACHA20) {
525
/* Chacha20-Poly1305 */
526
cdesc->control_data.control0 =
527
CONTEXT_CONTROL_KEY_EN |
528
CONTEXT_CONTROL_CRYPTO_ALG_CHACHA20 |
529
(sreq->direction == SAFEXCEL_ENCRYPT ?
530
CONTEXT_CONTROL_TYPE_ENCRYPT_HASH_OUT :
531
CONTEXT_CONTROL_TYPE_HASH_DECRYPT_IN) |
532
ctx->hash_alg |
533
CONTEXT_CONTROL_SIZE(ctrl_size);
534
return 0;
535
} else {
536
ctrl_size += ctx->state_sz / sizeof(u32) * 2;
537
cdesc->control_data.control0 =
538
CONTEXT_CONTROL_KEY_EN |
539
CONTEXT_CONTROL_DIGEST_HMAC |
540
ctx->hash_alg |
541
CONTEXT_CONTROL_SIZE(ctrl_size);
542
}
543
544
if (sreq->direction == SAFEXCEL_ENCRYPT &&
545
(ctx->xcm == EIP197_XCM_MODE_CCM ||
546
ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP_GMAC))
547
cdesc->control_data.control0 |=
548
CONTEXT_CONTROL_TYPE_HASH_ENCRYPT_OUT;
549
else if (sreq->direction == SAFEXCEL_ENCRYPT)
550
cdesc->control_data.control0 |=
551
CONTEXT_CONTROL_TYPE_ENCRYPT_HASH_OUT;
552
else if (ctx->xcm == EIP197_XCM_MODE_CCM)
553
cdesc->control_data.control0 |=
554
CONTEXT_CONTROL_TYPE_DECRYPT_HASH_IN;
555
else
556
cdesc->control_data.control0 |=
557
CONTEXT_CONTROL_TYPE_HASH_DECRYPT_IN;
558
} else {
559
if (sreq->direction == SAFEXCEL_ENCRYPT)
560
cdesc->control_data.control0 =
561
CONTEXT_CONTROL_TYPE_CRYPTO_OUT |
562
CONTEXT_CONTROL_KEY_EN |
563
CONTEXT_CONTROL_SIZE(ctrl_size);
564
else
565
cdesc->control_data.control0 =
566
CONTEXT_CONTROL_TYPE_CRYPTO_IN |
567
CONTEXT_CONTROL_KEY_EN |
568
CONTEXT_CONTROL_SIZE(ctrl_size);
569
}
570
571
if (ctx->alg == SAFEXCEL_DES) {
572
cdesc->control_data.control0 |=
573
CONTEXT_CONTROL_CRYPTO_ALG_DES;
574
} else if (ctx->alg == SAFEXCEL_3DES) {
575
cdesc->control_data.control0 |=
576
CONTEXT_CONTROL_CRYPTO_ALG_3DES;
577
} else if (ctx->alg == SAFEXCEL_AES) {
578
switch (ctx->key_len >> ctx->xts) {
579
case AES_KEYSIZE_128:
580
cdesc->control_data.control0 |=
581
CONTEXT_CONTROL_CRYPTO_ALG_AES128;
582
break;
583
case AES_KEYSIZE_192:
584
cdesc->control_data.control0 |=
585
CONTEXT_CONTROL_CRYPTO_ALG_AES192;
586
break;
587
case AES_KEYSIZE_256:
588
cdesc->control_data.control0 |=
589
CONTEXT_CONTROL_CRYPTO_ALG_AES256;
590
break;
591
default:
592
dev_err(priv->dev, "aes keysize not supported: %u\n",
593
ctx->key_len >> ctx->xts);
594
return -EINVAL;
595
}
596
} else if (ctx->alg == SAFEXCEL_CHACHA20) {
597
cdesc->control_data.control0 |=
598
CONTEXT_CONTROL_CRYPTO_ALG_CHACHA20;
599
} else if (ctx->alg == SAFEXCEL_SM4) {
600
cdesc->control_data.control0 |=
601
CONTEXT_CONTROL_CRYPTO_ALG_SM4;
602
}
603
604
return 0;
605
}
606
607
static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int ring,
608
struct crypto_async_request *async,
609
struct scatterlist *src,
610
struct scatterlist *dst,
611
unsigned int cryptlen,
612
struct safexcel_cipher_req *sreq,
613
bool *should_complete, int *ret)
614
{
615
struct skcipher_request *areq = skcipher_request_cast(async);
616
struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(areq);
617
struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(skcipher);
618
struct safexcel_result_desc *rdesc;
619
int ndesc = 0;
620
621
*ret = 0;
622
623
if (unlikely(!sreq->rdescs))
624
return 0;
625
626
while (sreq->rdescs--) {
627
rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr);
628
if (IS_ERR(rdesc)) {
629
dev_err(priv->dev,
630
"cipher: result: could not retrieve the result descriptor\n");
631
*ret = PTR_ERR(rdesc);
632
break;
633
}
634
635
if (likely(!*ret))
636
*ret = safexcel_rdesc_check_errors(priv, rdesc);
637
638
ndesc++;
639
}
640
641
safexcel_complete(priv, ring);
642
643
if (src == dst) {
644
if (sreq->nr_src > 0)
645
dma_unmap_sg(priv->dev, src, sreq->nr_src,
646
DMA_BIDIRECTIONAL);
647
} else {
648
if (sreq->nr_src > 0)
649
dma_unmap_sg(priv->dev, src, sreq->nr_src,
650
DMA_TO_DEVICE);
651
if (sreq->nr_dst > 0)
652
dma_unmap_sg(priv->dev, dst, sreq->nr_dst,
653
DMA_FROM_DEVICE);
654
}
655
656
/*
657
* Update IV in req from last crypto output word for CBC modes
658
*/
659
if ((!ctx->aead) && (ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CBC) &&
660
(sreq->direction == SAFEXCEL_ENCRYPT)) {
661
/* For encrypt take the last output word */
662
sg_pcopy_to_buffer(dst, sreq->nr_dst, areq->iv,
663
crypto_skcipher_ivsize(skcipher),
664
(cryptlen -
665
crypto_skcipher_ivsize(skcipher)));
666
}
667
668
*should_complete = true;
669
670
return ndesc;
671
}
672
673
static int safexcel_send_req(struct crypto_async_request *base, int ring,
674
struct safexcel_cipher_req *sreq,
675
struct scatterlist *src, struct scatterlist *dst,
676
unsigned int cryptlen, unsigned int assoclen,
677
unsigned int digestsize, u8 *iv, int *commands,
678
int *results)
679
{
680
struct skcipher_request *areq = skcipher_request_cast(base);
681
struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(areq);
682
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm);
683
struct safexcel_crypto_priv *priv = ctx->base.priv;
684
struct safexcel_command_desc *cdesc;
685
struct safexcel_command_desc *first_cdesc = NULL;
686
struct safexcel_result_desc *rdesc, *first_rdesc = NULL;
687
struct scatterlist *sg;
688
unsigned int totlen;
689
unsigned int totlen_src = cryptlen + assoclen;
690
unsigned int totlen_dst = totlen_src;
691
struct safexcel_token *atoken;
692
int n_cdesc = 0, n_rdesc = 0;
693
int queued, i, ret = 0;
694
bool first = true;
695
696
sreq->nr_src = sg_nents_for_len(src, totlen_src);
697
698
if (ctx->aead) {
699
/*
700
* AEAD has auth tag appended to output for encrypt and
701
* removed from the output for decrypt!
702
*/
703
if (sreq->direction == SAFEXCEL_DECRYPT)
704
totlen_dst -= digestsize;
705
else
706
totlen_dst += digestsize;
707
708
memcpy(ctx->base.ctxr->data + ctx->key_len / sizeof(u32),
709
&ctx->base.ipad, ctx->state_sz);
710
if (!ctx->xcm)
711
memcpy(ctx->base.ctxr->data + (ctx->key_len +
712
ctx->state_sz) / sizeof(u32), &ctx->base.opad,
713
ctx->state_sz);
714
} else if ((ctx->mode == CONTEXT_CONTROL_CRYPTO_MODE_CBC) &&
715
(sreq->direction == SAFEXCEL_DECRYPT)) {
716
/*
717
* Save IV from last crypto input word for CBC modes in decrypt
718
* direction. Need to do this first in case of inplace operation
719
* as it will be overwritten.
720
*/
721
sg_pcopy_to_buffer(src, sreq->nr_src, areq->iv,
722
crypto_skcipher_ivsize(skcipher),
723
(totlen_src -
724
crypto_skcipher_ivsize(skcipher)));
725
}
726
727
sreq->nr_dst = sg_nents_for_len(dst, totlen_dst);
728
729
/*
730
* Remember actual input length, source buffer length may be
731
* updated in case of inline operation below.
732
*/
733
totlen = totlen_src;
734
queued = totlen_src;
735
736
if (src == dst) {
737
sreq->nr_src = max(sreq->nr_src, sreq->nr_dst);
738
sreq->nr_dst = sreq->nr_src;
739
if (unlikely((totlen_src || totlen_dst) &&
740
(sreq->nr_src <= 0))) {
741
dev_err(priv->dev, "In-place buffer not large enough (need %d bytes)!",
742
max(totlen_src, totlen_dst));
743
return -EINVAL;
744
}
745
if (sreq->nr_src > 0 &&
746
!dma_map_sg(priv->dev, src, sreq->nr_src, DMA_BIDIRECTIONAL))
747
return -EIO;
748
} else {
749
if (unlikely(totlen_src && (sreq->nr_src <= 0))) {
750
dev_err(priv->dev, "Source buffer not large enough (need %d bytes)!",
751
totlen_src);
752
return -EINVAL;
753
}
754
755
if (sreq->nr_src > 0 &&
756
!dma_map_sg(priv->dev, src, sreq->nr_src, DMA_TO_DEVICE))
757
return -EIO;
758
759
if (unlikely(totlen_dst && (sreq->nr_dst <= 0))) {
760
dev_err(priv->dev, "Dest buffer not large enough (need %d bytes)!",
761
totlen_dst);
762
ret = -EINVAL;
763
goto unmap;
764
}
765
766
if (sreq->nr_dst > 0 &&
767
!dma_map_sg(priv->dev, dst, sreq->nr_dst, DMA_FROM_DEVICE)) {
768
ret = -EIO;
769
goto unmap;
770
}
771
}
772
773
memcpy(ctx->base.ctxr->data, ctx->key, ctx->key_len);
774
775
if (!totlen) {
776
/*
777
* The EIP97 cannot deal with zero length input packets!
778
* So stuff a dummy command descriptor indicating a 1 byte
779
* (dummy) input packet, using the context record as source.
780
*/
781
first_cdesc = safexcel_add_cdesc(priv, ring,
782
1, 1, ctx->base.ctxr_dma,
783
1, 1, ctx->base.ctxr_dma,
784
&atoken);
785
if (IS_ERR(first_cdesc)) {
786
/* No space left in the command descriptor ring */
787
ret = PTR_ERR(first_cdesc);
788
goto cdesc_rollback;
789
}
790
n_cdesc = 1;
791
goto skip_cdesc;
792
}
793
794
/* command descriptors */
795
for_each_sg(src, sg, sreq->nr_src, i) {
796
int len = sg_dma_len(sg);
797
798
/* Do not overflow the request */
799
if (queued < len)
800
len = queued;
801
802
cdesc = safexcel_add_cdesc(priv, ring, !n_cdesc,
803
!(queued - len),
804
sg_dma_address(sg), len, totlen,
805
ctx->base.ctxr_dma, &atoken);
806
if (IS_ERR(cdesc)) {
807
/* No space left in the command descriptor ring */
808
ret = PTR_ERR(cdesc);
809
goto cdesc_rollback;
810
}
811
812
if (!n_cdesc)
813
first_cdesc = cdesc;
814
815
n_cdesc++;
816
queued -= len;
817
if (!queued)
818
break;
819
}
820
skip_cdesc:
821
/* Add context control words and token to first command descriptor */
822
safexcel_context_control(ctx, base, sreq, first_cdesc);
823
if (ctx->aead)
824
safexcel_aead_token(ctx, iv, first_cdesc, atoken,
825
sreq->direction, cryptlen,
826
assoclen, digestsize);
827
else
828
safexcel_skcipher_token(ctx, iv, first_cdesc, atoken,
829
cryptlen);
830
831
/* result descriptors */
832
for_each_sg(dst, sg, sreq->nr_dst, i) {
833
bool last = (i == sreq->nr_dst - 1);
834
u32 len = sg_dma_len(sg);
835
836
/* only allow the part of the buffer we know we need */
837
if (len > totlen_dst)
838
len = totlen_dst;
839
if (unlikely(!len))
840
break;
841
totlen_dst -= len;
842
843
/* skip over AAD space in buffer - not written */
844
if (assoclen) {
845
if (assoclen >= len) {
846
assoclen -= len;
847
continue;
848
}
849
rdesc = safexcel_add_rdesc(priv, ring, first, last,
850
sg_dma_address(sg) +
851
assoclen,
852
len - assoclen);
853
assoclen = 0;
854
} else {
855
rdesc = safexcel_add_rdesc(priv, ring, first, last,
856
sg_dma_address(sg),
857
len);
858
}
859
if (IS_ERR(rdesc)) {
860
/* No space left in the result descriptor ring */
861
ret = PTR_ERR(rdesc);
862
goto rdesc_rollback;
863
}
864
if (first) {
865
first_rdesc = rdesc;
866
first = false;
867
}
868
n_rdesc++;
869
}
870
871
if (unlikely(first)) {
872
/*
873
* Special case: AEAD decrypt with only AAD data.
874
* In this case there is NO output data from the engine,
875
* but the engine still needs a result descriptor!
876
* Create a dummy one just for catching the result token.
877
*/
878
rdesc = safexcel_add_rdesc(priv, ring, true, true, 0, 0);
879
if (IS_ERR(rdesc)) {
880
/* No space left in the result descriptor ring */
881
ret = PTR_ERR(rdesc);
882
goto rdesc_rollback;
883
}
884
first_rdesc = rdesc;
885
n_rdesc = 1;
886
}
887
888
safexcel_rdr_req_set(priv, ring, first_rdesc, base);
889
890
*commands = n_cdesc;
891
*results = n_rdesc;
892
return 0;
893
894
rdesc_rollback:
895
for (i = 0; i < n_rdesc; i++)
896
safexcel_ring_rollback_wptr(priv, &priv->ring[ring].rdr);
897
cdesc_rollback:
898
for (i = 0; i < n_cdesc; i++)
899
safexcel_ring_rollback_wptr(priv, &priv->ring[ring].cdr);
900
unmap:
901
if (src == dst) {
902
if (sreq->nr_src > 0)
903
dma_unmap_sg(priv->dev, src, sreq->nr_src,
904
DMA_BIDIRECTIONAL);
905
} else {
906
if (sreq->nr_src > 0)
907
dma_unmap_sg(priv->dev, src, sreq->nr_src,
908
DMA_TO_DEVICE);
909
if (sreq->nr_dst > 0)
910
dma_unmap_sg(priv->dev, dst, sreq->nr_dst,
911
DMA_FROM_DEVICE);
912
}
913
914
return ret;
915
}
916
917
static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv,
918
int ring,
919
struct crypto_async_request *base,
920
struct safexcel_cipher_req *sreq,
921
bool *should_complete, int *ret)
922
{
923
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm);
924
struct safexcel_result_desc *rdesc;
925
int ndesc = 0, enq_ret;
926
927
*ret = 0;
928
929
if (unlikely(!sreq->rdescs))
930
return 0;
931
932
while (sreq->rdescs--) {
933
rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr);
934
if (IS_ERR(rdesc)) {
935
dev_err(priv->dev,
936
"cipher: invalidate: could not retrieve the result descriptor\n");
937
*ret = PTR_ERR(rdesc);
938
break;
939
}
940
941
if (likely(!*ret))
942
*ret = safexcel_rdesc_check_errors(priv, rdesc);
943
944
ndesc++;
945
}
946
947
safexcel_complete(priv, ring);
948
949
if (ctx->base.exit_inv) {
950
dma_pool_free(priv->context_pool, ctx->base.ctxr,
951
ctx->base.ctxr_dma);
952
953
*should_complete = true;
954
955
return ndesc;
956
}
957
958
ring = safexcel_select_ring(priv);
959
ctx->base.ring = ring;
960
961
spin_lock_bh(&priv->ring[ring].queue_lock);
962
enq_ret = crypto_enqueue_request(&priv->ring[ring].queue, base);
963
spin_unlock_bh(&priv->ring[ring].queue_lock);
964
965
if (enq_ret != -EINPROGRESS)
966
*ret = enq_ret;
967
968
queue_work(priv->ring[ring].workqueue,
969
&priv->ring[ring].work_data.work);
970
971
*should_complete = false;
972
973
return ndesc;
974
}
975
976
static int safexcel_skcipher_handle_result(struct safexcel_crypto_priv *priv,
977
int ring,
978
struct crypto_async_request *async,
979
bool *should_complete, int *ret)
980
{
981
struct skcipher_request *req = skcipher_request_cast(async);
982
struct safexcel_cipher_req *sreq = skcipher_request_ctx(req);
983
int err;
984
985
if (sreq->needs_inv) {
986
sreq->needs_inv = false;
987
err = safexcel_handle_inv_result(priv, ring, async, sreq,
988
should_complete, ret);
989
} else {
990
err = safexcel_handle_req_result(priv, ring, async, req->src,
991
req->dst, req->cryptlen, sreq,
992
should_complete, ret);
993
}
994
995
return err;
996
}
997
998
static int safexcel_aead_handle_result(struct safexcel_crypto_priv *priv,
999
int ring,
1000
struct crypto_async_request *async,
1001
bool *should_complete, int *ret)
1002
{
1003
struct aead_request *req = aead_request_cast(async);
1004
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1005
struct safexcel_cipher_req *sreq = aead_request_ctx(req);
1006
int err;
1007
1008
if (sreq->needs_inv) {
1009
sreq->needs_inv = false;
1010
err = safexcel_handle_inv_result(priv, ring, async, sreq,
1011
should_complete, ret);
1012
} else {
1013
err = safexcel_handle_req_result(priv, ring, async, req->src,
1014
req->dst,
1015
req->cryptlen + crypto_aead_authsize(tfm),
1016
sreq, should_complete, ret);
1017
}
1018
1019
return err;
1020
}
1021
1022
static int safexcel_cipher_send_inv(struct crypto_async_request *base,
1023
int ring, int *commands, int *results)
1024
{
1025
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm);
1026
struct safexcel_crypto_priv *priv = ctx->base.priv;
1027
int ret;
1028
1029
ret = safexcel_invalidate_cache(base, priv, ctx->base.ctxr_dma, ring);
1030
if (unlikely(ret))
1031
return ret;
1032
1033
*commands = 1;
1034
*results = 1;
1035
1036
return 0;
1037
}
1038
1039
static int safexcel_skcipher_send(struct crypto_async_request *async, int ring,
1040
int *commands, int *results)
1041
{
1042
struct skcipher_request *req = skcipher_request_cast(async);
1043
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
1044
struct safexcel_cipher_req *sreq = skcipher_request_ctx(req);
1045
struct safexcel_crypto_priv *priv = ctx->base.priv;
1046
int ret;
1047
1048
BUG_ON(!(priv->flags & EIP197_TRC_CACHE) && sreq->needs_inv);
1049
1050
if (sreq->needs_inv) {
1051
ret = safexcel_cipher_send_inv(async, ring, commands, results);
1052
} else {
1053
struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
1054
u8 input_iv[AES_BLOCK_SIZE];
1055
1056
/*
1057
* Save input IV in case of CBC decrypt mode
1058
* Will be overwritten with output IV prior to use!
1059
*/
1060
memcpy(input_iv, req->iv, crypto_skcipher_ivsize(skcipher));
1061
1062
ret = safexcel_send_req(async, ring, sreq, req->src,
1063
req->dst, req->cryptlen, 0, 0, input_iv,
1064
commands, results);
1065
}
1066
1067
sreq->rdescs = *results;
1068
return ret;
1069
}
1070
1071
static int safexcel_aead_send(struct crypto_async_request *async, int ring,
1072
int *commands, int *results)
1073
{
1074
struct aead_request *req = aead_request_cast(async);
1075
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1076
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
1077
struct safexcel_cipher_req *sreq = aead_request_ctx(req);
1078
struct safexcel_crypto_priv *priv = ctx->base.priv;
1079
int ret;
1080
1081
BUG_ON(!(priv->flags & EIP197_TRC_CACHE) && sreq->needs_inv);
1082
1083
if (sreq->needs_inv)
1084
ret = safexcel_cipher_send_inv(async, ring, commands, results);
1085
else
1086
ret = safexcel_send_req(async, ring, sreq, req->src, req->dst,
1087
req->cryptlen, req->assoclen,
1088
crypto_aead_authsize(tfm), req->iv,
1089
commands, results);
1090
sreq->rdescs = *results;
1091
return ret;
1092
}
1093
1094
static int safexcel_cipher_exit_inv(struct crypto_tfm *tfm,
1095
struct crypto_async_request *base,
1096
struct safexcel_cipher_req *sreq,
1097
struct crypto_wait *result)
1098
{
1099
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1100
struct safexcel_crypto_priv *priv = ctx->base.priv;
1101
int ring = ctx->base.ring;
1102
int err;
1103
1104
ctx = crypto_tfm_ctx(base->tfm);
1105
ctx->base.exit_inv = true;
1106
sreq->needs_inv = true;
1107
1108
spin_lock_bh(&priv->ring[ring].queue_lock);
1109
crypto_enqueue_request(&priv->ring[ring].queue, base);
1110
spin_unlock_bh(&priv->ring[ring].queue_lock);
1111
1112
queue_work(priv->ring[ring].workqueue,
1113
&priv->ring[ring].work_data.work);
1114
1115
err = crypto_wait_req(-EINPROGRESS, result);
1116
1117
if (err) {
1118
dev_warn(priv->dev,
1119
"cipher: sync: invalidate: completion error %d\n",
1120
err);
1121
return err;
1122
}
1123
1124
return 0;
1125
}
1126
1127
static int safexcel_skcipher_exit_inv(struct crypto_tfm *tfm)
1128
{
1129
EIP197_REQUEST_ON_STACK(req, skcipher, EIP197_SKCIPHER_REQ_SIZE);
1130
struct safexcel_cipher_req *sreq = skcipher_request_ctx(req);
1131
DECLARE_CRYPTO_WAIT(result);
1132
1133
memset(req, 0, sizeof(struct skcipher_request));
1134
1135
skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1136
crypto_req_done, &result);
1137
skcipher_request_set_tfm(req, __crypto_skcipher_cast(tfm));
1138
1139
return safexcel_cipher_exit_inv(tfm, &req->base, sreq, &result);
1140
}
1141
1142
static int safexcel_aead_exit_inv(struct crypto_tfm *tfm)
1143
{
1144
EIP197_REQUEST_ON_STACK(req, aead, EIP197_AEAD_REQ_SIZE);
1145
struct safexcel_cipher_req *sreq = aead_request_ctx(req);
1146
DECLARE_CRYPTO_WAIT(result);
1147
1148
memset(req, 0, sizeof(struct aead_request));
1149
1150
aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1151
crypto_req_done, &result);
1152
aead_request_set_tfm(req, __crypto_aead_cast(tfm));
1153
1154
return safexcel_cipher_exit_inv(tfm, &req->base, sreq, &result);
1155
}
1156
1157
static int safexcel_queue_req(struct crypto_async_request *base,
1158
struct safexcel_cipher_req *sreq,
1159
enum safexcel_cipher_direction dir)
1160
{
1161
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm);
1162
struct safexcel_crypto_priv *priv = ctx->base.priv;
1163
int ret, ring;
1164
1165
sreq->needs_inv = false;
1166
sreq->direction = dir;
1167
1168
if (ctx->base.ctxr) {
1169
if (priv->flags & EIP197_TRC_CACHE && ctx->base.needs_inv) {
1170
sreq->needs_inv = true;
1171
ctx->base.needs_inv = false;
1172
}
1173
} else {
1174
ctx->base.ring = safexcel_select_ring(priv);
1175
ctx->base.ctxr = dma_pool_zalloc(priv->context_pool,
1176
EIP197_GFP_FLAGS(*base),
1177
&ctx->base.ctxr_dma);
1178
if (!ctx->base.ctxr)
1179
return -ENOMEM;
1180
}
1181
1182
ring = ctx->base.ring;
1183
1184
spin_lock_bh(&priv->ring[ring].queue_lock);
1185
ret = crypto_enqueue_request(&priv->ring[ring].queue, base);
1186
spin_unlock_bh(&priv->ring[ring].queue_lock);
1187
1188
queue_work(priv->ring[ring].workqueue,
1189
&priv->ring[ring].work_data.work);
1190
1191
return ret;
1192
}
1193
1194
static int safexcel_encrypt(struct skcipher_request *req)
1195
{
1196
return safexcel_queue_req(&req->base, skcipher_request_ctx(req),
1197
SAFEXCEL_ENCRYPT);
1198
}
1199
1200
static int safexcel_decrypt(struct skcipher_request *req)
1201
{
1202
return safexcel_queue_req(&req->base, skcipher_request_ctx(req),
1203
SAFEXCEL_DECRYPT);
1204
}
1205
1206
static int safexcel_skcipher_cra_init(struct crypto_tfm *tfm)
1207
{
1208
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1209
struct safexcel_alg_template *tmpl =
1210
container_of(tfm->__crt_alg, struct safexcel_alg_template,
1211
alg.skcipher.base);
1212
1213
crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm),
1214
sizeof(struct safexcel_cipher_req));
1215
1216
ctx->base.priv = tmpl->priv;
1217
1218
ctx->base.send = safexcel_skcipher_send;
1219
ctx->base.handle_result = safexcel_skcipher_handle_result;
1220
ctx->ivmask = EIP197_OPTION_4_TOKEN_IV_CMD;
1221
ctx->ctrinit = 1;
1222
return 0;
1223
}
1224
1225
static int safexcel_cipher_cra_exit(struct crypto_tfm *tfm)
1226
{
1227
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1228
1229
memzero_explicit(ctx->key, sizeof(ctx->key));
1230
1231
/* context not allocated, skip invalidation */
1232
if (!ctx->base.ctxr)
1233
return -ENOMEM;
1234
1235
memzero_explicit(ctx->base.ctxr->data, sizeof(ctx->base.ctxr->data));
1236
return 0;
1237
}
1238
1239
static void safexcel_skcipher_cra_exit(struct crypto_tfm *tfm)
1240
{
1241
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1242
struct safexcel_crypto_priv *priv = ctx->base.priv;
1243
int ret;
1244
1245
if (safexcel_cipher_cra_exit(tfm))
1246
return;
1247
1248
if (priv->flags & EIP197_TRC_CACHE) {
1249
ret = safexcel_skcipher_exit_inv(tfm);
1250
if (ret)
1251
dev_warn(priv->dev, "skcipher: invalidation error %d\n",
1252
ret);
1253
} else {
1254
dma_pool_free(priv->context_pool, ctx->base.ctxr,
1255
ctx->base.ctxr_dma);
1256
}
1257
}
1258
1259
static void safexcel_aead_cra_exit(struct crypto_tfm *tfm)
1260
{
1261
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1262
struct safexcel_crypto_priv *priv = ctx->base.priv;
1263
int ret;
1264
1265
if (safexcel_cipher_cra_exit(tfm))
1266
return;
1267
1268
if (priv->flags & EIP197_TRC_CACHE) {
1269
ret = safexcel_aead_exit_inv(tfm);
1270
if (ret)
1271
dev_warn(priv->dev, "aead: invalidation error %d\n",
1272
ret);
1273
} else {
1274
dma_pool_free(priv->context_pool, ctx->base.ctxr,
1275
ctx->base.ctxr_dma);
1276
}
1277
}
1278
1279
static int safexcel_skcipher_aes_ecb_cra_init(struct crypto_tfm *tfm)
1280
{
1281
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1282
1283
safexcel_skcipher_cra_init(tfm);
1284
ctx->alg = SAFEXCEL_AES;
1285
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB;
1286
ctx->blocksz = 0;
1287
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1288
return 0;
1289
}
1290
1291
struct safexcel_alg_template safexcel_alg_ecb_aes = {
1292
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1293
.algo_mask = SAFEXCEL_ALG_AES,
1294
.alg.skcipher = {
1295
.setkey = safexcel_skcipher_aes_setkey,
1296
.encrypt = safexcel_encrypt,
1297
.decrypt = safexcel_decrypt,
1298
.min_keysize = AES_MIN_KEY_SIZE,
1299
.max_keysize = AES_MAX_KEY_SIZE,
1300
.base = {
1301
.cra_name = "ecb(aes)",
1302
.cra_driver_name = "safexcel-ecb-aes",
1303
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1304
.cra_flags = CRYPTO_ALG_ASYNC |
1305
CRYPTO_ALG_ALLOCATES_MEMORY |
1306
CRYPTO_ALG_KERN_DRIVER_ONLY,
1307
.cra_blocksize = AES_BLOCK_SIZE,
1308
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1309
.cra_alignmask = 0,
1310
.cra_init = safexcel_skcipher_aes_ecb_cra_init,
1311
.cra_exit = safexcel_skcipher_cra_exit,
1312
.cra_module = THIS_MODULE,
1313
},
1314
},
1315
};
1316
1317
static int safexcel_skcipher_aes_cbc_cra_init(struct crypto_tfm *tfm)
1318
{
1319
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1320
1321
safexcel_skcipher_cra_init(tfm);
1322
ctx->alg = SAFEXCEL_AES;
1323
ctx->blocksz = AES_BLOCK_SIZE;
1324
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;
1325
return 0;
1326
}
1327
1328
struct safexcel_alg_template safexcel_alg_cbc_aes = {
1329
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1330
.algo_mask = SAFEXCEL_ALG_AES,
1331
.alg.skcipher = {
1332
.setkey = safexcel_skcipher_aes_setkey,
1333
.encrypt = safexcel_encrypt,
1334
.decrypt = safexcel_decrypt,
1335
.min_keysize = AES_MIN_KEY_SIZE,
1336
.max_keysize = AES_MAX_KEY_SIZE,
1337
.ivsize = AES_BLOCK_SIZE,
1338
.base = {
1339
.cra_name = "cbc(aes)",
1340
.cra_driver_name = "safexcel-cbc-aes",
1341
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1342
.cra_flags = CRYPTO_ALG_ASYNC |
1343
CRYPTO_ALG_ALLOCATES_MEMORY |
1344
CRYPTO_ALG_KERN_DRIVER_ONLY,
1345
.cra_blocksize = AES_BLOCK_SIZE,
1346
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1347
.cra_alignmask = 0,
1348
.cra_init = safexcel_skcipher_aes_cbc_cra_init,
1349
.cra_exit = safexcel_skcipher_cra_exit,
1350
.cra_module = THIS_MODULE,
1351
},
1352
},
1353
};
1354
1355
static int safexcel_skcipher_aesctr_setkey(struct crypto_skcipher *ctfm,
1356
const u8 *key, unsigned int len)
1357
{
1358
struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
1359
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1360
struct safexcel_crypto_priv *priv = ctx->base.priv;
1361
struct crypto_aes_ctx aes;
1362
int ret, i;
1363
unsigned int keylen;
1364
1365
/* last 4 bytes of key are the nonce! */
1366
ctx->nonce = *(u32 *)(key + len - CTR_RFC3686_NONCE_SIZE);
1367
/* exclude the nonce here */
1368
keylen = len - CTR_RFC3686_NONCE_SIZE;
1369
ret = aes_expandkey(&aes, key, keylen);
1370
if (ret)
1371
return ret;
1372
1373
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
1374
for (i = 0; i < keylen / sizeof(u32); i++) {
1375
if (le32_to_cpu(ctx->key[i]) != aes.key_enc[i]) {
1376
ctx->base.needs_inv = true;
1377
break;
1378
}
1379
}
1380
}
1381
1382
for (i = 0; i < keylen / sizeof(u32); i++)
1383
ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
1384
1385
ctx->key_len = keylen;
1386
1387
memzero_explicit(&aes, sizeof(aes));
1388
return 0;
1389
}
1390
1391
static int safexcel_skcipher_aes_ctr_cra_init(struct crypto_tfm *tfm)
1392
{
1393
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1394
1395
safexcel_skcipher_cra_init(tfm);
1396
ctx->alg = SAFEXCEL_AES;
1397
ctx->blocksz = AES_BLOCK_SIZE;
1398
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD;
1399
return 0;
1400
}
1401
1402
struct safexcel_alg_template safexcel_alg_ctr_aes = {
1403
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1404
.algo_mask = SAFEXCEL_ALG_AES,
1405
.alg.skcipher = {
1406
.setkey = safexcel_skcipher_aesctr_setkey,
1407
.encrypt = safexcel_encrypt,
1408
.decrypt = safexcel_decrypt,
1409
/* Add nonce size */
1410
.min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
1411
.max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
1412
.ivsize = CTR_RFC3686_IV_SIZE,
1413
.base = {
1414
.cra_name = "rfc3686(ctr(aes))",
1415
.cra_driver_name = "safexcel-ctr-aes",
1416
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1417
.cra_flags = CRYPTO_ALG_ASYNC |
1418
CRYPTO_ALG_ALLOCATES_MEMORY |
1419
CRYPTO_ALG_KERN_DRIVER_ONLY,
1420
.cra_blocksize = 1,
1421
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1422
.cra_alignmask = 0,
1423
.cra_init = safexcel_skcipher_aes_ctr_cra_init,
1424
.cra_exit = safexcel_skcipher_cra_exit,
1425
.cra_module = THIS_MODULE,
1426
},
1427
},
1428
};
1429
1430
static int safexcel_des_setkey(struct crypto_skcipher *ctfm, const u8 *key,
1431
unsigned int len)
1432
{
1433
struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
1434
struct safexcel_crypto_priv *priv = ctx->base.priv;
1435
int ret;
1436
1437
ret = verify_skcipher_des_key(ctfm, key);
1438
if (ret)
1439
return ret;
1440
1441
/* if context exits and key changed, need to invalidate it */
1442
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)
1443
if (memcmp(ctx->key, key, len))
1444
ctx->base.needs_inv = true;
1445
1446
memcpy(ctx->key, key, len);
1447
ctx->key_len = len;
1448
1449
return 0;
1450
}
1451
1452
static int safexcel_skcipher_des_cbc_cra_init(struct crypto_tfm *tfm)
1453
{
1454
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1455
1456
safexcel_skcipher_cra_init(tfm);
1457
ctx->alg = SAFEXCEL_DES;
1458
ctx->blocksz = DES_BLOCK_SIZE;
1459
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1460
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;
1461
return 0;
1462
}
1463
1464
struct safexcel_alg_template safexcel_alg_cbc_des = {
1465
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1466
.algo_mask = SAFEXCEL_ALG_DES,
1467
.alg.skcipher = {
1468
.setkey = safexcel_des_setkey,
1469
.encrypt = safexcel_encrypt,
1470
.decrypt = safexcel_decrypt,
1471
.min_keysize = DES_KEY_SIZE,
1472
.max_keysize = DES_KEY_SIZE,
1473
.ivsize = DES_BLOCK_SIZE,
1474
.base = {
1475
.cra_name = "cbc(des)",
1476
.cra_driver_name = "safexcel-cbc-des",
1477
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1478
.cra_flags = CRYPTO_ALG_ASYNC |
1479
CRYPTO_ALG_ALLOCATES_MEMORY |
1480
CRYPTO_ALG_KERN_DRIVER_ONLY,
1481
.cra_blocksize = DES_BLOCK_SIZE,
1482
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1483
.cra_alignmask = 0,
1484
.cra_init = safexcel_skcipher_des_cbc_cra_init,
1485
.cra_exit = safexcel_skcipher_cra_exit,
1486
.cra_module = THIS_MODULE,
1487
},
1488
},
1489
};
1490
1491
static int safexcel_skcipher_des_ecb_cra_init(struct crypto_tfm *tfm)
1492
{
1493
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1494
1495
safexcel_skcipher_cra_init(tfm);
1496
ctx->alg = SAFEXCEL_DES;
1497
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB;
1498
ctx->blocksz = 0;
1499
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1500
return 0;
1501
}
1502
1503
struct safexcel_alg_template safexcel_alg_ecb_des = {
1504
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1505
.algo_mask = SAFEXCEL_ALG_DES,
1506
.alg.skcipher = {
1507
.setkey = safexcel_des_setkey,
1508
.encrypt = safexcel_encrypt,
1509
.decrypt = safexcel_decrypt,
1510
.min_keysize = DES_KEY_SIZE,
1511
.max_keysize = DES_KEY_SIZE,
1512
.base = {
1513
.cra_name = "ecb(des)",
1514
.cra_driver_name = "safexcel-ecb-des",
1515
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1516
.cra_flags = CRYPTO_ALG_ASYNC |
1517
CRYPTO_ALG_ALLOCATES_MEMORY |
1518
CRYPTO_ALG_KERN_DRIVER_ONLY,
1519
.cra_blocksize = DES_BLOCK_SIZE,
1520
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1521
.cra_alignmask = 0,
1522
.cra_init = safexcel_skcipher_des_ecb_cra_init,
1523
.cra_exit = safexcel_skcipher_cra_exit,
1524
.cra_module = THIS_MODULE,
1525
},
1526
},
1527
};
1528
1529
static int safexcel_des3_ede_setkey(struct crypto_skcipher *ctfm,
1530
const u8 *key, unsigned int len)
1531
{
1532
struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
1533
struct safexcel_crypto_priv *priv = ctx->base.priv;
1534
int err;
1535
1536
err = verify_skcipher_des3_key(ctfm, key);
1537
if (err)
1538
return err;
1539
1540
/* if context exits and key changed, need to invalidate it */
1541
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)
1542
if (memcmp(ctx->key, key, len))
1543
ctx->base.needs_inv = true;
1544
1545
memcpy(ctx->key, key, len);
1546
ctx->key_len = len;
1547
1548
return 0;
1549
}
1550
1551
static int safexcel_skcipher_des3_cbc_cra_init(struct crypto_tfm *tfm)
1552
{
1553
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1554
1555
safexcel_skcipher_cra_init(tfm);
1556
ctx->alg = SAFEXCEL_3DES;
1557
ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1558
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1559
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;
1560
return 0;
1561
}
1562
1563
struct safexcel_alg_template safexcel_alg_cbc_des3_ede = {
1564
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1565
.algo_mask = SAFEXCEL_ALG_DES,
1566
.alg.skcipher = {
1567
.setkey = safexcel_des3_ede_setkey,
1568
.encrypt = safexcel_encrypt,
1569
.decrypt = safexcel_decrypt,
1570
.min_keysize = DES3_EDE_KEY_SIZE,
1571
.max_keysize = DES3_EDE_KEY_SIZE,
1572
.ivsize = DES3_EDE_BLOCK_SIZE,
1573
.base = {
1574
.cra_name = "cbc(des3_ede)",
1575
.cra_driver_name = "safexcel-cbc-des3_ede",
1576
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1577
.cra_flags = CRYPTO_ALG_ASYNC |
1578
CRYPTO_ALG_ALLOCATES_MEMORY |
1579
CRYPTO_ALG_KERN_DRIVER_ONLY,
1580
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1581
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1582
.cra_alignmask = 0,
1583
.cra_init = safexcel_skcipher_des3_cbc_cra_init,
1584
.cra_exit = safexcel_skcipher_cra_exit,
1585
.cra_module = THIS_MODULE,
1586
},
1587
},
1588
};
1589
1590
static int safexcel_skcipher_des3_ecb_cra_init(struct crypto_tfm *tfm)
1591
{
1592
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1593
1594
safexcel_skcipher_cra_init(tfm);
1595
ctx->alg = SAFEXCEL_3DES;
1596
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB;
1597
ctx->blocksz = 0;
1598
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1599
return 0;
1600
}
1601
1602
struct safexcel_alg_template safexcel_alg_ecb_des3_ede = {
1603
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
1604
.algo_mask = SAFEXCEL_ALG_DES,
1605
.alg.skcipher = {
1606
.setkey = safexcel_des3_ede_setkey,
1607
.encrypt = safexcel_encrypt,
1608
.decrypt = safexcel_decrypt,
1609
.min_keysize = DES3_EDE_KEY_SIZE,
1610
.max_keysize = DES3_EDE_KEY_SIZE,
1611
.base = {
1612
.cra_name = "ecb(des3_ede)",
1613
.cra_driver_name = "safexcel-ecb-des3_ede",
1614
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1615
.cra_flags = CRYPTO_ALG_ASYNC |
1616
CRYPTO_ALG_ALLOCATES_MEMORY |
1617
CRYPTO_ALG_KERN_DRIVER_ONLY,
1618
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1619
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1620
.cra_alignmask = 0,
1621
.cra_init = safexcel_skcipher_des3_ecb_cra_init,
1622
.cra_exit = safexcel_skcipher_cra_exit,
1623
.cra_module = THIS_MODULE,
1624
},
1625
},
1626
};
1627
1628
static int safexcel_aead_encrypt(struct aead_request *req)
1629
{
1630
struct safexcel_cipher_req *creq = aead_request_ctx(req);
1631
1632
return safexcel_queue_req(&req->base, creq, SAFEXCEL_ENCRYPT);
1633
}
1634
1635
static int safexcel_aead_decrypt(struct aead_request *req)
1636
{
1637
struct safexcel_cipher_req *creq = aead_request_ctx(req);
1638
1639
return safexcel_queue_req(&req->base, creq, SAFEXCEL_DECRYPT);
1640
}
1641
1642
static int safexcel_aead_cra_init(struct crypto_tfm *tfm)
1643
{
1644
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1645
struct safexcel_alg_template *tmpl =
1646
container_of(tfm->__crt_alg, struct safexcel_alg_template,
1647
alg.aead.base);
1648
1649
crypto_aead_set_reqsize(__crypto_aead_cast(tfm),
1650
sizeof(struct safexcel_cipher_req));
1651
1652
ctx->base.priv = tmpl->priv;
1653
1654
ctx->alg = SAFEXCEL_AES; /* default */
1655
ctx->blocksz = AES_BLOCK_SIZE;
1656
ctx->ivmask = EIP197_OPTION_4_TOKEN_IV_CMD;
1657
ctx->ctrinit = 1;
1658
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC; /* default */
1659
ctx->aead = true;
1660
ctx->base.send = safexcel_aead_send;
1661
ctx->base.handle_result = safexcel_aead_handle_result;
1662
return 0;
1663
}
1664
1665
static int safexcel_aead_sha1_cra_init(struct crypto_tfm *tfm)
1666
{
1667
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1668
1669
safexcel_aead_cra_init(tfm);
1670
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA1;
1671
ctx->state_sz = SHA1_DIGEST_SIZE;
1672
return 0;
1673
}
1674
1675
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_cbc_aes = {
1676
.type = SAFEXCEL_ALG_TYPE_AEAD,
1677
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA1,
1678
.alg.aead = {
1679
.setkey = safexcel_aead_setkey,
1680
.encrypt = safexcel_aead_encrypt,
1681
.decrypt = safexcel_aead_decrypt,
1682
.ivsize = AES_BLOCK_SIZE,
1683
.maxauthsize = SHA1_DIGEST_SIZE,
1684
.base = {
1685
.cra_name = "authenc(hmac(sha1),cbc(aes))",
1686
.cra_driver_name = "safexcel-authenc-hmac-sha1-cbc-aes",
1687
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1688
.cra_flags = CRYPTO_ALG_ASYNC |
1689
CRYPTO_ALG_ALLOCATES_MEMORY |
1690
CRYPTO_ALG_KERN_DRIVER_ONLY,
1691
.cra_blocksize = AES_BLOCK_SIZE,
1692
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1693
.cra_alignmask = 0,
1694
.cra_init = safexcel_aead_sha1_cra_init,
1695
.cra_exit = safexcel_aead_cra_exit,
1696
.cra_module = THIS_MODULE,
1697
},
1698
},
1699
};
1700
1701
static int safexcel_aead_sha256_cra_init(struct crypto_tfm *tfm)
1702
{
1703
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1704
1705
safexcel_aead_cra_init(tfm);
1706
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA256;
1707
ctx->state_sz = SHA256_DIGEST_SIZE;
1708
return 0;
1709
}
1710
1711
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_aes = {
1712
.type = SAFEXCEL_ALG_TYPE_AEAD,
1713
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_256,
1714
.alg.aead = {
1715
.setkey = safexcel_aead_setkey,
1716
.encrypt = safexcel_aead_encrypt,
1717
.decrypt = safexcel_aead_decrypt,
1718
.ivsize = AES_BLOCK_SIZE,
1719
.maxauthsize = SHA256_DIGEST_SIZE,
1720
.base = {
1721
.cra_name = "authenc(hmac(sha256),cbc(aes))",
1722
.cra_driver_name = "safexcel-authenc-hmac-sha256-cbc-aes",
1723
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1724
.cra_flags = CRYPTO_ALG_ASYNC |
1725
CRYPTO_ALG_ALLOCATES_MEMORY |
1726
CRYPTO_ALG_KERN_DRIVER_ONLY,
1727
.cra_blocksize = AES_BLOCK_SIZE,
1728
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1729
.cra_alignmask = 0,
1730
.cra_init = safexcel_aead_sha256_cra_init,
1731
.cra_exit = safexcel_aead_cra_exit,
1732
.cra_module = THIS_MODULE,
1733
},
1734
},
1735
};
1736
1737
static int safexcel_aead_sha224_cra_init(struct crypto_tfm *tfm)
1738
{
1739
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1740
1741
safexcel_aead_cra_init(tfm);
1742
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA224;
1743
ctx->state_sz = SHA256_DIGEST_SIZE;
1744
return 0;
1745
}
1746
1747
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_aes = {
1748
.type = SAFEXCEL_ALG_TYPE_AEAD,
1749
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_256,
1750
.alg.aead = {
1751
.setkey = safexcel_aead_setkey,
1752
.encrypt = safexcel_aead_encrypt,
1753
.decrypt = safexcel_aead_decrypt,
1754
.ivsize = AES_BLOCK_SIZE,
1755
.maxauthsize = SHA224_DIGEST_SIZE,
1756
.base = {
1757
.cra_name = "authenc(hmac(sha224),cbc(aes))",
1758
.cra_driver_name = "safexcel-authenc-hmac-sha224-cbc-aes",
1759
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1760
.cra_flags = CRYPTO_ALG_ASYNC |
1761
CRYPTO_ALG_ALLOCATES_MEMORY |
1762
CRYPTO_ALG_KERN_DRIVER_ONLY,
1763
.cra_blocksize = AES_BLOCK_SIZE,
1764
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1765
.cra_alignmask = 0,
1766
.cra_init = safexcel_aead_sha224_cra_init,
1767
.cra_exit = safexcel_aead_cra_exit,
1768
.cra_module = THIS_MODULE,
1769
},
1770
},
1771
};
1772
1773
static int safexcel_aead_sha512_cra_init(struct crypto_tfm *tfm)
1774
{
1775
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1776
1777
safexcel_aead_cra_init(tfm);
1778
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA512;
1779
ctx->state_sz = SHA512_DIGEST_SIZE;
1780
return 0;
1781
}
1782
1783
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha512_cbc_aes = {
1784
.type = SAFEXCEL_ALG_TYPE_AEAD,
1785
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_512,
1786
.alg.aead = {
1787
.setkey = safexcel_aead_setkey,
1788
.encrypt = safexcel_aead_encrypt,
1789
.decrypt = safexcel_aead_decrypt,
1790
.ivsize = AES_BLOCK_SIZE,
1791
.maxauthsize = SHA512_DIGEST_SIZE,
1792
.base = {
1793
.cra_name = "authenc(hmac(sha512),cbc(aes))",
1794
.cra_driver_name = "safexcel-authenc-hmac-sha512-cbc-aes",
1795
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1796
.cra_flags = CRYPTO_ALG_ASYNC |
1797
CRYPTO_ALG_ALLOCATES_MEMORY |
1798
CRYPTO_ALG_KERN_DRIVER_ONLY,
1799
.cra_blocksize = AES_BLOCK_SIZE,
1800
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1801
.cra_alignmask = 0,
1802
.cra_init = safexcel_aead_sha512_cra_init,
1803
.cra_exit = safexcel_aead_cra_exit,
1804
.cra_module = THIS_MODULE,
1805
},
1806
},
1807
};
1808
1809
static int safexcel_aead_sha384_cra_init(struct crypto_tfm *tfm)
1810
{
1811
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1812
1813
safexcel_aead_cra_init(tfm);
1814
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA384;
1815
ctx->state_sz = SHA512_DIGEST_SIZE;
1816
return 0;
1817
}
1818
1819
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha384_cbc_aes = {
1820
.type = SAFEXCEL_ALG_TYPE_AEAD,
1821
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_512,
1822
.alg.aead = {
1823
.setkey = safexcel_aead_setkey,
1824
.encrypt = safexcel_aead_encrypt,
1825
.decrypt = safexcel_aead_decrypt,
1826
.ivsize = AES_BLOCK_SIZE,
1827
.maxauthsize = SHA384_DIGEST_SIZE,
1828
.base = {
1829
.cra_name = "authenc(hmac(sha384),cbc(aes))",
1830
.cra_driver_name = "safexcel-authenc-hmac-sha384-cbc-aes",
1831
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1832
.cra_flags = CRYPTO_ALG_ASYNC |
1833
CRYPTO_ALG_ALLOCATES_MEMORY |
1834
CRYPTO_ALG_KERN_DRIVER_ONLY,
1835
.cra_blocksize = AES_BLOCK_SIZE,
1836
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1837
.cra_alignmask = 0,
1838
.cra_init = safexcel_aead_sha384_cra_init,
1839
.cra_exit = safexcel_aead_cra_exit,
1840
.cra_module = THIS_MODULE,
1841
},
1842
},
1843
};
1844
1845
static int safexcel_aead_sha1_des3_cra_init(struct crypto_tfm *tfm)
1846
{
1847
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1848
1849
safexcel_aead_sha1_cra_init(tfm);
1850
ctx->alg = SAFEXCEL_3DES; /* override default */
1851
ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1852
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1853
return 0;
1854
}
1855
1856
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_cbc_des3_ede = {
1857
.type = SAFEXCEL_ALG_TYPE_AEAD,
1858
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA1,
1859
.alg.aead = {
1860
.setkey = safexcel_aead_setkey,
1861
.encrypt = safexcel_aead_encrypt,
1862
.decrypt = safexcel_aead_decrypt,
1863
.ivsize = DES3_EDE_BLOCK_SIZE,
1864
.maxauthsize = SHA1_DIGEST_SIZE,
1865
.base = {
1866
.cra_name = "authenc(hmac(sha1),cbc(des3_ede))",
1867
.cra_driver_name = "safexcel-authenc-hmac-sha1-cbc-des3_ede",
1868
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1869
.cra_flags = CRYPTO_ALG_ASYNC |
1870
CRYPTO_ALG_ALLOCATES_MEMORY |
1871
CRYPTO_ALG_KERN_DRIVER_ONLY,
1872
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1873
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1874
.cra_alignmask = 0,
1875
.cra_init = safexcel_aead_sha1_des3_cra_init,
1876
.cra_exit = safexcel_aead_cra_exit,
1877
.cra_module = THIS_MODULE,
1878
},
1879
},
1880
};
1881
1882
static int safexcel_aead_sha256_des3_cra_init(struct crypto_tfm *tfm)
1883
{
1884
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1885
1886
safexcel_aead_sha256_cra_init(tfm);
1887
ctx->alg = SAFEXCEL_3DES; /* override default */
1888
ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1889
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1890
return 0;
1891
}
1892
1893
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_des3_ede = {
1894
.type = SAFEXCEL_ALG_TYPE_AEAD,
1895
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_256,
1896
.alg.aead = {
1897
.setkey = safexcel_aead_setkey,
1898
.encrypt = safexcel_aead_encrypt,
1899
.decrypt = safexcel_aead_decrypt,
1900
.ivsize = DES3_EDE_BLOCK_SIZE,
1901
.maxauthsize = SHA256_DIGEST_SIZE,
1902
.base = {
1903
.cra_name = "authenc(hmac(sha256),cbc(des3_ede))",
1904
.cra_driver_name = "safexcel-authenc-hmac-sha256-cbc-des3_ede",
1905
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1906
.cra_flags = CRYPTO_ALG_ASYNC |
1907
CRYPTO_ALG_ALLOCATES_MEMORY |
1908
CRYPTO_ALG_KERN_DRIVER_ONLY,
1909
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1910
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1911
.cra_alignmask = 0,
1912
.cra_init = safexcel_aead_sha256_des3_cra_init,
1913
.cra_exit = safexcel_aead_cra_exit,
1914
.cra_module = THIS_MODULE,
1915
},
1916
},
1917
};
1918
1919
static int safexcel_aead_sha224_des3_cra_init(struct crypto_tfm *tfm)
1920
{
1921
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1922
1923
safexcel_aead_sha224_cra_init(tfm);
1924
ctx->alg = SAFEXCEL_3DES; /* override default */
1925
ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1926
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1927
return 0;
1928
}
1929
1930
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_des3_ede = {
1931
.type = SAFEXCEL_ALG_TYPE_AEAD,
1932
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_256,
1933
.alg.aead = {
1934
.setkey = safexcel_aead_setkey,
1935
.encrypt = safexcel_aead_encrypt,
1936
.decrypt = safexcel_aead_decrypt,
1937
.ivsize = DES3_EDE_BLOCK_SIZE,
1938
.maxauthsize = SHA224_DIGEST_SIZE,
1939
.base = {
1940
.cra_name = "authenc(hmac(sha224),cbc(des3_ede))",
1941
.cra_driver_name = "safexcel-authenc-hmac-sha224-cbc-des3_ede",
1942
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1943
.cra_flags = CRYPTO_ALG_ASYNC |
1944
CRYPTO_ALG_ALLOCATES_MEMORY |
1945
CRYPTO_ALG_KERN_DRIVER_ONLY,
1946
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1947
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1948
.cra_alignmask = 0,
1949
.cra_init = safexcel_aead_sha224_des3_cra_init,
1950
.cra_exit = safexcel_aead_cra_exit,
1951
.cra_module = THIS_MODULE,
1952
},
1953
},
1954
};
1955
1956
static int safexcel_aead_sha512_des3_cra_init(struct crypto_tfm *tfm)
1957
{
1958
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1959
1960
safexcel_aead_sha512_cra_init(tfm);
1961
ctx->alg = SAFEXCEL_3DES; /* override default */
1962
ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1963
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
1964
return 0;
1965
}
1966
1967
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha512_cbc_des3_ede = {
1968
.type = SAFEXCEL_ALG_TYPE_AEAD,
1969
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_512,
1970
.alg.aead = {
1971
.setkey = safexcel_aead_setkey,
1972
.encrypt = safexcel_aead_encrypt,
1973
.decrypt = safexcel_aead_decrypt,
1974
.ivsize = DES3_EDE_BLOCK_SIZE,
1975
.maxauthsize = SHA512_DIGEST_SIZE,
1976
.base = {
1977
.cra_name = "authenc(hmac(sha512),cbc(des3_ede))",
1978
.cra_driver_name = "safexcel-authenc-hmac-sha512-cbc-des3_ede",
1979
.cra_priority = SAFEXCEL_CRA_PRIORITY,
1980
.cra_flags = CRYPTO_ALG_ASYNC |
1981
CRYPTO_ALG_ALLOCATES_MEMORY |
1982
CRYPTO_ALG_KERN_DRIVER_ONLY,
1983
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1984
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
1985
.cra_alignmask = 0,
1986
.cra_init = safexcel_aead_sha512_des3_cra_init,
1987
.cra_exit = safexcel_aead_cra_exit,
1988
.cra_module = THIS_MODULE,
1989
},
1990
},
1991
};
1992
1993
static int safexcel_aead_sha384_des3_cra_init(struct crypto_tfm *tfm)
1994
{
1995
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1996
1997
safexcel_aead_sha384_cra_init(tfm);
1998
ctx->alg = SAFEXCEL_3DES; /* override default */
1999
ctx->blocksz = DES3_EDE_BLOCK_SIZE;
2000
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
2001
return 0;
2002
}
2003
2004
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha384_cbc_des3_ede = {
2005
.type = SAFEXCEL_ALG_TYPE_AEAD,
2006
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_512,
2007
.alg.aead = {
2008
.setkey = safexcel_aead_setkey,
2009
.encrypt = safexcel_aead_encrypt,
2010
.decrypt = safexcel_aead_decrypt,
2011
.ivsize = DES3_EDE_BLOCK_SIZE,
2012
.maxauthsize = SHA384_DIGEST_SIZE,
2013
.base = {
2014
.cra_name = "authenc(hmac(sha384),cbc(des3_ede))",
2015
.cra_driver_name = "safexcel-authenc-hmac-sha384-cbc-des3_ede",
2016
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2017
.cra_flags = CRYPTO_ALG_ASYNC |
2018
CRYPTO_ALG_ALLOCATES_MEMORY |
2019
CRYPTO_ALG_KERN_DRIVER_ONLY,
2020
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2021
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2022
.cra_alignmask = 0,
2023
.cra_init = safexcel_aead_sha384_des3_cra_init,
2024
.cra_exit = safexcel_aead_cra_exit,
2025
.cra_module = THIS_MODULE,
2026
},
2027
},
2028
};
2029
2030
static int safexcel_aead_sha1_des_cra_init(struct crypto_tfm *tfm)
2031
{
2032
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2033
2034
safexcel_aead_sha1_cra_init(tfm);
2035
ctx->alg = SAFEXCEL_DES; /* override default */
2036
ctx->blocksz = DES_BLOCK_SIZE;
2037
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
2038
return 0;
2039
}
2040
2041
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_cbc_des = {
2042
.type = SAFEXCEL_ALG_TYPE_AEAD,
2043
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA1,
2044
.alg.aead = {
2045
.setkey = safexcel_aead_setkey,
2046
.encrypt = safexcel_aead_encrypt,
2047
.decrypt = safexcel_aead_decrypt,
2048
.ivsize = DES_BLOCK_SIZE,
2049
.maxauthsize = SHA1_DIGEST_SIZE,
2050
.base = {
2051
.cra_name = "authenc(hmac(sha1),cbc(des))",
2052
.cra_driver_name = "safexcel-authenc-hmac-sha1-cbc-des",
2053
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2054
.cra_flags = CRYPTO_ALG_ASYNC |
2055
CRYPTO_ALG_ALLOCATES_MEMORY |
2056
CRYPTO_ALG_KERN_DRIVER_ONLY,
2057
.cra_blocksize = DES_BLOCK_SIZE,
2058
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2059
.cra_alignmask = 0,
2060
.cra_init = safexcel_aead_sha1_des_cra_init,
2061
.cra_exit = safexcel_aead_cra_exit,
2062
.cra_module = THIS_MODULE,
2063
},
2064
},
2065
};
2066
2067
static int safexcel_aead_sha256_des_cra_init(struct crypto_tfm *tfm)
2068
{
2069
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2070
2071
safexcel_aead_sha256_cra_init(tfm);
2072
ctx->alg = SAFEXCEL_DES; /* override default */
2073
ctx->blocksz = DES_BLOCK_SIZE;
2074
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
2075
return 0;
2076
}
2077
2078
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_des = {
2079
.type = SAFEXCEL_ALG_TYPE_AEAD,
2080
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_256,
2081
.alg.aead = {
2082
.setkey = safexcel_aead_setkey,
2083
.encrypt = safexcel_aead_encrypt,
2084
.decrypt = safexcel_aead_decrypt,
2085
.ivsize = DES_BLOCK_SIZE,
2086
.maxauthsize = SHA256_DIGEST_SIZE,
2087
.base = {
2088
.cra_name = "authenc(hmac(sha256),cbc(des))",
2089
.cra_driver_name = "safexcel-authenc-hmac-sha256-cbc-des",
2090
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2091
.cra_flags = CRYPTO_ALG_ASYNC |
2092
CRYPTO_ALG_ALLOCATES_MEMORY |
2093
CRYPTO_ALG_KERN_DRIVER_ONLY,
2094
.cra_blocksize = DES_BLOCK_SIZE,
2095
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2096
.cra_alignmask = 0,
2097
.cra_init = safexcel_aead_sha256_des_cra_init,
2098
.cra_exit = safexcel_aead_cra_exit,
2099
.cra_module = THIS_MODULE,
2100
},
2101
},
2102
};
2103
2104
static int safexcel_aead_sha224_des_cra_init(struct crypto_tfm *tfm)
2105
{
2106
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2107
2108
safexcel_aead_sha224_cra_init(tfm);
2109
ctx->alg = SAFEXCEL_DES; /* override default */
2110
ctx->blocksz = DES_BLOCK_SIZE;
2111
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
2112
return 0;
2113
}
2114
2115
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_des = {
2116
.type = SAFEXCEL_ALG_TYPE_AEAD,
2117
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_256,
2118
.alg.aead = {
2119
.setkey = safexcel_aead_setkey,
2120
.encrypt = safexcel_aead_encrypt,
2121
.decrypt = safexcel_aead_decrypt,
2122
.ivsize = DES_BLOCK_SIZE,
2123
.maxauthsize = SHA224_DIGEST_SIZE,
2124
.base = {
2125
.cra_name = "authenc(hmac(sha224),cbc(des))",
2126
.cra_driver_name = "safexcel-authenc-hmac-sha224-cbc-des",
2127
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2128
.cra_flags = CRYPTO_ALG_ASYNC |
2129
CRYPTO_ALG_ALLOCATES_MEMORY |
2130
CRYPTO_ALG_KERN_DRIVER_ONLY,
2131
.cra_blocksize = DES_BLOCK_SIZE,
2132
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2133
.cra_alignmask = 0,
2134
.cra_init = safexcel_aead_sha224_des_cra_init,
2135
.cra_exit = safexcel_aead_cra_exit,
2136
.cra_module = THIS_MODULE,
2137
},
2138
},
2139
};
2140
2141
static int safexcel_aead_sha512_des_cra_init(struct crypto_tfm *tfm)
2142
{
2143
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2144
2145
safexcel_aead_sha512_cra_init(tfm);
2146
ctx->alg = SAFEXCEL_DES; /* override default */
2147
ctx->blocksz = DES_BLOCK_SIZE;
2148
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
2149
return 0;
2150
}
2151
2152
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha512_cbc_des = {
2153
.type = SAFEXCEL_ALG_TYPE_AEAD,
2154
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_512,
2155
.alg.aead = {
2156
.setkey = safexcel_aead_setkey,
2157
.encrypt = safexcel_aead_encrypt,
2158
.decrypt = safexcel_aead_decrypt,
2159
.ivsize = DES_BLOCK_SIZE,
2160
.maxauthsize = SHA512_DIGEST_SIZE,
2161
.base = {
2162
.cra_name = "authenc(hmac(sha512),cbc(des))",
2163
.cra_driver_name = "safexcel-authenc-hmac-sha512-cbc-des",
2164
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2165
.cra_flags = CRYPTO_ALG_ASYNC |
2166
CRYPTO_ALG_ALLOCATES_MEMORY |
2167
CRYPTO_ALG_KERN_DRIVER_ONLY,
2168
.cra_blocksize = DES_BLOCK_SIZE,
2169
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2170
.cra_alignmask = 0,
2171
.cra_init = safexcel_aead_sha512_des_cra_init,
2172
.cra_exit = safexcel_aead_cra_exit,
2173
.cra_module = THIS_MODULE,
2174
},
2175
},
2176
};
2177
2178
static int safexcel_aead_sha384_des_cra_init(struct crypto_tfm *tfm)
2179
{
2180
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2181
2182
safexcel_aead_sha384_cra_init(tfm);
2183
ctx->alg = SAFEXCEL_DES; /* override default */
2184
ctx->blocksz = DES_BLOCK_SIZE;
2185
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
2186
return 0;
2187
}
2188
2189
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha384_cbc_des = {
2190
.type = SAFEXCEL_ALG_TYPE_AEAD,
2191
.algo_mask = SAFEXCEL_ALG_DES | SAFEXCEL_ALG_SHA2_512,
2192
.alg.aead = {
2193
.setkey = safexcel_aead_setkey,
2194
.encrypt = safexcel_aead_encrypt,
2195
.decrypt = safexcel_aead_decrypt,
2196
.ivsize = DES_BLOCK_SIZE,
2197
.maxauthsize = SHA384_DIGEST_SIZE,
2198
.base = {
2199
.cra_name = "authenc(hmac(sha384),cbc(des))",
2200
.cra_driver_name = "safexcel-authenc-hmac-sha384-cbc-des",
2201
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2202
.cra_flags = CRYPTO_ALG_ASYNC |
2203
CRYPTO_ALG_ALLOCATES_MEMORY |
2204
CRYPTO_ALG_KERN_DRIVER_ONLY,
2205
.cra_blocksize = DES_BLOCK_SIZE,
2206
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2207
.cra_alignmask = 0,
2208
.cra_init = safexcel_aead_sha384_des_cra_init,
2209
.cra_exit = safexcel_aead_cra_exit,
2210
.cra_module = THIS_MODULE,
2211
},
2212
},
2213
};
2214
2215
static int safexcel_aead_sha1_ctr_cra_init(struct crypto_tfm *tfm)
2216
{
2217
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2218
2219
safexcel_aead_sha1_cra_init(tfm);
2220
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD; /* override default */
2221
return 0;
2222
}
2223
2224
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_ctr_aes = {
2225
.type = SAFEXCEL_ALG_TYPE_AEAD,
2226
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA1,
2227
.alg.aead = {
2228
.setkey = safexcel_aead_setkey,
2229
.encrypt = safexcel_aead_encrypt,
2230
.decrypt = safexcel_aead_decrypt,
2231
.ivsize = CTR_RFC3686_IV_SIZE,
2232
.maxauthsize = SHA1_DIGEST_SIZE,
2233
.base = {
2234
.cra_name = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
2235
.cra_driver_name = "safexcel-authenc-hmac-sha1-ctr-aes",
2236
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2237
.cra_flags = CRYPTO_ALG_ASYNC |
2238
CRYPTO_ALG_ALLOCATES_MEMORY |
2239
CRYPTO_ALG_KERN_DRIVER_ONLY,
2240
.cra_blocksize = 1,
2241
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2242
.cra_alignmask = 0,
2243
.cra_init = safexcel_aead_sha1_ctr_cra_init,
2244
.cra_exit = safexcel_aead_cra_exit,
2245
.cra_module = THIS_MODULE,
2246
},
2247
},
2248
};
2249
2250
static int safexcel_aead_sha256_ctr_cra_init(struct crypto_tfm *tfm)
2251
{
2252
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2253
2254
safexcel_aead_sha256_cra_init(tfm);
2255
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD; /* override default */
2256
return 0;
2257
}
2258
2259
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_ctr_aes = {
2260
.type = SAFEXCEL_ALG_TYPE_AEAD,
2261
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_256,
2262
.alg.aead = {
2263
.setkey = safexcel_aead_setkey,
2264
.encrypt = safexcel_aead_encrypt,
2265
.decrypt = safexcel_aead_decrypt,
2266
.ivsize = CTR_RFC3686_IV_SIZE,
2267
.maxauthsize = SHA256_DIGEST_SIZE,
2268
.base = {
2269
.cra_name = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
2270
.cra_driver_name = "safexcel-authenc-hmac-sha256-ctr-aes",
2271
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2272
.cra_flags = CRYPTO_ALG_ASYNC |
2273
CRYPTO_ALG_ALLOCATES_MEMORY |
2274
CRYPTO_ALG_KERN_DRIVER_ONLY,
2275
.cra_blocksize = 1,
2276
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2277
.cra_alignmask = 0,
2278
.cra_init = safexcel_aead_sha256_ctr_cra_init,
2279
.cra_exit = safexcel_aead_cra_exit,
2280
.cra_module = THIS_MODULE,
2281
},
2282
},
2283
};
2284
2285
static int safexcel_aead_sha224_ctr_cra_init(struct crypto_tfm *tfm)
2286
{
2287
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2288
2289
safexcel_aead_sha224_cra_init(tfm);
2290
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD; /* override default */
2291
return 0;
2292
}
2293
2294
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_ctr_aes = {
2295
.type = SAFEXCEL_ALG_TYPE_AEAD,
2296
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_256,
2297
.alg.aead = {
2298
.setkey = safexcel_aead_setkey,
2299
.encrypt = safexcel_aead_encrypt,
2300
.decrypt = safexcel_aead_decrypt,
2301
.ivsize = CTR_RFC3686_IV_SIZE,
2302
.maxauthsize = SHA224_DIGEST_SIZE,
2303
.base = {
2304
.cra_name = "authenc(hmac(sha224),rfc3686(ctr(aes)))",
2305
.cra_driver_name = "safexcel-authenc-hmac-sha224-ctr-aes",
2306
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2307
.cra_flags = CRYPTO_ALG_ASYNC |
2308
CRYPTO_ALG_ALLOCATES_MEMORY |
2309
CRYPTO_ALG_KERN_DRIVER_ONLY,
2310
.cra_blocksize = 1,
2311
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2312
.cra_alignmask = 0,
2313
.cra_init = safexcel_aead_sha224_ctr_cra_init,
2314
.cra_exit = safexcel_aead_cra_exit,
2315
.cra_module = THIS_MODULE,
2316
},
2317
},
2318
};
2319
2320
static int safexcel_aead_sha512_ctr_cra_init(struct crypto_tfm *tfm)
2321
{
2322
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2323
2324
safexcel_aead_sha512_cra_init(tfm);
2325
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD; /* override default */
2326
return 0;
2327
}
2328
2329
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha512_ctr_aes = {
2330
.type = SAFEXCEL_ALG_TYPE_AEAD,
2331
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_512,
2332
.alg.aead = {
2333
.setkey = safexcel_aead_setkey,
2334
.encrypt = safexcel_aead_encrypt,
2335
.decrypt = safexcel_aead_decrypt,
2336
.ivsize = CTR_RFC3686_IV_SIZE,
2337
.maxauthsize = SHA512_DIGEST_SIZE,
2338
.base = {
2339
.cra_name = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
2340
.cra_driver_name = "safexcel-authenc-hmac-sha512-ctr-aes",
2341
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2342
.cra_flags = CRYPTO_ALG_ASYNC |
2343
CRYPTO_ALG_ALLOCATES_MEMORY |
2344
CRYPTO_ALG_KERN_DRIVER_ONLY,
2345
.cra_blocksize = 1,
2346
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2347
.cra_alignmask = 0,
2348
.cra_init = safexcel_aead_sha512_ctr_cra_init,
2349
.cra_exit = safexcel_aead_cra_exit,
2350
.cra_module = THIS_MODULE,
2351
},
2352
},
2353
};
2354
2355
static int safexcel_aead_sha384_ctr_cra_init(struct crypto_tfm *tfm)
2356
{
2357
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2358
2359
safexcel_aead_sha384_cra_init(tfm);
2360
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD; /* override default */
2361
return 0;
2362
}
2363
2364
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha384_ctr_aes = {
2365
.type = SAFEXCEL_ALG_TYPE_AEAD,
2366
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_SHA2_512,
2367
.alg.aead = {
2368
.setkey = safexcel_aead_setkey,
2369
.encrypt = safexcel_aead_encrypt,
2370
.decrypt = safexcel_aead_decrypt,
2371
.ivsize = CTR_RFC3686_IV_SIZE,
2372
.maxauthsize = SHA384_DIGEST_SIZE,
2373
.base = {
2374
.cra_name = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
2375
.cra_driver_name = "safexcel-authenc-hmac-sha384-ctr-aes",
2376
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2377
.cra_flags = CRYPTO_ALG_ASYNC |
2378
CRYPTO_ALG_ALLOCATES_MEMORY |
2379
CRYPTO_ALG_KERN_DRIVER_ONLY,
2380
.cra_blocksize = 1,
2381
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2382
.cra_alignmask = 0,
2383
.cra_init = safexcel_aead_sha384_ctr_cra_init,
2384
.cra_exit = safexcel_aead_cra_exit,
2385
.cra_module = THIS_MODULE,
2386
},
2387
},
2388
};
2389
2390
static int safexcel_skcipher_aesxts_setkey(struct crypto_skcipher *ctfm,
2391
const u8 *key, unsigned int len)
2392
{
2393
struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
2394
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2395
struct safexcel_crypto_priv *priv = ctx->base.priv;
2396
struct crypto_aes_ctx aes;
2397
int ret, i;
2398
unsigned int keylen;
2399
2400
/* Check for illegal XTS keys */
2401
ret = xts_verify_key(ctfm, key, len);
2402
if (ret)
2403
return ret;
2404
2405
/* Only half of the key data is cipher key */
2406
keylen = (len >> 1);
2407
ret = aes_expandkey(&aes, key, keylen);
2408
if (ret)
2409
return ret;
2410
2411
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
2412
for (i = 0; i < keylen / sizeof(u32); i++) {
2413
if (le32_to_cpu(ctx->key[i]) != aes.key_enc[i]) {
2414
ctx->base.needs_inv = true;
2415
break;
2416
}
2417
}
2418
}
2419
2420
for (i = 0; i < keylen / sizeof(u32); i++)
2421
ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
2422
2423
/* The other half is the tweak key */
2424
ret = aes_expandkey(&aes, (u8 *)(key + keylen), keylen);
2425
if (ret)
2426
return ret;
2427
2428
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
2429
for (i = 0; i < keylen / sizeof(u32); i++) {
2430
if (le32_to_cpu(ctx->key[i + keylen / sizeof(u32)]) !=
2431
aes.key_enc[i]) {
2432
ctx->base.needs_inv = true;
2433
break;
2434
}
2435
}
2436
}
2437
2438
for (i = 0; i < keylen / sizeof(u32); i++)
2439
ctx->key[i + keylen / sizeof(u32)] =
2440
cpu_to_le32(aes.key_enc[i]);
2441
2442
ctx->key_len = keylen << 1;
2443
2444
memzero_explicit(&aes, sizeof(aes));
2445
return 0;
2446
}
2447
2448
static int safexcel_skcipher_aes_xts_cra_init(struct crypto_tfm *tfm)
2449
{
2450
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2451
2452
safexcel_skcipher_cra_init(tfm);
2453
ctx->alg = SAFEXCEL_AES;
2454
ctx->blocksz = AES_BLOCK_SIZE;
2455
ctx->xts = 1;
2456
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_XTS;
2457
return 0;
2458
}
2459
2460
static int safexcel_encrypt_xts(struct skcipher_request *req)
2461
{
2462
if (req->cryptlen < XTS_BLOCK_SIZE)
2463
return -EINVAL;
2464
return safexcel_queue_req(&req->base, skcipher_request_ctx(req),
2465
SAFEXCEL_ENCRYPT);
2466
}
2467
2468
static int safexcel_decrypt_xts(struct skcipher_request *req)
2469
{
2470
if (req->cryptlen < XTS_BLOCK_SIZE)
2471
return -EINVAL;
2472
return safexcel_queue_req(&req->base, skcipher_request_ctx(req),
2473
SAFEXCEL_DECRYPT);
2474
}
2475
2476
struct safexcel_alg_template safexcel_alg_xts_aes = {
2477
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
2478
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_AES_XTS,
2479
.alg.skcipher = {
2480
.setkey = safexcel_skcipher_aesxts_setkey,
2481
.encrypt = safexcel_encrypt_xts,
2482
.decrypt = safexcel_decrypt_xts,
2483
/* XTS actually uses 2 AES keys glued together */
2484
.min_keysize = AES_MIN_KEY_SIZE * 2,
2485
.max_keysize = AES_MAX_KEY_SIZE * 2,
2486
.ivsize = XTS_BLOCK_SIZE,
2487
.base = {
2488
.cra_name = "xts(aes)",
2489
.cra_driver_name = "safexcel-xts-aes",
2490
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2491
.cra_flags = CRYPTO_ALG_ASYNC |
2492
CRYPTO_ALG_ALLOCATES_MEMORY |
2493
CRYPTO_ALG_KERN_DRIVER_ONLY,
2494
.cra_blocksize = XTS_BLOCK_SIZE,
2495
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2496
.cra_alignmask = 0,
2497
.cra_init = safexcel_skcipher_aes_xts_cra_init,
2498
.cra_exit = safexcel_skcipher_cra_exit,
2499
.cra_module = THIS_MODULE,
2500
},
2501
},
2502
};
2503
2504
static int safexcel_aead_gcm_setkey(struct crypto_aead *ctfm, const u8 *key,
2505
unsigned int len)
2506
{
2507
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
2508
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2509
struct safexcel_crypto_priv *priv = ctx->base.priv;
2510
struct crypto_aes_ctx aes;
2511
u32 hashkey[AES_BLOCK_SIZE >> 2];
2512
int ret, i;
2513
2514
ret = aes_expandkey(&aes, key, len);
2515
if (ret) {
2516
memzero_explicit(&aes, sizeof(aes));
2517
return ret;
2518
}
2519
2520
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
2521
for (i = 0; i < len / sizeof(u32); i++) {
2522
if (le32_to_cpu(ctx->key[i]) != aes.key_enc[i]) {
2523
ctx->base.needs_inv = true;
2524
break;
2525
}
2526
}
2527
}
2528
2529
for (i = 0; i < len / sizeof(u32); i++)
2530
ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
2531
2532
ctx->key_len = len;
2533
2534
/* Compute hash key by encrypting zeroes with cipher key */
2535
memset(hashkey, 0, AES_BLOCK_SIZE);
2536
aes_encrypt(&aes, (u8 *)hashkey, (u8 *)hashkey);
2537
2538
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
2539
for (i = 0; i < AES_BLOCK_SIZE / sizeof(u32); i++) {
2540
if (be32_to_cpu(ctx->base.ipad.be[i]) != hashkey[i]) {
2541
ctx->base.needs_inv = true;
2542
break;
2543
}
2544
}
2545
}
2546
2547
for (i = 0; i < AES_BLOCK_SIZE / sizeof(u32); i++)
2548
ctx->base.ipad.be[i] = cpu_to_be32(hashkey[i]);
2549
2550
memzero_explicit(hashkey, AES_BLOCK_SIZE);
2551
memzero_explicit(&aes, sizeof(aes));
2552
return 0;
2553
}
2554
2555
static int safexcel_aead_gcm_cra_init(struct crypto_tfm *tfm)
2556
{
2557
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2558
2559
safexcel_aead_cra_init(tfm);
2560
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_GHASH;
2561
ctx->state_sz = GHASH_BLOCK_SIZE;
2562
ctx->xcm = EIP197_XCM_MODE_GCM;
2563
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_XCM; /* override default */
2564
2565
return 0;
2566
}
2567
2568
static void safexcel_aead_gcm_cra_exit(struct crypto_tfm *tfm)
2569
{
2570
safexcel_aead_cra_exit(tfm);
2571
}
2572
2573
static int safexcel_aead_gcm_setauthsize(struct crypto_aead *tfm,
2574
unsigned int authsize)
2575
{
2576
return crypto_gcm_check_authsize(authsize);
2577
}
2578
2579
struct safexcel_alg_template safexcel_alg_gcm = {
2580
.type = SAFEXCEL_ALG_TYPE_AEAD,
2581
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_GHASH,
2582
.alg.aead = {
2583
.setkey = safexcel_aead_gcm_setkey,
2584
.setauthsize = safexcel_aead_gcm_setauthsize,
2585
.encrypt = safexcel_aead_encrypt,
2586
.decrypt = safexcel_aead_decrypt,
2587
.ivsize = GCM_AES_IV_SIZE,
2588
.maxauthsize = GHASH_DIGEST_SIZE,
2589
.base = {
2590
.cra_name = "gcm(aes)",
2591
.cra_driver_name = "safexcel-gcm-aes",
2592
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2593
.cra_flags = CRYPTO_ALG_ASYNC |
2594
CRYPTO_ALG_ALLOCATES_MEMORY |
2595
CRYPTO_ALG_KERN_DRIVER_ONLY,
2596
.cra_blocksize = 1,
2597
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2598
.cra_alignmask = 0,
2599
.cra_init = safexcel_aead_gcm_cra_init,
2600
.cra_exit = safexcel_aead_gcm_cra_exit,
2601
.cra_module = THIS_MODULE,
2602
},
2603
},
2604
};
2605
2606
static int safexcel_aead_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,
2607
unsigned int len)
2608
{
2609
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
2610
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2611
struct safexcel_crypto_priv *priv = ctx->base.priv;
2612
struct crypto_aes_ctx aes;
2613
int ret, i;
2614
2615
ret = aes_expandkey(&aes, key, len);
2616
if (ret) {
2617
memzero_explicit(&aes, sizeof(aes));
2618
return ret;
2619
}
2620
2621
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma) {
2622
for (i = 0; i < len / sizeof(u32); i++) {
2623
if (le32_to_cpu(ctx->key[i]) != aes.key_enc[i]) {
2624
ctx->base.needs_inv = true;
2625
break;
2626
}
2627
}
2628
}
2629
2630
for (i = 0; i < len / sizeof(u32); i++) {
2631
ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
2632
ctx->base.ipad.be[i + 2 * AES_BLOCK_SIZE / sizeof(u32)] =
2633
cpu_to_be32(aes.key_enc[i]);
2634
}
2635
2636
ctx->key_len = len;
2637
ctx->state_sz = 2 * AES_BLOCK_SIZE + len;
2638
2639
if (len == AES_KEYSIZE_192)
2640
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC192;
2641
else if (len == AES_KEYSIZE_256)
2642
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC256;
2643
else
2644
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC128;
2645
2646
memzero_explicit(&aes, sizeof(aes));
2647
return 0;
2648
}
2649
2650
static int safexcel_aead_ccm_cra_init(struct crypto_tfm *tfm)
2651
{
2652
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2653
2654
safexcel_aead_cra_init(tfm);
2655
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC128;
2656
ctx->state_sz = 3 * AES_BLOCK_SIZE;
2657
ctx->xcm = EIP197_XCM_MODE_CCM;
2658
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_XCM; /* override default */
2659
ctx->ctrinit = 0;
2660
return 0;
2661
}
2662
2663
static int safexcel_aead_ccm_setauthsize(struct crypto_aead *tfm,
2664
unsigned int authsize)
2665
{
2666
/* Borrowed from crypto/ccm.c */
2667
switch (authsize) {
2668
case 4:
2669
case 6:
2670
case 8:
2671
case 10:
2672
case 12:
2673
case 14:
2674
case 16:
2675
break;
2676
default:
2677
return -EINVAL;
2678
}
2679
2680
return 0;
2681
}
2682
2683
static int safexcel_ccm_encrypt(struct aead_request *req)
2684
{
2685
struct safexcel_cipher_req *creq = aead_request_ctx(req);
2686
2687
if (req->iv[0] < 1 || req->iv[0] > 7)
2688
return -EINVAL;
2689
2690
return safexcel_queue_req(&req->base, creq, SAFEXCEL_ENCRYPT);
2691
}
2692
2693
static int safexcel_ccm_decrypt(struct aead_request *req)
2694
{
2695
struct safexcel_cipher_req *creq = aead_request_ctx(req);
2696
2697
if (req->iv[0] < 1 || req->iv[0] > 7)
2698
return -EINVAL;
2699
2700
return safexcel_queue_req(&req->base, creq, SAFEXCEL_DECRYPT);
2701
}
2702
2703
struct safexcel_alg_template safexcel_alg_ccm = {
2704
.type = SAFEXCEL_ALG_TYPE_AEAD,
2705
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_CBC_MAC_ALL,
2706
.alg.aead = {
2707
.setkey = safexcel_aead_ccm_setkey,
2708
.setauthsize = safexcel_aead_ccm_setauthsize,
2709
.encrypt = safexcel_ccm_encrypt,
2710
.decrypt = safexcel_ccm_decrypt,
2711
.ivsize = AES_BLOCK_SIZE,
2712
.maxauthsize = AES_BLOCK_SIZE,
2713
.base = {
2714
.cra_name = "ccm(aes)",
2715
.cra_driver_name = "safexcel-ccm-aes",
2716
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2717
.cra_flags = CRYPTO_ALG_ASYNC |
2718
CRYPTO_ALG_ALLOCATES_MEMORY |
2719
CRYPTO_ALG_KERN_DRIVER_ONLY,
2720
.cra_blocksize = 1,
2721
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2722
.cra_alignmask = 0,
2723
.cra_init = safexcel_aead_ccm_cra_init,
2724
.cra_exit = safexcel_aead_cra_exit,
2725
.cra_module = THIS_MODULE,
2726
},
2727
},
2728
};
2729
2730
static void safexcel_chacha20_setkey(struct safexcel_cipher_ctx *ctx,
2731
const u8 *key)
2732
{
2733
struct safexcel_crypto_priv *priv = ctx->base.priv;
2734
2735
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)
2736
if (memcmp(ctx->key, key, CHACHA_KEY_SIZE))
2737
ctx->base.needs_inv = true;
2738
2739
memcpy(ctx->key, key, CHACHA_KEY_SIZE);
2740
ctx->key_len = CHACHA_KEY_SIZE;
2741
}
2742
2743
static int safexcel_skcipher_chacha20_setkey(struct crypto_skcipher *ctfm,
2744
const u8 *key, unsigned int len)
2745
{
2746
struct safexcel_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
2747
2748
if (len != CHACHA_KEY_SIZE)
2749
return -EINVAL;
2750
2751
safexcel_chacha20_setkey(ctx, key);
2752
2753
return 0;
2754
}
2755
2756
static int safexcel_skcipher_chacha20_cra_init(struct crypto_tfm *tfm)
2757
{
2758
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2759
2760
safexcel_skcipher_cra_init(tfm);
2761
ctx->alg = SAFEXCEL_CHACHA20;
2762
ctx->ctrinit = 0;
2763
ctx->mode = CONTEXT_CONTROL_CHACHA20_MODE_256_32;
2764
return 0;
2765
}
2766
2767
struct safexcel_alg_template safexcel_alg_chacha20 = {
2768
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
2769
.algo_mask = SAFEXCEL_ALG_CHACHA20,
2770
.alg.skcipher = {
2771
.setkey = safexcel_skcipher_chacha20_setkey,
2772
.encrypt = safexcel_encrypt,
2773
.decrypt = safexcel_decrypt,
2774
.min_keysize = CHACHA_KEY_SIZE,
2775
.max_keysize = CHACHA_KEY_SIZE,
2776
.ivsize = CHACHA_IV_SIZE,
2777
.base = {
2778
.cra_name = "chacha20",
2779
.cra_driver_name = "safexcel-chacha20",
2780
.cra_priority = SAFEXCEL_CRA_PRIORITY,
2781
.cra_flags = CRYPTO_ALG_ASYNC |
2782
CRYPTO_ALG_ALLOCATES_MEMORY |
2783
CRYPTO_ALG_KERN_DRIVER_ONLY,
2784
.cra_blocksize = 1,
2785
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2786
.cra_alignmask = 0,
2787
.cra_init = safexcel_skcipher_chacha20_cra_init,
2788
.cra_exit = safexcel_skcipher_cra_exit,
2789
.cra_module = THIS_MODULE,
2790
},
2791
},
2792
};
2793
2794
static int safexcel_aead_chachapoly_setkey(struct crypto_aead *ctfm,
2795
const u8 *key, unsigned int len)
2796
{
2797
struct safexcel_cipher_ctx *ctx = crypto_aead_ctx(ctfm);
2798
2799
if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP &&
2800
len > EIP197_AEAD_IPSEC_NONCE_SIZE) {
2801
/* ESP variant has nonce appended to key */
2802
len -= EIP197_AEAD_IPSEC_NONCE_SIZE;
2803
ctx->nonce = *(u32 *)(key + len);
2804
}
2805
if (len != CHACHA_KEY_SIZE)
2806
return -EINVAL;
2807
2808
safexcel_chacha20_setkey(ctx, key);
2809
2810
return 0;
2811
}
2812
2813
static int safexcel_aead_chachapoly_setauthsize(struct crypto_aead *tfm,
2814
unsigned int authsize)
2815
{
2816
if (authsize != POLY1305_DIGEST_SIZE)
2817
return -EINVAL;
2818
return 0;
2819
}
2820
2821
static int safexcel_aead_chachapoly_crypt(struct aead_request *req,
2822
enum safexcel_cipher_direction dir)
2823
{
2824
struct safexcel_cipher_req *creq = aead_request_ctx(req);
2825
struct crypto_aead *aead = crypto_aead_reqtfm(req);
2826
struct crypto_tfm *tfm = crypto_aead_tfm(aead);
2827
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2828
struct aead_request *subreq = aead_request_ctx(req);
2829
u32 key[CHACHA_KEY_SIZE / sizeof(u32) + 1];
2830
int ret = 0;
2831
2832
/*
2833
* Instead of wasting time detecting umpteen silly corner cases,
2834
* just dump all "small" requests to the fallback implementation.
2835
* HW would not be faster on such small requests anyway.
2836
*/
2837
if (likely((ctx->aead != EIP197_AEAD_TYPE_IPSEC_ESP ||
2838
req->assoclen >= EIP197_AEAD_IPSEC_IV_SIZE) &&
2839
req->cryptlen > POLY1305_DIGEST_SIZE)) {
2840
return safexcel_queue_req(&req->base, creq, dir);
2841
}
2842
2843
/* HW cannot do full (AAD+payload) zero length, use fallback */
2844
memcpy(key, ctx->key, CHACHA_KEY_SIZE);
2845
if (ctx->aead == EIP197_AEAD_TYPE_IPSEC_ESP) {
2846
/* ESP variant has nonce appended to the key */
2847
key[CHACHA_KEY_SIZE / sizeof(u32)] = ctx->nonce;
2848
ret = crypto_aead_setkey(ctx->fback, (u8 *)key,
2849
CHACHA_KEY_SIZE +
2850
EIP197_AEAD_IPSEC_NONCE_SIZE);
2851
} else {
2852
ret = crypto_aead_setkey(ctx->fback, (u8 *)key,
2853
CHACHA_KEY_SIZE);
2854
}
2855
if (ret) {
2856
crypto_aead_clear_flags(aead, CRYPTO_TFM_REQ_MASK);
2857
crypto_aead_set_flags(aead, crypto_aead_get_flags(ctx->fback) &
2858
CRYPTO_TFM_REQ_MASK);
2859
return ret;
2860
}
2861
2862
aead_request_set_tfm(subreq, ctx->fback);
2863
aead_request_set_callback(subreq, req->base.flags, req->base.complete,
2864
req->base.data);
2865
aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
2866
req->iv);
2867
aead_request_set_ad(subreq, req->assoclen);
2868
2869
return (dir == SAFEXCEL_ENCRYPT) ?
2870
crypto_aead_encrypt(subreq) :
2871
crypto_aead_decrypt(subreq);
2872
}
2873
2874
static int safexcel_aead_chachapoly_encrypt(struct aead_request *req)
2875
{
2876
return safexcel_aead_chachapoly_crypt(req, SAFEXCEL_ENCRYPT);
2877
}
2878
2879
static int safexcel_aead_chachapoly_decrypt(struct aead_request *req)
2880
{
2881
return safexcel_aead_chachapoly_crypt(req, SAFEXCEL_DECRYPT);
2882
}
2883
2884
static int safexcel_aead_fallback_cra_init(struct crypto_tfm *tfm)
2885
{
2886
struct crypto_aead *aead = __crypto_aead_cast(tfm);
2887
struct aead_alg *alg = crypto_aead_alg(aead);
2888
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2889
2890
safexcel_aead_cra_init(tfm);
2891
2892
/* Allocate fallback implementation */
2893
ctx->fback = crypto_alloc_aead(alg->base.cra_name, 0,
2894
CRYPTO_ALG_ASYNC |
2895
CRYPTO_ALG_NEED_FALLBACK);
2896
if (IS_ERR(ctx->fback))
2897
return PTR_ERR(ctx->fback);
2898
2899
crypto_aead_set_reqsize(aead, max(sizeof(struct safexcel_cipher_req),
2900
sizeof(struct aead_request) +
2901
crypto_aead_reqsize(ctx->fback)));
2902
2903
return 0;
2904
}
2905
2906
static int safexcel_aead_chachapoly_cra_init(struct crypto_tfm *tfm)
2907
{
2908
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2909
2910
safexcel_aead_fallback_cra_init(tfm);
2911
ctx->alg = SAFEXCEL_CHACHA20;
2912
ctx->mode = CONTEXT_CONTROL_CHACHA20_MODE_256_32 |
2913
CONTEXT_CONTROL_CHACHA20_MODE_CALC_OTK;
2914
ctx->ctrinit = 0;
2915
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_POLY1305;
2916
ctx->state_sz = 0; /* Precomputed by HW */
2917
return 0;
2918
}
2919
2920
static void safexcel_aead_fallback_cra_exit(struct crypto_tfm *tfm)
2921
{
2922
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2923
2924
crypto_free_aead(ctx->fback);
2925
safexcel_aead_cra_exit(tfm);
2926
}
2927
2928
struct safexcel_alg_template safexcel_alg_chachapoly = {
2929
.type = SAFEXCEL_ALG_TYPE_AEAD,
2930
.algo_mask = SAFEXCEL_ALG_CHACHA20 | SAFEXCEL_ALG_POLY1305,
2931
.alg.aead = {
2932
.setkey = safexcel_aead_chachapoly_setkey,
2933
.setauthsize = safexcel_aead_chachapoly_setauthsize,
2934
.encrypt = safexcel_aead_chachapoly_encrypt,
2935
.decrypt = safexcel_aead_chachapoly_decrypt,
2936
.ivsize = CHACHAPOLY_IV_SIZE,
2937
.maxauthsize = POLY1305_DIGEST_SIZE,
2938
.base = {
2939
.cra_name = "rfc7539(chacha20,poly1305)",
2940
.cra_driver_name = "safexcel-chacha20-poly1305",
2941
/* +1 to put it above HW chacha + SW poly */
2942
.cra_priority = SAFEXCEL_CRA_PRIORITY + 1,
2943
.cra_flags = CRYPTO_ALG_ASYNC |
2944
CRYPTO_ALG_ALLOCATES_MEMORY |
2945
CRYPTO_ALG_KERN_DRIVER_ONLY |
2946
CRYPTO_ALG_NEED_FALLBACK,
2947
.cra_blocksize = 1,
2948
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2949
.cra_alignmask = 0,
2950
.cra_init = safexcel_aead_chachapoly_cra_init,
2951
.cra_exit = safexcel_aead_fallback_cra_exit,
2952
.cra_module = THIS_MODULE,
2953
},
2954
},
2955
};
2956
2957
static int safexcel_aead_chachapolyesp_cra_init(struct crypto_tfm *tfm)
2958
{
2959
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
2960
int ret;
2961
2962
ret = safexcel_aead_chachapoly_cra_init(tfm);
2963
ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP;
2964
ctx->aadskip = EIP197_AEAD_IPSEC_IV_SIZE;
2965
return ret;
2966
}
2967
2968
struct safexcel_alg_template safexcel_alg_chachapoly_esp = {
2969
.type = SAFEXCEL_ALG_TYPE_AEAD,
2970
.algo_mask = SAFEXCEL_ALG_CHACHA20 | SAFEXCEL_ALG_POLY1305,
2971
.alg.aead = {
2972
.setkey = safexcel_aead_chachapoly_setkey,
2973
.setauthsize = safexcel_aead_chachapoly_setauthsize,
2974
.encrypt = safexcel_aead_chachapoly_encrypt,
2975
.decrypt = safexcel_aead_chachapoly_decrypt,
2976
.ivsize = CHACHAPOLY_IV_SIZE - EIP197_AEAD_IPSEC_NONCE_SIZE,
2977
.maxauthsize = POLY1305_DIGEST_SIZE,
2978
.base = {
2979
.cra_name = "rfc7539esp(chacha20,poly1305)",
2980
.cra_driver_name = "safexcel-chacha20-poly1305-esp",
2981
/* +1 to put it above HW chacha + SW poly */
2982
.cra_priority = SAFEXCEL_CRA_PRIORITY + 1,
2983
.cra_flags = CRYPTO_ALG_ASYNC |
2984
CRYPTO_ALG_ALLOCATES_MEMORY |
2985
CRYPTO_ALG_KERN_DRIVER_ONLY |
2986
CRYPTO_ALG_NEED_FALLBACK,
2987
.cra_blocksize = 1,
2988
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
2989
.cra_alignmask = 0,
2990
.cra_init = safexcel_aead_chachapolyesp_cra_init,
2991
.cra_exit = safexcel_aead_fallback_cra_exit,
2992
.cra_module = THIS_MODULE,
2993
},
2994
},
2995
};
2996
2997
static int safexcel_skcipher_sm4_setkey(struct crypto_skcipher *ctfm,
2998
const u8 *key, unsigned int len)
2999
{
3000
struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
3001
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3002
struct safexcel_crypto_priv *priv = ctx->base.priv;
3003
3004
if (len != SM4_KEY_SIZE)
3005
return -EINVAL;
3006
3007
if (priv->flags & EIP197_TRC_CACHE && ctx->base.ctxr_dma)
3008
if (memcmp(ctx->key, key, SM4_KEY_SIZE))
3009
ctx->base.needs_inv = true;
3010
3011
memcpy(ctx->key, key, SM4_KEY_SIZE);
3012
ctx->key_len = SM4_KEY_SIZE;
3013
3014
return 0;
3015
}
3016
3017
static int safexcel_sm4_blk_encrypt(struct skcipher_request *req)
3018
{
3019
/* Workaround for HW bug: EIP96 4.3 does not report blocksize error */
3020
if (req->cryptlen & (SM4_BLOCK_SIZE - 1))
3021
return -EINVAL;
3022
else
3023
return safexcel_queue_req(&req->base, skcipher_request_ctx(req),
3024
SAFEXCEL_ENCRYPT);
3025
}
3026
3027
static int safexcel_sm4_blk_decrypt(struct skcipher_request *req)
3028
{
3029
/* Workaround for HW bug: EIP96 4.3 does not report blocksize error */
3030
if (req->cryptlen & (SM4_BLOCK_SIZE - 1))
3031
return -EINVAL;
3032
else
3033
return safexcel_queue_req(&req->base, skcipher_request_ctx(req),
3034
SAFEXCEL_DECRYPT);
3035
}
3036
3037
static int safexcel_skcipher_sm4_ecb_cra_init(struct crypto_tfm *tfm)
3038
{
3039
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3040
3041
safexcel_skcipher_cra_init(tfm);
3042
ctx->alg = SAFEXCEL_SM4;
3043
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_ECB;
3044
ctx->blocksz = 0;
3045
ctx->ivmask = EIP197_OPTION_2_TOKEN_IV_CMD;
3046
return 0;
3047
}
3048
3049
struct safexcel_alg_template safexcel_alg_ecb_sm4 = {
3050
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
3051
.algo_mask = SAFEXCEL_ALG_SM4,
3052
.alg.skcipher = {
3053
.setkey = safexcel_skcipher_sm4_setkey,
3054
.encrypt = safexcel_sm4_blk_encrypt,
3055
.decrypt = safexcel_sm4_blk_decrypt,
3056
.min_keysize = SM4_KEY_SIZE,
3057
.max_keysize = SM4_KEY_SIZE,
3058
.base = {
3059
.cra_name = "ecb(sm4)",
3060
.cra_driver_name = "safexcel-ecb-sm4",
3061
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3062
.cra_flags = CRYPTO_ALG_ASYNC |
3063
CRYPTO_ALG_ALLOCATES_MEMORY |
3064
CRYPTO_ALG_KERN_DRIVER_ONLY,
3065
.cra_blocksize = SM4_BLOCK_SIZE,
3066
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3067
.cra_alignmask = 0,
3068
.cra_init = safexcel_skcipher_sm4_ecb_cra_init,
3069
.cra_exit = safexcel_skcipher_cra_exit,
3070
.cra_module = THIS_MODULE,
3071
},
3072
},
3073
};
3074
3075
static int safexcel_skcipher_sm4_cbc_cra_init(struct crypto_tfm *tfm)
3076
{
3077
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3078
3079
safexcel_skcipher_cra_init(tfm);
3080
ctx->alg = SAFEXCEL_SM4;
3081
ctx->blocksz = SM4_BLOCK_SIZE;
3082
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CBC;
3083
return 0;
3084
}
3085
3086
struct safexcel_alg_template safexcel_alg_cbc_sm4 = {
3087
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
3088
.algo_mask = SAFEXCEL_ALG_SM4,
3089
.alg.skcipher = {
3090
.setkey = safexcel_skcipher_sm4_setkey,
3091
.encrypt = safexcel_sm4_blk_encrypt,
3092
.decrypt = safexcel_sm4_blk_decrypt,
3093
.min_keysize = SM4_KEY_SIZE,
3094
.max_keysize = SM4_KEY_SIZE,
3095
.ivsize = SM4_BLOCK_SIZE,
3096
.base = {
3097
.cra_name = "cbc(sm4)",
3098
.cra_driver_name = "safexcel-cbc-sm4",
3099
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3100
.cra_flags = CRYPTO_ALG_ASYNC |
3101
CRYPTO_ALG_ALLOCATES_MEMORY |
3102
CRYPTO_ALG_KERN_DRIVER_ONLY,
3103
.cra_blocksize = SM4_BLOCK_SIZE,
3104
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3105
.cra_alignmask = 0,
3106
.cra_init = safexcel_skcipher_sm4_cbc_cra_init,
3107
.cra_exit = safexcel_skcipher_cra_exit,
3108
.cra_module = THIS_MODULE,
3109
},
3110
},
3111
};
3112
3113
static int safexcel_skcipher_sm4ctr_setkey(struct crypto_skcipher *ctfm,
3114
const u8 *key, unsigned int len)
3115
{
3116
struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
3117
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3118
3119
/* last 4 bytes of key are the nonce! */
3120
ctx->nonce = *(u32 *)(key + len - CTR_RFC3686_NONCE_SIZE);
3121
/* exclude the nonce here */
3122
len -= CTR_RFC3686_NONCE_SIZE;
3123
3124
return safexcel_skcipher_sm4_setkey(ctfm, key, len);
3125
}
3126
3127
static int safexcel_skcipher_sm4_ctr_cra_init(struct crypto_tfm *tfm)
3128
{
3129
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3130
3131
safexcel_skcipher_cra_init(tfm);
3132
ctx->alg = SAFEXCEL_SM4;
3133
ctx->blocksz = SM4_BLOCK_SIZE;
3134
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD;
3135
return 0;
3136
}
3137
3138
struct safexcel_alg_template safexcel_alg_ctr_sm4 = {
3139
.type = SAFEXCEL_ALG_TYPE_SKCIPHER,
3140
.algo_mask = SAFEXCEL_ALG_SM4,
3141
.alg.skcipher = {
3142
.setkey = safexcel_skcipher_sm4ctr_setkey,
3143
.encrypt = safexcel_encrypt,
3144
.decrypt = safexcel_decrypt,
3145
/* Add nonce size */
3146
.min_keysize = SM4_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
3147
.max_keysize = SM4_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
3148
.ivsize = CTR_RFC3686_IV_SIZE,
3149
.base = {
3150
.cra_name = "rfc3686(ctr(sm4))",
3151
.cra_driver_name = "safexcel-ctr-sm4",
3152
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3153
.cra_flags = CRYPTO_ALG_ASYNC |
3154
CRYPTO_ALG_ALLOCATES_MEMORY |
3155
CRYPTO_ALG_KERN_DRIVER_ONLY,
3156
.cra_blocksize = 1,
3157
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3158
.cra_alignmask = 0,
3159
.cra_init = safexcel_skcipher_sm4_ctr_cra_init,
3160
.cra_exit = safexcel_skcipher_cra_exit,
3161
.cra_module = THIS_MODULE,
3162
},
3163
},
3164
};
3165
3166
static int safexcel_aead_sm4_blk_encrypt(struct aead_request *req)
3167
{
3168
/* Workaround for HW bug: EIP96 4.3 does not report blocksize error */
3169
if (req->cryptlen & (SM4_BLOCK_SIZE - 1))
3170
return -EINVAL;
3171
3172
return safexcel_queue_req(&req->base, aead_request_ctx(req),
3173
SAFEXCEL_ENCRYPT);
3174
}
3175
3176
static int safexcel_aead_sm4_blk_decrypt(struct aead_request *req)
3177
{
3178
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
3179
3180
/* Workaround for HW bug: EIP96 4.3 does not report blocksize error */
3181
if ((req->cryptlen - crypto_aead_authsize(tfm)) & (SM4_BLOCK_SIZE - 1))
3182
return -EINVAL;
3183
3184
return safexcel_queue_req(&req->base, aead_request_ctx(req),
3185
SAFEXCEL_DECRYPT);
3186
}
3187
3188
static int safexcel_aead_sm4cbc_sha1_cra_init(struct crypto_tfm *tfm)
3189
{
3190
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3191
3192
safexcel_aead_cra_init(tfm);
3193
ctx->alg = SAFEXCEL_SM4;
3194
ctx->blocksz = SM4_BLOCK_SIZE;
3195
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SHA1;
3196
ctx->state_sz = SHA1_DIGEST_SIZE;
3197
return 0;
3198
}
3199
3200
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_cbc_sm4 = {
3201
.type = SAFEXCEL_ALG_TYPE_AEAD,
3202
.algo_mask = SAFEXCEL_ALG_SM4 | SAFEXCEL_ALG_SHA1,
3203
.alg.aead = {
3204
.setkey = safexcel_aead_setkey,
3205
.encrypt = safexcel_aead_sm4_blk_encrypt,
3206
.decrypt = safexcel_aead_sm4_blk_decrypt,
3207
.ivsize = SM4_BLOCK_SIZE,
3208
.maxauthsize = SHA1_DIGEST_SIZE,
3209
.base = {
3210
.cra_name = "authenc(hmac(sha1),cbc(sm4))",
3211
.cra_driver_name = "safexcel-authenc-hmac-sha1-cbc-sm4",
3212
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3213
.cra_flags = CRYPTO_ALG_ASYNC |
3214
CRYPTO_ALG_ALLOCATES_MEMORY |
3215
CRYPTO_ALG_KERN_DRIVER_ONLY,
3216
.cra_blocksize = SM4_BLOCK_SIZE,
3217
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3218
.cra_alignmask = 0,
3219
.cra_init = safexcel_aead_sm4cbc_sha1_cra_init,
3220
.cra_exit = safexcel_aead_cra_exit,
3221
.cra_module = THIS_MODULE,
3222
},
3223
},
3224
};
3225
3226
static int safexcel_aead_fallback_setkey(struct crypto_aead *ctfm,
3227
const u8 *key, unsigned int len)
3228
{
3229
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
3230
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3231
3232
/* Keep fallback cipher synchronized */
3233
return crypto_aead_setkey(ctx->fback, (u8 *)key, len) ?:
3234
safexcel_aead_setkey(ctfm, key, len);
3235
}
3236
3237
static int safexcel_aead_fallback_setauthsize(struct crypto_aead *ctfm,
3238
unsigned int authsize)
3239
{
3240
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
3241
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3242
3243
/* Keep fallback cipher synchronized */
3244
return crypto_aead_setauthsize(ctx->fback, authsize);
3245
}
3246
3247
static int safexcel_aead_fallback_crypt(struct aead_request *req,
3248
enum safexcel_cipher_direction dir)
3249
{
3250
struct crypto_aead *aead = crypto_aead_reqtfm(req);
3251
struct crypto_tfm *tfm = crypto_aead_tfm(aead);
3252
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3253
struct aead_request *subreq = aead_request_ctx(req);
3254
3255
aead_request_set_tfm(subreq, ctx->fback);
3256
aead_request_set_callback(subreq, req->base.flags, req->base.complete,
3257
req->base.data);
3258
aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
3259
req->iv);
3260
aead_request_set_ad(subreq, req->assoclen);
3261
3262
return (dir == SAFEXCEL_ENCRYPT) ?
3263
crypto_aead_encrypt(subreq) :
3264
crypto_aead_decrypt(subreq);
3265
}
3266
3267
static int safexcel_aead_sm4cbc_sm3_encrypt(struct aead_request *req)
3268
{
3269
struct safexcel_cipher_req *creq = aead_request_ctx(req);
3270
3271
/* Workaround for HW bug: EIP96 4.3 does not report blocksize error */
3272
if (req->cryptlen & (SM4_BLOCK_SIZE - 1))
3273
return -EINVAL;
3274
else if (req->cryptlen || req->assoclen) /* If input length > 0 only */
3275
return safexcel_queue_req(&req->base, creq, SAFEXCEL_ENCRYPT);
3276
3277
/* HW cannot do full (AAD+payload) zero length, use fallback */
3278
return safexcel_aead_fallback_crypt(req, SAFEXCEL_ENCRYPT);
3279
}
3280
3281
static int safexcel_aead_sm4cbc_sm3_decrypt(struct aead_request *req)
3282
{
3283
struct safexcel_cipher_req *creq = aead_request_ctx(req);
3284
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
3285
3286
/* Workaround for HW bug: EIP96 4.3 does not report blocksize error */
3287
if ((req->cryptlen - crypto_aead_authsize(tfm)) & (SM4_BLOCK_SIZE - 1))
3288
return -EINVAL;
3289
else if (req->cryptlen > crypto_aead_authsize(tfm) || req->assoclen)
3290
/* If input length > 0 only */
3291
return safexcel_queue_req(&req->base, creq, SAFEXCEL_DECRYPT);
3292
3293
/* HW cannot do full (AAD+payload) zero length, use fallback */
3294
return safexcel_aead_fallback_crypt(req, SAFEXCEL_DECRYPT);
3295
}
3296
3297
static int safexcel_aead_sm4cbc_sm3_cra_init(struct crypto_tfm *tfm)
3298
{
3299
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3300
3301
safexcel_aead_fallback_cra_init(tfm);
3302
ctx->alg = SAFEXCEL_SM4;
3303
ctx->blocksz = SM4_BLOCK_SIZE;
3304
ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_SM3;
3305
ctx->state_sz = SM3_DIGEST_SIZE;
3306
return 0;
3307
}
3308
3309
struct safexcel_alg_template safexcel_alg_authenc_hmac_sm3_cbc_sm4 = {
3310
.type = SAFEXCEL_ALG_TYPE_AEAD,
3311
.algo_mask = SAFEXCEL_ALG_SM4 | SAFEXCEL_ALG_SM3,
3312
.alg.aead = {
3313
.setkey = safexcel_aead_fallback_setkey,
3314
.setauthsize = safexcel_aead_fallback_setauthsize,
3315
.encrypt = safexcel_aead_sm4cbc_sm3_encrypt,
3316
.decrypt = safexcel_aead_sm4cbc_sm3_decrypt,
3317
.ivsize = SM4_BLOCK_SIZE,
3318
.maxauthsize = SM3_DIGEST_SIZE,
3319
.base = {
3320
.cra_name = "authenc(hmac(sm3),cbc(sm4))",
3321
.cra_driver_name = "safexcel-authenc-hmac-sm3-cbc-sm4",
3322
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3323
.cra_flags = CRYPTO_ALG_ASYNC |
3324
CRYPTO_ALG_ALLOCATES_MEMORY |
3325
CRYPTO_ALG_KERN_DRIVER_ONLY |
3326
CRYPTO_ALG_NEED_FALLBACK,
3327
.cra_blocksize = SM4_BLOCK_SIZE,
3328
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3329
.cra_alignmask = 0,
3330
.cra_init = safexcel_aead_sm4cbc_sm3_cra_init,
3331
.cra_exit = safexcel_aead_fallback_cra_exit,
3332
.cra_module = THIS_MODULE,
3333
},
3334
},
3335
};
3336
3337
static int safexcel_aead_sm4ctr_sha1_cra_init(struct crypto_tfm *tfm)
3338
{
3339
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3340
3341
safexcel_aead_sm4cbc_sha1_cra_init(tfm);
3342
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD;
3343
return 0;
3344
}
3345
3346
struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_ctr_sm4 = {
3347
.type = SAFEXCEL_ALG_TYPE_AEAD,
3348
.algo_mask = SAFEXCEL_ALG_SM4 | SAFEXCEL_ALG_SHA1,
3349
.alg.aead = {
3350
.setkey = safexcel_aead_setkey,
3351
.encrypt = safexcel_aead_encrypt,
3352
.decrypt = safexcel_aead_decrypt,
3353
.ivsize = CTR_RFC3686_IV_SIZE,
3354
.maxauthsize = SHA1_DIGEST_SIZE,
3355
.base = {
3356
.cra_name = "authenc(hmac(sha1),rfc3686(ctr(sm4)))",
3357
.cra_driver_name = "safexcel-authenc-hmac-sha1-ctr-sm4",
3358
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3359
.cra_flags = CRYPTO_ALG_ASYNC |
3360
CRYPTO_ALG_ALLOCATES_MEMORY |
3361
CRYPTO_ALG_KERN_DRIVER_ONLY,
3362
.cra_blocksize = 1,
3363
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3364
.cra_alignmask = 0,
3365
.cra_init = safexcel_aead_sm4ctr_sha1_cra_init,
3366
.cra_exit = safexcel_aead_cra_exit,
3367
.cra_module = THIS_MODULE,
3368
},
3369
},
3370
};
3371
3372
static int safexcel_aead_sm4ctr_sm3_cra_init(struct crypto_tfm *tfm)
3373
{
3374
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3375
3376
safexcel_aead_sm4cbc_sm3_cra_init(tfm);
3377
ctx->mode = CONTEXT_CONTROL_CRYPTO_MODE_CTR_LOAD;
3378
return 0;
3379
}
3380
3381
struct safexcel_alg_template safexcel_alg_authenc_hmac_sm3_ctr_sm4 = {
3382
.type = SAFEXCEL_ALG_TYPE_AEAD,
3383
.algo_mask = SAFEXCEL_ALG_SM4 | SAFEXCEL_ALG_SM3,
3384
.alg.aead = {
3385
.setkey = safexcel_aead_setkey,
3386
.encrypt = safexcel_aead_encrypt,
3387
.decrypt = safexcel_aead_decrypt,
3388
.ivsize = CTR_RFC3686_IV_SIZE,
3389
.maxauthsize = SM3_DIGEST_SIZE,
3390
.base = {
3391
.cra_name = "authenc(hmac(sm3),rfc3686(ctr(sm4)))",
3392
.cra_driver_name = "safexcel-authenc-hmac-sm3-ctr-sm4",
3393
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3394
.cra_flags = CRYPTO_ALG_ASYNC |
3395
CRYPTO_ALG_ALLOCATES_MEMORY |
3396
CRYPTO_ALG_KERN_DRIVER_ONLY,
3397
.cra_blocksize = 1,
3398
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3399
.cra_alignmask = 0,
3400
.cra_init = safexcel_aead_sm4ctr_sm3_cra_init,
3401
.cra_exit = safexcel_aead_cra_exit,
3402
.cra_module = THIS_MODULE,
3403
},
3404
},
3405
};
3406
3407
static int safexcel_rfc4106_gcm_setkey(struct crypto_aead *ctfm, const u8 *key,
3408
unsigned int len)
3409
{
3410
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
3411
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3412
3413
/* last 4 bytes of key are the nonce! */
3414
ctx->nonce = *(u32 *)(key + len - CTR_RFC3686_NONCE_SIZE);
3415
3416
len -= CTR_RFC3686_NONCE_SIZE;
3417
return safexcel_aead_gcm_setkey(ctfm, key, len);
3418
}
3419
3420
static int safexcel_rfc4106_gcm_setauthsize(struct crypto_aead *tfm,
3421
unsigned int authsize)
3422
{
3423
return crypto_rfc4106_check_authsize(authsize);
3424
}
3425
3426
static int safexcel_rfc4106_encrypt(struct aead_request *req)
3427
{
3428
return crypto_ipsec_check_assoclen(req->assoclen) ?:
3429
safexcel_aead_encrypt(req);
3430
}
3431
3432
static int safexcel_rfc4106_decrypt(struct aead_request *req)
3433
{
3434
return crypto_ipsec_check_assoclen(req->assoclen) ?:
3435
safexcel_aead_decrypt(req);
3436
}
3437
3438
static int safexcel_rfc4106_gcm_cra_init(struct crypto_tfm *tfm)
3439
{
3440
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3441
int ret;
3442
3443
ret = safexcel_aead_gcm_cra_init(tfm);
3444
ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP;
3445
ctx->aadskip = EIP197_AEAD_IPSEC_IV_SIZE;
3446
return ret;
3447
}
3448
3449
struct safexcel_alg_template safexcel_alg_rfc4106_gcm = {
3450
.type = SAFEXCEL_ALG_TYPE_AEAD,
3451
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_GHASH,
3452
.alg.aead = {
3453
.setkey = safexcel_rfc4106_gcm_setkey,
3454
.setauthsize = safexcel_rfc4106_gcm_setauthsize,
3455
.encrypt = safexcel_rfc4106_encrypt,
3456
.decrypt = safexcel_rfc4106_decrypt,
3457
.ivsize = GCM_RFC4106_IV_SIZE,
3458
.maxauthsize = GHASH_DIGEST_SIZE,
3459
.base = {
3460
.cra_name = "rfc4106(gcm(aes))",
3461
.cra_driver_name = "safexcel-rfc4106-gcm-aes",
3462
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3463
.cra_flags = CRYPTO_ALG_ASYNC |
3464
CRYPTO_ALG_ALLOCATES_MEMORY |
3465
CRYPTO_ALG_KERN_DRIVER_ONLY,
3466
.cra_blocksize = 1,
3467
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3468
.cra_alignmask = 0,
3469
.cra_init = safexcel_rfc4106_gcm_cra_init,
3470
.cra_exit = safexcel_aead_gcm_cra_exit,
3471
},
3472
},
3473
};
3474
3475
static int safexcel_rfc4543_gcm_setauthsize(struct crypto_aead *tfm,
3476
unsigned int authsize)
3477
{
3478
if (authsize != GHASH_DIGEST_SIZE)
3479
return -EINVAL;
3480
3481
return 0;
3482
}
3483
3484
static int safexcel_rfc4543_gcm_cra_init(struct crypto_tfm *tfm)
3485
{
3486
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3487
int ret;
3488
3489
ret = safexcel_aead_gcm_cra_init(tfm);
3490
ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP_GMAC;
3491
return ret;
3492
}
3493
3494
struct safexcel_alg_template safexcel_alg_rfc4543_gcm = {
3495
.type = SAFEXCEL_ALG_TYPE_AEAD,
3496
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_GHASH,
3497
.alg.aead = {
3498
.setkey = safexcel_rfc4106_gcm_setkey,
3499
.setauthsize = safexcel_rfc4543_gcm_setauthsize,
3500
.encrypt = safexcel_rfc4106_encrypt,
3501
.decrypt = safexcel_rfc4106_decrypt,
3502
.ivsize = GCM_RFC4543_IV_SIZE,
3503
.maxauthsize = GHASH_DIGEST_SIZE,
3504
.base = {
3505
.cra_name = "rfc4543(gcm(aes))",
3506
.cra_driver_name = "safexcel-rfc4543-gcm-aes",
3507
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3508
.cra_flags = CRYPTO_ALG_ASYNC |
3509
CRYPTO_ALG_ALLOCATES_MEMORY |
3510
CRYPTO_ALG_KERN_DRIVER_ONLY,
3511
.cra_blocksize = 1,
3512
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3513
.cra_alignmask = 0,
3514
.cra_init = safexcel_rfc4543_gcm_cra_init,
3515
.cra_exit = safexcel_aead_gcm_cra_exit,
3516
},
3517
},
3518
};
3519
3520
static int safexcel_rfc4309_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,
3521
unsigned int len)
3522
{
3523
struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
3524
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3525
3526
/* First byte of the nonce = L = always 3 for RFC4309 (4 byte ctr) */
3527
*(u8 *)&ctx->nonce = EIP197_AEAD_IPSEC_COUNTER_SIZE - 1;
3528
/* last 3 bytes of key are the nonce! */
3529
memcpy((u8 *)&ctx->nonce + 1, key + len -
3530
EIP197_AEAD_IPSEC_CCM_NONCE_SIZE,
3531
EIP197_AEAD_IPSEC_CCM_NONCE_SIZE);
3532
3533
len -= EIP197_AEAD_IPSEC_CCM_NONCE_SIZE;
3534
return safexcel_aead_ccm_setkey(ctfm, key, len);
3535
}
3536
3537
static int safexcel_rfc4309_ccm_setauthsize(struct crypto_aead *tfm,
3538
unsigned int authsize)
3539
{
3540
/* Borrowed from crypto/ccm.c */
3541
switch (authsize) {
3542
case 8:
3543
case 12:
3544
case 16:
3545
break;
3546
default:
3547
return -EINVAL;
3548
}
3549
3550
return 0;
3551
}
3552
3553
static int safexcel_rfc4309_ccm_encrypt(struct aead_request *req)
3554
{
3555
struct safexcel_cipher_req *creq = aead_request_ctx(req);
3556
3557
/* Borrowed from crypto/ccm.c */
3558
if (req->assoclen != 16 && req->assoclen != 20)
3559
return -EINVAL;
3560
3561
return safexcel_queue_req(&req->base, creq, SAFEXCEL_ENCRYPT);
3562
}
3563
3564
static int safexcel_rfc4309_ccm_decrypt(struct aead_request *req)
3565
{
3566
struct safexcel_cipher_req *creq = aead_request_ctx(req);
3567
3568
/* Borrowed from crypto/ccm.c */
3569
if (req->assoclen != 16 && req->assoclen != 20)
3570
return -EINVAL;
3571
3572
return safexcel_queue_req(&req->base, creq, SAFEXCEL_DECRYPT);
3573
}
3574
3575
static int safexcel_rfc4309_ccm_cra_init(struct crypto_tfm *tfm)
3576
{
3577
struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
3578
int ret;
3579
3580
ret = safexcel_aead_ccm_cra_init(tfm);
3581
ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP;
3582
ctx->aadskip = EIP197_AEAD_IPSEC_IV_SIZE;
3583
return ret;
3584
}
3585
3586
struct safexcel_alg_template safexcel_alg_rfc4309_ccm = {
3587
.type = SAFEXCEL_ALG_TYPE_AEAD,
3588
.algo_mask = SAFEXCEL_ALG_AES | SAFEXCEL_ALG_CBC_MAC_ALL,
3589
.alg.aead = {
3590
.setkey = safexcel_rfc4309_ccm_setkey,
3591
.setauthsize = safexcel_rfc4309_ccm_setauthsize,
3592
.encrypt = safexcel_rfc4309_ccm_encrypt,
3593
.decrypt = safexcel_rfc4309_ccm_decrypt,
3594
.ivsize = EIP197_AEAD_IPSEC_IV_SIZE,
3595
.maxauthsize = AES_BLOCK_SIZE,
3596
.base = {
3597
.cra_name = "rfc4309(ccm(aes))",
3598
.cra_driver_name = "safexcel-rfc4309-ccm-aes",
3599
.cra_priority = SAFEXCEL_CRA_PRIORITY,
3600
.cra_flags = CRYPTO_ALG_ASYNC |
3601
CRYPTO_ALG_ALLOCATES_MEMORY |
3602
CRYPTO_ALG_KERN_DRIVER_ONLY,
3603
.cra_blocksize = 1,
3604
.cra_ctxsize = sizeof(struct safexcel_cipher_ctx),
3605
.cra_alignmask = 0,
3606
.cra_init = safexcel_rfc4309_ccm_cra_init,
3607
.cra_exit = safexcel_aead_cra_exit,
3608
.cra_module = THIS_MODULE,
3609
},
3610
},
3611
};
3612
3613