From: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
To: linux-crypto@vger.kernel.org
Cc: Herbert Xu <herbert@gondor.apana.org.au>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 12/18] crypto: xts: add interface for parallelized cipher implementations
Date: Tue, 18 Oct 2011 13:33:12 +0300 [thread overview]
Message-ID: <20111018103312.3074.3979.stgit@localhost6.localdomain6> (raw)
In-Reply-To: <20111018103208.3074.11546.stgit@localhost6.localdomain6>
Add xts_crypt() function that can be used by cipher implementations that can
benefit from parallelized cipher operations.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
---
crypto/xts.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++-
include/crypto/xts.h | 27 ++++++++++++++++++
2 files changed, 99 insertions(+), 2 deletions(-)
create mode 100644 include/crypto/xts.h
diff --git a/crypto/xts.c b/crypto/xts.c
index 96f3f88..5681d66 100644
--- a/crypto/xts.c
+++ b/crypto/xts.c
@@ -21,11 +21,10 @@
#include <linux/scatterlist.h>
#include <linux/slab.h>
+#include <crypto/xts.h>
#include <crypto/b128ops.h>
#include <crypto/gf128mul.h>
-#define XTS_BLOCK_SIZE 16
-
struct priv {
struct crypto_cipher *child;
struct crypto_cipher *tweak;
@@ -167,6 +166,77 @@ static int decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
crypto_cipher_alg(ctx->child)->cia_decrypt);
}
+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;
+ be128 *src, *dst, *t;
+ be128 *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 = (be128 *)walk.src.virt.addr;
+ dst = (be128 *)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 */
+ be128_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++)
+ be128_xor(dst + i, dst + i, &t_buf[i]);
+
+ src += nblocks;
+ dst += nblocks;
+ nbytes -= nblocks * bsize;
+ nblocks = min(nbytes / bsize, max_blks);
+ } while (nblocks > 0);
+
+ *(be128 *)walk.iv = *t;
+
+ err = blkcipher_walk_done(desc, &walk, nbytes);
+ nbytes = walk.nbytes;
+ if (!nbytes)
+ break;
+
+ src = (be128 *)walk.src.virt.addr;
+ dst = (be128 *)walk.dst.virt.addr;
+ }
+
+ return err;
+}
+EXPORT_SYMBOL_GPL(xts_crypt);
+
static int init_tfm(struct crypto_tfm *tfm)
{
struct crypto_cipher *cipher;
diff --git a/include/crypto/xts.h b/include/crypto/xts.h
new file mode 100644
index 0000000..72c09eb
--- /dev/null
+++ b/include/crypto/xts.h
@@ -0,0 +1,27 @@
+#ifndef _CRYPTO_XTS_H
+#define _CRYPTO_XTS_H
+
+#include <crypto/b128ops.h>
+
+struct scatterlist;
+struct blkcipher_desc;
+
+#define XTS_BLOCK_SIZE 16
+
+struct xts_crypt_req {
+ be128 *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))
+
+int xts_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+ struct scatterlist *src, unsigned int nbytes,
+ struct xts_crypt_req *req);
+
+#endif /* _CRYPTO_XTS_H */
next prev parent reply other threads:[~2011-10-18 10:33 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-18 10:32 [PATCH 00/18] crypto: Add helper functions for parallelized LRW and XTS modes Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 01/18] crypto: lrw: fix memleak Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 02/18] crypto: lrw: use blocksize constant Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 03/18] crypto: lrw: split gf128mul table initialization from setkey Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 04/18] crypto: lrw: add interface for parallelized cipher implementions Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 05/18] crypto: testmgr: add lrw(serpent) test vectors Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 06/18] crypto: tcrypt: add lrw(serpent) tests Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 07/18] crypto: serpent-sse2: add lrw support Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 08/18] crypto: testmgr: add lrw(twofish) test vectors Jussi Kivilinna
2011-10-18 10:32 ` [PATCH 09/18] crypto: tcrypt: add lrw(twofish) tests Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 10/18] crypto: twofish-x86_64-3way: add lrw support Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 11/18] crypto: xts: use blocksize constant Jussi Kivilinna
2011-10-18 10:33 ` Jussi Kivilinna [this message]
2011-10-18 10:33 ` [PATCH 13/18] crypto: testmgr: add xts(serpent) test vectors Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 14/18] crypto: tcrypt: add xts(serpent) tests Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 15/18] crypto: serpent-sse2: add xts support Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 16/18] crypto: testmgr: add xts(twofish) test vectors Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 17/18] crypto: tcrypt: add xts(twofish) tests Jussi Kivilinna
2011-10-18 10:33 ` [PATCH 18/18] crypto: twofish-x86_64-3way: add xts support Jussi Kivilinna
2011-11-09 4:00 ` [PATCH 00/18] crypto: Add helper functions for parallelized LRW and XTS modes Herbert Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20111018103312.3074.3979.stgit@localhost6.localdomain6 \
--to=jussi.kivilinna@mbnet.fi \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=linux-crypto@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox