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
272272static 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
352353static 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
465467static 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
478480static 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
535556static 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 ;
547569bad_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
878901static 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+
939983static 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