Skip to content

Commit def14bf

Browse files
tstrukherbertx
authored andcommitted
crypto: qat - add support for ctr(aes) and xts(aes)
Add support for ctr and xts encryption modes. Signed-off-by: Tadeusz Struk <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent ecdd6be commit def14bf

File tree

1 file changed

+127
-39
lines changed

1 file changed

+127
-39
lines changed

drivers/crypto/qat/qat_common/qat_algs.c

Lines changed: 127 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@
6262
#include "icp_qat_fw.h"
6363
#include "icp_qat_fw_la.h"
6464

65-
#define QAT_AES_HW_CONFIG_CBC_ENC(alg) \
66-
ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \
65+
#define QAT_AES_HW_CONFIG_ENC(alg, mode) \
66+
ICP_QAT_HW_CIPHER_CONFIG_BUILD(mode, alg, \
6767
ICP_QAT_HW_CIPHER_NO_CONVERT, \
6868
ICP_QAT_HW_CIPHER_ENCRYPT)
6969

70-
#define QAT_AES_HW_CONFIG_CBC_DEC(alg) \
71-
ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \
70+
#define QAT_AES_HW_CONFIG_DEC(alg, mode) \
71+
ICP_QAT_HW_CIPHER_CONFIG_BUILD(mode, alg, \
7272
ICP_QAT_HW_CIPHER_KEY_CONVERT, \
7373
ICP_QAT_HW_CIPHER_DECRYPT)
7474

@@ -271,7 +271,8 @@ static void qat_alg_init_common_hdr(struct icp_qat_fw_comn_req_hdr *header)
271271

272272
static int qat_alg_aead_init_enc_session(struct crypto_aead *aead_tfm,
273273
int alg,
274-
struct crypto_authenc_keys *keys)
274+
struct crypto_authenc_keys *keys,
275+
int mode)
275276
{
276277
struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(aead_tfm);
277278
unsigned int digestsize = crypto_aead_authsize(aead_tfm);
@@ -288,7 +289,7 @@ static int qat_alg_aead_init_enc_session(struct crypto_aead *aead_tfm,
288289
struct icp_qat_fw_auth_cd_ctrl_hdr *hash_cd_ctrl = ptr;
289290

290291
/* CD setup */
291-
cipher->aes.cipher_config.val = QAT_AES_HW_CONFIG_CBC_ENC(alg);
292+
cipher->aes.cipher_config.val = QAT_AES_HW_CONFIG_ENC(alg, mode);
292293
memcpy(cipher->aes.key, keys->enckey, keys->enckeylen);
293294
hash->sha.inner_setup.auth_config.config =
294295
ICP_QAT_HW_AUTH_CONFIG_BUILD(ICP_QAT_HW_AUTH_MODE1,
@@ -351,7 +352,8 @@ static int qat_alg_aead_init_enc_session(struct crypto_aead *aead_tfm,
351352

352353
static int qat_alg_aead_init_dec_session(struct crypto_aead *aead_tfm,
353354
int alg,
354-
struct crypto_authenc_keys *keys)
355+
struct crypto_authenc_keys *keys,
356+
int mode)
355357
{
356358
struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(aead_tfm);
357359
unsigned int digestsize = crypto_aead_authsize(aead_tfm);
@@ -373,7 +375,7 @@ static int qat_alg_aead_init_dec_session(struct crypto_aead *aead_tfm,
373375
sizeof(struct icp_qat_fw_la_cipher_req_params));
374376

375377
/* CD setup */
376-
cipher->aes.cipher_config.val = QAT_AES_HW_CONFIG_CBC_DEC(alg);
378+
cipher->aes.cipher_config.val = QAT_AES_HW_CONFIG_DEC(alg, mode);
377379
memcpy(cipher->aes.key, keys->enckey, keys->enckeylen);
378380
hash->sha.inner_setup.auth_config.config =
379381
ICP_QAT_HW_AUTH_CONFIG_BUILD(ICP_QAT_HW_AUTH_MODE1,
@@ -464,64 +466,83 @@ static void qat_alg_ablkcipher_init_com(struct qat_alg_ablkcipher_ctx *ctx,
464466

465467
static void qat_alg_ablkcipher_init_enc(struct qat_alg_ablkcipher_ctx *ctx,
466468
int alg, const uint8_t *key,
467-
unsigned int keylen)
469+
unsigned int keylen, int mode)
468470
{
469471
struct icp_qat_hw_cipher_algo_blk *enc_cd = ctx->enc_cd;
470472
struct icp_qat_fw_la_bulk_req *req = &ctx->enc_fw_req;
471473
struct icp_qat_fw_comn_req_hdr_cd_pars *cd_pars = &req->cd_pars;
472474

473475
qat_alg_ablkcipher_init_com(ctx, req, enc_cd, key, keylen);
474476
cd_pars->u.s.content_desc_addr = ctx->enc_cd_paddr;
475-
enc_cd->aes.cipher_config.val = QAT_AES_HW_CONFIG_CBC_ENC(alg);
477+
enc_cd->aes.cipher_config.val = QAT_AES_HW_CONFIG_ENC(alg, mode);
476478
}
477479

478480
static void qat_alg_ablkcipher_init_dec(struct qat_alg_ablkcipher_ctx *ctx,
479481
int alg, const uint8_t *key,
480-
unsigned int keylen)
482+
unsigned int keylen, int mode)
481483
{
482484
struct icp_qat_hw_cipher_algo_blk *dec_cd = ctx->dec_cd;
483485
struct icp_qat_fw_la_bulk_req *req = &ctx->dec_fw_req;
484486
struct icp_qat_fw_comn_req_hdr_cd_pars *cd_pars = &req->cd_pars;
485487

486488
qat_alg_ablkcipher_init_com(ctx, req, dec_cd, key, keylen);
487489
cd_pars->u.s.content_desc_addr = ctx->dec_cd_paddr;
488-
dec_cd->aes.cipher_config.val = QAT_AES_HW_CONFIG_CBC_DEC(alg);
490+
491+
if (mode != ICP_QAT_HW_CIPHER_CTR_MODE)
492+
dec_cd->aes.cipher_config.val =
493+
QAT_AES_HW_CONFIG_DEC(alg, mode);
494+
else
495+
dec_cd->aes.cipher_config.val =
496+
QAT_AES_HW_CONFIG_ENC(alg, mode);
489497
}
490498

491-
static int qat_alg_validate_key(int key_len, int *alg)
499+
static int qat_alg_validate_key(int key_len, int *alg, int mode)
492500
{
493-
switch (key_len) {
494-
case AES_KEYSIZE_128:
495-
*alg = ICP_QAT_HW_CIPHER_ALGO_AES128;
496-
break;
497-
case AES_KEYSIZE_192:
498-
*alg = ICP_QAT_HW_CIPHER_ALGO_AES192;
499-
break;
500-
case AES_KEYSIZE_256:
501-
*alg = ICP_QAT_HW_CIPHER_ALGO_AES256;
502-
break;
503-
default:
504-
return -EINVAL;
501+
if (mode != ICP_QAT_HW_CIPHER_XTS_MODE) {
502+
switch (key_len) {
503+
case AES_KEYSIZE_128:
504+
*alg = ICP_QAT_HW_CIPHER_ALGO_AES128;
505+
break;
506+
case AES_KEYSIZE_192:
507+
*alg = ICP_QAT_HW_CIPHER_ALGO_AES192;
508+
break;
509+
case AES_KEYSIZE_256:
510+
*alg = ICP_QAT_HW_CIPHER_ALGO_AES256;
511+
break;
512+
default:
513+
return -EINVAL;
514+
}
515+
} else {
516+
switch (key_len) {
517+
case AES_KEYSIZE_128 << 1:
518+
*alg = ICP_QAT_HW_CIPHER_ALGO_AES128;
519+
break;
520+
case AES_KEYSIZE_256 << 1:
521+
*alg = ICP_QAT_HW_CIPHER_ALGO_AES256;
522+
break;
523+
default:
524+
return -EINVAL;
525+
}
505526
}
506527
return 0;
507528
}
508529

509-
static int qat_alg_aead_init_sessions(struct crypto_aead *tfm,
510-
const uint8_t *key, unsigned int keylen)
530+
static int qat_alg_aead_init_sessions(struct crypto_aead *tfm, const u8 *key,
531+
unsigned int keylen, int mode)
511532
{
512533
struct crypto_authenc_keys keys;
513534
int alg;
514535

515536
if (crypto_authenc_extractkeys(&keys, key, keylen))
516537
goto bad_key;
517538

518-
if (qat_alg_validate_key(keys.enckeylen, &alg))
539+
if (qat_alg_validate_key(keys.enckeylen, &alg, mode))
519540
goto bad_key;
520541

521-
if (qat_alg_aead_init_enc_session(tfm, alg, &keys))
542+
if (qat_alg_aead_init_enc_session(tfm, alg, &keys, mode))
522543
goto error;
523544

524-
if (qat_alg_aead_init_dec_session(tfm, alg, &keys))
545+
if (qat_alg_aead_init_dec_session(tfm, alg, &keys, mode))
525546
goto error;
526547

527548
return 0;
@@ -534,15 +555,16 @@ static int qat_alg_aead_init_sessions(struct crypto_aead *tfm,
534555

535556
static int qat_alg_ablkcipher_init_sessions(struct qat_alg_ablkcipher_ctx *ctx,
536557
const uint8_t *key,
537-
unsigned int keylen)
558+
unsigned int keylen,
559+
int mode)
538560
{
539561
int alg;
540562

541-
if (qat_alg_validate_key(keylen, &alg))
563+
if (qat_alg_validate_key(keylen, &alg, mode))
542564
goto bad_key;
543565

544-
qat_alg_ablkcipher_init_enc(ctx, alg, key, keylen);
545-
qat_alg_ablkcipher_init_dec(ctx, alg, key, keylen);
566+
qat_alg_ablkcipher_init_enc(ctx, alg, key, keylen, mode);
567+
qat_alg_ablkcipher_init_dec(ctx, alg, key, keylen, mode);
546568
return 0;
547569
bad_key:
548570
crypto_tfm_set_flags(ctx->tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
@@ -586,7 +608,8 @@ static int qat_alg_aead_setkey(struct crypto_aead *tfm, const uint8_t *key,
586608
goto out_free_enc;
587609
}
588610
}
589-
if (qat_alg_aead_init_sessions(tfm, key, keylen))
611+
if (qat_alg_aead_init_sessions(tfm, key, keylen,
612+
ICP_QAT_HW_CIPHER_CBC_MODE))
590613
goto out_free_all;
591614

592615
return 0;
@@ -876,8 +899,8 @@ static int qat_alg_aead_enc(struct aead_request *areq)
876899
}
877900

878901
static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
879-
const uint8_t *key,
880-
unsigned int keylen)
902+
const u8 *key, unsigned int keylen,
903+
int mode)
881904
{
882905
struct qat_alg_ablkcipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
883906
struct device *dev;
@@ -918,7 +941,7 @@ static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
918941
}
919942
}
920943
spin_unlock(&ctx->lock);
921-
if (qat_alg_ablkcipher_init_sessions(ctx, key, keylen))
944+
if (qat_alg_ablkcipher_init_sessions(ctx, key, keylen, mode))
922945
goto out_free_all;
923946

924947
return 0;
@@ -936,6 +959,27 @@ static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
936959
return -ENOMEM;
937960
}
938961

962+
static int qat_alg_ablkcipher_cbc_setkey(struct crypto_ablkcipher *tfm,
963+
const u8 *key, unsigned int keylen)
964+
{
965+
return qat_alg_ablkcipher_setkey(tfm, key, keylen,
966+
ICP_QAT_HW_CIPHER_CBC_MODE);
967+
}
968+
969+
static int qat_alg_ablkcipher_ctr_setkey(struct crypto_ablkcipher *tfm,
970+
const u8 *key, unsigned int keylen)
971+
{
972+
return qat_alg_ablkcipher_setkey(tfm, key, keylen,
973+
ICP_QAT_HW_CIPHER_CTR_MODE);
974+
}
975+
976+
static int qat_alg_ablkcipher_xts_setkey(struct crypto_ablkcipher *tfm,
977+
const u8 *key, unsigned int keylen)
978+
{
979+
return qat_alg_ablkcipher_setkey(tfm, key, keylen,
980+
ICP_QAT_HW_CIPHER_XTS_MODE);
981+
}
982+
939983
static int qat_alg_ablkcipher_encrypt(struct ablkcipher_request *req)
940984
{
941985
struct crypto_ablkcipher *atfm = crypto_ablkcipher_reqtfm(req);
@@ -1171,7 +1215,51 @@ static struct crypto_alg qat_algs[] = { {
11711215
.cra_exit = qat_alg_ablkcipher_exit,
11721216
.cra_u = {
11731217
.ablkcipher = {
1174-
.setkey = qat_alg_ablkcipher_setkey,
1218+
.setkey = qat_alg_ablkcipher_cbc_setkey,
1219+
.decrypt = qat_alg_ablkcipher_decrypt,
1220+
.encrypt = qat_alg_ablkcipher_encrypt,
1221+
.min_keysize = AES_MIN_KEY_SIZE,
1222+
.max_keysize = AES_MAX_KEY_SIZE,
1223+
.ivsize = AES_BLOCK_SIZE,
1224+
},
1225+
},
1226+
}, {
1227+
.cra_name = "ctr(aes)",
1228+
.cra_driver_name = "qat_aes_ctr",
1229+
.cra_priority = 4001,
1230+
.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
1231+
.cra_blocksize = AES_BLOCK_SIZE,
1232+
.cra_ctxsize = sizeof(struct qat_alg_ablkcipher_ctx),
1233+
.cra_alignmask = 0,
1234+
.cra_type = &crypto_ablkcipher_type,
1235+
.cra_module = THIS_MODULE,
1236+
.cra_init = qat_alg_ablkcipher_init,
1237+
.cra_exit = qat_alg_ablkcipher_exit,
1238+
.cra_u = {
1239+
.ablkcipher = {
1240+
.setkey = qat_alg_ablkcipher_ctr_setkey,
1241+
.decrypt = qat_alg_ablkcipher_decrypt,
1242+
.encrypt = qat_alg_ablkcipher_encrypt,
1243+
.min_keysize = AES_MIN_KEY_SIZE,
1244+
.max_keysize = AES_MAX_KEY_SIZE,
1245+
.ivsize = AES_BLOCK_SIZE,
1246+
},
1247+
},
1248+
}, {
1249+
.cra_name = "xts(aes)",
1250+
.cra_driver_name = "qat_aes_xts",
1251+
.cra_priority = 4001,
1252+
.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
1253+
.cra_blocksize = AES_BLOCK_SIZE,
1254+
.cra_ctxsize = sizeof(struct qat_alg_ablkcipher_ctx),
1255+
.cra_alignmask = 0,
1256+
.cra_type = &crypto_ablkcipher_type,
1257+
.cra_module = THIS_MODULE,
1258+
.cra_init = qat_alg_ablkcipher_init,
1259+
.cra_exit = qat_alg_ablkcipher_exit,
1260+
.cra_u = {
1261+
.ablkcipher = {
1262+
.setkey = qat_alg_ablkcipher_xts_setkey,
11751263
.decrypt = qat_alg_ablkcipher_decrypt,
11761264
.encrypt = qat_alg_ablkcipher_encrypt,
11771265
.min_keysize = AES_MIN_KEY_SIZE,

0 commit comments

Comments
 (0)