• Ard Biesheuvel's avatar
    crypto: lib/chacha20poly1305 - reimplement crypt_from_sg() routine · d95312a3
    Ard Biesheuvel authored
    Reimplement the library routines to perform chacha20poly1305 en/decryption
    on scatterlists, without [ab]using the [deprecated] blkcipher interface,
    which is rather heavyweight and does things we don't really need.
    
    Instead, we use the sg_miter API in a novel and clever way, to iterate
    over the scatterlist in-place (i.e., source == destination, which is the
    only way this library is expected to be used). That way, we don't have to
    iterate over two scatterlists in parallel.
    
    Another optimization is that, instead of relying on the blkcipher walker
    to present the input in suitable chunks, we recognize that ChaCha is a
    streamcipher, and so we can simply deal with partial blocks by keeping a
    block of cipherstream on the stack and use crypto_xor() to mix it with
    the in/output.
    
    Finally, we omit the scatterwalk_and_copy() call if the last element of
    the scatterlist covers the MAC as well (which is the common case),
    avoiding the need to walk the scatterlist and kmap() the page twice.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    d95312a3
chacha20poly1305.c 9.85 KB