aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/nx
diff options
context:
space:
mode:
authorMarcelo Cerri <mhcerri@linux.vnet.ibm.com>2013-08-29 10:36:31 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2013-09-02 06:32:52 -0400
commita8fc391a15957e2f2871c4ea3f6e84c33095c374 (patch)
treeefcd0fd9cb12d1b970444842207efdce25e79d3c /drivers/crypto/nx
parentb8b4a4166e3401b7d8ea9deb8d64d875a468144c (diff)
crypto: nx - add offset to nx_build_sg_lists()
This patch includes one more parameter to nx_build_sg_lists() to skip the given number of bytes from beginning of each sg list. This is needed in order to implement the fixes for the AES modes to make them able to process larger chunks of data. Reviewed-by: Joy Latten <jmlatten@linux.vnet.ibm.com> Signed-off-by: Marcelo Cerri <mhcerri@linux.vnet.ibm.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/nx')
-rw-r--r--drivers/crypto/nx/nx-aes-cbc.c2
-rw-r--r--drivers/crypto/nx/nx-aes-ccm.c4
-rw-r--r--drivers/crypto/nx/nx-aes-ctr.c2
-rw-r--r--drivers/crypto/nx/nx-aes-ecb.c2
-rw-r--r--drivers/crypto/nx/nx-aes-gcm.c2
-rw-r--r--drivers/crypto/nx/nx.c9
-rw-r--r--drivers/crypto/nx/nx.h2
7 files changed, 14 insertions, 9 deletions
diff --git a/drivers/crypto/nx/nx-aes-cbc.c b/drivers/crypto/nx/nx-aes-cbc.c
index 7c0237dae02d..a9e76c6c37d8 100644
--- a/drivers/crypto/nx/nx-aes-cbc.c
+++ b/drivers/crypto/nx/nx-aes-cbc.c
@@ -85,7 +85,7 @@ static int cbc_aes_nx_crypt(struct blkcipher_desc *desc,
85 else 85 else
86 NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT; 86 NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT;
87 87
88 rc = nx_build_sg_lists(nx_ctx, desc, dst, src, nbytes, 88 rc = nx_build_sg_lists(nx_ctx, desc, dst, src, nbytes, 0,
89 csbcpb->cpb.aes_cbc.iv); 89 csbcpb->cpb.aes_cbc.iv);
90 if (rc) 90 if (rc)
91 goto out; 91 goto out;
diff --git a/drivers/crypto/nx/nx-aes-ccm.c b/drivers/crypto/nx/nx-aes-ccm.c
index 39d42245bc79..666a35b1181a 100644
--- a/drivers/crypto/nx/nx-aes-ccm.c
+++ b/drivers/crypto/nx/nx-aes-ccm.c
@@ -293,7 +293,7 @@ static int ccm_nx_decrypt(struct aead_request *req,
293 if (rc) 293 if (rc)
294 goto out; 294 goto out;
295 295
296 rc = nx_build_sg_lists(nx_ctx, desc, req->dst, req->src, nbytes, 296 rc = nx_build_sg_lists(nx_ctx, desc, req->dst, req->src, nbytes, 0,
297 csbcpb->cpb.aes_ccm.iv_or_ctr); 297 csbcpb->cpb.aes_ccm.iv_or_ctr);
298 if (rc) 298 if (rc)
299 goto out; 299 goto out;
@@ -339,7 +339,7 @@ static int ccm_nx_encrypt(struct aead_request *req,
339 if (rc) 339 if (rc)
340 goto out; 340 goto out;
341 341
342 rc = nx_build_sg_lists(nx_ctx, desc, req->dst, req->src, nbytes, 342 rc = nx_build_sg_lists(nx_ctx, desc, req->dst, req->src, nbytes, 0,
343 csbcpb->cpb.aes_ccm.iv_or_ctr); 343 csbcpb->cpb.aes_ccm.iv_or_ctr);
344 if (rc) 344 if (rc)
345 goto out; 345 goto out;
diff --git a/drivers/crypto/nx/nx-aes-ctr.c b/drivers/crypto/nx/nx-aes-ctr.c
index 762611b883cb..80dee8d58659 100644
--- a/drivers/crypto/nx/nx-aes-ctr.c
+++ b/drivers/crypto/nx/nx-aes-ctr.c
@@ -98,7 +98,7 @@ static int ctr_aes_nx_crypt(struct blkcipher_desc *desc,
98 goto out; 98 goto out;
99 } 99 }
100 100
101 rc = nx_build_sg_lists(nx_ctx, desc, dst, src, nbytes, 101 rc = nx_build_sg_lists(nx_ctx, desc, dst, src, nbytes, 0,
102 csbcpb->cpb.aes_ctr.iv); 102 csbcpb->cpb.aes_ctr.iv);
103 if (rc) 103 if (rc)
104 goto out; 104 goto out;
diff --git a/drivers/crypto/nx/nx-aes-ecb.c b/drivers/crypto/nx/nx-aes-ecb.c
index 77dbe084ba41..fe0d803ed233 100644
--- a/drivers/crypto/nx/nx-aes-ecb.c
+++ b/drivers/crypto/nx/nx-aes-ecb.c
@@ -85,7 +85,7 @@ static int ecb_aes_nx_crypt(struct blkcipher_desc *desc,
85 else 85 else
86 NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT; 86 NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT;
87 87
88 rc = nx_build_sg_lists(nx_ctx, desc, dst, src, nbytes, NULL); 88 rc = nx_build_sg_lists(nx_ctx, desc, dst, src, nbytes, 0, NULL);
89 if (rc) 89 if (rc)
90 goto out; 90 goto out;
91 91
diff --git a/drivers/crypto/nx/nx-aes-gcm.c b/drivers/crypto/nx/nx-aes-gcm.c
index 74feee10f943..c2d6f76e3677 100644
--- a/drivers/crypto/nx/nx-aes-gcm.c
+++ b/drivers/crypto/nx/nx-aes-gcm.c
@@ -226,7 +226,7 @@ static int gcm_aes_nx_crypt(struct aead_request *req, int enc)
226 226
227 csbcpb->cpb.aes_gcm.bit_length_data = nbytes * 8; 227 csbcpb->cpb.aes_gcm.bit_length_data = nbytes * 8;
228 228
229 rc = nx_build_sg_lists(nx_ctx, &desc, req->dst, req->src, nbytes, 229 rc = nx_build_sg_lists(nx_ctx, &desc, req->dst, req->src, nbytes, 0,
230 csbcpb->cpb.aes_gcm.iv_or_cnt); 230 csbcpb->cpb.aes_gcm.iv_or_cnt);
231 if (rc) 231 if (rc)
232 goto out; 232 goto out;
diff --git a/drivers/crypto/nx/nx.c b/drivers/crypto/nx/nx.c
index bdf4990f9758..5533fe31c90d 100644
--- a/drivers/crypto/nx/nx.c
+++ b/drivers/crypto/nx/nx.c
@@ -211,6 +211,8 @@ struct nx_sg *nx_walk_and_build(struct nx_sg *nx_dst,
211 * @dst: destination scatterlist 211 * @dst: destination scatterlist
212 * @src: source scatterlist 212 * @src: source scatterlist
213 * @nbytes: length of data described in the scatterlists 213 * @nbytes: length of data described in the scatterlists
214 * @offset: number of bytes to fast-forward past at the beginning of
215 * scatterlists.
214 * @iv: destination for the iv data, if the algorithm requires it 216 * @iv: destination for the iv data, if the algorithm requires it
215 * 217 *
216 * This is common code shared by all the AES algorithms. It uses the block 218 * This is common code shared by all the AES algorithms. It uses the block
@@ -222,6 +224,7 @@ int nx_build_sg_lists(struct nx_crypto_ctx *nx_ctx,
222 struct scatterlist *dst, 224 struct scatterlist *dst,
223 struct scatterlist *src, 225 struct scatterlist *src,
224 unsigned int nbytes, 226 unsigned int nbytes,
227 unsigned int offset,
225 u8 *iv) 228 u8 *iv)
226{ 229{
227 struct nx_sg *nx_insg = nx_ctx->in_sg; 230 struct nx_sg *nx_insg = nx_ctx->in_sg;
@@ -230,8 +233,10 @@ int nx_build_sg_lists(struct nx_crypto_ctx *nx_ctx,
230 if (iv) 233 if (iv)
231 memcpy(iv, desc->info, AES_BLOCK_SIZE); 234 memcpy(iv, desc->info, AES_BLOCK_SIZE);
232 235
233 nx_insg = nx_walk_and_build(nx_insg, nx_ctx->ap->sglen, src, 0, nbytes); 236 nx_insg = nx_walk_and_build(nx_insg, nx_ctx->ap->sglen, src,
234 nx_outsg = nx_walk_and_build(nx_outsg, nx_ctx->ap->sglen, dst, 0, nbytes); 237 offset, nbytes);
238 nx_outsg = nx_walk_and_build(nx_outsg, nx_ctx->ap->sglen, dst,
239 offset, nbytes);
235 240
236 /* these lengths should be negative, which will indicate to phyp that 241 /* these lengths should be negative, which will indicate to phyp that
237 * the input and output parameters are scatterlists, not linear 242 * the input and output parameters are scatterlists, not linear
diff --git a/drivers/crypto/nx/nx.h b/drivers/crypto/nx/nx.h
index 14bb97f1c339..befda07ca1da 100644
--- a/drivers/crypto/nx/nx.h
+++ b/drivers/crypto/nx/nx.h
@@ -156,7 +156,7 @@ int nx_hcall_sync(struct nx_crypto_ctx *ctx, struct vio_pfo_op *op,
156struct nx_sg *nx_build_sg_list(struct nx_sg *, u8 *, unsigned int, u32); 156struct nx_sg *nx_build_sg_list(struct nx_sg *, u8 *, unsigned int, u32);
157int nx_build_sg_lists(struct nx_crypto_ctx *, struct blkcipher_desc *, 157int nx_build_sg_lists(struct nx_crypto_ctx *, struct blkcipher_desc *,
158 struct scatterlist *, struct scatterlist *, unsigned int, 158 struct scatterlist *, struct scatterlist *, unsigned int,
159 u8 *); 159 unsigned int, u8 *);
160struct nx_sg *nx_walk_and_build(struct nx_sg *, unsigned int, 160struct nx_sg *nx_walk_and_build(struct nx_sg *, unsigned int,
161 struct scatterlist *, unsigned int, 161 struct scatterlist *, unsigned int,
162 unsigned int); 162 unsigned int);