crypto user configuration api
Subsystems (2)
v3 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-2.6 tree.
A userspace tool that makes use of the configuration API is available at
https://sourceforge.net/projects/crconf/files/crconf-pre1.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 the priority update functions back. 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.
Steffen
PATCH v3 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 v3 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 v3 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 v3 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 | 368 ++++++++++++++++++++++++++++++++++++++++++++ include/linux/cryptouser.h | 53 +++++++ include/linux/netlink.h | 1 + 5 files changed, 430 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 +368 -0
368 lines not on this page · raw message
include/linux/cryptouser.h new file +53 -0
53 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
Herbert Xu
maintainerRe: [PATCH v3 04/17] crypto: Add userspace configuration API
Quoted 7 lines · Steffen Klassert
include/linux/cryptouser.h new file +6
-0+/* Netlink message attributes. */ +enum crypto_attr_type_t { +CRYPTOCFGA_UNSPEC , +CRYPTOCFGA_PRIORITY_VAL ,/* __u32 */ + __CRYPTOCFGA_MAX +
include/linux/cryptouser.h line 50
Quoted 10 lines
include/linux/cryptouser.h new file +10
-0+#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1) +}; + +struct crypto_user_alg { +char cru_name[CRYPTO_MAX_ALG_NAME ]; +char cru_driver_name[CRYPTO_MAX_ALG_NAME ]; +char cru_module_name[CRYPTO_MAX_ALG_NAME ]; +__u32 cru_type; +__u32 cru_mask; +__u32 cru_priority;
Do we still need this since you already have the priority as an attribute?
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
Re: [PATCH v3 04/17] crypto: Add userspace configuration API
Quoted 13 lines · Herbert Xu
Quoted 12 lines · Steffen Klassert
include/linux/cryptouser.h new file +11
-0+/* Netlink message attributes. */ +enum crypto_attr_type_t { +CRYPTOCFGA_UNSPEC , +CRYPTOCFGA_PRIORITY_VAL ,/* __u32 */ + __CRYPTOCFGA_MAX + +#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1) +}; + +struct crypto_user_alg { +char cru_name[CRYPTO_MAX_ALG_NAME ];
Quoted 9 lines
include/linux/cryptouser.h line 50
Quoted 5 lines
include/linux/cryptouser.h new file +5
-0+char cru_driver_name[CRYPTO_MAX_ALG_NAME ]; +char cru_module_name[CRYPTO_MAX_ALG_NAME ]; +__u32 cru_type; +__u32 cru_mask; +__u32 cru_priority;Do we still need this since you already have the priority as an attribute?
Actually no, I'll remove it. Anything else to change? If not I'll update the patches and resend.
Re: [PATCH v3 04/17] crypto: Add userspace configuration API
In reply to Steffen KlassertQuoted 7 lines · Steffen Klassert
crypto/crypto_user.c new file +7
-0+ +static int crypto_user_rcv_msg (struct sk_buff *skb,struct nlmsghdr *nlh) +{ +struct nlattr *attrs[CRYPTOCFGA_MAX +1 ]; +struct crypto_link *link; +int type, err; +
crypto/crypto_user.c line 320
Quoted 10 lines
crypto/crypto_user.c new file +10
-0+ type = nlh->nlmsg_type; +if (type >CRYPTO_MSG_MAX ) +return -EINVAL ; + + type -=CRYPTO_MSG_BASE ; + link = &crypto_dispatch[type]; + +if (security_netlink_recv (skb,CAP_NET_ADMIN )) +return -EPERM ; +
I'm just wondering whether CAP_NET_ADMIN is the right capability to use here? Do you think we can keep it like that, or would it be better to define a new CAP_CRYPTO_ADMIN capability?
Herbert Xu
maintainerRe: [PATCH v3 04/17] crypto: Add userspace configuration API
Quoted 4 lines · Steffen Klassert
I'm just wondering whether
CAP_NET_ADMINis the right capability to use here? Do you think we can keep it like that, or would it be better to define a newCAP_CRYPTO_ADMINcapability?
I think CAP_NET_ADMIN is fine.
Thanks,
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
PATCH v3 5/17 crypto: Add a report function pointer to crypto_typ
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 | 8 ++++++++ include/crypto/algapi.h | 2 ++ 2 files changed, 10 insertions(+), 0 deletions(-)
crypto/crypto_user.c +8 -0
@@ -83,7 +83,15 @@ static int crypto_report_one(struct crypto_alg *alg, ualg->cru_priority = alg->cra_priority; ualg->cru_refcnt =atomic_read (&alg->cra_refcnt); +if (alg->cra_type && alg->cra_type->report) { +if (alg->cra_type->report (skb, alg)) + goto nla_put_failure; + } +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; } static int crypto_report_alg(struct crypto_alg *alg,
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 v3 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
@@ -83,11 +83,23 @@ static int crypto_report_one(struct crypto_alg *alg, ualg->cru_priority = alg->cra_priority; ualg->cru_refcnt =atomic_read (&alg->cra_refcnt); +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)
@@ -51,3 +52,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 v3 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_SHASH , +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_SHASH ,/* struct crypto_report_hash */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -56,3 +57,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 v3 8/17 crypto: Add userspace report for ahash type algorithms
In reply to Steffen Klassert--- crypto/ahash.c | 21 +++++++++++++++++++++ include/linux/cryptouser.h | 1 + 2 files changed, 22 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_AHASH , +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,
include/linux/cryptouser.h +1 -0
@@ -38,6 +38,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_PRIORITY_VAL ,/* __u32 */ CRYPTOCFGA_REPORT_LARVAL ,/* struct crypto_report_larval */ CRYPTOCFGA_REPORT_SHASH ,/* struct crypto_report_hash */ +CRYPTOCFGA_REPORT_AHASH ,/* struct crypto_report_hash */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
Signature · 1 line
1.7.0.4
PATCH v3 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
@@ -39,6 +39,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_LARVAL ,/* struct crypto_report_larval */ CRYPTOCFGA_REPORT_SHASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_AHASH ,/* struct crypto_report_hash */ +CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -64,3 +65,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 v3 10/17 crypto: Add userspace report for ablkcipher type algorithms
In reply to Steffen Klassert--- crypto/ablkcipher.c | 25 +++++++++++++++++++++++++ include/linux/cryptouser.h | 1 + 2 files changed, 26 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_ABLKCIPHER , +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);
include/linux/cryptouser.h +1 -0
@@ -40,6 +40,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_SHASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_AHASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ +CRYPTOCFGA_REPORT_ABLKCIPHER ,/* struct crypto_report_blkcipher */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
Signature · 1 line
1.7.0.4
Herbert Xu
maintainerRe: [PATCH v3 10/17] crypto: Add userspace report for ablkcipher type algorithms
include/linux/cryptouser.h enum crypto_attr_type_t { · line 43
Quoted 10 lines · Steffen Klassert
include/linux/cryptouser.h +1
-0@@ -40,6 +40,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_SHASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_AHASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ + CRYPTOCFGA_REPORT_ABLKCIPHER, /* struct crypto_report_blkcipher */
I don't think you should distinguish between BLKCIPHER and ABLKCIPHER. A good rule of thumb would be if the report data structure is the same, then the type value should be the same.
You can still have the string type to show something different to the user.
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
Re: [PATCH v3 10/17] crypto: Add userspace report for ablkcipher type algorithms
Quoted 5 lines · Herbert Xu
I don't think you should distinguish between BLKCIPHER and ABLKCIPHER. A good rule of thumb would be if the report data structure is the same, then the type value should be the same.
Ok, will do that. I'll update the patches and resend.
Thanks for the review!
PATCH v3 11/17 crypto: Add userspace report for givcipher type algorithms
In reply to Steffen Klassert--- crypto/ablkcipher.c | 23 +++++++++++++++++++++++ include/linux/cryptouser.h | 1 + 2 files changed, 24 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_GIVCIPHER , +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);
include/linux/cryptouser.h +1 -0
@@ -41,6 +41,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_AHASH ,/* struct crypto_report_hash */ CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_ABLKCIPHER ,/* struct crypto_report_blkcipher */ +CRYPTOCFGA_REPORT_GIVCIPHER ,/* struct crypto_report_blkcipher */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
Signature · 1 line
1.7.0.4
PATCH v3 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
@@ -42,6 +42,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_BLKCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_ABLKCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_GIVCIPHER ,/* struct crypto_report_blkcipher */ +CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -76,3 +77,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
PATCH v3 13/17 crypto: Add userspace report for nivaead type algorithms
In reply to Steffen Klassert--- crypto/aead.c | 23 +++++++++++++++++++++++ include/linux/cryptouser.h | 1 + 2 files changed, 24 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_NIVAEAD , +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);
include/linux/cryptouser.h +1 -0
@@ -43,6 +43,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_ABLKCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_GIVCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ +CRYPTOCFGA_REPORT_NIVAEAD ,/* struct crypto_report_aead */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
Signature · 1 line
1.7.0.4
PATCH v3 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_PCOMPRESS , +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
@@ -44,6 +44,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_GIVCIPHER ,/* struct crypto_report_blkcipher */ CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ CRYPTOCFGA_REPORT_NIVAEAD ,/* struct crypto_report_aead */ +CRYPTOCFGA_REPORT_PCOMPRESS ,/* struct crypto_report_comp */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -86,3 +87,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 v3 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
@@ -45,6 +45,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_AEAD ,/* struct crypto_report_aead */ CRYPTOCFGA_REPORT_NIVAEAD ,/* struct crypto_report_aead */ CRYPTOCFGA_REPORT_PCOMPRESS ,/* struct crypto_report_comp */ +CRYPTOCFGA_REPORT_RNG ,/* struct crypto_report_rng */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
@@ -91,3 +92,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 v3 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) {
@@ -97,6 +116,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
@@ -46,6 +46,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_NIVAEAD ,/* struct crypto_report_aead */ CRYPTOCFGA_REPORT_PCOMPRESS ,/* 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)
@@ -72,6 +73,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 v3 17/17 crypto: Add userspace report for compress type algorithms
In reply to Steffen Klassert--- crypto/crypto_user.c | 20 ++++++++++++++++++++ include/linux/cryptouser.h | 1 + 2 files changed, 21 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) {
@@ -126,6 +141,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:
include/linux/cryptouser.h +1 -0
@@ -47,6 +47,7 @@ enum crypto_attr_type_t {CRYPTOCFGA_REPORT_PCOMPRESS ,/* struct crypto_report_comp */ CRYPTOCFGA_REPORT_RNG ,/* struct crypto_report_rng */ CRYPTOCFGA_REPORT_CIPHER ,/* struct crypto_report_cipher */ +CRYPTOCFGA_REPORT_COMPRESS ,/* struct crypto_report_comp */ __CRYPTOCFGA_MAX#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
Signature · 1 line
1.7.0.4