diff options
author | Tadeusz Struk <tadeusz.struk@intel.com> | 2015-09-30 08:38:39 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2015-10-01 09:56:58 -0400 |
commit | def14bfaf30d5d5a4a8fe5bf600ce09232e688c0 (patch) | |
tree | 337296554830bb1c7da7be865214f5c256859be6 /drivers/crypto | |
parent | ecdd6bed292fda02a3e3997307ac228edcab0b22 (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.c | 166 |
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 | ||
272 | static int qat_alg_aead_init_enc_session(struct crypto_aead *aead_tfm, | 272 | static 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 | ||
352 | static int qat_alg_aead_init_dec_session(struct crypto_aead *aead_tfm, | 353 | static 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 | ||
465 | static void qat_alg_ablkcipher_init_enc(struct qat_alg_ablkcipher_ctx *ctx, | 467 | static 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 | ||
478 | static void qat_alg_ablkcipher_init_dec(struct qat_alg_ablkcipher_ctx *ctx, | 480 | static 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 | ||
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) |
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 | ||
509 | static int qat_alg_aead_init_sessions(struct crypto_aead *tfm, | 530 | static 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 | ||
535 | static int qat_alg_ablkcipher_init_sessions(struct qat_alg_ablkcipher_ctx *ctx, | 556 | static 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; |
547 | bad_key: | 569 | bad_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 | ||
878 | static int qat_alg_ablkcipher_setkey(struct crypto_ablkcipher *tfm, | 901 | static 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 | ||
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 | |||
939 | static int qat_alg_ablkcipher_encrypt(struct ablkcipher_request *req) | 983 | static 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, |