Re: [1/1 take 2] HIFN 795x driver.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi.

On Thu, Oct 04, 2007 at 06:04:14PM +0800, Herbert Xu (herbert@xxxxxxxxxxxxxxxxxxx) wrote:
> But we still need to fix the partial block case.

Just a note: blkcipher_walk_* was not designed for async hardware, since
there is no way to know in advance how many pages will be required for 
single request. For example DES second multipage test says it has three
pages, but actually it will have 4 requests and thus 4 DMA
descriptors in HIFN, but when new interrupt says about completed
descriptor, it can not know if it is the last descriptor or not, so that
callback for request should or should not be called. I've fixed that
with additional atomic ops...

Given that, new driver passes all except one DES tcrypt tests, it fails
on cbc multipage encryption (decryption works ok), which provides 13
bytes of misaligned data.

Here is a code snippet for current driver (error handling was ommitted):

	blkcipher_walk_init(&walk, req->dst, req->src, nbytes);
	err = blkcipher_walk_phys(&desc, &walk);

	while ((nbytes = walk.nbytes)) {
		spage = walk.src.phys.page;
		soff = walk.src.phys.offset;

		dpage = walk.dst.phys.page;
		doff = walk.dst.phys.offset;
		
		ctx->iv = walk.iv;

		++i;

		spin_lock_irqsave(&dev->lock, flags);
		err = hifn_setup_dma(dev, spage, soff, dpage, doff, nbytes,
				req, ctx);
		spin_unlock_irqrestore(&dev->lock, flags);

		nbytes &= blocksize - 1;
		err = blkcipher_walk_done(&desc, &walk, nbytes);
	}

And debug output:
Testing cbc(des) encryption across pages (chunking)
test 1 (64 bit key):
hifn0: spage: ffff81003fe8f1e8, soffset: 0, dpage: ffff81003fe8f1e8, doffset: 0, nbytes: 13, priv: ffff81003dc74138, ctx: ffff81003a9d7210.
hifn0: spage: ffff81003fe8f1e8, soffset: 8, dpage: ffff81003fe8f1e8, doffset: 0, nbytes: 8, priv: ffff81003dc74138, ctx: ffff81003a9d7210.
hifn0: spage: ffff81003fe8f1e8, soffset: 0, dpage: ffff81003fe8f1e8, doffset: 0, nbytes: 8, priv: ffff81003dc74138, ctx: ffff81003a9d7210.
page 0
ccd173ffab2039f47f81654121
fail
page 1
dbd4cf266da007deeadb88
fail


And actually there is a huge problem with blkcipher_walk* interface - it
always provides the same destination buffer, so it is possible to
overwrite it if second crypto block was encrypted before the first one.

It just can not be used in asynchronous hardware, so I will create
soemthing new for HIFN driver specially.

-- 
	Evgeniy Polyakov
-
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux