Re: [PATCH] crypto: aesni-intel - Add ivsize to ablk_ecb_alg

From: Josh Boyer
Date: Mon Aug 15 2011 - 07:50:52 EST


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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/