Patch "crypto: algif_skcipher - Require setkey before accept(2)" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
crypto: algif_skcipher - Require setkey before accept(2)
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
crypto-algif_skcipher-require-setkey-before-accept-2.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
dd504589577d8e8e70f51f997ad487a4cb6c026fMon Sep 17 00:00:00 2001
From: Herbert Xu <[email protected]>
Date: Fri, 25 Dec 2015 15:40:05 +0800
Subject: crypto: algif_skcipher - Require setkey before accept(2)
From: Herbert Xu <[email protected]>
commit dd504589577d8e8e70f51f997ad487a4cb6c026f upstream.
Some cipher implementations will crash if you try to use them without calling setkey first. This patch adds a check so that the accept(2) call will fail with -ENOKEY if setkey hasn't been done on the socket yet.
--- crypto/algif_skcipher.c | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-)
crypto/algif_skcipher.c +41 -7
@@ -31,6 +31,11 @@ struct skcipher_sg_list {struct scatterlist sg[0 ]; }; +struct skcipher_tfm { +struct crypto_skcipher *skcipher; +bool has_key; +}; +struct skcipher_ctx {struct list_head tsgl;struct af_alg_sgl rsgl;
@@ -750,17 +755,41 @@ static struct proto_ops algif_skcipher_ostatic void *skcipher_bind (const char *name,u32 type,u32 mask) { -return crypto_alloc_skcipher (name, type, mask); +struct skcipher_tfm *tfm; +struct crypto_skcipher *skcipher; + + tfm =kzalloc (sizeof (*tfm),GFP_KERNEL ); +if (!tfm) +return ERR_PTR (-ENOMEM ); + + skcipher =crypto_alloc_skcipher (name, type, mask); +if (IS_ERR (skcipher)) { +kfree (tfm); +return ERR_CAST (skcipher); + } + + tfm->skcipher = skcipher; + +return tfm; }static void skcipher_release (void *private) { -crypto_free_skcipher (private); +struct skcipher_tfm *tfm = private; + +crypto_free_skcipher (tfm->skcipher); +kfree (tfm); }static int skcipher_setkey (void *private,const u8 *key,unsigned int keylen) { -return crypto_skcipher_setkey (private, key, keylen); +struct skcipher_tfm *tfm = private; +int err; + + err =crypto_skcipher_setkey (tfm->skcipher, key, keylen); + tfm->has_key = !err; + +return err; }static void skcipher_wait (struct sock *sk)
@@ -792,20 +821,25 @@ static int skcipher_accept_parent(void * {struct skcipher_ctx *ctx;struct alg_sock *ask =alg_sk (sk); -unsigned int len =sizeof (*ctx) +crypto_skcipher_reqsize (private); +struct skcipher_tfm *tfm = private; +struct crypto_skcipher *skcipher = tfm->skcipher; +unsigned int len =sizeof (*ctx) +crypto_skcipher_reqsize (skcipher); + +if (!tfm->has_key) +return -ENOKEY ; ctx =sock_kmalloc (sk, len,GFP_KERNEL );if (!ctx)return -ENOMEM ; - ctx->iv =sock_kmalloc (sk,crypto_skcipher_ivsize (private), + ctx->iv =sock_kmalloc (sk,crypto_skcipher_ivsize (skcipher),GFP_KERNEL );if (!ctx->iv) {sock_kfree_s (sk, ctx, len);return -ENOMEM ; } -memset (ctx->iv,0 ,crypto_skcipher_ivsize (private)); +memset (ctx->iv,0 ,crypto_skcipher_ivsize (skcipher));INIT_LIST_HEAD (&ctx->tsgl); ctx->len = len;
@@ -818,7 +852,7 @@ static int skcipher_accept_parent(void * ask->private = ctx; -skcipher_request_set_tfm (&ctx->req, private); +skcipher_request_set_tfm (&ctx->req, skcipher);skcipher_request_set_callback (&ctx->req,CRYPTO_TFM_REQ_MAY_BACKLOG , af_alg_complete, &ctx->completion);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/crypto-af_alg-disallow-bind-setkey-...-after-accept-2.patch queue-4.4/crypto-skcipher-add-crypto_skcipher_has_setkey.patch queue-4.4/crypto-algif_skcipher-add-key-check-exception-for-cipher_null.patch queue-4.4/crypto-algif_skcipher-require-setkey-before-accept-2.patch queue-4.4/crypto-algif_skcipher-add-nokey-compatibility-path.patch queue-4.4/crypto-hash-add-crypto_ahash_has_setkey.patch queue-4.4/crypto-af_alg-add-nokey-compatibility-path.patch queue-4.4/crypto-sun4i-ss-add-missing-statesize.patch queue-4.4/crypto-algif_hash-require-setkey-before-accept-2.patch queue-4.4/crypto-af_alg-fix-socket-double-free-when-accept-fails.patch