20 Mar, 2020

1 commit

  • Prior, passing in chunks of 2, 3, or 4, followed by any additional
    chunks would result in the chacha state counter getting out of sync,
    resulting in incorrect encryption/decryption, which is a pretty nasty
    crypto vuln: "why do images look weird on webpages?" WireGuard users
    never experienced this prior, because we have always, out of tree, used
    a different crypto library, until the recent Frankenzinc addition. This
    commit fixes the issue by advancing the pointers and state counter by
    the actual size processed. It also fixes up a bug in the (optional,
    costly) stride test that prevented it from running on arm64.

    Fixes: b3aad5bad26a ("crypto: arm64/chacha - expose arm64 ChaCha routine as library function")
    Reported-and-tested-by: Emil Renner Berthing
    Cc: Ard Biesheuvel
    Cc: stable@vger.kernel.org # v5.5+
    Signed-off-by: Jason A. Donenfeld
    Reviewed-by: Eric Biggers
    Signed-off-by: Herbert Xu

    Jason A. Donenfeld
     

22 Jan, 2020

1 commit

  • When this was originally ported, the 12-byte nonce vectors were left out
    to keep things simple. I agree that we don't need nor want a library
    interface for 12-byte nonces. But these test vectors were specially
    crafted to look at issues in the underlying primitives and related
    interactions. Therefore, we actually want to keep around all of the
    test vectors, and simply have a helper function to test them with.

    Secondly, the sglist-based chunking code in the library interface is
    rather complicated, so this adds a developer-only test for ensuring that
    all the book keeping is correct, across a wide array of possibilities.

    Signed-off-by: Jason A. Donenfeld
    Signed-off-by: Herbert Xu

    Jason A. Donenfeld
     

17 Nov, 2019

2 commits

  • 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: Ard Biesheuvel
    Signed-off-by: Herbert Xu

    Ard Biesheuvel
     
  • This incorporates the chacha20poly1305 from the Zinc library, retaining
    the library interface, but replacing the implementation with calls into
    the code that already existed in the kernel's crypto API.

    Note that this library API does not implement RFC7539 fully, given that
    it is limited to 64-bit nonces. (The 96-bit nonce version that was part
    of the selftest only has been removed, along with the 96-bit nonce test
    vectors that only tested the selftest but not the actual library itself)

    Signed-off-by: Ard Biesheuvel
    Signed-off-by: Herbert Xu

    Ard Biesheuvel