diff options
Diffstat (limited to 'crypto/ablkcipher.c')
| -rw-r--r-- | crypto/ablkcipher.c | 90 | 
1 files changed, 66 insertions, 24 deletions
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c index a854df2a5a4..40886c48990 100644 --- a/crypto/ablkcipher.c +++ b/crypto/ablkcipher.c @@ -16,20 +16,18 @@  #include <crypto/internal/skcipher.h>  #include <linux/cpumask.h>  #include <linux/err.h> -#include <linux/init.h>  #include <linux/kernel.h> -#include <linux/module.h>  #include <linux/rtnetlink.h>  #include <linux/sched.h>  #include <linux/slab.h>  #include <linux/seq_file.h> +#include <linux/cryptouser.h> +#include <net/netlink.h>  #include <crypto/scatterwalk.h>  #include "internal.h" -static const char *skcipher_default_geniv __read_mostly; -  struct ablkcipher_buffer {  	struct list_head	entry;  	struct scatter_walk	dst; @@ -141,8 +139,7 @@ err:  	if (walk->iv != req->info)  		memcpy(req->info, walk->iv, tfm->crt_ablkcipher.ivsize); -	if (walk->iv_buffer) -		kfree(walk->iv_buffer); +	kfree(walk->iv_buffer);  	return err;  } @@ -382,6 +379,35 @@ static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type,  	return 0;  } +#ifdef CONFIG_NET +static int crypto_ablkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ +	struct crypto_report_blkcipher rblkcipher; + +	strncpy(rblkcipher.type, "ablkcipher", sizeof(rblkcipher.type)); +	strncpy(rblkcipher.geniv, alg->cra_ablkcipher.geniv ?: "<default>", +		sizeof(rblkcipher.geniv)); + +	rblkcipher.blocksize = alg->cra_blocksize; +	rblkcipher.min_keysize = alg->cra_ablkcipher.min_keysize; +	rblkcipher.max_keysize = alg->cra_ablkcipher.max_keysize; +	rblkcipher.ivsize = alg->cra_ablkcipher.ivsize; + +	if (nla_put(skb, CRYPTOCFGA_REPORT_BLKCIPHER, +		    sizeof(struct crypto_report_blkcipher), &rblkcipher)) +		goto nla_put_failure; +	return 0; + +nla_put_failure: +	return -EMSGSIZE; +} +#else +static int crypto_ablkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ +	return -ENOSYS; +} +#endif +  static void crypto_ablkcipher_show(struct seq_file *m, struct crypto_alg *alg)  	__attribute__ ((unused));  static void crypto_ablkcipher_show(struct seq_file *m, struct crypto_alg *alg) @@ -404,6 +430,7 @@ const struct crypto_type crypto_ablkcipher_type = {  #ifdef CONFIG_PROC_FS  	.show = crypto_ablkcipher_show,  #endif +	.report = crypto_ablkcipher_report,  };  EXPORT_SYMBOL_GPL(crypto_ablkcipher_type); @@ -433,6 +460,35 @@ static int crypto_init_givcipher_ops(struct crypto_tfm *tfm, u32 type,  	return 0;  } +#ifdef CONFIG_NET +static int crypto_givcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ +	struct crypto_report_blkcipher rblkcipher; + +	strncpy(rblkcipher.type, "givcipher", sizeof(rblkcipher.type)); +	strncpy(rblkcipher.geniv, alg->cra_ablkcipher.geniv ?: "<built-in>", +		sizeof(rblkcipher.geniv)); + +	rblkcipher.blocksize = alg->cra_blocksize; +	rblkcipher.min_keysize = alg->cra_ablkcipher.min_keysize; +	rblkcipher.max_keysize = alg->cra_ablkcipher.max_keysize; +	rblkcipher.ivsize = alg->cra_ablkcipher.ivsize; + +	if (nla_put(skb, CRYPTOCFGA_REPORT_BLKCIPHER, +		    sizeof(struct crypto_report_blkcipher), &rblkcipher)) +		goto nla_put_failure; +	return 0; + +nla_put_failure: +	return -EMSGSIZE; +} +#else +static int crypto_givcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ +	return -ENOSYS; +} +#endif +  static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg)  	__attribute__ ((unused));  static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg) @@ -455,6 +511,7 @@ const struct crypto_type crypto_givcipher_type = {  #ifdef CONFIG_PROC_FS  	.show = crypto_givcipher_show,  #endif +	.report = crypto_givcipher_report,  };  EXPORT_SYMBOL_GPL(crypto_givcipher_type); @@ -466,8 +523,7 @@ const char *crypto_default_geniv(const struct crypto_alg *alg)  	    alg->cra_blocksize)  		return "chainiv"; -	return alg->cra_flags & CRYPTO_ALG_ASYNC ? -	       "eseqiv" : skcipher_default_geniv; +	return "eseqiv";  }  static int crypto_givcipher_default(struct crypto_alg *alg, u32 type, u32 mask) @@ -552,8 +608,7 @@ out:  	return err;  } -static struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, -						 u32 mask) +struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, u32 mask)  {  	struct crypto_alg *alg; @@ -591,6 +646,7 @@ static struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type,  	return ERR_PTR(crypto_givcipher_default(alg, type, mask));  } +EXPORT_SYMBOL_GPL(crypto_lookup_skcipher);  int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name,  			 u32 type, u32 mask) @@ -648,17 +704,3 @@ err:  	return ERR_PTR(err);  }  EXPORT_SYMBOL_GPL(crypto_alloc_ablkcipher); - -static int __init skcipher_module_init(void) -{ -	skcipher_default_geniv = num_possible_cpus() > 1 ? -				 "eseqiv" : "chainiv"; -	return 0; -} - -static void skcipher_module_exit(void) -{ -} - -module_init(skcipher_module_init); -module_exit(skcipher_module_exit);  | 
