diff options
| author | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
|---|---|---|
| committer | Wim Van Sebroeck <wim@iguana.be> | 2007-05-11 19:03:13 +0000 | 
| commit | 5c34202b8bf942da411b6599668a76b07449bbfd (patch) | |
| tree | 5719c361321eaddc8e4f1b0c8a7994f0e9a6fdd3 /crypto/blkcipher.c | |
| parent | 0d4804b31f91cfbcff6d62af0bc09a893a1c8ae0 (diff) | |
| parent | 1f8a6b658a943b4f04a1fc7b3a420360202c86cd (diff) | |
Merge /pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'crypto/blkcipher.c')
| -rw-r--r-- | crypto/blkcipher.c | 72 | 
1 files changed, 66 insertions, 6 deletions
diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c index b5befe8c3a9..8edf40c835a 100644 --- a/crypto/blkcipher.c +++ b/crypto/blkcipher.c @@ -349,13 +349,48 @@ static int setkey(struct crypto_tfm *tfm, const u8 *key,  	return cipher->setkey(tfm, key, keylen);  } +static int async_setkey(struct crypto_ablkcipher *tfm, const u8 *key, +			unsigned int keylen) +{ +	return setkey(crypto_ablkcipher_tfm(tfm), key, keylen); +} + +static int async_encrypt(struct ablkcipher_request *req) +{ +	struct crypto_tfm *tfm = req->base.tfm; +	struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; +	struct blkcipher_desc desc = { +		.tfm = __crypto_blkcipher_cast(tfm), +		.info = req->info, +		.flags = req->base.flags, +	}; + + +	return alg->encrypt(&desc, req->dst, req->src, req->nbytes); +} + +static int async_decrypt(struct ablkcipher_request *req) +{ +	struct crypto_tfm *tfm = req->base.tfm; +	struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; +	struct blkcipher_desc desc = { +		.tfm = __crypto_blkcipher_cast(tfm), +		.info = req->info, +		.flags = req->base.flags, +	}; + +	return alg->decrypt(&desc, req->dst, req->src, req->nbytes); +} +  static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg, u32 type,  					     u32 mask)  {  	struct blkcipher_alg *cipher = &alg->cra_blkcipher;  	unsigned int len = alg->cra_ctxsize; -	if (cipher->ivsize) { +	type ^= CRYPTO_ALG_ASYNC; +	mask &= CRYPTO_ALG_ASYNC; +	if ((type & mask) && cipher->ivsize) {  		len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1);  		len += cipher->ivsize;  	} @@ -363,16 +398,26 @@ static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg, u32 type,  	return len;  } -static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask) +static int crypto_init_blkcipher_ops_async(struct crypto_tfm *tfm) +{ +	struct ablkcipher_tfm *crt = &tfm->crt_ablkcipher; +	struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; + +	crt->setkey = async_setkey; +	crt->encrypt = async_encrypt; +	crt->decrypt = async_decrypt; +	crt->ivsize = alg->ivsize; + +	return 0; +} + +static int crypto_init_blkcipher_ops_sync(struct crypto_tfm *tfm)  {  	struct blkcipher_tfm *crt = &tfm->crt_blkcipher;  	struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher;  	unsigned long align = crypto_tfm_alg_alignmask(tfm) + 1;  	unsigned long addr; -	if (alg->ivsize > PAGE_SIZE / 8) -		return -EINVAL; -  	crt->setkey = setkey;  	crt->encrypt = alg->encrypt;  	crt->decrypt = alg->decrypt; @@ -385,8 +430,23 @@ static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask)  	return 0;  } +static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask) +{ +	struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; + +	if (alg->ivsize > PAGE_SIZE / 8) +		return -EINVAL; + +	type ^= CRYPTO_ALG_ASYNC; +	mask &= CRYPTO_ALG_ASYNC; +	if (type & mask) +		return crypto_init_blkcipher_ops_sync(tfm); +	else +		return crypto_init_blkcipher_ops_async(tfm); +} +  static void crypto_blkcipher_show(struct seq_file *m, struct crypto_alg *alg) -	__attribute_used__; +	__attribute__ ((unused));  static void crypto_blkcipher_show(struct seq_file *m, struct crypto_alg *alg)  {  	seq_printf(m, "type         : blkcipher\n");  | 
