• Ard Biesheuvel's avatar
    crypto: caam - limit output IV to CBC to work around CTR mode DMA issue · f976273a
    Ard Biesheuvel authored
    commit ed527b13 upstream.
    
    The CAAM driver currently violates an undocumented and slightly
    controversial requirement imposed by the crypto stack that a buffer
    referred to by the request structure via its virtual address may not
    be modified while any scatterlists passed via the same request
    structure are mapped for inbound DMA.
    
    This may result in errors like
    
      alg: aead: decryption failed on test 1 for gcm_base(ctr-aes-caam,ghash-generic): ret=74
      alg: aead: Failed to load transform for gcm(aes): -2
    
    on non-cache coherent systems, due to the fact that the GCM driver
    passes an IV buffer by virtual address which shares a cacheline with
    the auth_tag buffer passed via a scatterlist, resulting in corruption
    of the auth_tag when the IV is updated while the DMA mapping is live.
    
    Since the IV that is returned to the caller is only valid for CBC mode,
    and given that the in-kernel users of CBC (such as CTS) don't trigger the
    same issue as the GCM driver, let's just disable the output IV generation
    for all modes except CBC for the time being.
    
    Fixes: 854b06f7 ("crypto: caam - properly set IV after {en,de}crypt")
    Cc: Horia Geanta <horia.geanta@nxp.com>
    Cc: Iuliana Prodan <iuliana.prodan@nxp.com>
    Reported-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Reviewed-by: default avatarHoria Geanta <horia.geanta@nxp.com>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f976273a
caamalg.c 94.8 KB