crypto user configuration api
Subsystems (2)
v4 cover crypto user configuration api
This patchset adds a netlink based user configuration API for the crypto layer, similar to the configuration API of xfrm.
The patchset is based on the current cryptodev tree.
A userspace tool that makes use of the configuration API is available at
https://sourceforge.net/projects/crconf/files/crconf-pre2.tar.gz
With this it is possible to instantiate certain algorithms by doing
crconf add driver "cbc(aes-generic)" type 4
or
crconf add driver "cbc(aes-generic)" type 4 priority 100
To remove a (form templates build and unused) algorithm with all subsequent algorithms do
crconf del driver "cbc(aes-generic)" type 4
It is possible to update the priority of an algorithm by doing
crconf update driver "cbc(aes-generic)" type 4 priority 200
this updates the priority of this algorithm and removes all algorithms on top.
Finally it is possible to print the instantiated crypto algorithms similar to /proc/crypto by doing
crconf show all
This prints the algorithm informations of all instantiated algorithms as long as the information fits into a netlink message.
Changes from v1:
- Removed the priority update functions.
- Fix algorithm information printing when build as module.
- Update the crconf tool according to the kernel changes.
Changes from v2:
- Use one structure for creating and basic querying of algorithms.
- Send the algorithm flags to userspace, so the userspace can check for things like passed selftest, async algorithms etc.
- Update the crconf tool according to the kernel changes.
- Add some priority update functions. We need to be able to update the priority of algorithms, as we can't delete core algorithms like aes-generic. When we update the priority of an algorithm, we remove all algorithms on top.
Changes from v3:
- Remove the priority field from struct crypto_user_alg and use the existing netlink attribute to send the priority value to userspace.
- Update the crconf tool according to the kernel changes.
- Don't distinguish between netlink attributes that use the same type value.
Steffen
PATCH v4 1/17 crypto: Add a flag to identify crypto instances
The upcomming crypto user configuration api needs to identify crypto instances. This patch adds a flag that is set if the algorithm is an instance that is build from templates.
--- crypto/algapi.c | 1 + include/linux/crypto.h | 5 +++++ 2 files changed, 6 insertions(+), 0 deletions(-)
crypto/algapi.c +1 -0
@@ -493,6 +493,7 @@ int crypto_register_instance(struct crypto_template *tmpl, goto err; inst->alg.cra_module = tmpl->module; + inst->alg.cra_flags |=CRYPTO_ALG_INSTANCE ;down_write (&crypto_alg_sem);
include/linux/crypto.h +5 -0
@@ -72,6 +72,11 @@#define CRYPTO_ALG_TESTED 0x00000400/* +* Set if the algorithm is an instance that is build from templates. +*/ +#define CRYPTO_ALG_INSTANCE 0x00000800 + +/* * Transform masks and values (for crt_flags). */ #define CRYPTO_TFM_REQ_MASK 0x000fff00
Signature · 1 line
1.7.0.4
PATCH v4 2/17 crypto: Export crypto_remove_spawns
In reply to Steffen KlassertThe upcomming crypto usrerspace configuration api needs to remove the spawns on top on an algorithm, so export crypto_remove_spawns.
--- crypto/algapi.c | 6 +++--- crypto/internal.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-)
crypto/algapi.c +3 -3
@@ -129,9 +129,8 @@ static void crypto_remove_spawn(struct crypto_spawn *spawn,BUG_ON (!list_empty (&inst->alg.cra_users)); } -static void crypto_remove_spawns (struct crypto_alg *alg, -struct list_head *list, -struct crypto_alg *nalg) +void crypto_remove_spawns (struct crypto_alg *alg,struct list_head *list, +struct crypto_alg *nalg) {u32 new_type = (nalg ?: alg)->cra_flags;struct crypto_spawn *spawn, *n;
@@ -177,6 +176,7 @@ static void crypto_remove_spawns(struct crypto_alg *alg,crypto_remove_spawn (spawn, list); } } +EXPORT_SYMBOL_GPL (crypto_remove_spawns);static struct crypto_larval *__crypto_register_alg (struct crypto_alg *alg) {
crypto/internal.h +2 -0
@@ -86,6 +86,8 @@ struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask);void crypto_larval_error (const char *name,u32 type,u32 mask);void crypto_alg_tested (const char *name,int err); +void crypto_remove_spawns (struct crypto_alg *alg,struct list_head *list, +struct crypto_alg *nalg);void crypto_shoot_alg (struct crypto_alg *alg);struct crypto_tfm *__crypto_alloc_tfm (struct crypto_alg *alg,u32 type,u32 mask);
Signature · 1 line
1.7.0.4
PATCH v4 3/17 crypto: Export crypto_remove_final
In reply to Steffen KlassertThe upcomming crypto usrerspace configuration api needs to remove the spawns on top on an algorithm, so export crypto_remove_final.
--- crypto/algapi.c | 5 ++--- crypto/internal.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-)
crypto/algapi.c +2 -3
@@ -22,8 +22,6 @@#include "internal.h" -static void crypto_remove_final (struct list_head *list); -static LIST_HEAD (crypto_template_list);void crypto_larval_error (const char *name,u32 type,u32 mask)
@@ -321,7 +319,7 @@ unlock: }EXPORT_SYMBOL_GPL (crypto_alg_tested); -static void crypto_remove_final (struct list_head *list) +void crypto_remove_final (struct list_head *list) {struct crypto_alg *alg;struct crypto_alg *n;
@@ -331,6 +329,7 @@ static void crypto_remove_final(struct list_head *list)crypto_alg_put (alg); } } +EXPORT_SYMBOL_GPL (crypto_remove_final);static void crypto_wait_for_test (struct crypto_larval *larval) {
crypto/internal.h +1 -0
@@ -88,6 +88,7 @@ void crypto_alg_tested(const char *name, int err);void crypto_remove_spawns (struct crypto_alg *alg,struct list_head *list,struct crypto_alg *nalg); +void crypto_remove_final (struct list_head *list);void crypto_shoot_alg (struct crypto_alg *alg);struct crypto_tfm *__crypto_alloc_tfm (struct crypto_alg *alg,u32 type,u32 mask);
Signature · 1 line
1.7.0.4
PATCH v4 4/17 crypto: Add userspace configuration API
In reply to Steffen KlassertThis patch adds a basic userspace configuration API for the crypto layer. With this it is possible to instantiate, remove and to show crypto algorithms from userspace.
--- crypto/Kconfig | 7 + crypto/Makefile | 1 + crypto/crypto_user.c | 372 ++++++++++++++++++++++++++++++++++++++++++++ include/linux/cryptouser.h | 52 ++++++ include/linux/netlink.h | 1 + 5 files changed, 433 insertions(+), 0 deletions(-) create mode 100644 crypto/crypto_user.c create mode 100644 include/linux/cryptouser.h
crypto/Kconfig +7 -0
@@ -100,6 +100,13 @@ config CRYPTO_MANAGER2 select CRYPTO_BLKCIPHER2 select CRYPTO_PCOMP2 +config CRYPTO_USER + tristate "Userspace cryptographic algorithm configuration" + select CRYPTO_MANAGER + help + Userapace configuration for cryptographic instantiations such as + cbc(aes). + config CRYPTO_MANAGER_DISABLE_TESTS bool "Disable run-time self tests" default y
crypto/Makefile +1 -0
@@ -31,6 +31,7 @@ obj-$(CONFIG_CRYPTO_PCOMP2) += pcompress.o cryptomgr-y := algboss.o testmgr.o obj-$(CONFIG_CRYPTO_MANAGER2) += cryptomgr.o +obj-$(CONFIG_CRYPTO_USER) += crypto_user.o obj-$(CONFIG_CRYPTO_HMAC) += hmac.o obj-$(CONFIG_CRYPTO_VMAC) += vmac.o obj-$(CONFIG_CRYPTO_XCBC) += xcbc.o
crypto/crypto_user.c new file +372 -0
372 lines not on this page · raw message
include/linux/cryptouser.h new file +52 -0
52 lines not on this page · raw message
include/linux/netlink.h +1 -0
@@ -25,6 +25,7 @@#define NETLINK_SCSITRANSPORT 18/* SCSI Transports */ #define NETLINK_ECRYPTFS 19#define NETLINK_RDMA 20 +#define NETLINK_CRYPTO 21/* Crypto layer */ #define MAX_LINKS 32
Signature · 1 line
1.7.0.4
PATCH v4 5/17 crypto: Add a report function pointer to crypto_type
In reply to Steffen KlassertWe add a report function pointer to struct crypto_type. This function pointer is used from the crypto userspace configuration API to report crypto algorithms to userspace.
--- crypto/crypto_user.c | 5 +++++ include/crypto/algapi.h | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-)
crypto/crypto_user.c +5 -0
@@ -84,6 +84,11 @@ static int crypto_report_one(struct crypto_alg *alg,NLA_PUT_U32 (skb,CRYPTOCFGA_PRIORITY_VAL , alg->cra_priority); +if (alg->cra_type && alg->cra_type->report) { +if (alg->cra_type->report (skb, alg)) + goto nla_put_failure; + } +return 0 ; nla_put_failure:
include/crypto/algapi.h +2 -0
@@ -15,6 +15,7 @@#include <linux/crypto.h> #include <linux/list.h> #include <linux/kernel.h> +#include <linux/skbuff.h> struct module ;struct rtattr ;
@@ -26,6 +27,7 @@ struct crypto_type {int (*init)(struct crypto_tfm *tfm,u32 type,u32 mask);int (*init_tfm)(struct crypto_tfm *tfm);void (*show)(struct seq_file *m,struct crypto_alg *alg); +int (*report)(struct sk_buff *skb,struct crypto_alg *alg);struct crypto_alg *(*lookup)(const char *name,u32 type,u32 mask);unsigned int type;
Signature · 1 line
1.7.0.4
PATCH v4 6/17 crypto: Add userspace report for larval type algorithms
In reply to Steffen Klassert--- crypto/crypto_user.c | 12 ++++++++++++ include/linux/cryptouser.h | 5 +++++ 2 files changed, 17 insertions(+), 0 deletions(-)
crypto/crypto_user.c +12 -0
@@ -84,11 +84,23 @@ static int crypto_report_one(struct crypto_alg *alg,NLA_PUT_U32 (skb,CRYPTOCFGA_PRIORITY_VAL , alg->cra_priority); +if (alg->cra_flags &CRYPTO_ALG_LARVAL ) { +struct crypto_report_larval rl; + +snprintf (rl.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"larval" ); + +NLA_PUT (skb,CRYPTOCFGA_REPORT_LARVAL , +sizeof (struct crypto_report_larval ), &rl); + + goto out; + } +if (alg->cra_type && alg->cra_type->report) {if (alg->cra_type->report (skb, alg)) goto nla_put_failure; } +out:return 0 ; nla_put_failure:
include/linux/cryptouser.h +5 -0
@@ -36,6 +36,7 @@ enum {enum crypto_attr_type_t {CRYPTOCFGA_UNSPEC ,CRYPTOCFGA_PRIORITY_VAL ,/* __u32 */ +CRYPTOCFGA_REPORT_LARVAL ,/* struct crypto_report_larval */ __CRYPTOCFGA_MAX #define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -50,3 +51,7 @@ struct crypto_user_alg {__u32 cru_refcnt;__u32 cru_flags; }; + +struct crypto_report_larval { +char type[CRYPTO_MAX_NAME ]; +};
Signature · 1 line
1.7.0.4
PATCH v4 7/17 crypto: Add userspace report for shash type algorithms
In reply to Steffen Klassert--- crypto/shash.c | 21 +++++++++++++++++++++ include/linux/cryptouser.h | 7 +++++++ 2 files changed, 28 insertions(+), 0 deletions(-)
crypto/shash.c +21 -0
@@ -17,6 +17,8 @@#include <linux/module.h> #include <linux/slab.h> #include <linux/seq_file.h> +#include <linux/cryptouser.h> +#include <net/netlink.h> #include "internal.h"
@@ -522,6 +524,24 @@ static unsigned int crypto_shash_extsize(struct crypto_alg *alg)return alg->cra_ctxsize; } +static int crypto_shash_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_hash rhash; +struct shash_alg *salg =__crypto_shash_alg (alg); + +snprintf (rhash.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"shash" ); + rhash.blocksize = alg->cra_blocksize; + rhash.digestsize = salg->digestsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_HASH , +sizeof (struct crypto_report_hash ), &rhash); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static void crypto_shash_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_shash_show (struct seq_file *m,struct crypto_alg *alg)
@@ -541,6 +561,7 @@ static const struct crypto_type crypto_shash_type = {#ifdef CONFIG_PROC_FS .show = crypto_shash_show, #endif + .report = crypto_shash_report, .maskclear = ~CRYPTO_ALG_TYPE_MASK, .maskset = CRYPTO_ALG_TYPE_MASK, .type = CRYPTO_ALG_TYPE_SHASH,
include/linux/cryptouser.h +7 -0
@@ -37,6 +37,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_UNSPEC ,CRYPTOCFGA_PRIORITY_VAL ,/* __u32 */ CRYPTOCFGA_REPORT_LARVAL ,/* struct crypto_report_larval */ +CRYPTOCFGA_REPORT_HASH ,/* struct crypto_report_hash */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -55,3 +56,9 @@ struct crypto_user_alg {struct crypto_report_larval {char type[CRYPTO_MAX_NAME ]; }; + +struct crypto_report_hash { +char type[CRYPTO_MAX_NAME ]; +unsigned int blocksize; +unsigned int digestsize; +};
Signature · 1 line
1.7.0.4
PATCH v4 8/17 crypto: Add userspace report for ahash type algorithms
In reply to Steffen Klassert--- crypto/ahash.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-)
crypto/ahash.c +21 -0
@@ -21,6 +21,8 @@#include <linux/sched.h> #include <linux/slab.h> #include <linux/seq_file.h> +#include <linux/cryptouser.h> +#include <net/netlink.h> #include "internal.h"
@@ -397,6 +399,24 @@ static unsigned int crypto_ahash_extsize(struct crypto_alg *alg)return sizeof (struct crypto_shash *); } +static int crypto_ahash_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_hash rhash; + +snprintf (rhash.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"ahash" ); + + rhash.blocksize = alg->cra_blocksize; + rhash.digestsize =__crypto_hash_alg_common (alg)->digestsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_HASH , +sizeof (struct crypto_report_hash ), &rhash); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static void crypto_ahash_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_ahash_show (struct seq_file *m,struct crypto_alg *alg)
@@ -415,6 +435,7 @@ const struct crypto_type crypto_ahash_type = {#ifdef CONFIG_PROC_FS .show = crypto_ahash_show, #endif + .report = crypto_ahash_report, .maskclear = ~CRYPTO_ALG_TYPE_MASK, .maskset = CRYPTO_ALG_TYPE_AHASH_MASK, .type = CRYPTO_ALG_TYPE_AHASH,
Signature · 1 line
1.7.0.4
PATCH v4 9/17 crypto: Add userspace report for blkcipher type algorithms
In reply to Steffen Klassert--- crypto/blkcipher.c | 25 +++++++++++++++++++++++++ include/linux/cryptouser.h | 10 ++++++++++ 2 files changed, 35 insertions(+), 0 deletions(-)
crypto/blkcipher.c +25 -0
@@ -24,6 +24,8 @@#include <linux/seq_file.h> #include <linux/slab.h> #include <linux/string.h> +#include <linux/cryptouser.h> +#include <net/netlink.h> #include "internal.h"
@@ -492,6 +494,28 @@ static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask)return crypto_init_blkcipher_ops_async (tfm); } +static int crypto_blkcipher_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_blkcipher rblkcipher; + +snprintf (rblkcipher.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"blkcipher" ); +snprintf (rblkcipher.geniv,CRYPTO_MAX_ALG_NAME ,"%s" , + alg->cra_blkcipher.geniv ?:"<default>" ); + + rblkcipher.blocksize = alg->cra_blocksize; + rblkcipher.min_keysize = alg->cra_blkcipher.min_keysize; + rblkcipher.max_keysize = alg->cra_blkcipher.max_keysize; + rblkcipher.ivsize = alg->cra_blkcipher.ivsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_BLKCIPHER , +sizeof (struct crypto_report_blkcipher ), &rblkcipher); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static void crypto_blkcipher_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_blkcipher_show (struct seq_file *m,struct crypto_alg *alg)
@@ -511,6 +535,7 @@ const struct crypto_type crypto_blkcipher_type = {#ifdef CONFIG_PROC_FS .show = crypto_blkcipher_show, #endif + .report = crypto_blkcipher_report, };EXPORT_SYMBOL_GPL (crypto_blkcipher_type);
include/linux/cryptouser.h +10 -0
@@ -38,6 +38,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_PRIORITY_VAL ,/* __u32 */ CRYPTOCFGA_REPORT_LARVAL ,/* struct crypto_report_larval */ CRYPTOCFGA_REPORT_HASH ,/* struct crypto_report_hash */ +CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -62,3 +63,12 @@ struct crypto_report_hash {unsigned int blocksize;unsigned int digestsize; }; + +struct crypto_report_blkcipher { +char type[CRYPTO_MAX_NAME ]; +char geniv[CRYPTO_MAX_NAME ]; +unsigned int blocksize; +unsigned int min_keysize; +unsigned int max_keysize; +unsigned int ivsize; +};
Signature · 1 line
1.7.0.4
PATCH v4 10/17 crypto: Add userspace report for ablkcipher type algorithms
In reply to Steffen Klassert--- crypto/ablkcipher.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-)
crypto/ablkcipher.c +25 -0
@@ -23,6 +23,8 @@#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>
@@ -381,6 +383,28 @@ static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type,return 0 ; } +static int crypto_ablkcipher_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_blkcipher rblkcipher; + +snprintf (rblkcipher.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"ablkcipher" ); +snprintf (rblkcipher.geniv,CRYPTO_MAX_ALG_NAME ,"%s" , + alg->cra_ablkcipher.geniv ?:"<default>" ); + + 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; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_BLKCIPHER , +sizeof (struct crypto_report_blkcipher ), &rblkcipher); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +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)
@@ -403,6 +427,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);
Signature · 1 line
1.7.0.4
PATCH v4 11/17 crypto: Add userspace report for givcipher type algorithms
In reply to Steffen Klassert--- crypto/ablkcipher.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-)
crypto/ablkcipher.c +23 -0
@@ -457,6 +457,28 @@ static int crypto_init_givcipher_ops(struct crypto_tfm *tfm, u32 type,return 0 ; } +static int crypto_givcipher_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_blkcipher rblkcipher; + +snprintf (rblkcipher.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"givcipher" ); +snprintf (rblkcipher.geniv,CRYPTO_MAX_ALG_NAME ,"%s" , + alg->cra_ablkcipher.geniv ?:"<built-in>" ); + + 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; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_BLKCIPHER , +sizeof (struct crypto_report_blkcipher ), &rblkcipher); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +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)
@@ -479,6 +501,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);
Signature · 1 line
1.7.0.4
PATCH v4 12/17 crypto: Add userspace report for aead type algorithms
In reply to Steffen Klassert--- crypto/aead.c | 25 +++++++++++++++++++++++++ include/linux/cryptouser.h | 9 +++++++++ 2 files changed, 34 insertions(+), 0 deletions(-)
crypto/aead.c +25 -0
@@ -21,6 +21,8 @@#include <linux/sched.h> #include <linux/slab.h> #include <linux/seq_file.h> +#include <linux/cryptouser.h> +#include <net/netlink.h> #include "internal.h"
@@ -109,6 +111,28 @@ static int crypto_init_aead_ops(struct crypto_tfm *tfm, u32 type, u32 mask)return 0 ; } +static int crypto_aead_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_aead raead; +struct aead_alg *aead = &alg->cra_aead; + +snprintf (raead.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"aead" ); +snprintf (raead.geniv,CRYPTO_MAX_ALG_NAME ,"%s" , + aead->geniv ?:"<built-in>" ); + + raead.blocksize = alg->cra_blocksize; + raead.maxauthsize = aead->maxauthsize; + raead.ivsize = aead->ivsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_AEAD , +sizeof (struct crypto_report_aead ), &raead); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static void crypto_aead_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_aead_show (struct seq_file *m,struct crypto_alg *alg)
@@ -130,6 +154,7 @@ const struct crypto_type crypto_aead_type = {#ifdef CONFIG_PROC_FS .show = crypto_aead_show, #endif + .report = crypto_aead_report, };EXPORT_SYMBOL_GPL (crypto_aead_type);
include/linux/cryptouser.h +9 -0
@@ -39,6 +39,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_LARVAL ,/* struct crypto_report_larval */ CRYPTOCFGA_REPORT_HASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ +CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -72,3 +73,11 @@ struct crypto_report_blkcipher {unsigned int max_keysize;unsigned int ivsize; }; + +struct crypto_report_aead { +char type[CRYPTO_MAX_NAME ]; +char geniv[CRYPTO_MAX_NAME ]; +unsigned int blocksize; +unsigned int maxauthsize; +unsigned int ivsize; +};
Signature · 1 line
1.7.0.4
Re: [PATCH v4 12/17] crypto: Add userspace report for aead type algorithms
Steffen Klassert <steffen.klassert <at> secunet.com> writes:
...
crypto/aead.c static int crypto_init_aead_ops(struct crypto_tfm *tfm, u32 type, u32 mask) · line 128
Quoted 6 lines
crypto/aead.c +6
-0+ raead.blocksize = alg->cra_blocksize; + raead.maxauthsize = aead->maxauthsize; + raead.ivsize = aead->ivsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_AEAD , +sizeof (struct crypto_report_aead ), &raead);
This patch seems to break the build if you have a config file without CONFIG_NET. Other patches in this serie have the same effect -- they add dependencies over nla_put, which is defined only on CONFIG_NET.
Cheers,
--
Luis Henriques
PATCH v4 13/17 crypto: Add userspace report for nivaead type algorithms
In reply to Steffen Klassert--- crypto/aead.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-)
crypto/aead.c +23 -0
@@ -190,6 +190,28 @@ static int crypto_init_nivaead_ops(struct crypto_tfm *tfm, u32 type, u32 mask)return 0 ; } +static int crypto_nivaead_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_aead raead; +struct aead_alg *aead = &alg->cra_aead; + +snprintf (raead.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"nivaead" ); +snprintf (raead.geniv,CRYPTO_MAX_ALG_NAME ,"%s" , aead->geniv); + + raead.blocksize = alg->cra_blocksize; + raead.maxauthsize = aead->maxauthsize; + raead.ivsize = aead->ivsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_AEAD , +sizeof (struct crypto_report_aead ), &raead); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} + +static void crypto_nivaead_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_nivaead_show (struct seq_file *m,struct crypto_alg *alg)
@@ -211,6 +233,7 @@ const struct crypto_type crypto_nivaead_type = {#ifdef CONFIG_PROC_FS .show = crypto_nivaead_show, #endif + .report = crypto_nivaead_report, };EXPORT_SYMBOL_GPL (crypto_nivaead_type);
Signature · 1 line
1.7.0.4
PATCH v4 14/17 crypto: Add userspace report for pcompress type algorithms
In reply to Steffen Klassert--- crypto/pcompress.c | 18 ++++++++++++++++++ include/linux/cryptouser.h | 5 +++++ 2 files changed, 23 insertions(+), 0 deletions(-)
crypto/pcompress.c +18 -0
@@ -24,6 +24,8 @@#include <linux/module.h> #include <linux/seq_file.h> #include <linux/string.h> +#include <linux/cryptouser.h> +#include <net/netlink.h> #include <crypto/compress.h> #include <crypto/internal/compress.h>
@@ -46,6 +48,21 @@ static int crypto_pcomp_init_tfm(struct crypto_tfm *tfm)return 0 ; } +static int crypto_pcomp_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_comp rpcomp; + +snprintf (rpcomp.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"pcomp" ); + +NLA_PUT (skb,CRYPTOCFGA_REPORT_COMPRESS , +sizeof (struct crypto_report_comp ), &rpcomp); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static void crypto_pcomp_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_pcomp_show (struct seq_file *m,struct crypto_alg *alg)
@@ -60,6 +77,7 @@ static const struct crypto_type crypto_pcomp_type = {#ifdef CONFIG_PROC_FS .show = crypto_pcomp_show, #endif + .report = crypto_pcomp_report, .maskclear = ~CRYPTO_ALG_TYPE_MASK, .maskset = CRYPTO_ALG_TYPE_MASK, .type = CRYPTO_ALG_TYPE_PCOMPRESS,
include/linux/cryptouser.h +5 -0
@@ -40,6 +40,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_HASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ +CRYPTOCFGA_REPORT_COMPRESS ,/* struct crypto_report_comp */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -81,3 +82,7 @@ struct crypto_report_aead {unsigned int maxauthsize;unsigned int ivsize; }; + +struct crypto_report_comp { +char type[CRYPTO_MAX_NAME ]; +};
Signature · 1 line
1.7.0.4
PATCH v4 15/17 crypto: Add userspace report for rng type algorithms
In reply to Steffen Klassert--- crypto/rng.c | 20 ++++++++++++++++++++ include/linux/cryptouser.h | 6 ++++++ 2 files changed, 26 insertions(+), 0 deletions(-)
crypto/rng.c +20 -0
@@ -21,6 +21,8 @@#include <linux/seq_file.h> #include <linux/slab.h> #include <linux/string.h> +#include <linux/cryptouser.h> +#include <net/netlink.h> static DEFINE_MUTEX (crypto_default_rng_lock);struct crypto_rng *crypto_default_rng;
@@ -58,6 +60,23 @@ static int crypto_init_rng_ops(struct crypto_tfm *tfm, u32 type, u32 mask)return 0 ; } +static int crypto_rng_report (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_rng rrng; + +snprintf (rrng.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"rng" ); + + rrng.seedsize = alg->cra_rng.seedsize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_RNG , +sizeof (struct crypto_report_rng ), &rrng); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static void crypto_rng_show (struct seq_file *m,struct crypto_alg *alg) __attribute__ ((unused));static void crypto_rng_show (struct seq_file *m,struct crypto_alg *alg)
@@ -78,6 +97,7 @@ const struct crypto_type crypto_rng_type = {#ifdef CONFIG_PROC_FS .show = crypto_rng_show, #endif + .report = crypto_rng_report, };EXPORT_SYMBOL_GPL (crypto_rng_type);
include/linux/cryptouser.h +6 -0
@@ -41,6 +41,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ CRYPTOCFGA_REPORT_COMPRESS ,/* struct crypto_report_comp */ +CRYPTOCFGA_REPORT_RNG ,/* struct crypto_report_rng */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -86,3 +87,8 @@ struct crypto_report_aead {struct crypto_report_comp {char type[CRYPTO_MAX_NAME ]; }; + +struct crypto_report_rng { +char type[CRYPTO_MAX_NAME ]; +unsigned int seedsize; +};
Signature · 1 line
1.7.0.4
PATCH v4 16/17 crypto: Add userspace report for cipher type algorithms
In reply to Steffen Klassert--- crypto/crypto_user.c | 29 +++++++++++++++++++++++++++++ include/linux/cryptouser.h | 8 ++++++++ 2 files changed, 37 insertions(+), 0 deletions(-)
crypto/crypto_user.c +29 -0
@@ -70,6 +70,25 @@ static struct crypto_alg *crypto_alg_match(struct crypto_user_alg *p, int exact)return alg; } +static int crypto_report_cipher (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_cipher rcipher; + +snprintf (rcipher.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"cipher" ); + + rcipher.blocksize = alg->cra_blocksize; + rcipher.min_keysize = alg->cra_cipher.cia_min_keysize; + rcipher.max_keysize = alg->cra_cipher.cia_max_keysize; + +NLA_PUT (skb,CRYPTOCFGA_REPORT_CIPHER , +sizeof (struct crypto_report_cipher ), &rcipher); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static int crypto_report_one (struct crypto_alg *alg,struct crypto_user_alg *ualg,struct sk_buff *skb) {
@@ -98,6 +117,16 @@ static int crypto_report_one(struct crypto_alg *alg,if (alg->cra_type && alg->cra_type->report) {if (alg->cra_type->report (skb, alg)) goto nla_put_failure; + + goto out; + } + +switch (alg->cra_flags & (CRYPTO_ALG_TYPE_MASK |CRYPTO_ALG_LARVAL )) { +case CRYPTO_ALG_TYPE_CIPHER : +if (crypto_report_cipher (skb, alg)) + goto nla_put_failure; + +break ; } out:
include/linux/cryptouser.h +8 -0
@@ -42,6 +42,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ CRYPTOCFGA_REPORT_COMPRESS ,/* struct crypto_report_comp */ CRYPTOCFGA_REPORT_RNG ,/* struct crypto_report_rng */ +CRYPTOCFGA_REPORT_CIPHER ,/* struct crypto_report_cipher */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -67,6 +68,13 @@ struct crypto_report_hash {unsigned int digestsize; }; +struct crypto_report_cipher { +char type[CRYPTO_MAX_ALG_NAME ]; +unsigned int blocksize; +unsigned int min_keysize; +unsigned int max_keysize; +}; +struct crypto_report_blkcipher {char type[CRYPTO_MAX_NAME ];char geniv[CRYPTO_MAX_NAME ];
Signature · 1 line
1.7.0.4
PATCH v4 17/17 crypto: Add userspace report for compress type algorithms
In reply to Steffen Klassert--- crypto/crypto_user.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-)
crypto/crypto_user.c +20 -0
@@ -89,6 +89,21 @@ nla_put_failure:return -EMSGSIZE ; } +static int crypto_report_comp (struct sk_buff *skb,struct crypto_alg *alg) +{ +struct crypto_report_comp rcomp; + +snprintf (rcomp.type,CRYPTO_MAX_ALG_NAME ,"%s" ,"compression" ); + +NLA_PUT (skb,CRYPTOCFGA_REPORT_COMPRESS , +sizeof (struct crypto_report_comp ), &rcomp); + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +static int crypto_report_one (struct crypto_alg *alg,struct crypto_user_alg *ualg,struct sk_buff *skb) {
@@ -127,6 +142,11 @@ static int crypto_report_one(struct crypto_alg *alg, goto nla_put_failure;break ; +case CRYPTO_ALG_TYPE_COMPRESS : +if (crypto_report_comp (skb, alg)) + goto nla_put_failure; + +break ; } out:
Signature · 1 line
1.7.0.4
Herbert Xu
maintainerQuoted 2 lines · Steffen Klassert
This patchset adds a netlink based user configuration API for the crypto layer, similar to the configuration API of xfrm.
All applied to cryptodev. Thanks!
I added this little fix on top:
commit e6ea64ece7f4c14294b2fce5403b1e71eab87f1e
Author: Herbert Xu <[email protected]> Date: Fri Oct 21 14:37:10 2011 +0200
crypto: user - Initialise match in crypto_alg_match
We need to default match to 0 as otherwise it may lead to a false positive.
crypto/crypto_user.c +1 -1
@@ -40,7 +40,6 @@ struct crypto_dump_info {static struct crypto_alg *crypto_alg_match (struct crypto_user_alg *p,int exact) { -int match;struct crypto_alg *q, *alg =NULL ;down_read (&crypto_alg_sem);
@@ -49,6 +48,7 @@ static struct crypto_alg *crypto_alg_match(struct crypto_user_alg *p, int exact)return NULL ;list_for_each_entry (q, &crypto_alg_list, cra_list) { +int match =0 ;if ((q->cra_flags ^ p->cru_type) & p->cru_mask)continue ;
Cheers,
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt