lkml.org 
[lkml]   [2021]   [Feb]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 02/11] crypto: qce: sha: Hold back a block of data to be transferred as part of final
    Date
    If the available data to transfer is exactly a multiple of block size, save
    the last block to be transferred in qce_ahash_final (with the last block
    bit set) if this is indeed the end of data stream. If not this saved block
    will be transferred as part of next update. If this block is not held back
    and if this is indeed the end of data stream, the digest obtained will be
    wrong since qce_ahash_final will see that rctx->buflen is 0 and return
    doing nothing which in turn means that a digest will not be copied to the
    destination result buffer. qce_ahash_final cannot be made to alter this
    behavior and allowed to proceed if rctx->buflen is 0 because the crypto
    engine BAM does not allow for zero length transfers.

    Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Thara Gopinath <thara.gopinath@linaro.org>
    ---
    drivers/crypto/qce/sha.c | 19 +++++++++++++++++++
    1 file changed, 19 insertions(+)

    diff --git a/drivers/crypto/qce/sha.c b/drivers/crypto/qce/sha.c
    index 7da562dca740..2813c9a27a6e 100644
    --- a/drivers/crypto/qce/sha.c
    +++ b/drivers/crypto/qce/sha.c
    @@ -216,6 +216,25 @@ static int qce_ahash_update(struct ahash_request *req)

    /* calculate how many bytes will be hashed later */
    hash_later = total % blocksize;
    +
    + /*
    + * At this point, there is more than one block size of data. If
    + * the available data to transfer is exactly a multiple of block
    + * size, save the last block to be transferred in qce_ahash_final
    + * (with the last block bit set) if this is indeed the end of data
    + * stream. If not this saved block will be transferred as part of
    + * next update. If this block is not held back and if this is
    + * indeed the end of data stream, the digest obtained will be wrong
    + * since qce_ahash_final will see that rctx->buflen is 0 and return
    + * doing nothing which in turn means that a digest will not be
    + * copied to the destination result buffer. qce_ahash_final cannot
    + * be made to alter this behavior and allowed to proceed if
    + * rctx->buflen is 0 because the crypto engine BAM does not allow
    + * for zero length transfers.
    + */
    + if (!hash_later)
    + hash_later = blocksize;
    +
    if (hash_later) {
    unsigned int src_offset = req->nbytes - hash_later;
    scatterwalk_map_and_copy(rctx->buf, req->src, src_offset,
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-02-11 21:09    [W:3.697 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site