crypto:chcr- Bug fixes
Subsystems (5)
cover crypto:chcr- Bug fixes
The patch series is based on Herbert's cryptodev-2.6 tree. It include bug fixes.
Atul Gupta (4):
crypto:chcr-Change flow IDs
crypto:chcr- Fix panic on dma_unmap_sg
crypto:chcr- Check device is allocated before use crypto:chcr- Fix wrong typecasting
Harsh Jain (4):
crypto:chcr- Fix key length for RFC4106 crypto:chcr- Use cipher instead of Block Cipher in gcm setkey crypto:chcr: Change cra_flags for cipher algos crypto:chcr- Change algo priority
drivers/crypto/chelsio/chcr_algo.c | 97 ++++++++++++++------------- drivers/crypto/chelsio/chcr_algo.h | 9 +-- drivers/crypto/chelsio/chcr_core.c | 27 ++++---- drivers/crypto/chelsio/chcr_core.h | 1 + drivers/crypto/chelsio/chcr_crypto.h | 5 +- drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h | 8 +++ 6 files changed, 80 insertions(+), 67 deletions(-)
Signature · 1 line
1.8.2.3
PATCH 1/8 crypto:chcr-Change flow IDs
Change assign flowc id to each outgoing request.Firmware use flowc id to schedule each request onto HW.
--- drivers/crypto/chelsio/chcr_algo.c | 18 ++++++++++-------- drivers/crypto/chelsio/chcr_algo.h | 9 +++++---- drivers/crypto/chelsio/chcr_core.h | 1 + drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h | 8 ++++++++ 4 files changed, 24 insertions(+), 12 deletions(-)
drivers/crypto/chelsio/chcr_algo.c +10 -8
@@ -542,10 +542,11 @@ static inline void create_wreq(struct chcr_context *ctx, (calc_tx_flits_ofld(skb) * 8), 16))); chcr_req->wreq.cookie =cpu_to_be64 ((uintptr_t )req); chcr_req->wreq.rx_chid_to_rx_q_id = -FILL_WR_RX_Q_ID (ctx->dev->tx_channel_id, qid, - is_iv ? iv_loc :IV_NOP ); +FILL_WR_RX_Q_ID (ctx->dev->rx_channel_id, qid, + is_iv ? iv_loc :IV_NOP , ctx->tx_channel_id); - chcr_req->ulptx.cmd_dest =FILL_ULPTX_CMD_DEST (ctx->dev->tx_channel_id); + chcr_req->ulptx.cmd_dest =FILL_ULPTX_CMD_DEST (ctx->dev->tx_channel_id, + qid); chcr_req->ulptx.len =htonl ((DIV_ROUND_UP ((calc_tx_flits_ofld (skb) *8 ),16 ) - ((sizeof (chcr_req->wreq)) >>4 )));
@@ -606,7 +607,7 @@ static inline void create_wreq(struct chcr_context *ctx, chcr_req = (struct chcr_wr *)__skb_put (skb, transhdr_len);memset (chcr_req,0 , transhdr_len); chcr_req->sec_cpl.op_ivinsrtofst = -FILL_SEC_CPL_OP_IVINSR (ctx->dev->tx_channel_id,2 ,1 ); +FILL_SEC_CPL_OP_IVINSR (ctx->dev->rx_channel_id,2 ,1 ); chcr_req->sec_cpl.pldlen =htonl (ivsize + req->nbytes); chcr_req->sec_cpl.aadstart_cipherstop_hi =
@@ -782,6 +783,7 @@ static int chcr_device_init(struct chcr_context *ctx)spin_lock (&ctx->dev->lock_chcr_dev); ctx->tx_channel_id = rxq_idx; ctx->dev->tx_channel_id = !ctx->dev->tx_channel_id; + ctx->dev->rx_channel_id =0 ;spin_unlock (&ctx->dev->lock_chcr_dev); } out:
@@ -874,7 +876,7 @@ static struct sk_buff *create_hash_wr(struct ahash_request *req,memset (chcr_req,0 , transhdr_len); chcr_req->sec_cpl.op_ivinsrtofst = -FILL_SEC_CPL_OP_IVINSR (ctx->dev->tx_channel_id,2 ,0 ); +FILL_SEC_CPL_OP_IVINSR (ctx->dev->rx_channel_id,2 ,0 ); chcr_req->sec_cpl.pldlen =htonl (param->bfr_len + param->sg_len); chcr_req->sec_cpl.aadstart_cipherstop_hi =
@@ -1424,7 +1426,7 @@ static struct sk_buff *create_authenc_wr(struct aead_request *req,* to the hardware spec */ chcr_req->sec_cpl.op_ivinsrtofst = -FILL_SEC_CPL_OP_IVINSR (ctx->dev->tx_channel_id,2 , +FILL_SEC_CPL_OP_IVINSR (ctx->dev->rx_channel_id,2 , (ivsize ? (assoclen +1 ) :0 )); chcr_req->sec_cpl.pldlen =htonl (assoclen + ivsize + req->cryptlen); chcr_req->sec_cpl.aadstart_cipherstop_hi = FILL_SEC_CPL_CIPHERSTOP_HI(
@@ -1600,7 +1602,7 @@ static void fill_sec_cpl_for_aead(struct cpl_tx_sec_pdu *sec_cpl,unsigned int ivsize =AES_BLOCK_SIZE ;unsigned int cipher_mode =CHCR_SCMD_CIPHER_MODE_AES_CCM ;unsigned int mac_mode =CHCR_SCMD_AUTH_MODE_CBCMAC ; -unsigned int c_id = chcrctx->dev->tx_channel_id; +unsigned int c_id = chcrctx->dev->rx_channel_id;unsigned int ccm_xtra;unsigned char tag_offset =0 , auth_offset =0 ;unsigned char hmac_ctrl =get_hmac (crypto_aead_authsize (tfm));
@@ -1875,7 +1877,7 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req, tag_offset = (op_type ==CHCR_ENCRYPT_OP ) ?0 : authsize; chcr_req->sec_cpl.op_ivinsrtofst =FILL_SEC_CPL_OP_IVINSR ( - ctx->dev->tx_channel_id,2 , (ivsize ? + ctx->dev->rx_channel_id,2 , (ivsize ? (req->assoclen +1 ) :0 )); chcr_req->sec_cpl.pldlen =htonl (req->assoclen + ivsize + crypt_len); chcr_req->sec_cpl.aadstart_cipherstop_hi = FILL_SEC_CPL_CIPHERSTOP_HI(
drivers/crypto/chelsio/chcr_algo.h +5 -4
@@ -185,20 +185,21 @@ FW_CRYPTO_LOOKASIDE_WR_CCTX_LOC_V(1) | \ FW_CRYPTO_LOOKASIDE_WR_CCTX_SIZE_V((ctx_len))) -#define FILL_WR_RX_Q_ID (cid, qid, wr_iv) \ +#define FILL_WR_RX_Q_ID (cid, qid, wr_iv, fid) \ htonl( \ FW_CRYPTO_LOOKASIDE_WR_RX_CHID_V((cid)) | \ FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID_V((qid)) | \ FW_CRYPTO_LOOKASIDE_WR_LCB_V(0) | \ - FW_CRYPTO_LOOKASIDE_WR_IV_V((wr_iv))) + FW_CRYPTO_LOOKASIDE_WR_IV_V((wr_iv)) | \ + FW_CRYPTO_LOOKASIDE_WR_FQIDX_V(fid)) -#define FILL_ULPTX_CMD_DEST (cid) \ +#define FILL_ULPTX_CMD_DEST (cid, qid) \ htonl(ULPTX_CMD_V(ULP_TX_PKT) | \ ULP_TXPKT_DEST_V(0) | \ ULP_TXPKT_DATAMODIFY_V(0) | \ ULP_TXPKT_CHANNELID_V((cid)) | \ ULP_TXPKT_RO_V(1) | \ - ULP_TXPKT_FID_V(0)) + ULP_TXPKT_FID_V(qid))#define KEYCTX_ALIGN_PAD (bs) ({unsigned int _bs = (bs);\ _bs == SHA1_DIGEST_SIZE ? 12 : 0; })
drivers/crypto/chelsio/chcr_core.h +1 -0
@@ -75,6 +75,7 @@ struct chcr_dev {spinlock_t lock_chcr_dev;struct uld_ctx *u_ctx;unsigned char tx_channel_id; +unsigned char rx_channel_id; };struct uld_ctx {
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h +8 -0
@@ -3385,6 +3385,14 @@ struct fw_crypto_lookaside_wr {#define FW_CRYPTO_LOOKASIDE_WR_IV_G (x) \ (((x) >> FW_CRYPTO_LOOKASIDE_WR_IV_S) & FW_CRYPTO_LOOKASIDE_WR_IV_M) +#define FW_CRYPTO_LOOKASIDE_WR_FQIDX_S 15 +#define FW_CRYPTO_LOOKASIDE_WR_FQIDX_M 0xff +#define FW_CRYPTO_LOOKASIDE_WR_FQIDX_V (x) \ + ((x) << FW_CRYPTO_LOOKASIDE_WR_FQIDX_S) +#define FW_CRYPTO_LOOKASIDE_WR_FQIDX_G (x) \ + (((x) >> FW_CRYPTO_LOOKASIDE_WR_FQIDX_S) & \ + FW_CRYPTO_LOOKASIDE_WR_FQIDX_M) +#define FW_CRYPTO_LOOKASIDE_WR_TX_CH_S 10#define FW_CRYPTO_LOOKASIDE_WR_TX_CH_M 0x3#define FW_CRYPTO_LOOKASIDE_WR_TX_CH_V (x) \
Signature · 1 line
1.8.2.3
PATCH 2/8 crypto:chcr- Fix panic on dma_unmap_sg
In reply to Harsh JainSave DMA mapped sg list addresses to request context buffer.
--- drivers/crypto/chelsio/chcr_algo.c | 49 +++++++++++++++++++----------------- drivers/crypto/chelsio/chcr_crypto.h | 3 +++ 2 files changed, 29 insertions(+), 23 deletions(-)
drivers/crypto/chelsio/chcr_algo.c +26 -23
@@ -158,7 +158,7 @@ int chcr_handle_resp(struct crypto_async_request *req, unsigned char *input,case CRYPTO_ALG_TYPE_AEAD : ctx_req.req.aead_req = (struct aead_request *)req; ctx_req.ctx.reqctx =aead_request_ctx (ctx_req.req.aead_req); -dma_unmap_sg (&u_ctx->lldi.pdev->dev, ctx_req.req.aead_req->dst, +dma_unmap_sg (&u_ctx->lldi.pdev->dev, ctx_req.ctx.reqctx->dst, ctx_req.ctx.reqctx->dst_nents,DMA_FROM_DEVICE );if (ctx_req.ctx.reqctx->skb) {kfree_skb (ctx_req.ctx.reqctx->skb);
@@ -1364,8 +1364,7 @@ static struct sk_buff *create_authenc_wr(struct aead_request *req,struct chcr_wr *chcr_req;struct cpl_rx_phys_dsgl *phys_cpl;struct phys_sge_parm sg_param; -struct scatterlist *src, *dst; -struct scatterlist src_sg[2 ], dst_sg[2 ]; +struct scatterlist *src;unsigned int frags =0 , transhdr_len;unsigned int ivsize =crypto_aead_ivsize (tfm), dst_size =0 ;unsigned int kctx_len =0 ;
@@ -1385,19 +1384,21 @@ static struct sk_buff *create_authenc_wr(struct aead_request *req,if (sg_nents_for_len (req->src, req->assoclen + req->cryptlen) <0 ) goto err; - src =scatterwalk_ffwd (src_sg, req->src, req->assoclen); - dst = src; + src =scatterwalk_ffwd (reqctx->srcffwd, req->src, req->assoclen); + reqctx->dst = src; +if (req->src != req->dst) { err =chcr_copy_assoc (req, aeadctx);if (err)return ERR_PTR (err); - dst =scatterwalk_ffwd (dst_sg, req->dst, req->assoclen); + reqctx->dst =scatterwalk_ffwd (reqctx->dstffwd, req->dst, + req->assoclen); }if (get_aead_subtype (tfm) ==CRYPTO_ALG_SUB_TYPE_AEAD_NULL ) { null =1 ; assoclen =0 ; } - reqctx->dst_nents =sg_nents_for_len (dst, req->cryptlen + + reqctx->dst_nents =sg_nents_for_len (reqctx->dst, req->cryptlen + (op_type ? -authsize : authsize));if (reqctx->dst_nents <=0 ) {pr_err ("AUTHENC:Invalid Destination sg entries\n" );
@@ -1462,7 +1463,7 @@ static struct sk_buff *create_authenc_wr(struct aead_request *req, sg_param.obsize = req->cryptlen + (op_type ? -authsize : authsize); sg_param.qid = qid; sg_param.align =0 ; -if (map_writesg_phys_cpl (&u_ctx->lldi.pdev->dev, phys_cpl, dst, +if (map_writesg_phys_cpl (&u_ctx->lldi.pdev->dev, phys_cpl, reqctx->dst, &sg_param)) goto dstmap_fail;
@@ -1713,8 +1714,7 @@ static struct sk_buff *create_aead_ccm_wr(struct aead_request *req,struct chcr_wr *chcr_req;struct cpl_rx_phys_dsgl *phys_cpl;struct phys_sge_parm sg_param; -struct scatterlist *src, *dst; -struct scatterlist src_sg[2 ], dst_sg[2 ]; +struct scatterlist *src;unsigned int frags =0 , transhdr_len, ivsize =AES_BLOCK_SIZE ;unsigned int dst_size =0 , kctx_len;unsigned int sub_type;
@@ -1730,17 +1730,19 @@ static struct sk_buff *create_aead_ccm_wr(struct aead_request *req,if (sg_nents_for_len (req->src, req->assoclen + req->cryptlen) <0 ) goto err; sub_type =get_aead_subtype (tfm); - src =scatterwalk_ffwd (src_sg, req->src, req->assoclen); - dst = src; + src =scatterwalk_ffwd (reqctx->srcffwd, req->src, req->assoclen); + reqctx->dst = src; +if (req->src != req->dst) { err =chcr_copy_assoc (req, aeadctx);if (err) {pr_err ("AAD copy to destination buffer fails\n" );return ERR_PTR (err); } - dst =scatterwalk_ffwd (dst_sg, req->dst, req->assoclen); + reqctx->dst =scatterwalk_ffwd (reqctx->dstffwd, req->dst, + req->assoclen); } - reqctx->dst_nents =sg_nents_for_len (dst, req->cryptlen + + reqctx->dst_nents =sg_nents_for_len (reqctx->dst, req->cryptlen + (op_type ? -authsize : authsize));if (reqctx->dst_nents <=0 ) {pr_err ("CCM:Invalid Destination sg entries\n" );
@@ -1779,7 +1781,7 @@ static struct sk_buff *create_aead_ccm_wr(struct aead_request *req, sg_param.obsize = req->cryptlen + (op_type ? -authsize : authsize); sg_param.qid = qid; sg_param.align =0 ; -if (map_writesg_phys_cpl (&u_ctx->lldi.pdev->dev, phys_cpl, dst, +if (map_writesg_phys_cpl (&u_ctx->lldi.pdev->dev, phys_cpl, reqctx->dst, &sg_param)) goto dstmap_fail;
@@ -1811,8 +1813,7 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req,struct chcr_wr *chcr_req;struct cpl_rx_phys_dsgl *phys_cpl;struct phys_sge_parm sg_param; -struct scatterlist *src, *dst; -struct scatterlist src_sg[2 ], dst_sg[2 ]; +struct scatterlist *src;unsigned int frags =0 , transhdr_len;unsigned int ivsize =AES_BLOCK_SIZE ;unsigned int dst_size =0 , kctx_len;
@@ -1834,13 +1835,14 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req,if (sg_nents_for_len (req->src, req->assoclen + req->cryptlen) <0 ) goto err; - src =scatterwalk_ffwd (src_sg, req->src, req->assoclen); - dst = src; + src =scatterwalk_ffwd (reqctx->srcffwd, req->src, req->assoclen); + reqctx->dst = src;if (req->src != req->dst) { err =chcr_copy_assoc (req, aeadctx);if (err)return ERR_PTR (err); - dst =scatterwalk_ffwd (dst_sg, req->dst, req->assoclen); + reqctx->dst =scatterwalk_ffwd (reqctx->dstffwd, req->dst, + req->assoclen); }if (!req->cryptlen)
@@ -1850,7 +1852,7 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req, crypt_len =AES_BLOCK_SIZE ; else crypt_len = req->cryptlen; - reqctx->dst_nents =sg_nents_for_len (dst, req->cryptlen + + reqctx->dst_nents =sg_nents_for_len (reqctx->dst, req->cryptlen + (op_type ? -authsize : authsize));if (reqctx->dst_nents <=0 ) {pr_err ("GCM:Invalid Destination sg entries\n" );
@@ -1925,7 +1927,7 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req, sg_param.obsize = req->cryptlen + (op_type ? -authsize : authsize); sg_param.qid = qid; sg_param.align =0 ; -if (map_writesg_phys_cpl (&u_ctx->lldi.pdev->dev, phys_cpl, dst, +if (map_writesg_phys_cpl (&u_ctx->lldi.pdev->dev, phys_cpl, reqctx->dst, &sg_param)) goto dstmap_fail;
@@ -1939,7 +1941,8 @@ static struct sk_buff *create_gcm_wr(struct aead_request *req,write_sg_to_skb (skb, &frags, src, req->cryptlen); }else {aes_gcm_empty_pld_pad (req->dst, authsize -1 ); -write_sg_to_skb (skb, &frags, dst, crypt_len); +write_sg_to_skb (skb, &frags, reqctx->dst, crypt_len); + } create_wreq(ctx, chcr_req, req, skb, kctx_len, size, 1,
drivers/crypto/chelsio/chcr_crypto.h +3 -0
@@ -158,6 +158,9 @@ struct ablk_ctx { };struct chcr_aead_reqctx {struct sk_buff *skb; +struct scatterlist *dst; +struct scatterlist srcffwd[2 ]; +struct scatterlist dstffwd[2 ];short int dst_nents;u16 verify;u8 iv[CHCR_MAX_CRYPTO_IV_LEN ];
Signature · 1 line
1.8.2.3
PATCH 3/8 crypto:chcr- Fix key length for RFC4106
In reply to Harsh JainCheck keylen before copying salt to avoid wrap around of Integer.
--- drivers/crypto/chelsio/chcr_algo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/chelsio/chcr_algo.c +2 -2
@@ -2194,8 +2194,8 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,unsigned int ck_size;int ret =0 , key_ctx_size =0 ; -if (get_aead_subtype (aead) == -CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 ) { +if (get_aead_subtype (aead) ==CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 && + keylen >3 ) { keylen -=4 ;/* nonce/salt is present in the last 4 bytes */ memcpy (aeadctx->salt, key + keylen,4 ); }
Signature · 1 line
1.8.2.3
PATCH 4/8 crypto:chcr- Use cipher instead of Block Cipher in gcm setkey
In reply to Harsh Jain1 Block of encrption can be done with aes-generic. no need of cbc(aes). This patch replaces cbc(aes-generic) with aes-generic.
--- drivers/crypto/chelsio/chcr_algo.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/crypto/chelsio/chcr_algo.c +9 -11
@@ -2189,8 +2189,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,struct chcr_context *ctx =crypto_aead_ctx (aead);struct chcr_aead_ctx *aeadctx =AEAD_CTX (ctx);struct chcr_gcm_ctx *gctx =GCM_CTX (aeadctx); -struct blkcipher_desc h_desc; -struct scatterlist src[1 ]; +struct crypto_cipher *cipher;unsigned int ck_size;int ret =0 , key_ctx_size =0 ;
@@ -2223,27 +2222,26 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,CHCR_KEYCTX_MAC_KEY_SIZE_128 ,0 ,0 , key_ctx_size >> 4); -/* Calculate the H = CIPH(K, 0 repeated 16 times) using sync aes -* blkcipher It will go on key context +/* Calculate the H = CIPH(K, 0 repeated 16 times). +* It will go in key context */ - h_desc.tfm =crypto_alloc_blkcipher ("cbc(aes-generic)" ,0 ,0 ); -if (IS_ERR (h_desc.tfm)) { + cipher =crypto_alloc_cipher ("aes-generic" ,0 ,0 ); +if (IS_ERR (cipher)) { aeadctx->enckey_len =0 ; ret = -ENOMEM ; goto out; } - h_desc.flags =0 ; - ret =crypto_blkcipher_setkey (h_desc.tfm, key, keylen); + + ret =crypto_cipher_setkey (cipher, key, keylen);if (ret) { aeadctx->enckey_len =0 ; goto out1; }memset (gctx->ghash_h,0 ,AEAD_H_SIZE ); -sg_init_one (&src[0 ], gctx->ghash_h,AEAD_H_SIZE ); - ret =crypto_blkcipher_encrypt (&h_desc, &src[0 ], &src[0 ],AEAD_H_SIZE ); +crypto_cipher_encrypt_one (cipher, gctx->ghash_h, gctx->ghash_h); out1: -crypto_free_blkcipher (h_desc.tfm); +crypto_free_cipher (cipher); out:return ret; }
Signature · 1 line
1.8.2.3
PATCH 5/8 crypto:chcr: Change cra_flags for cipher algos
In reply to Harsh JainChange cipher algos flags to CRYPTO_ALG_TYPE_ABLKCIPHER.
--- drivers/crypto/chelsio/chcr_algo.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/chelsio/chcr_algo.c +3 -3
@@ -171,7 +171,7 @@ int chcr_handle_resp(struct crypto_async_request *req, unsigned char *input, }break ; -case CRYPTO_ALG_TYPE_BLKCIPHER : +case CRYPTO_ALG_TYPE_ABLKCIPHER : ctx_req.req.ablk_req = (struct ablkcipher_request *)req; ctx_req.ctx.ablk_ctx =ablkcipher_request_ctx (ctx_req.req.ablk_req);
@@ -2492,7 +2492,7 @@ static int chcr_aead_op(struct aead_request *req, .cra_name = "cbc(aes)", .cra_driver_name = "cbc-aes-chcr", .cra_priority = CHCR_CRA_PRIORITY, - .cra_flags =CRYPTO_ALG_TYPE_BLKCIPHER | + .cra_flags =CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, .cra_blocksize =AES_BLOCK_SIZE , .cra_ctxsize = sizeof(struct chcr_context)
@@ -2519,7 +2519,7 @@ static int chcr_aead_op(struct aead_request *req, .cra_name = "xts(aes)", .cra_driver_name = "xts-aes-chcr", .cra_priority = CHCR_CRA_PRIORITY, - .cra_flags =CRYPTO_ALG_TYPE_BLKCIPHER | + .cra_flags =CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC, .cra_blocksize = AES_BLOCK_SIZE, .cra_ctxsize = sizeof(struct chcr_context) +
Signature · 1 line
1.8.2.3
PATCH 6/8 crypto:chcr- Change algo priority
In reply to Harsh JainUpdate priorities to 3000
--- drivers/crypto/chelsio/chcr_crypto.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/chelsio/chcr_crypto.h +1 -1
@@ -48,7 +48,7 @@* giving the processed data */ -#define CHCR_CRA_PRIORITY 300 +#define CHCR_CRA_PRIORITY 3000#define CHCR_AES_MAX_KEY_LEN (2 * (AES_MAX_KEY_SIZE))/* consider xts */ #define CHCR_MAX_CRYPTO_IV_LEN 16/* AES IV len */
Signature · 1 line
1.8.2.3
PATCH 7/8 crypto:chcr- Check device is allocated before use
In reply to Harsh JainEnsure dev is allocated for crypto uld context before using the device for crypto operations.
--- drivers/crypto/chelsio/chcr_core.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
drivers/crypto/chelsio/chcr_core.c +8 -10
@@ -52,6 +52,7 @@int assign_chcr_device (struct chcr_dev **dev) {struct uld_ctx *u_ctx; +int ret = -ENXIO ;/* * Which device to use if multiple devices are available TODO
@@ -59,15 +60,14 @@ int assign_chcr_device(struct chcr_dev **dev)* must go to the same device to maintain the ordering. */ mutex_lock (&dev_mutex);/* TODO ? */ - u_ctx = list_first_entry(&uld_ctx_list, struct uld_ctx, entry); -if (!u_ctx) { -mutex_unlock (&dev_mutex); -return -ENXIO ; +list_for_each_entry (u_ctx, &uld_ctx_list, entry) +if (u_ctx && u_ctx->dev) { + *dev = u_ctx->dev; + ret =0 ; +break ; } - - *dev = u_ctx->dev;mutex_unlock (&dev_mutex); -return 0 ; +return ret; }static int chcr_dev_add (struct uld_ctx *u_ctx)
@@ -202,10 +202,8 @@ static int chcr_uld_state_change(void *handle, enum cxgb4_state state)static int __init chcr_crypto_init (void ) { -if (cxgb4_register_uld (CXGB4_ULD_CRYPTO , &chcr_uld_info)) { +if (cxgb4_register_uld (CXGB4_ULD_CRYPTO , &chcr_uld_info))pr_err ("ULD register fail: No chcr crypto support in cxgb4" ); -return -1 ; - }return 0 ; }
Signature · 1 line
1.8.2.3
PATCH 8/8 crypto:chcr- Fix wrong typecasting
In reply to Harsh JainTypecast the pointer with correct structure.
--- drivers/crypto/chelsio/chcr_core.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/crypto/chelsio/chcr_core.c +4 -5
@@ -151,18 +151,17 @@ int chcr_uld_rx_handler(void *handle, const __be64 *rsp, {struct uld_ctx *u_ctx = (struct uld_ctx *)handle;struct chcr_dev *dev = u_ctx->dev; -const struct cpl_act_establish *rpl = (struct cpl_act_establish - *)rsp; +const struct cpl_fw6_pld *rpl = (struct cpl_fw6_pld *)rsp; -if (rpl->ot.opcode !=CPL_FW6_PLD ) { +if (rpl->opcode !=CPL_FW6_PLD ) {pr_err ("Unsupported opcode\n" );return 0 ; }if (!pgl) - work_handlers[rpl->ot.opcode](dev, (unsigned char *)&rsp[1 ]); + work_handlers[rpl->opcode](dev, (unsigned char *)&rsp[1 ]);else - work_handlers[rpl->ot.opcode](dev, pgl->va); + work_handlers[rpl->opcode](dev, pgl->va);return 0 ; }
Signature · 1 line
1.8.2.3
Herbert Xu
maintainerRe: [PATCH v1 3/8] crypto:chcr- Fix key length for RFC4106
In reply to Harsh JainQuoted 12 lines · Harsh Jain
Check keylen before copying salt to avoid wrap around of Integer.
Signed-off-by Harsh Jain <[email protected]>--- drivers/crypto/chelsio/chcr_algo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/crypto/chelsio/chcr_algo.c +0
-0
drivers/crypto/chelsio/chcr_algo.c static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key, · line 2201
Quoted 10 lines
drivers/crypto/chelsio/chcr_algo.c +2
-2@@ -2194,8 +2194,8 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,unsigned int ck_size;int ret =0 , key_ctx_size =0 ; -if (get_aead_subtype (aead) == -CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 ) { +if (get_aead_subtype (aead) ==CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 && + keylen >3 ) { keylen -=4 ;/* nonce/salt is present in the last 4 bytes */ memcpy (aeadctx->salt, key + keylen,4 ); }
We should return an error in this case.
Cheers,
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Herbert Xu
maintainerQuoted 13 lines · Harsh Jain
The patch series is based on Herbert's cryptodev-2.6 tree. It include bug fixes.
Atul Gupta (4):
crypto:chcr-Change flow IDs
crypto:chcr- Fix panic ondma_unmap_sg
crypto:chcr- Check device is allocated before use crypto:chcr- Fix wrong typecasting
Harsh Jain (4):
crypto:chcr- Fix key length for RFC4106 crypto:chcr- Use cipher instead of Block Cipher in gcm setkey crypto:chcr: Changecra_flagsfor cipher algos crypto:chcr- Change algo priority
When you resubmit this please split it into two series. Please send the critical bug fixes (panic + key length + alloc check) in one series separate from the others. This way I can push them easily to the 4.10 tree.
Thanks,
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Re: [PATCH v1 3/8] crypto:chcr- Fix key length for RFC4106
In reply to Herbert XuQuoted 16 lines · Herbert Xu
Quoted 15 lines · Harsh Jain
Check keylen before copying salt to avoid wrap around of Integer.
Signed-off-by Harsh Jain <[email protected]>--- drivers/crypto/chelsio/chcr_algo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/crypto/chelsio/chcr_algo.c +0
-0@@ -2194,8 +2194,8 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,unsigned int ck_size;int ret =0 , key_ctx_size =0 ;
Quoted 8 lines
drivers/crypto/chelsio/chcr_algo.c static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key, · line 2201
Quoted 7 lines
drivers/crypto/chelsio/chcr_algo.c +2
-2-if (get_aead_subtype (aead) == -CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 ) { +if (get_aead_subtype (aead) ==CRYPTO_ALG_SUB_TYPE_AEAD_RFC4106 && + keylen >3 ) { keylen -=4 ;/* nonce/salt is present in the last 4 bytes */ memcpy (aeadctx->salt, key + keylen,4 ); }We should return an error in this case.
That case is already handled in next if condition.It will error out with -EINVAL in next condition.
if (keylen == AES_KEYSIZE_128) {
Quoted 2 lines
Cheers,
Herbert Xu
maintainerRe: [PATCH v1 3/8] crypto:chcr- Fix key length for RFC4106
Quoted 4 lines · Harsh Jain
That case is already handled in next if condition.It will error out with
-EINVALin next condition.if (keylen ==
AES_KEYSIZE_128) {
Good point. Please split the patches according to whether they should go into 4.10/4.11 and then resubmit.
Thanks,
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt