aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
authorTadeusz Struk <tadeusz.struk@intel.com>2015-09-30 08:38:39 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-10-01 09:56:58 -0400
commitdef14bfaf30d5d5a4a8fe5bf600ce09232e688c0 (patch)
tree337296554830bb1c7da7be865214f5c256859be6 /drivers/crypto
parentecdd6bed292fda02a3e3997307ac228edcab0b22 (diff)
crypto: qat - add support for ctr(aes) and xts(aes)
Add support for ctr and xts encryption modes. Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/qat/qat_common/qat_algs.c166
1 files changed, 127 insertions, 39 deletions
diff --git a/drivers/crypto/qat/qat_common/qat_algs.c b/drivers/crypto/qat/qat_common/qat_algs.c
index 9ed7bd5b860c..59e4c3af15ed 100644
--- a/drivers/crypto/qat/qat_common/qat_algs.c
+++ b/drivers/crypto/qat/qat_common/qat_algs.c
@@ -62,13 +62,13 @@
62#include "icp_qat_fw.h" 62#include "icp_qat_fw.h"
63#include "icp_qat_fw_la.h" 63#include "icp_qat_fw_la.h"
64 64
65#define QAT_AES_HW_CONFIG_CBC_ENC(alg) \ 65#define QAT_AES_HW_CONFIG_ENC(alg, mode) \
66 ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \ 66 ICP_QAT_HW_CIPHER_CONFIG_BUILD(mode, alg, \
67 ICP_QAT_HW_CIPHER_NO_CONVERT, \ 67 ICP_QAT_HW_CIPHER_NO_CONVERT, \
68 ICP_QAT_HW_CIPHER_ENCRYPT) 68 ICP_QAT_HW_CIPHER_ENCRYPT)
69 69
70#define QAT_AES_HW_CONFIG_CBC_DEC(alg) \ 70#define QAT_AES_HW_CONFIG_DEC(alg, mode) \
71 ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \ 71 ICP_QAT_HW_CIPHER_CONFIG_BUILD(mode, alg, \
72 ICP_QAT_HW_CIPHER_KEY_CONVERT, \ 72 ICP_QAT_HW_CIPHER_KEY_CONVERT, \
73 ICP_QAT_HW_CIPHER_DECRYPT) 73 ICP_QAT_HW_CIPHER_DECRYPT)
74 74
@@ -271,7 +271,8 @@ static void qat_alg_init_common_hdr(struct icp_qat_fw_comn_req_hdr *header)
271 271
272static int qat_alg_aead_init_enc_session(struct crypto_aead *aead_tfm, 272static int qat_alg_aead_init_enc_session(struct crypto_aead *aead_tfm,
273 int alg, 273 int alg,
274 struct crypto_authenc_keys *keys) 274 struct crypto_authenc_keys *keys,
275 int mode)
275{ 276{
276 struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(aead_tfm); 277 struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(aead_tfm);
277 unsigned int digestsize = crypto_aead_authsize(aead_tfm); 278 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,
288 struct icp_qat_fw_auth_cd_ctrl_hdr *hash_cd_ctrl = ptr; 289 struct icp_qat_fw_auth_cd_ctrl_hdr *hash_cd_ctrl = ptr;
289 290
290 /* CD setup */ 291 /* 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);
292 memcpy(cipher->aes.key, keys->enckey, keys->enckeylen); 293 memcpy(cipher->aes.key, keys->enckey, keys->enckeylen);
293 hash->sha.inner_setup.auth_config.config = 294 hash->sha.inner_setup.auth_config.config =
294 ICP_QAT_HW_AUTH_CONFIG_BUILD(ICP_QAT_HW_AUTH_MODE1, 295 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,
351 352
352static int qat_alg_aead_init_dec_session(struct crypto_aead *aead_tfm, 353static int qat_alg_aead_init_dec_session(struct crypto_aead *aead_tfm,
353 int alg, 354 int alg,
354 struct crypto_authenc_keys *keys) 355 struct crypto_authenc_keys *keys,
356 int mode)
355{ 357{
356 struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(aead_tfm); 358 struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(aead_tfm);
357 unsigned int digestsize = crypto_aead_authsize(aead_tfm); 359 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,
373 sizeof(struct icp_qat_fw_la_cipher_req_params)); 375 sizeof(struct icp_qat_fw_la_cipher_req_params));
374 376
375 /* CD setup */ 377 /* 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);
377 memcpy(cipher->aes.key, keys->enckey, keys->enckeylen); 379 memcpy(cipher->aes.key, keys->enckey, keys->enckeylen);
378 hash->sha.inner_setup.auth_config.config = 380 hash->sha.inner_setup.auth_config.config =
379 ICP_QAT_HW_AUTH_CONFIG_BUILD(ICP_QAT_HW_AUTH_MODE1, 381 ICP_QAT_HW_AUTH_CONFIG_BUILD(ICP_QAT_HW_AUTH_MODE1,
@@ -464,7 +466,7 @@ static void qat_alg_ablkcipher_init_com(struct qat_alg_ablkcipher_ctx *ctx,
464 466
465static void qat_alg_ablkcipher_init_enc(struct qat_alg_ablkcipher_ctx *ctx, 467static void qat_alg_ablkcipher_init_enc(struct qat_alg_ablkcipher_ctx *ctx,
466 int alg, const uint8_t *key, 468 int alg, const uint8_t *key,
467 unsigned int keylen) 469 unsigned int keylen, int mode)
468{ 470{
469 struct icp_qat_hw_cipher_algo_blk *enc_cd = ctx->enc_cd; 471 struct icp_qat_hw_cipher_algo_blk *enc_cd = ctx->enc_cd;
470 struct icp_qat_fw_la_bulk_req *req = &ctx->enc_fw_req; 472 struct icp_qat_fw_la_bulk_req *req = &ctx->enc_fw_req;
@@ -472,12 +474,12 @@ static void qat_alg_ablkcipher_init_enc(struct qat_alg_ablkcipher_ctx *ctx,
472 474
473 qat_alg_ablkcipher_init_com(ctx, req, enc_cd, key, keylen); 475 qat_alg_ablkcipher_init_com(ctx, req, enc_cd, key, keylen);
474 cd_pars->u.s.content_desc_addr = ctx->enc_cd_paddr; 476 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);
476} 478}
477 479
478static void qat_alg_ablkcipher_init_dec(struct qat_alg_ablkcipher_ctx *ctx, 480static void qat_alg_ablkcipher_init_dec(struct qat_alg_ablkcipher_ctx *ctx,
479 int alg, const uint8_t *key, 481 int alg, const uint8_t *key,
480 unsigned int keylen) 482 unsigned int keylen, int mode)
481{ 483{
482 struct icp_qat_hw_cipher_algo_blk *dec_cd = ctx->dec_cd; 484 struct icp_qat_hw_cipher_algo_blk *dec_cd = ctx->dec_cd;
483 struct icp_qat_fw_la_bulk_req *req = &ctx->dec_fw_req; 485 struct icp_qat_fw_la_bulk_req *req = &ctx->dec_fw_req;
@@ -485,29 +487,48 @@ static void qat_alg_ablkcipher_init_dec(struct qat_alg_ablkcipher_ctx *ctx,
485 487
486 qat_alg_ablkcipher_init_com(ctx, req, dec_cd, key, keylen); 488 qat_alg_ablkcipher_init_com(ctx, req, dec_cd, key, keylen);
487 cd_pars->u.s.content_desc_addr = ctx->dec_cd_paddr; 489 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);
489} 497}
490 498
491static int qat_alg_validate_key(int key_len, int *alg) 499static int qat_alg_validate_key(int key_len, int *alg, int mode)
492{ 500{
493 switch (key_len) { 501 if (mode != ICP_QAT_HW_CIPHER_XTS_MODE) {
494 case AES_KEYSIZE_128: 502 switch (key_len) {
495 *alg = ICP_QAT_HW_CIPHER_ALGO_AES128; 503 case AES_KEYSIZE_128:
496 break; 504 *alg = ICP_QAT_HW_CIPHER_ALGO_AES128;
497 case AES_KEYSIZE_192: 505 break;
498 *alg = ICP_QAT_HW_CIPHER_ALGO_AES192; 506 case AES_KEYSIZE_192:
499 break; 507 *alg = ICP_QAT_HW_CIPHER_ALGO_AES192;
500 case AES_KEYSIZE_256: 508 break;
501 *alg = ICP_QAT_HW_CIPHER_ALGO_AES256; 509 case AES_KEYSIZE_256:
502 break; 510 *alg = ICP_QAT_HW_CIPHER_ALGO_AES256;
503 default: 511 break;
504 return -EINVAL; 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 }
505 } 526 }
506 return 0; 527 return 0;
507} 528}
508 529
509static int qat_alg_aead_init_sessions(struct crypto_aead *tfm, 530static int qat_alg_aead_init_sessions(struct crypto_aead *tfm, const u8 *key,
510 const uint8_t *key, unsigned int keylen) 531 unsigned int keylen, int mode)
511{ 532{
512 struct crypto_authenc_keys keys; 533 struct crypto_authenc_keys keys;
513 int alg; 534 int alg;
@@ -515,13 +536,13 @@ static int qat_alg_aead_init_sessions(struct crypto_aead *tfm,
515 if (crypto_authenc_extractkeys(&keys, key, keylen)) 536 if (crypto_authenc_extractkeys(&keys, key, keylen))
516 goto bad_key; 537 goto bad_key;
517 538
518 if (qat_alg_validate_key(keys.enckeylen, &alg)) 539 if (qat_alg_validate_key(keys.enckeylen, &alg, mode))
519 goto bad_key; 540 goto bad_key;
520 541
521 if (qat_alg_aead_init_enc_session(tfm, alg, &keys)) 542 if (qat_alg_aead_init_enc_session(tfm, alg, &keys, mode))
522 goto error; 543 goto error;
523 544
524 if (qat_alg_aead_init_dec_session(tfm, alg, &keys)) 545 if (qat_alg_aead_init_dec_session(tfm, alg, &keys, mode))
525 goto error; 546 goto error;
526 547
527 return 0; 548 return 0;
@@ -534,15 +555,16 @@ error:
534 555
535static int qat_alg_ablkcipher_init_sessions(struct qat_alg_ablkcipher_ctx *ctx, 556static int qat_alg_ablkcipher_init_sessions(struct qat_alg_ablkcipher_ctx *ctx,
536 const uint8_t *key, 557 const uint8_t *key,
537 unsigned int keylen) 558 unsigned int keylen,
559 int mode)
538{ 560{
539 int alg; 561 int alg;
540 562
541 if (qat_alg_validate_key(keylen, &alg)) 563 if (qat_alg_validate_key(keylen, &alg, mode))
542 goto bad_key; 564 goto bad_key;
543 565
544 qat_alg_ablkcipher_init_enc(ctx, alg, key, keylen); 566 qat_alg_ablkcipher_init_enc(ctx, alg, key, keylen, mode);
545 qat_alg_ablkcipher_init_dec(ctx, alg, key, keylen); 567 qat_alg_ablkcipher_init_dec(ctx, alg, key, keylen, mode);
546 return 0; 568 return 0;
547bad_key: 569bad_key:
548 crypto_tfm_set_flags(ctx->tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); 570 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,
586 goto out_free_enc; 608 goto out_free_enc;
587 } 609 }
588 } 610 }
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))
590 goto out_free_all; 613 goto out_free_all;
591 614
592 return 0; 615 return 0;
@@ -876,8 +899,8 @@ static int qat_alg_aead_enc(struct aead_request *areq)
876} 899}
877 900
878static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm, 901static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
879 const uint8_t *key, 902 const u8 *key, unsigned int keylen,
880 unsigned int keylen) 903 int mode)
881{ 904{
882 struct qat_alg_ablkcipher_ctx *ctx = crypto_ablkcipher_ctx(tfm); 905 struct qat_alg_ablkcipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
883 struct device *dev; 906 struct device *dev;
@@ -918,7 +941,7 @@ static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
918 } 941 }
919 } 942 }
920 spin_unlock(&ctx->lock); 943 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))
922 goto out_free_all; 945 goto out_free_all;
923 946
924 return 0; 947 return 0;
@@ -936,6 +959,27 @@ out_free_enc:
936 return -ENOMEM; 959 return -ENOMEM;
937} 960}
938 961
962static 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
969static 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
976static 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
939static int qat_alg_ablkcipher_encrypt(struct ablkcipher_request *req) 983static int qat_alg_ablkcipher_encrypt(struct ablkcipher_request *req)
940{ 984{
941 struct crypto_ablkcipher *atfm = crypto_ablkcipher_reqtfm(req); 985 struct crypto_ablkcipher *atfm = crypto_ablkcipher_reqtfm(req);
@@ -1171,7 +1215,51 @@ static struct crypto_alg qat_algs[] = { {
1171 .cra_exit = qat_alg_ablkcipher_exit, 1215 .cra_exit = qat_alg_ablkcipher_exit,
1172 .cra_u = { 1216 .cra_u = {
1173 .ablkcipher = { 1217 .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,
1175 .decrypt = qat_alg_ablkcipher_decrypt, 1263 .decrypt = qat_alg_ablkcipher_decrypt,
1176 .encrypt = qat_alg_ablkcipher_encrypt, 1264 .encrypt = qat_alg_ablkcipher_encrypt,
1177 .min_keysize = AES_MIN_KEY_SIZE, 1265 .min_keysize = AES_MIN_KEY_SIZE,