libceph: Remove VLA usage of skcipher
In the quest to remove all stack VLA usage from the kernel[1], this replaces struct crypto_skcipher and SKCIPHER_REQUEST_ON_STACK() usage with struct crypto_sync_skcipher and SYNC_SKCIPHER_REQUEST_ON_STACK(), which uses a fixed stack size. [1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com Cc: Ilya Dryomov <idryomov@gmail.com> Cc: "Yan, Zheng" <zyan@redhat.com> Cc: Sage Weil <sage@redhat.com> Cc: ceph-devel@vger.kernel.org Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
dc568baf9b
commit
69d6302b65
|
@ -46,9 +46,9 @@ static int set_secret(struct ceph_crypto_key *key, void *buf)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* crypto_alloc_skcipher() allocates with GFP_KERNEL */
|
/* crypto_alloc_sync_skcipher() allocates with GFP_KERNEL */
|
||||||
noio_flag = memalloc_noio_save();
|
noio_flag = memalloc_noio_save();
|
||||||
key->tfm = crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
|
key->tfm = crypto_alloc_sync_skcipher("cbc(aes)", 0, 0);
|
||||||
memalloc_noio_restore(noio_flag);
|
memalloc_noio_restore(noio_flag);
|
||||||
if (IS_ERR(key->tfm)) {
|
if (IS_ERR(key->tfm)) {
|
||||||
ret = PTR_ERR(key->tfm);
|
ret = PTR_ERR(key->tfm);
|
||||||
|
@ -56,7 +56,7 @@ static int set_secret(struct ceph_crypto_key *key, void *buf)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = crypto_skcipher_setkey(key->tfm, key->key, key->len);
|
ret = crypto_sync_skcipher_setkey(key->tfm, key->key, key->len);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ void ceph_crypto_key_destroy(struct ceph_crypto_key *key)
|
||||||
if (key) {
|
if (key) {
|
||||||
kfree(key->key);
|
kfree(key->key);
|
||||||
key->key = NULL;
|
key->key = NULL;
|
||||||
crypto_free_skcipher(key->tfm);
|
crypto_free_sync_skcipher(key->tfm);
|
||||||
key->tfm = NULL;
|
key->tfm = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ static void teardown_sgtable(struct sg_table *sgt)
|
||||||
static int ceph_aes_crypt(const struct ceph_crypto_key *key, bool encrypt,
|
static int ceph_aes_crypt(const struct ceph_crypto_key *key, bool encrypt,
|
||||||
void *buf, int buf_len, int in_len, int *pout_len)
|
void *buf, int buf_len, int in_len, int *pout_len)
|
||||||
{
|
{
|
||||||
SKCIPHER_REQUEST_ON_STACK(req, key->tfm);
|
SYNC_SKCIPHER_REQUEST_ON_STACK(req, key->tfm);
|
||||||
struct sg_table sgt;
|
struct sg_table sgt;
|
||||||
struct scatterlist prealloc_sg;
|
struct scatterlist prealloc_sg;
|
||||||
char iv[AES_BLOCK_SIZE] __aligned(8);
|
char iv[AES_BLOCK_SIZE] __aligned(8);
|
||||||
|
@ -232,7 +232,7 @@ static int ceph_aes_crypt(const struct ceph_crypto_key *key, bool encrypt,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
memcpy(iv, aes_iv, AES_BLOCK_SIZE);
|
memcpy(iv, aes_iv, AES_BLOCK_SIZE);
|
||||||
skcipher_request_set_tfm(req, key->tfm);
|
skcipher_request_set_sync_tfm(req, key->tfm);
|
||||||
skcipher_request_set_callback(req, 0, NULL, NULL);
|
skcipher_request_set_callback(req, 0, NULL, NULL);
|
||||||
skcipher_request_set_crypt(req, sgt.sgl, sgt.sgl, crypt_len, iv);
|
skcipher_request_set_crypt(req, sgt.sgl, sgt.sgl, crypt_len, iv);
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct ceph_crypto_key {
|
||||||
struct ceph_timespec created;
|
struct ceph_timespec created;
|
||||||
int len;
|
int len;
|
||||||
void *key;
|
void *key;
|
||||||
struct crypto_skcipher *tfm;
|
struct crypto_sync_skcipher *tfm;
|
||||||
};
|
};
|
||||||
|
|
||||||
int ceph_crypto_key_clone(struct ceph_crypto_key *dst,
|
int ceph_crypto_key_clone(struct ceph_crypto_key *dst,
|
||||||
|
|
Loading…
Reference in New Issue