Skip to content

Commit 8b18e23

Browse files
horiagherbertx
authored andcommitted
crypto: caam - fix IV loading for authenc (giv)decryption
For algorithms that implement IV generators before the crypto ops, the IV needed for decryption is initially located in req->src scatterlist, not in req->iv. Avoid copying the IV into req->iv by modifying the (givdecrypt) descriptors to load it directly from req->src. aead_givdecrypt() is no longer needed and goes away. Cc: <[email protected]> # 4.3+ Fixes: 479bcc7 ("crypto: caam - Convert authenc to new AEAD interface") Signed-off-by: Horia Geantă <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 31bd44e commit 8b18e23

File tree

1 file changed

+37
-40
lines changed

1 file changed

+37
-40
lines changed

drivers/crypto/caam/caamalg.c

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,10 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
556556

557557
/* Read and write assoclen bytes */
558558
append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
559-
append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
559+
if (alg->caam.geniv)
560+
append_math_add_imm_u32(desc, VARSEQOUTLEN, REG3, IMM, ivsize);
561+
else
562+
append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
560563

561564
/* Skip assoc data */
562565
append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
@@ -565,6 +568,14 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
565568
append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
566569
KEY_VLF);
567570

571+
if (alg->caam.geniv) {
572+
append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
573+
LDST_SRCDST_BYTE_CONTEXT |
574+
(ctx1_iv_off << LDST_OFFSET_SHIFT));
575+
append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_CLASS2INFIFO |
576+
(ctx1_iv_off << MOVE_OFFSET_SHIFT) | ivsize);
577+
}
578+
568579
/* Load Counter into CONTEXT1 reg */
569580
if (is_rfc3686)
570581
append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM |
@@ -2150,7 +2161,7 @@ static void init_authenc_job(struct aead_request *req,
21502161

21512162
init_aead_job(req, edesc, all_contig, encrypt);
21522163

2153-
if (ivsize && (is_rfc3686 || !(alg->caam.geniv && encrypt)))
2164+
if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv))
21542165
append_load_as_imm(desc, req->iv, ivsize,
21552166
LDST_CLASS_1_CCB |
21562167
LDST_SRCDST_BYTE_CONTEXT |
@@ -2537,20 +2548,6 @@ static int aead_decrypt(struct aead_request *req)
25372548
return ret;
25382549
}
25392550

2540-
static int aead_givdecrypt(struct aead_request *req)
2541-
{
2542-
struct crypto_aead *aead = crypto_aead_reqtfm(req);
2543-
unsigned int ivsize = crypto_aead_ivsize(aead);
2544-
2545-
if (req->cryptlen < ivsize)
2546-
return -EINVAL;
2547-
2548-
req->cryptlen -= ivsize;
2549-
req->assoclen += ivsize;
2550-
2551-
return aead_decrypt(req);
2552-
}
2553-
25542551
/*
25552552
* allocate and map the ablkcipher extended descriptor for ablkcipher
25562553
*/
@@ -3210,7 +3207,7 @@ static struct caam_aead_alg driver_aeads[] = {
32103207
.setkey = aead_setkey,
32113208
.setauthsize = aead_setauthsize,
32123209
.encrypt = aead_encrypt,
3213-
.decrypt = aead_givdecrypt,
3210+
.decrypt = aead_decrypt,
32143211
.ivsize = AES_BLOCK_SIZE,
32153212
.maxauthsize = MD5_DIGEST_SIZE,
32163213
},
@@ -3256,7 +3253,7 @@ static struct caam_aead_alg driver_aeads[] = {
32563253
.setkey = aead_setkey,
32573254
.setauthsize = aead_setauthsize,
32583255
.encrypt = aead_encrypt,
3259-
.decrypt = aead_givdecrypt,
3256+
.decrypt = aead_decrypt,
32603257
.ivsize = AES_BLOCK_SIZE,
32613258
.maxauthsize = SHA1_DIGEST_SIZE,
32623259
},
@@ -3302,7 +3299,7 @@ static struct caam_aead_alg driver_aeads[] = {
33023299
.setkey = aead_setkey,
33033300
.setauthsize = aead_setauthsize,
33043301
.encrypt = aead_encrypt,
3305-
.decrypt = aead_givdecrypt,
3302+
.decrypt = aead_decrypt,
33063303
.ivsize = AES_BLOCK_SIZE,
33073304
.maxauthsize = SHA224_DIGEST_SIZE,
33083305
},
@@ -3348,7 +3345,7 @@ static struct caam_aead_alg driver_aeads[] = {
33483345
.setkey = aead_setkey,
33493346
.setauthsize = aead_setauthsize,
33503347
.encrypt = aead_encrypt,
3351-
.decrypt = aead_givdecrypt,
3348+
.decrypt = aead_decrypt,
33523349
.ivsize = AES_BLOCK_SIZE,
33533350
.maxauthsize = SHA256_DIGEST_SIZE,
33543351
},
@@ -3394,7 +3391,7 @@ static struct caam_aead_alg driver_aeads[] = {
33943391
.setkey = aead_setkey,
33953392
.setauthsize = aead_setauthsize,
33963393
.encrypt = aead_encrypt,
3397-
.decrypt = aead_givdecrypt,
3394+
.decrypt = aead_decrypt,
33983395
.ivsize = AES_BLOCK_SIZE,
33993396
.maxauthsize = SHA384_DIGEST_SIZE,
34003397
},
@@ -3440,7 +3437,7 @@ static struct caam_aead_alg driver_aeads[] = {
34403437
.setkey = aead_setkey,
34413438
.setauthsize = aead_setauthsize,
34423439
.encrypt = aead_encrypt,
3443-
.decrypt = aead_givdecrypt,
3440+
.decrypt = aead_decrypt,
34443441
.ivsize = AES_BLOCK_SIZE,
34453442
.maxauthsize = SHA512_DIGEST_SIZE,
34463443
},
@@ -3486,7 +3483,7 @@ static struct caam_aead_alg driver_aeads[] = {
34863483
.setkey = aead_setkey,
34873484
.setauthsize = aead_setauthsize,
34883485
.encrypt = aead_encrypt,
3489-
.decrypt = aead_givdecrypt,
3486+
.decrypt = aead_decrypt,
34903487
.ivsize = DES3_EDE_BLOCK_SIZE,
34913488
.maxauthsize = MD5_DIGEST_SIZE,
34923489
},
@@ -3534,7 +3531,7 @@ static struct caam_aead_alg driver_aeads[] = {
35343531
.setkey = aead_setkey,
35353532
.setauthsize = aead_setauthsize,
35363533
.encrypt = aead_encrypt,
3537-
.decrypt = aead_givdecrypt,
3534+
.decrypt = aead_decrypt,
35383535
.ivsize = DES3_EDE_BLOCK_SIZE,
35393536
.maxauthsize = SHA1_DIGEST_SIZE,
35403537
},
@@ -3582,7 +3579,7 @@ static struct caam_aead_alg driver_aeads[] = {
35823579
.setkey = aead_setkey,
35833580
.setauthsize = aead_setauthsize,
35843581
.encrypt = aead_encrypt,
3585-
.decrypt = aead_givdecrypt,
3582+
.decrypt = aead_decrypt,
35863583
.ivsize = DES3_EDE_BLOCK_SIZE,
35873584
.maxauthsize = SHA224_DIGEST_SIZE,
35883585
},
@@ -3630,7 +3627,7 @@ static struct caam_aead_alg driver_aeads[] = {
36303627
.setkey = aead_setkey,
36313628
.setauthsize = aead_setauthsize,
36323629
.encrypt = aead_encrypt,
3633-
.decrypt = aead_givdecrypt,
3630+
.decrypt = aead_decrypt,
36343631
.ivsize = DES3_EDE_BLOCK_SIZE,
36353632
.maxauthsize = SHA256_DIGEST_SIZE,
36363633
},
@@ -3678,7 +3675,7 @@ static struct caam_aead_alg driver_aeads[] = {
36783675
.setkey = aead_setkey,
36793676
.setauthsize = aead_setauthsize,
36803677
.encrypt = aead_encrypt,
3681-
.decrypt = aead_givdecrypt,
3678+
.decrypt = aead_decrypt,
36823679
.ivsize = DES3_EDE_BLOCK_SIZE,
36833680
.maxauthsize = SHA384_DIGEST_SIZE,
36843681
},
@@ -3726,7 +3723,7 @@ static struct caam_aead_alg driver_aeads[] = {
37263723
.setkey = aead_setkey,
37273724
.setauthsize = aead_setauthsize,
37283725
.encrypt = aead_encrypt,
3729-
.decrypt = aead_givdecrypt,
3726+
.decrypt = aead_decrypt,
37303727
.ivsize = DES3_EDE_BLOCK_SIZE,
37313728
.maxauthsize = SHA512_DIGEST_SIZE,
37323729
},
@@ -3772,7 +3769,7 @@ static struct caam_aead_alg driver_aeads[] = {
37723769
.setkey = aead_setkey,
37733770
.setauthsize = aead_setauthsize,
37743771
.encrypt = aead_encrypt,
3775-
.decrypt = aead_givdecrypt,
3772+
.decrypt = aead_decrypt,
37763773
.ivsize = DES_BLOCK_SIZE,
37773774
.maxauthsize = MD5_DIGEST_SIZE,
37783775
},
@@ -3818,7 +3815,7 @@ static struct caam_aead_alg driver_aeads[] = {
38183815
.setkey = aead_setkey,
38193816
.setauthsize = aead_setauthsize,
38203817
.encrypt = aead_encrypt,
3821-
.decrypt = aead_givdecrypt,
3818+
.decrypt = aead_decrypt,
38223819
.ivsize = DES_BLOCK_SIZE,
38233820
.maxauthsize = SHA1_DIGEST_SIZE,
38243821
},
@@ -3864,7 +3861,7 @@ static struct caam_aead_alg driver_aeads[] = {
38643861
.setkey = aead_setkey,
38653862
.setauthsize = aead_setauthsize,
38663863
.encrypt = aead_encrypt,
3867-
.decrypt = aead_givdecrypt,
3864+
.decrypt = aead_decrypt,
38683865
.ivsize = DES_BLOCK_SIZE,
38693866
.maxauthsize = SHA224_DIGEST_SIZE,
38703867
},
@@ -3910,7 +3907,7 @@ static struct caam_aead_alg driver_aeads[] = {
39103907
.setkey = aead_setkey,
39113908
.setauthsize = aead_setauthsize,
39123909
.encrypt = aead_encrypt,
3913-
.decrypt = aead_givdecrypt,
3910+
.decrypt = aead_decrypt,
39143911
.ivsize = DES_BLOCK_SIZE,
39153912
.maxauthsize = SHA256_DIGEST_SIZE,
39163913
},
@@ -3956,7 +3953,7 @@ static struct caam_aead_alg driver_aeads[] = {
39563953
.setkey = aead_setkey,
39573954
.setauthsize = aead_setauthsize,
39583955
.encrypt = aead_encrypt,
3959-
.decrypt = aead_givdecrypt,
3956+
.decrypt = aead_decrypt,
39603957
.ivsize = DES_BLOCK_SIZE,
39613958
.maxauthsize = SHA384_DIGEST_SIZE,
39623959
},
@@ -4002,7 +3999,7 @@ static struct caam_aead_alg driver_aeads[] = {
40023999
.setkey = aead_setkey,
40034000
.setauthsize = aead_setauthsize,
40044001
.encrypt = aead_encrypt,
4005-
.decrypt = aead_givdecrypt,
4002+
.decrypt = aead_decrypt,
40064003
.ivsize = DES_BLOCK_SIZE,
40074004
.maxauthsize = SHA512_DIGEST_SIZE,
40084005
},
@@ -4051,7 +4048,7 @@ static struct caam_aead_alg driver_aeads[] = {
40514048
.setkey = aead_setkey,
40524049
.setauthsize = aead_setauthsize,
40534050
.encrypt = aead_encrypt,
4054-
.decrypt = aead_givdecrypt,
4051+
.decrypt = aead_decrypt,
40554052
.ivsize = CTR_RFC3686_IV_SIZE,
40564053
.maxauthsize = MD5_DIGEST_SIZE,
40574054
},
@@ -4102,7 +4099,7 @@ static struct caam_aead_alg driver_aeads[] = {
41024099
.setkey = aead_setkey,
41034100
.setauthsize = aead_setauthsize,
41044101
.encrypt = aead_encrypt,
4105-
.decrypt = aead_givdecrypt,
4102+
.decrypt = aead_decrypt,
41064103
.ivsize = CTR_RFC3686_IV_SIZE,
41074104
.maxauthsize = SHA1_DIGEST_SIZE,
41084105
},
@@ -4153,7 +4150,7 @@ static struct caam_aead_alg driver_aeads[] = {
41534150
.setkey = aead_setkey,
41544151
.setauthsize = aead_setauthsize,
41554152
.encrypt = aead_encrypt,
4156-
.decrypt = aead_givdecrypt,
4153+
.decrypt = aead_decrypt,
41574154
.ivsize = CTR_RFC3686_IV_SIZE,
41584155
.maxauthsize = SHA224_DIGEST_SIZE,
41594156
},
@@ -4204,7 +4201,7 @@ static struct caam_aead_alg driver_aeads[] = {
42044201
.setkey = aead_setkey,
42054202
.setauthsize = aead_setauthsize,
42064203
.encrypt = aead_encrypt,
4207-
.decrypt = aead_givdecrypt,
4204+
.decrypt = aead_decrypt,
42084205
.ivsize = CTR_RFC3686_IV_SIZE,
42094206
.maxauthsize = SHA256_DIGEST_SIZE,
42104207
},
@@ -4255,7 +4252,7 @@ static struct caam_aead_alg driver_aeads[] = {
42554252
.setkey = aead_setkey,
42564253
.setauthsize = aead_setauthsize,
42574254
.encrypt = aead_encrypt,
4258-
.decrypt = aead_givdecrypt,
4255+
.decrypt = aead_decrypt,
42594256
.ivsize = CTR_RFC3686_IV_SIZE,
42604257
.maxauthsize = SHA384_DIGEST_SIZE,
42614258
},
@@ -4306,7 +4303,7 @@ static struct caam_aead_alg driver_aeads[] = {
43064303
.setkey = aead_setkey,
43074304
.setauthsize = aead_setauthsize,
43084305
.encrypt = aead_encrypt,
4309-
.decrypt = aead_givdecrypt,
4306+
.decrypt = aead_decrypt,
43104307
.ivsize = CTR_RFC3686_IV_SIZE,
43114308
.maxauthsize = SHA512_DIGEST_SIZE,
43124309
},

0 commit comments

Comments
 (0)