Linux cryptographic layer development
 help / color / mirror / Atom feed
From: Josh Boyer <jwboyer@redhat.com>
To: Herbert Xu <herbert@gondor.hengli.com.au>
Cc: linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] crypto: aesni-intel - Add ivsize to ablk_ecb_alg
Date: Mon, 15 Aug 2011 07:50:39 -0400	[thread overview]
Message-ID: <20110815115038.GA2227@zod.bos.redhat.com> (raw)
In-Reply-To: <20110815071528.GA29656@gondor.apana.org.au>

On Mon, Aug 15, 2011 at 03:15:28PM +0800, Herbert Xu wrote:
> On Thu, Aug 11, 2011 at 12:40:41PM -0400, Josh Boyer wrote:
> > The ablkcipher structure in ablk_ecb_alg is lacking an ivsize setting.
> > This causes the algorithm to fail it's self-test when it's registered
> > with the error message:
> > 
> > [    0.806920] alg: skcipher: Failed to load transform for ecb-aes-aesni: -2
> > 
> > crypto_lookup_skcipher doesn't like a missing ivsize.  Adding the ivsize
> > allows the self-test lookup to pass.
> 
> That's not right.  ECB does not require an IV and therefore it
> shouldn't have a non-zero IV size.

Hm.  OK.  
 
> I'm not quite sure what you mean by crypto_lookup_skcipher not
> liking a missing IV size.  It appears to handle that case just
> fine by returning the algorithm as is.

Well, yes, it does in this code:

	if (!((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
	      CRYPTO_ALG_TYPE_BLKCIPHER ? alg->cra_blkcipher.ivsize :
					  alg->cra_ablkcipher.ivsize)) {

		printk(KERN_ERR "%s: %d\n", __func__, __LINE__);
		return alg;
	}

But the lookup seems to fail after it returns (see traces below).

> Can you show me what your /proc/crypto contains after you get the
> aformentioned error?


Sure.

Without the patch:

[jwboyer@zod ~]$ cat /proc/crypto 
name         : arc4
driver       : arc4-generic
module       : arc4
priority     : 0
refcnt       : 3
selftest     : passed
type         : cipher
blocksize    : 1
min keysize  : 1
max keysize  : 256

name         : fpu(xts(__aes-aesni))
driver       : cryptd(fpu(xts(__driver-aes-aesni)))
module       : kernel
priority     : 50
refcnt       : 9
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : fpu(xts(__aes-aesni))
driver       : fpu(xts(__driver-aes-aesni))
module       : kernel
priority     : 0
refcnt       : 9
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : xts(__aes-aesni)
driver       : xts(__driver-aes-aesni)
module       : xts
priority     : 0
refcnt       : 9
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 400
refcnt       : 9
selftest     : passed
type         : givcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : eseqiv

name         : stdrng
driver       : krng
module       : kernel
priority     : 200
refcnt       : 2
selftest     : passed
type         : rng
seedsize     : 0

name         : crc32c
driver       : crc32c-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 1
digestsize   : 4

name         : aes
driver       : aes-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : sha1
driver       : sha1-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 64
digestsize   : 20

name         : md5
driver       : md5-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 64
digestsize   : 16

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 400
refcnt       : 9
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : pcbc(aes)
driver       : pcbc-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : lrw(aes)
driver       : lrw-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 48
ivsize       : 16
geniv        : <default>

name         : rfc3686(ctr(aes))
driver       : rfc3686-ctr-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 1
min keysize  : 20
max keysize  : 36
ivsize       : 8
geniv        : seqiv

name         : rfc4106(gcm(aes))
driver       : rfc4106-gcm-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : nivaead
async        : yes
blocksize    : 1
ivsize       : 8
maxauthsize  : 16
geniv        : seqiv

name         : __gcm-aes-aesni
driver       : __driver-gcm-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : aead
async        : no
blocksize    : 1
ivsize       : 0
maxauthsize  : 0
geniv        : <built-in>

name         : ctr(aes)
driver       : ctr-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : chainiv

name         : __ctr-aes-aesni
driver       : __driver-ctr-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : blkcipher
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : cbc(aes)
driver       : cbc-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : ecb(aes)
driver       : ecb-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : unknown
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __cbc-aes-aesni
driver       : __driver-cbc-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __ecb-aes-aesni
driver       : __driver-ecb-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __aes-aesni
driver       : __driver-aes-aesni
module       : kernel
priority     : 0
refcnt       : 17
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : aes
driver       : aes-aesni
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : aes
driver       : aes-asm
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32



With the patch:

[jwboyer@zod ~]$ cat /proc/crypto 
name         : arc4
driver       : arc4-generic
module       : arc4
priority     : 0
refcnt       : 3
selftest     : passed
type         : cipher
blocksize    : 1
min keysize  : 1
max keysize  : 256

name         : fpu(xts(__aes-aesni))
driver       : cryptd(fpu(xts(__driver-aes-aesni)))
module       : kernel
priority     : 50
refcnt       : 9
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : fpu(xts(__aes-aesni))
driver       : fpu(xts(__driver-aes-aesni))
module       : kernel
priority     : 0
refcnt       : 9
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : xts(__aes-aesni)
driver       : xts(__driver-aes-aesni)
module       : xts
priority     : 0
refcnt       : 9
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 400
refcnt       : 9
selftest     : passed
type         : givcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : eseqiv

name         : stdrng
driver       : krng
module       : kernel
priority     : 200
refcnt       : 2
selftest     : passed
type         : rng
seedsize     : 0

name         : crc32c
driver       : crc32c-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 1
digestsize   : 4

name         : aes
driver       : aes-generic
module       : kernel
priority     : 100
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : sha1
driver       : sha1-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 64
digestsize   : 20

name         : md5
driver       : md5-generic
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : shash
blocksize    : 64
digestsize   : 16

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 400
refcnt       : 9
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : <default>

name         : pcbc(aes)
driver       : pcbc-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : lrw(aes)
driver       : lrw-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 48
ivsize       : 16
geniv        : <default>

name         : rfc3686(ctr(aes))
driver       : rfc3686-ctr-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 1
min keysize  : 20
max keysize  : 36
ivsize       : 8
geniv        : seqiv

name         : rfc4106(gcm(aes))
driver       : rfc4106-gcm-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : nivaead
async        : yes
blocksize    : 1
ivsize       : 8
maxauthsize  : 16
geniv        : seqiv

name         : __gcm-aes-aesni
driver       : __driver-gcm-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : aead
async        : no
blocksize    : 1
ivsize       : 0
maxauthsize  : 0
geniv        : <built-in>

name         : ctr(aes)
driver       : ctr-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : chainiv

name         : __ctr-aes-aesni
driver       : __driver-ctr-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : blkcipher
blocksize    : 1
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : cbc(aes)
driver       : cbc-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : ecb(aes)
driver       : ecb-aes-aesni
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
type         : ablkcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
geniv        : <default>

name         : __cbc-aes-aesni
driver       : __driver-cbc-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __ecb-aes-aesni
driver       : __driver-ecb-aes-aesni
module       : kernel
priority     : 0
refcnt       : 1
selftest     : passed
type         : blkcipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 0
geniv        : <default>

name         : __aes-aesni
driver       : __driver-aes-aesni
module       : kernel
priority     : 0
refcnt       : 17
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : aes
driver       : aes-aesni
module       : kernel
priority     : 300
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : aes
driver       : aes-asm
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32



And below is an instrumented kernel with some printks leading up to the
failure.

josh

Aug 11 11:31:34 zod kernel: [    0.799743] aesni_init: 1275 registering
ablk_ecb_alg
Aug 11 11:31:34 zod kernel: [    0.799792] __crypto_register_alg: 235
ecb(aes)
Aug 11 11:31:34 zod kernel: [    0.799862] crypto_alg_mod_lookup: 278
ecb-aes-aesni
Aug 11 11:31:34 zod kernel: [    0.799910] crypto_lookup_skcipher: 576
Aug 11 11:31:34 zod kernel: [    0.801540] crypto_alg_mod_lookup: 286
cryptd(__driver-ecb-aes-aesni)
Aug 11 11:31:34 zod kernel: [    0.802260] crypto_larval_wait: 192
Aug 11 11:31:34 zod kernel: [    0.802307] crypto_alloc_base: 452
Aug 11 11:31:34 zod kernel: [    0.802352] cryptd_alloc_ablkcipher: 828
Aug 11 11:31:34 zod kernel: [    0.802398] __crypto_alloc_tfm: 400
Aug 11 11:31:34 zod kernel: [    0.802444] __crypto_alloc_tfm:
(null) ffffffff8103ba69 -2
Aug 11 11:31:34 zod kernel: [    0.802494] alg: skcipher: Failed to load
transform for ecb-aes-aesni: -2
Aug 11 11:31:34 zod kernel: [    0.802546] Pid: 36, comm: cryptomgr_test
Not tainted 2.6.40-4.fc15.x86_64 #14
Aug 11 11:31:34 zod kernel: [    0.802548] Call Trace:
Aug 11 11:31:34 zod kernel: [    0.802554]  [<ffffffff81216042>]
alg_test_skcipher+0x48/0xa3
Aug 11 11:31:34 zod kernel: [    0.802557]  [<ffffffff812162f5>] ?
alg_find_test+0x3a/0x5d
Aug 11 11:31:34 zod kernel: [    0.802560]  [<ffffffff812164d8>]
alg_test+0x1c0/0x277
Aug 11 11:31:34 zod kernel: [    0.802563]  [<ffffffff814b5b33>] ?
schedule+0x690/0x6be
Aug 11 11:31:34 zod kernel: [    0.802566]  [<ffffffff81213fd2>] ?
cryptomgr_probe+0xca/0xca
Aug 11 11:31:34 zod kernel: [    0.802569]  [<ffffffff81213ffb>]
cryptomgr_test+0x29/0x44
Aug 11 11:31:34 zod kernel: [    0.802571]  [<ffffffff8106fd2b>]
kthread+0x84/0x8c
Aug 11 11:31:34 zod kernel: [    0.802575]  [<ffffffff814beb64>]
kernel_thread_helper+0x4/0x10
Aug 11 11:31:34 zod kernel: [    0.802577]  [<ffffffff8106fca7>] ?
kthread_worker_fn+0x148/0x148
Aug 11 11:31:34 zod kernel: [    0.802580]  [<ffffffff814beb60>] ?
gs_change+0x13/0x13
Aug 11 11:31:34 zod kernel: [    0.802586] aesni_init: 1278 err: 0

  reply	other threads:[~2011-08-15 11:50 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-11 16:40 [PATCH] crypto: aesni-intel - Add ivsize to ablk_ecb_alg Josh Boyer
2011-08-15  7:15 ` Herbert Xu
2011-08-15 11:50   ` Josh Boyer [this message]
2011-08-16 12:32     ` Herbert Xu
2011-08-18 17:44       ` Josh Boyer
2011-08-19  0:02         ` Herbert Xu
2011-08-19  2:15           ` Josh Boyer
2011-08-19  7:32             ` Herbert Xu
2011-08-19  8:12               ` Herbert Xu
2011-08-19 12:15                 ` Josh Boyer
2011-08-20  8:08                   ` 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=20110815115038.GA2227@zod.bos.redhat.com \
    --to=jwboyer@redhat.com \
    --cc=herbert@gondor.hengli.com.au \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@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