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

Commit eb66ecd5 authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu
Browse files

crypto: xts - remove xts_crypt()



Now that all users of xts_crypt() have been removed in favor of the XTS
template wrapping an ECB mode algorithm, remove xts_crypt().

Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 44893bc2
Loading
Loading
Loading
Loading
+0 −72
Original line number Original line Diff line number Diff line
@@ -357,78 +357,6 @@ static int decrypt(struct skcipher_request *req)
	return do_decrypt(req, init_crypt(req, decrypt_done));
	return do_decrypt(req, init_crypt(req, decrypt_done));
}
}


int xts_crypt(struct blkcipher_desc *desc, struct scatterlist *sdst,
	      struct scatterlist *ssrc, unsigned int nbytes,
	      struct xts_crypt_req *req)
{
	const unsigned int bsize = XTS_BLOCK_SIZE;
	const unsigned int max_blks = req->tbuflen / bsize;
	struct blkcipher_walk walk;
	unsigned int nblocks;
	le128 *src, *dst, *t;
	le128 *t_buf = req->tbuf;
	int err, i;

	BUG_ON(max_blks < 1);

	blkcipher_walk_init(&walk, sdst, ssrc, nbytes);

	err = blkcipher_walk_virt(desc, &walk);
	nbytes = walk.nbytes;
	if (!nbytes)
		return err;

	nblocks = min(nbytes / bsize, max_blks);
	src = (le128 *)walk.src.virt.addr;
	dst = (le128 *)walk.dst.virt.addr;

	/* calculate first value of T */
	req->tweak_fn(req->tweak_ctx, (u8 *)&t_buf[0], walk.iv);

	i = 0;
	goto first;

	for (;;) {
		do {
			for (i = 0; i < nblocks; i++) {
				gf128mul_x_ble(&t_buf[i], t);
first:
				t = &t_buf[i];

				/* PP <- T xor P */
				le128_xor(dst + i, t, src + i);
			}

			/* CC <- E(Key2,PP) */
			req->crypt_fn(req->crypt_ctx, (u8 *)dst,
				      nblocks * bsize);

			/* C <- T xor CC */
			for (i = 0; i < nblocks; i++)
				le128_xor(dst + i, dst + i, &t_buf[i]);

			src += nblocks;
			dst += nblocks;
			nbytes -= nblocks * bsize;
			nblocks = min(nbytes / bsize, max_blks);
		} while (nblocks > 0);

		*(le128 *)walk.iv = *t;

		err = blkcipher_walk_done(desc, &walk, nbytes);
		nbytes = walk.nbytes;
		if (!nbytes)
			break;

		nblocks = min(nbytes / bsize, max_blks);
		src = (le128 *)walk.src.virt.addr;
		dst = (le128 *)walk.dst.virt.addr;
	}

	return err;
}
EXPORT_SYMBOL_GPL(xts_crypt);

static int init_tfm(struct crypto_skcipher *tfm)
static int init_tfm(struct crypto_skcipher *tfm)
{
{
	struct skcipher_instance *inst = skcipher_alg_instance(tfm);
	struct skcipher_instance *inst = skcipher_alg_instance(tfm);
+0 −17
Original line number Original line Diff line number Diff line
@@ -6,27 +6,10 @@
#include <crypto/internal/skcipher.h>
#include <crypto/internal/skcipher.h>
#include <linux/fips.h>
#include <linux/fips.h>


struct scatterlist;
struct blkcipher_desc;

#define XTS_BLOCK_SIZE 16
#define XTS_BLOCK_SIZE 16


struct xts_crypt_req {
	le128 *tbuf;
	unsigned int tbuflen;

	void *tweak_ctx;
	void (*tweak_fn)(void *ctx, u8* dst, const u8* src);
	void *crypt_ctx;
	void (*crypt_fn)(void *ctx, u8 *blks, unsigned int nbytes);
};

#define XTS_TWEAK_CAST(x) ((void (*)(void *, u8*, const u8*))(x))
#define XTS_TWEAK_CAST(x) ((void (*)(void *, u8*, const u8*))(x))


int xts_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
	      struct scatterlist *src, unsigned int nbytes,
	      struct xts_crypt_req *req);

static inline int xts_check_key(struct crypto_tfm *tfm,
static inline int xts_check_key(struct crypto_tfm *tfm,
				const u8 *key, unsigned int keylen)
				const u8 *key, unsigned int keylen)
{
{