From: "Francis Moreau" <francis.moro@gmail.com>
To: "Roland Dreier" <rdreier@cisco.com>
Cc: "Herbert Xu" <herbert@gondor.apana.org.au>,
helge.hafting@aitel.hist.no, linux-kernel@vger.kernel.org,
linux-crypto@vger.kernel.org
Subject: Re: [CRYPTO] is it really optimized ?
Date: Tue, 17 Apr 2007 18:14:58 +0200 [thread overview]
Message-ID: <38b2ab8a0704170914h3a766236t47bc7e1c8de67662@mail.gmail.com> (raw)
In-Reply-To: <adairbv57s2.fsf@cisco.com>
On 4/17/07, Roland Dreier <rdreier@cisco.com> wrote:
> > Again, my code is faster only because I skip the key loading in
> > "cia_encrypt" method. Actually the gain is bigger in decryption mode
> > than in encryption one because I also generate the decryption key for
> > each block.
>
> I wonder if there's some way you can cache the last caller and reload
> the key lazily (only when it changes).
yes something that allows crypto drivers to detect if the key has
changed would be good.
> Of course without your code it's hard to say...
>
Alright you can find the main part of it below...
----------------------------
struct foo_aes_ctx {
u8 key[AES_KEY_LENGTH];
};
/*
*
*/
static inline void set_dir(int dir)
{
u32 cr = aes_read(AES_CR);
switch (dir) {
case AES_DIR_ENCRYPT:
cr |= CR_DIR;
break;
case AES_DIR_DECRYPT:
cr &= ~CR_DIR;
break;
default:
BUG();
}
aes_write(cr, AES_CR);
}
static inline void set_key(const char *key)
{
u32 key0 = be32_to_cpup((const u32 *)(key + 12));
u32 key1 = be32_to_cpup((const u32 *)(key + 8));
u32 key2 = be32_to_cpup((const u32 *)(key + 4));
u32 key3 = be32_to_cpup((const u32 *)(key));
aes_write(key0, AES_KEY0);
aes_write(key1, AES_KEY1);
aes_write(key2, AES_KEY2);
aes_write(key3, AES_KEY3);
}
/* should take only 11 cycles */
static int gen_dkey(void)
{
int timeout = 100;
aes_write(aes_read(AES_CR) | CR_DKEYGEN, AES_CR);
while (aes_read(AES_CR) & CR_DKEYGEN) {
if (--timeout == 0)
return -EIO;
}
return 0;
}
static int crypt_block(int dir, u8 *dst, const u8 *src, const char *key)
{
register u32 acc0 = be32_to_cpup((const u32 *)(src + 12));
register u32 acc1 = be32_to_cpup((const u32 *)(src + 8));
register u32 acc2 = be32_to_cpup((const u32 *)(src + 4));
register u32 acc3 = be32_to_cpup((const u32 *)(src));
unsigned long flags;
spin_lock_irqsave(&foo_aes_lock, flags);
set_key(key);
set_dir(dir);
if (dir == AES_DIR_DECRYPT)
gen_dkey();
aes_write(acc0, AES_ACC0);
aes_write(acc1, AES_ACC1);
aes_write(acc2, AES_ACC2);
aes_write(acc3, AES_ACC3);
{
/* Again, should take only 11 cycles */
int timeout = 100;
while (aes_read(AES_CR) & 0x70) {
if (--timeout == 0)
return -EIO;
}
}
/* order is important, guess why ? */
*(u32 *)(dst + 12) = cpu_to_be32(aes_read(AES_ACC0));
*(u32 *)(dst + 8) = cpu_to_be32(aes_read(AES_ACC1));
*(u32 *)(dst + 4) = cpu_to_be32(aes_read(AES_ACC2));
*(u32 *)(dst) = cpu_to_be32(aes_read(AES_ACC3));
spin_unlock_irqrestore(&foo_aes_lock, flags);
return 0;
}
/*
*
*/
static int foo_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int len)
{
struct foo_aes_ctx *ctx = crypto_tfm_ctx(tfm);
int rv;
if (len == AES_KEY_LENGTH) {
memcpy(ctx->key, key, AES_KEY_LENGTH);
rv = 0;
} else {
tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
rv = -EINVAL;
}
return rv;
}
static void foo_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
struct foo_aes_ctx *ctx = crypto_tfm_ctx(tfm);
BUG_ON(!in);
BUG_ON(!out);
crypt_block(AES_DIR_DECRYPT, out, in, ctx->key);
}
static void foo_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
struct foo_aes_ctx *ctx = crypto_tfm_ctx(tfm);
BUG_ON(!in);
BUG_ON(!out);
crypt_block(AES_DIR_ENCRYPT, out, in, ctx->key);
}
static struct crypto_alg foo_alg = {
.cra_name = "aes",
.cra_driver_name = "aes-128-foo",
.cra_priority = 300,
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
.cra_blocksize = AES_MIN_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct foo_aes_ctx),
.cra_module = THIS_MODULE,
.cra_list = LIST_HEAD_INIT(foo_alg.cra_list),
.cra_u = {
.cipher = {
.cia_min_keysize = AES_KEY_LENGTH,
.cia_max_keysize = AES_KEY_LENGTH,
.cia_setkey = foo_setkey,
.cia_encrypt = foo_encrypt,
.cia_decrypt = foo_decrypt
}
}
};
--
Francis
next prev parent reply other threads:[~2007-04-17 16:15 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-12 19:39 Francis Moreau
2007-04-13 12:17 ` Helge Hafting
2007-04-13 13:30 ` Francis Moreau
2007-04-14 4:30 ` Herbert Xu
2007-04-14 13:15 ` Francis Moreau
2007-04-14 19:34 ` Herbert Xu
2007-04-14 21:10 ` Francis Moreau
2007-04-15 7:52 ` Herbert Xu
2007-04-16 8:37 ` Francis Moreau
2007-04-17 0:41 ` Herbert Xu
2007-04-17 12:36 ` Francis Moreau
2007-04-17 13:04 ` Evgeniy Polyakov
2007-04-17 13:42 ` Herbert Xu
2007-04-17 14:01 ` Francis Moreau
2007-04-17 15:08 ` Evgeniy Polyakov
2007-04-17 15:34 ` Francis Moreau
2007-04-17 15:57 ` Evgeniy Polyakov
2007-04-17 16:18 ` Francis Moreau
2007-04-17 17:07 ` Evgeniy Polyakov
2007-04-17 13:57 ` Francis Moreau
2007-04-17 13:40 ` Herbert Xu
2007-04-17 13:59 ` Francis Moreau
2007-04-17 14:02 ` Herbert Xu
2007-04-17 14:41 ` Francis Moreau
2007-04-17 15:40 ` Roland Dreier
2007-04-17 16:14 ` Francis Moreau [this message]
2007-04-17 16:33 ` Roland Dreier
2007-04-17 17:24 ` Francis Moreau
2007-04-17 17:34 ` Roland Dreier
2007-04-19 8:07 ` Francis Moreau
2007-04-23 13:56 ` Francis Moreau
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=38b2ab8a0704170914h3a766236t47bc7e1c8de67662@mail.gmail.com \
--to=francis.moro@gmail.com \
--cc=helge.hafting@aitel.hist.no \
--cc=herbert@gondor.apana.org.au \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rdreier@cisco.com \
/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
all inboxes | Powered by JetHome®