Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6106265 authored by Jan-Simon Möller's avatar Jan-Simon Möller Committed by Behan Webster
Browse files

crypto, dm: LLVMLinux: Remove VLAIS usage from dm-crypt



Replaced the use of a Variable Length Array In Struct (VLAIS) with a C99
compliant equivalent. This patch allocates the appropriate amount of memory
using a char array using the SHASH_DESC_ON_STACK macro.

The new code can be compiled with both gcc and clang.

Signed-off-by: default avatarJan-Simon Möller <dl9pf@gmx.de>
Signed-off-by: default avatarBehan Webster <behanw@converseincode.com>
Reviewed-by: default avatarMark Charlebois <charlebm@gmail.com>
Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Cc: pageexec@freemail.hu
Cc: gmazyland@gmail.com
Cc: "David S. Miller" <davem@davemloft.net>
parent 37e52654
Loading
Loading
Loading
Loading
+14 −20
Original line number Original line Diff line number Diff line
@@ -526,29 +526,26 @@ static int crypt_iv_lmk_one(struct crypt_config *cc, u8 *iv,
			    u8 *data)
			    u8 *data)
{
{
	struct iv_lmk_private *lmk = &cc->iv_gen_private.lmk;
	struct iv_lmk_private *lmk = &cc->iv_gen_private.lmk;
	struct {
	SHASH_DESC_ON_STACK(desc, lmk->hash_tfm);
		struct shash_desc desc;
		char ctx[crypto_shash_descsize(lmk->hash_tfm)];
	} sdesc;
	struct md5_state md5state;
	struct md5_state md5state;
	__le32 buf[4];
	__le32 buf[4];
	int i, r;
	int i, r;


	sdesc.desc.tfm = lmk->hash_tfm;
	desc->tfm = lmk->hash_tfm;
	sdesc.desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
	desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;


	r = crypto_shash_init(&sdesc.desc);
	r = crypto_shash_init(desc);
	if (r)
	if (r)
		return r;
		return r;


	if (lmk->seed) {
	if (lmk->seed) {
		r = crypto_shash_update(&sdesc.desc, lmk->seed, LMK_SEED_SIZE);
		r = crypto_shash_update(desc, lmk->seed, LMK_SEED_SIZE);
		if (r)
		if (r)
			return r;
			return r;
	}
	}


	/* Sector is always 512B, block size 16, add data of blocks 1-31 */
	/* Sector is always 512B, block size 16, add data of blocks 1-31 */
	r = crypto_shash_update(&sdesc.desc, data + 16, 16 * 31);
	r = crypto_shash_update(desc, data + 16, 16 * 31);
	if (r)
	if (r)
		return r;
		return r;


@@ -557,12 +554,12 @@ static int crypt_iv_lmk_one(struct crypt_config *cc, u8 *iv,
	buf[1] = cpu_to_le32((((u64)dmreq->iv_sector >> 32) & 0x00FFFFFF) | 0x80000000);
	buf[1] = cpu_to_le32((((u64)dmreq->iv_sector >> 32) & 0x00FFFFFF) | 0x80000000);
	buf[2] = cpu_to_le32(4024);
	buf[2] = cpu_to_le32(4024);
	buf[3] = 0;
	buf[3] = 0;
	r = crypto_shash_update(&sdesc.desc, (u8 *)buf, sizeof(buf));
	r = crypto_shash_update(desc, (u8 *)buf, sizeof(buf));
	if (r)
	if (r)
		return r;
		return r;


	/* No MD5 padding here */
	/* No MD5 padding here */
	r = crypto_shash_export(&sdesc.desc, &md5state);
	r = crypto_shash_export(desc, &md5state);
	if (r)
	if (r)
		return r;
		return r;


@@ -679,10 +676,7 @@ static int crypt_iv_tcw_whitening(struct crypt_config *cc,
	struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
	struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw;
	u64 sector = cpu_to_le64((u64)dmreq->iv_sector);
	u64 sector = cpu_to_le64((u64)dmreq->iv_sector);
	u8 buf[TCW_WHITENING_SIZE];
	u8 buf[TCW_WHITENING_SIZE];
	struct {
	SHASH_DESC_ON_STACK(desc, tcw->crc32_tfm);
		struct shash_desc desc;
		char ctx[crypto_shash_descsize(tcw->crc32_tfm)];
	} sdesc;
	int i, r;
	int i, r;


	/* xor whitening with sector number */
	/* xor whitening with sector number */
@@ -691,16 +685,16 @@ static int crypt_iv_tcw_whitening(struct crypt_config *cc,
	crypto_xor(&buf[8], (u8 *)&sector, 8);
	crypto_xor(&buf[8], (u8 *)&sector, 8);


	/* calculate crc32 for every 32bit part and xor it */
	/* calculate crc32 for every 32bit part and xor it */
	sdesc.desc.tfm = tcw->crc32_tfm;
	desc->tfm = tcw->crc32_tfm;
	sdesc.desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
	desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
	for (i = 0; i < 4; i++) {
	for (i = 0; i < 4; i++) {
		r = crypto_shash_init(&sdesc.desc);
		r = crypto_shash_init(desc);
		if (r)
		if (r)
			goto out;
			goto out;
		r = crypto_shash_update(&sdesc.desc, &buf[i * 4], 4);
		r = crypto_shash_update(desc, &buf[i * 4], 4);
		if (r)
		if (r)
			goto out;
			goto out;
		r = crypto_shash_final(&sdesc.desc, &buf[i * 4]);
		r = crypto_shash_final(desc, &buf[i * 4]);
		if (r)
		if (r)
			goto out;
			goto out;
	}
	}