|
@@ -1112,7 +1112,8 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
|
|
|
unsigned int authsize,
|
|
|
unsigned int ivsize,
|
|
|
int icv_stashing,
|
|
|
- u32 cryptoflags)
|
|
|
+ u32 cryptoflags,
|
|
|
+ bool encrypt)
|
|
|
{
|
|
|
struct talitos_edesc *edesc;
|
|
|
int assoc_nents = 0, src_nents, dst_nents, alloc_len, dma_len;
|
|
@@ -1145,19 +1146,17 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
|
|
|
assoc_nents = assoc_nents ? assoc_nents + 1 : 2;
|
|
|
}
|
|
|
|
|
|
- src_nents = sg_count(src, cryptlen + authsize, &src_chained);
|
|
|
- src_nents = (src_nents == 1) ? 0 : src_nents;
|
|
|
-
|
|
|
- if (!dst) {
|
|
|
- dst_nents = 0;
|
|
|
- } else {
|
|
|
- if (dst == src) {
|
|
|
- dst_nents = src_nents;
|
|
|
- } else {
|
|
|
- dst_nents = sg_count(dst, cryptlen + authsize,
|
|
|
- &dst_chained);
|
|
|
- dst_nents = (dst_nents == 1) ? 0 : dst_nents;
|
|
|
- }
|
|
|
+ if (!dst || dst == src) {
|
|
|
+ src_nents = sg_count(src, cryptlen + authsize, &src_chained);
|
|
|
+ src_nents = (src_nents == 1) ? 0 : src_nents;
|
|
|
+ dst_nents = dst ? src_nents : 0;
|
|
|
+ } else { /* dst && dst != src*/
|
|
|
+ src_nents = sg_count(src, cryptlen + (encrypt ? 0 : authsize),
|
|
|
+ &src_chained);
|
|
|
+ src_nents = (src_nents == 1) ? 0 : src_nents;
|
|
|
+ dst_nents = sg_count(dst, cryptlen + (encrypt ? authsize : 0),
|
|
|
+ &dst_chained);
|
|
|
+ dst_nents = (dst_nents == 1) ? 0 : dst_nents;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1208,7 +1207,7 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
|
|
|
}
|
|
|
|
|
|
static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
|
|
|
- int icv_stashing)
|
|
|
+ int icv_stashing, bool encrypt)
|
|
|
{
|
|
|
struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
|
|
|
struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
|
|
@@ -1217,7 +1216,7 @@ static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
|
|
|
return talitos_edesc_alloc(ctx->dev, areq->assoc, areq->src, areq->dst,
|
|
|
iv, areq->assoclen, areq->cryptlen,
|
|
|
ctx->authsize, ivsize, icv_stashing,
|
|
|
- areq->base.flags);
|
|
|
+ areq->base.flags, encrypt);
|
|
|
}
|
|
|
|
|
|
static int aead_encrypt(struct aead_request *req)
|
|
@@ -1227,7 +1226,7 @@ static int aead_encrypt(struct aead_request *req)
|
|
|
struct talitos_edesc *edesc;
|
|
|
|
|
|
/* allocate extended descriptor */
|
|
|
- edesc = aead_edesc_alloc(req, req->iv, 0);
|
|
|
+ edesc = aead_edesc_alloc(req, req->iv, 0, true);
|
|
|
if (IS_ERR(edesc))
|
|
|
return PTR_ERR(edesc);
|
|
|
|
|
@@ -1250,7 +1249,7 @@ static int aead_decrypt(struct aead_request *req)
|
|
|
req->cryptlen -= authsize;
|
|
|
|
|
|
/* allocate extended descriptor */
|
|
|
- edesc = aead_edesc_alloc(req, req->iv, 1);
|
|
|
+ edesc = aead_edesc_alloc(req, req->iv, 1, false);
|
|
|
if (IS_ERR(edesc))
|
|
|
return PTR_ERR(edesc);
|
|
|
|
|
@@ -1296,7 +1295,7 @@ static int aead_givencrypt(struct aead_givcrypt_request *req)
|
|
|
struct talitos_edesc *edesc;
|
|
|
|
|
|
/* allocate extended descriptor */
|
|
|
- edesc = aead_edesc_alloc(areq, req->giv, 0);
|
|
|
+ edesc = aead_edesc_alloc(areq, req->giv, 0, true);
|
|
|
if (IS_ERR(edesc))
|
|
|
return PTR_ERR(edesc);
|
|
|
|
|
@@ -1452,7 +1451,7 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
|
|
|
}
|
|
|
|
|
|
static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *
|
|
|
- areq)
|
|
|
+ areq, bool encrypt)
|
|
|
{
|
|
|
struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
|
|
|
struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
|
|
@@ -1460,7 +1459,7 @@ static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *
|
|
|
|
|
|
return talitos_edesc_alloc(ctx->dev, NULL, areq->src, areq->dst,
|
|
|
areq->info, 0, areq->nbytes, 0, ivsize, 0,
|
|
|
- areq->base.flags);
|
|
|
+ areq->base.flags, encrypt);
|
|
|
}
|
|
|
|
|
|
static int ablkcipher_encrypt(struct ablkcipher_request *areq)
|
|
@@ -1470,7 +1469,7 @@ static int ablkcipher_encrypt(struct ablkcipher_request *areq)
|
|
|
struct talitos_edesc *edesc;
|
|
|
|
|
|
/* allocate extended descriptor */
|
|
|
- edesc = ablkcipher_edesc_alloc(areq);
|
|
|
+ edesc = ablkcipher_edesc_alloc(areq, true);
|
|
|
if (IS_ERR(edesc))
|
|
|
return PTR_ERR(edesc);
|
|
|
|
|
@@ -1487,7 +1486,7 @@ static int ablkcipher_decrypt(struct ablkcipher_request *areq)
|
|
|
struct talitos_edesc *edesc;
|
|
|
|
|
|
/* allocate extended descriptor */
|
|
|
- edesc = ablkcipher_edesc_alloc(areq);
|
|
|
+ edesc = ablkcipher_edesc_alloc(areq, false);
|
|
|
if (IS_ERR(edesc))
|
|
|
return PTR_ERR(edesc);
|
|
|
|
|
@@ -1639,7 +1638,7 @@ static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
|
|
|
struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
|
|
|
|
|
|
return talitos_edesc_alloc(ctx->dev, NULL, req_ctx->psrc, NULL, NULL, 0,
|
|
|
- nbytes, 0, 0, 0, areq->base.flags);
|
|
|
+ nbytes, 0, 0, 0, areq->base.flags, false);
|
|
|
}
|
|
|
|
|
|
static int ahash_init(struct ahash_request *areq)
|