if (rctx->hash_rem) {
/* Save remaining data to buffer */
- scatterwalk_map_and_copy(rctx->buf, rctx->cmd.u.aes.src,
- rctx->hash_cnt, rctx->hash_rem, 0);
+ unsigned int offset = rctx->nbytes - rctx->hash_rem;
+ scatterwalk_map_and_copy(rctx->buf, rctx->src,
+ offset, rctx->hash_rem, 0);
rctx->buf_count = rctx->hash_rem;
} else
rctx->buf_count = 0;
struct scatterlist *sg, *cmac_key_sg = NULL;
unsigned int block_size =
crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
- unsigned int len, need_pad, sg_count;
+ unsigned int need_pad, sg_count;
gfp_t gfp;
+ u64 len;
int ret;
if (!ctx->u.aes.key_len)
if (nbytes)
rctx->null_msg = 0;
- if (!final && ((nbytes + rctx->buf_count) <= block_size)) {
+ len = (u64)rctx->buf_count + (u64)nbytes;
+
+ if (!final && (len <= block_size)) {
scatterwalk_map_and_copy(rctx->buf + rctx->buf_count, req->src,
0, nbytes, 0);
rctx->buf_count += nbytes;
return 0;
}
- len = rctx->buf_count + nbytes;
+ rctx->src = req->src;
+ rctx->nbytes = nbytes;
rctx->final = final;
- rctx->hash_cnt = final ? len : len & ~(block_size - 1);
- rctx->hash_rem = final ? 0 : len & (block_size - 1);
- if (!final && (rctx->hash_cnt == len)) {
+ rctx->hash_rem = final ? 0 : len & (block_size - 1);
+ rctx->hash_cnt = len - rctx->hash_rem;
+ if (!final && !rctx->hash_rem) {
/* CCP can't do zero length final, so keep some data around */
rctx->hash_cnt -= block_size;
rctx->hash_rem = block_size;
if (rctx->hash_rem) {
/* Save remaining data to buffer */
- scatterwalk_map_and_copy(rctx->buf, rctx->cmd.u.sha.src,
- rctx->hash_cnt, rctx->hash_rem, 0);
+ unsigned int offset = rctx->nbytes - rctx->hash_rem;
+ scatterwalk_map_and_copy(rctx->buf, rctx->src,
+ offset, rctx->hash_rem, 0);
rctx->buf_count = rctx->hash_rem;
} else
rctx->buf_count = 0;
struct scatterlist *sg;
unsigned int block_size =
crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
- unsigned int len, sg_count;
+ unsigned int sg_count;
gfp_t gfp;
+ u64 len;
int ret;
- if (!final && ((nbytes + rctx->buf_count) <= block_size)) {
+ len = (u64)rctx->buf_count + (u64)nbytes;
+
+ if (!final && (len <= block_size)) {
scatterwalk_map_and_copy(rctx->buf + rctx->buf_count, req->src,
0, nbytes, 0);
rctx->buf_count += nbytes;
return 0;
}
- len = rctx->buf_count + nbytes;
+ rctx->src = req->src;
+ rctx->nbytes = nbytes;
rctx->final = final;
- rctx->hash_cnt = final ? len : len & ~(block_size - 1);
- rctx->hash_rem = final ? 0 : len & (block_size - 1);
- if (!final && (rctx->hash_cnt == len)) {
+ rctx->hash_rem = final ? 0 : len & (block_size - 1);
+ rctx->hash_cnt = len - rctx->hash_rem;
+ if (!final && !rctx->hash_rem) {
/* CCP can't do zero length final, so keep some data around */
rctx->hash_cnt -= block_size;
rctx->hash_rem = block_size;
unsigned int null_msg;
unsigned int final;
- unsigned int hash_cnt;
+ struct scatterlist *src;
+ unsigned int nbytes;
+
+ u64 hash_cnt;
unsigned int hash_rem;
struct sg_table data_sg;
unsigned int first;
unsigned int final;
- unsigned int hash_cnt;
+ struct scatterlist *src;
+ unsigned int nbytes;
+
+ u64 hash_cnt;
unsigned int hash_rem;
struct sg_table data_sg;
unsigned int dma_count;
enum dma_data_direction dma_dir;
- u32 sg_used;
+ unsigned int sg_used;
- u32 bytes_left;
+ u64 bytes_left;
};
struct ccp_data {
}
static int ccp_init_sg_workarea(struct ccp_sg_workarea *wa, struct device *dev,
- struct scatterlist *sg, unsigned int len,
+ struct scatterlist *sg, u64 len,
enum dma_data_direction dma_dir)
{
memset(wa, 0, sizeof(*wa));
static void ccp_update_sg_workarea(struct ccp_sg_workarea *wa, unsigned int len)
{
- unsigned int nbytes = min(len, wa->bytes_left);
+ unsigned int nbytes = min_t(u64, len, wa->bytes_left);
if (!wa->sg)
return;
}
static int ccp_init_data(struct ccp_data *data, struct ccp_cmd_queue *cmd_q,
- struct scatterlist *sg, unsigned int sg_len,
+ struct scatterlist *sg, u64 sg_len,
unsigned int dm_len,
enum dma_data_direction dir)
{
if (!sg_wa->sg)
return 0;
- /* Perform the copy operation */
- nbytes = min(sg_wa->bytes_left, dm_wa->length);
+ /* Perform the copy operation
+ * nbytes will always be <= UINT_MAX because dm_wa->length is
+ * an unsigned int
+ */
+ nbytes = min_t(u64, sg_wa->bytes_left, dm_wa->length);
scatterwalk_map_and_copy(dm_wa->address, sg_wa->sg, sg_wa->sg_used,
nbytes, from);
/* Update the structures and generate the count */
buf_count = 0;
while (sg_wa->bytes_left && (buf_count < dm_wa->length)) {
- nbytes = min3(sg_wa->sg->length - sg_wa->sg_used,
- dm_wa->length - buf_count,
- sg_wa->bytes_left);
+ nbytes = min(sg_wa->sg->length - sg_wa->sg_used,
+ dm_wa->length - buf_count);
+ nbytes = min_t(u64, sg_wa->bytes_left, nbytes);
buf_count += nbytes;
ccp_update_sg_workarea(sg_wa, nbytes);
/* The CCP can only DMA from/to one address each per operation. This
* requires that we find the smallest DMA area between the source
- * and destination.
+ * and destination. The resulting len values will always be <= UINT_MAX
+ * because the dma length is an unsigned int.
*/
- sg_src_len = min(sg_dma_len(src->sg_wa.sg) - src->sg_wa.sg_used,
- src->sg_wa.bytes_left);
+ sg_src_len = sg_dma_len(src->sg_wa.sg) - src->sg_wa.sg_used;
+ sg_src_len = min_t(u64, src->sg_wa.bytes_left, sg_src_len);
if (dst) {
- sg_dst_len = min(sg_dma_len(dst->sg_wa.sg) - dst->sg_wa.sg_used,
- src->sg_wa.bytes_left);
+ sg_dst_len = sg_dma_len(dst->sg_wa.sg) - dst->sg_wa.sg_used;
+ sg_dst_len = min_t(u64, src->sg_wa.bytes_left, sg_dst_len);
op_len = min(sg_src_len, sg_dst_len);
} else
op_len = sg_src_len;
u32 iv_len; /* In bytes */
struct scatterlist *src, *dst;
- u32 src_len; /* In bytes */
+ u64 src_len; /* In bytes */
u32 cmac_final; /* Indicates final cmac cmd */
struct scatterlist *cmac_key; /* K1/K2 cmac key required for
u32 iv_len; /* In bytes */
struct scatterlist *src, *dst;
- u32 src_len; /* In bytes */
+ u64 src_len; /* In bytes */
u32 final;
};
u32 ctx_len; /* In bytes */
struct scatterlist *src;
- u32 src_len; /* In bytes */
+ u64 src_len; /* In bytes */
u32 final; /* Indicates final sha cmd */
u64 msg_bits; /* Message length in bits required for
u32 mask_len; /* In bytes */
struct scatterlist *src, *dst;
- u32 src_len; /* In bytes */
+ u64 src_len; /* In bytes */
u32 final;
};