android_kernel_samsung_univ.../include/crypto
Eric Biggers 335e988310 crypto: vmac - separate tfm and request context
commit bb29648102335586e9a66289a1d98a0cb392b6e5 upstream.

syzbot reported a crash in vmac_final() when multiple threads
concurrently use the same "vmac(aes)" transform through AF_ALG.  The bug
is pretty fundamental: the VMAC template doesn't separate per-request
state from per-tfm (per-key) state like the other hash algorithms do,
but rather stores it all in the tfm context.  That's wrong.

Also, vmac_final() incorrectly zeroes most of the state including the
derived keys and cached pseudorandom pad.  Therefore, only the first
VMAC invocation with a given key calculates the correct digest.

Fix these bugs by splitting the per-tfm state from the per-request state
and using the proper init/update/final sequencing for requests.

Reproducer for the crash:

    #include <linux/if_alg.h>
    #include <sys/socket.h>
    #include <unistd.h>

    int main()
    {
            int fd;
            struct sockaddr_alg addr = {
                    .salg_type = "hash",
                    .salg_name = "vmac(aes)",
            };
            char buf[256] = { 0 };

            fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
            bind(fd, (void *)&addr, sizeof(addr));
            setsockopt(fd, SOL_ALG, ALG_SET_KEY, buf, 16);
            fork();
            fd = accept(fd, NULL, NULL);
            for (;;)
                    write(fd, buf, 256);
    }

The immediate cause of the crash is that vmac_ctx_t.partial_size exceeds
VMAC_NHBYTES, causing vmac_final() to memset() a negative length.

Reported-by: syzbot+264bca3a6e8d645550d3@syzkaller.appspotmail.com
Fixes: f1939f7c56 ("crypto: vmac - New hash algorithm for intel_txt support")
Cc: <stable@vger.kernel.org> # v2.6.32+
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-08-17 20:56:45 +02:00
..
internal crypto: hash - introduce crypto_hash_alg_has_setkey() 2018-02-16 20:09:42 +01:00
ablk_helper.h
aead.h crypto: aead - Remove old AEAD interfaces 2015-08-17 16:53:50 +08:00
aes.h
akcipher.h crypto: akcipher - Changes to asymmetric key API 2015-10-14 22:23:16 +08:00
algapi.h crypto: api - Add instance free function to crypto_type 2015-07-14 14:56:45 +08:00
authenc.h
b128ops.h
blowfish.h
cast_common.h
cast5.h
cast6.h
chacha20.h crypto: chacha20 - Export common ChaCha20 helpers 2015-07-17 21:20:21 +08:00
compress.h crypto: pcomp - Constify (de)compression parameters 2015-05-01 11:16:37 +08:00
cryptd.h crypto: cryptd - Add missing aead.h inclusion 2015-05-13 10:31:46 +08:00
crypto_wq.h
ctr.h
des.h crypto: des_3des - add x86-64 assembly implementation 2014-06-20 21:27:58 +08:00
drbg.h crypto: drbg - reseed often if seedsource is degraded 2015-06-10 19:14:05 +08:00
gf128mul.h
ghash.h crypto: ghash-generic - move common definitions to a new header file 2016-10-22 12:26:56 +02:00
hash_info.h
hash.h crypto: hash - Add crypto_ahash_has_setkey 2016-02-17 12:31:03 -08:00
if_alg.h crypto: af_alg - Allow af_af_alg_release_parent to be called on nokey path 2016-02-17 12:31:03 -08:00
lrw.h
mcryptd.h crypto: mcryptd - protect the per-CPU queue with a lock 2018-01-02 20:33:19 +01:00
md5.h crypto: md5 - add MD5 initial vectors 2015-05-18 12:20:18 +08:00
null.h crypto: null - Add default null skcipher 2015-05-22 11:25:55 +08:00
padlock.h
pcrypt.h
pkcs7.h PKCS#7: Appropriately restrict authenticated attributes and content type 2015-08-12 17:01:01 +01:00
poly1305.h crypto: poly1305 - remove ->setkey() method 2018-02-16 20:09:43 +01:00
public_key.h KEYS: Merge the type-specific data with the payload data 2015-10-21 15:18:36 +01:00
rng.h crypto: doc - Fix typo in crypto-API.xml 2015-06-04 15:05:08 +08:00
scatterwalk.h crypto: replace scatterwalk_sg_chain with sg_chain 2015-08-17 08:12:54 -06:00
serpent.h
sha.h crypto: sha512-generic - move to generic glue implementation 2015-04-10 21:39:41 +08:00
sha1_base.h crypto: sha1 - implement base layer for SHA-1 2015-04-10 21:39:39 +08:00
sha256_base.h crypto: sha256 - implement base layer for SHA-256 2015-04-10 21:39:39 +08:00
sha512_base.h crypto: sha512 - implement base layer for SHA-512 2015-04-10 21:39:39 +08:00
skcipher.h crypto: skcipher - Add crypto_skcipher_has_setkey 2016-02-17 12:31:03 -08:00
twofish.h
xts.h