Commit e3023094 authored by Herbert Xu's avatar Herbert Xu

dm crypt: Avoid using MAX_CIPHER_BLOCKSIZE

MAX_CIPHER_BLOCKSIZE is an internal implementation detail and should
not be relied on by users of the Crypto API.

Instead of storing the IV on the stack, allocate it together with
the crypto request.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Reviewed-by: default avatarMike Snitzer <snitzer@kernel.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent f0051844
...@@ -31,10 +31,10 @@ ...@@ -31,10 +31,10 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <crypto/hash.h> #include <crypto/hash.h>
#include <crypto/md5.h> #include <crypto/md5.h>
#include <crypto/algapi.h>
#include <crypto/skcipher.h> #include <crypto/skcipher.h>
#include <crypto/aead.h> #include <crypto/aead.h>
#include <crypto/authenc.h> #include <crypto/authenc.h>
#include <crypto/utils.h>
#include <linux/rtnetlink.h> /* for struct rtattr and RTA macros only */ #include <linux/rtnetlink.h> /* for struct rtattr and RTA macros only */
#include <linux/key-type.h> #include <linux/key-type.h>
#include <keys/user-type.h> #include <keys/user-type.h>
...@@ -745,16 +745,23 @@ static int crypt_iv_eboiv_ctr(struct crypt_config *cc, struct dm_target *ti, ...@@ -745,16 +745,23 @@ static int crypt_iv_eboiv_ctr(struct crypt_config *cc, struct dm_target *ti,
static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv, static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv,
struct dm_crypt_request *dmreq) struct dm_crypt_request *dmreq)
{ {
u8 buf[MAX_CIPHER_BLOCKSIZE] __aligned(__alignof__(__le64)); struct crypto_skcipher *tfm = any_tfm(cc);
struct skcipher_request *req; struct skcipher_request *req;
struct scatterlist src, dst; struct scatterlist src, dst;
DECLARE_CRYPTO_WAIT(wait); DECLARE_CRYPTO_WAIT(wait);
unsigned int reqsize;
int err; int err;
u8 *buf;
req = skcipher_request_alloc(any_tfm(cc), GFP_NOIO); reqsize = ALIGN(crypto_skcipher_reqsize(tfm), __alignof__(__le64));
req = kmalloc(reqsize + cc->iv_size, GFP_NOIO);
if (!req) if (!req)
return -ENOMEM; return -ENOMEM;
skcipher_request_set_tfm(req, tfm);
buf = (u8 *)req + reqsize;
memset(buf, 0, cc->iv_size); memset(buf, 0, cc->iv_size);
*(__le64 *)buf = cpu_to_le64(dmreq->iv_sector * cc->sector_size); *(__le64 *)buf = cpu_to_le64(dmreq->iv_sector * cc->sector_size);
...@@ -763,7 +770,7 @@ static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv, ...@@ -763,7 +770,7 @@ static int crypt_iv_eboiv_gen(struct crypt_config *cc, u8 *iv,
skcipher_request_set_crypt(req, &src, &dst, cc->iv_size, buf); skcipher_request_set_crypt(req, &src, &dst, cc->iv_size, buf);
skcipher_request_set_callback(req, 0, crypto_req_done, &wait); skcipher_request_set_callback(req, 0, crypto_req_done, &wait);
err = crypto_wait_req(crypto_skcipher_encrypt(req), &wait); err = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
skcipher_request_free(req); kfree_sensitive(req);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment