lkml.org 
[lkml]   [2020]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 02/14] crypto: qat - check cipher length for aead AES-CBC-HMAC-SHA
    Date
    From: Dominik Przychodni <dominik.przychodni@intel.com>

    commit 45cb6653b0c355fc1445a8069ba78a4ce8720511 upstream.

    Return -EINVAL for authenc(hmac(sha1),cbc(aes)),
    authenc(hmac(sha256),cbc(aes)) and authenc(hmac(sha512),cbc(aes))
    if the cipher length is not multiple of the AES block.
    This is to prevent an undefined device behaviour.

    Fixes: d370cec32194 ("crypto: qat - Intel(R) QAT crypto interface")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Dominik Przychodni <dominik.przychodni@intel.com>
    [giovanni.cabiddu@intel.com: reworded commit message]
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/crypto/qat/qat_common/qat_algs.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/drivers/crypto/qat/qat_common/qat_algs.c
    +++ b/drivers/crypto/qat/qat_common/qat_algs.c
    @@ -871,6 +871,11 @@ static int qat_alg_aead_dec(struct aead_
    struct icp_qat_fw_la_bulk_req *msg;
    int digst_size = crypto_aead_authsize(aead_tfm);
    int ret, ctr = 0;
    + u32 cipher_len;
    +
    + cipher_len = areq->cryptlen - digst_size;
    + if (cipher_len % AES_BLOCK_SIZE != 0)
    + return -EINVAL;

    ret = qat_alg_sgl_to_bufl(ctx->inst, areq->src, areq->dst, qat_req);
    if (unlikely(ret))
    @@ -885,7 +890,7 @@ static int qat_alg_aead_dec(struct aead_
    qat_req->req.comn_mid.src_data_addr = qat_req->buf.blp;
    qat_req->req.comn_mid.dest_data_addr = qat_req->buf.bloutp;
    cipher_param = (void *)&qat_req->req.serv_specif_rqpars;
    - cipher_param->cipher_length = areq->cryptlen - digst_size;
    + cipher_param->cipher_length = cipher_len;
    cipher_param->cipher_offset = areq->assoclen;
    memcpy(cipher_param->u.cipher_IV_array, areq->iv, AES_BLOCK_SIZE);
    auth_param = (void *)((uint8_t *)cipher_param + sizeof(*cipher_param));
    @@ -914,6 +919,9 @@ static int qat_alg_aead_enc(struct aead_
    uint8_t *iv = areq->iv;
    int ret, ctr = 0;

    + if (areq->cryptlen % AES_BLOCK_SIZE != 0)
    + return -EINVAL;
    +
    ret = qat_alg_sgl_to_bufl(ctx->inst, areq->src, areq->dst, qat_req);
    if (unlikely(ret))
    return ret;

    \
     
     \ /
      Last update: 2020-10-16 11:14    [W:4.323 / U:0.876 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site