[cryptoapi/sysfs] display cipher details in sysfs

From: Andreas Happe
Date: Wed Sep 01 2004 - 03:36:57 EST


Hi,

following-up to: James Morris <jmorris@xxxxxxxxxx> [040901 09:35]:
This looks potentially useful, although I'm not sure yet whether the userland crypto API should be exposed via sysfs or a separate filesystem.

I suggest you post the patch to linux-kernel and the crypto API list at:
http://lists.logix.cz/pipermail/cryptoapi as an RFC, for wider feedback.

the attached patch creates a /sys/cryptoapi/<cipher-name>/ hierarchie
which includes all information which is currently offered by
/proc/crypto. This was done by embedding a kobject in struct crypto_alg
(include/linux/crypto.h) and using a kset/subsystem instead of the
currently used list (crypto_alg->cra_list was removed, as it shouldn't
be needed anymore). crypto/proc.c was converted to use the subsystem
internal rwlock/list for its iteration of ciphers.

I think that the place for the cryptoapi-tree in sysfs is wrong (but the
others (block, module, bus, class, etc.) seemed worse). But the effort
to change this should be neglectable (and centered at syfs.c).

Also the different cipher types (digest, compress..) could be seperated
into own ksets/directories, but this would make the crypto/proc.c code
worse.

small example:
| bash-2.05b# cd /sys/cryptoapi/
| bash-2.05b# ls
| aes blowfish cipher_null compress_null deflate des des3_ede
| digest_null md5 serpent sha1 sha256 twofish
| bash-2.05b# cd aes/
| bash-2.05b# ls
| blocksize maxkeysize minkeysize module name type
| bash-2.05b# cat blocksize | 16
| bash-2.05b# cd ./../sha1/
| bash-2.05b# ls
| digestsize module name type
| bash-2.05b# cat digestsize | 20
| bash-2.05b# cat type | digest

--Andreas diff -u -N -r linux-2.6.9-rc1/arch/i386/crypto/aes.c linux-2.6.9-rc1-sys2/arch/i386/crypto/aes.c
--- linux-2.6.9-rc1/arch/i386/crypto/aes.c 2004-08-28 15:33:41.000000000 +0200
+++ linux-2.6.9-rc1-sys2/arch/i386/crypto/aes.c 2004-08-31 22:50:01.000000000 +0200
@@ -488,7 +488,6 @@
.cra_blocksize = AES_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct aes_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(aes_alg.cra_list),
.cra_u = {
.cipher = {
.cia_min_keysize = AES_MIN_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/aes.c linux-2.6.9-rc1-sys2/crypto/aes.c
--- linux-2.6.9-rc1/crypto/aes.c 2004-08-28 16:20:48.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/aes.c 2004-08-31 22:29:06.000000000 +0200
@@ -437,7 +437,6 @@
.cra_blocksize = AES_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct aes_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(aes_alg.cra_list),
.cra_u = {
.cipher = {
.cia_min_keysize = AES_MIN_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/api.c linux-2.6.9-rc1-sys2/crypto/api.c
--- linux-2.6.9-rc1/crypto/api.c 2004-06-16 07:20:04.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/api.c 2004-08-31 22:21:01.000000000 +0200
@@ -18,40 +18,58 @@
#include <linux/errno.h>
#include <linux/rwsem.h>
#include <linux/slab.h>
+#include <linux/kernel.h>
#include "internal.h"

-LIST_HEAD(crypto_alg_list);
-DECLARE_RWSEM(crypto_alg_sem);
+#ifdef CONFIG_SYSFS
+extern struct sysfs_ops cryptoapi_ops;
+extern struct attribute cryptoapi_attr_blocksize;
+extern struct attribute cryptoapi_attr_digestsize;
+extern struct attribute cryptoapi_attr_minkeysize;
+extern struct attribute cryptoapi_attr_maxkeysize;
+extern struct attribute *cryptoapi_attributes[];
+
+extern ssize_t cryptoapi_show(struct kobject *kobj, struct attribute *attr, char *buffer);
+#endif
+void cryptoapi_release(struct kobject *kobj);
+
+static struct kobj_type cryptoapi_type = {
+ .release = cryptoapi_release,
+#ifdef CONFIG_SYSFS
+ .sysfs_ops = &cryptoapi_ops,
+ .default_attrs = cryptoapi_attributes
+#endif
+};
+
+decl_subsys(cryptoapi, &cryptoapi_type, NULL);
+
+void cryptoapi_release(struct kobject *kobj) {}

static inline int crypto_alg_get(struct crypto_alg *alg)
{
+ kobject_get(&(alg->cra_obj));
return try_module_get(alg->cra_module);
}

static inline void crypto_alg_put(struct crypto_alg *alg)
{
+ kobject_put(&(alg->cra_obj));
module_put(alg->cra_module);
}

struct crypto_alg *crypto_alg_lookup(const char *name)
{
- struct crypto_alg *q, *alg = NULL;
-
- if (!name)
- return NULL;
-
- down_read(&crypto_alg_sem);
+ struct kobject *obj=NULL;
+ struct crypto_alg *result=NULL;

- list_for_each_entry(q, &crypto_alg_list, cra_list) {
- if (!(strcmp(q->cra_name, name))) {
- if (crypto_alg_get(q))
- alg = q;
- break;
- }
+ obj = kset_find_obj(&(cryptoapi_subsys.kset), name);
+
+ if(obj) {
+ result = container_of(obj, struct crypto_alg, cra_obj);
+ if(result)
+ result = (crypto_alg_get(result))?result:NULL;
}
-
- up_read(&crypto_alg_sem);
- return alg;
+ return result;
}

static int crypto_init_flags(struct crypto_tfm *tfm, u32 flags)
@@ -163,40 +181,38 @@
int crypto_register_alg(struct crypto_alg *alg)
{
int ret = 0;
- struct crypto_alg *q;
-
- down_write(&crypto_alg_sem);

- list_for_each_entry(q, &crypto_alg_list, cra_list) {
- if (!(strcmp(q->cra_name, alg->cra_name))) {
- ret = -EEXIST;
- goto out;
+ if(kset_find_obj(&(cryptoapi_subsys.kset), alg->cra_name)) {
+ ret = -EEXIST;
+ } else {
+ kobject_init(&(alg->cra_obj));
+ BUG_ON(kobject_set_name(&(alg->cra_obj), alg->cra_name));
+ alg->cra_obj.kset = &cryptoapi_subsys.kset;
+ BUG_ON(kobject_add(&(alg->cra_obj)));
+#ifdef CONFIG_SYSFS
+ switch(alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
+ case CRYPTO_ALG_TYPE_CIPHER:
+ WARN_ON(sysfs_create_file(&(alg->cra_obj), &cryptoapi_attr_blocksize));
+ WARN_ON(sysfs_create_file(&(alg->cra_obj), &cryptoapi_attr_minkeysize));
+ WARN_ON(sysfs_create_file(&(alg->cra_obj), &cryptoapi_attr_maxkeysize));
+ break;
+ case CRYPTO_ALG_TYPE_DIGEST:
+ WARN_ON(sysfs_create_file(&(alg->cra_obj), &cryptoapi_attr_digestsize));
+ break;
}
+#endif
}
-
- list_add_tail(&alg->cra_list, &crypto_alg_list);
-out:
- up_write(&crypto_alg_sem);
return ret;
}

int crypto_unregister_alg(struct crypto_alg *alg)
{
int ret = -ENOENT;
- struct crypto_alg *q;
-
- BUG_ON(!alg->cra_module);
-
- down_write(&crypto_alg_sem);
- list_for_each_entry(q, &crypto_alg_list, cra_list) {
- if (alg == q) {
- list_del(&alg->cra_list);
- ret = 0;
- goto out;
- }
+
+ if(kset_find_obj(&(cryptoapi_subsys.kset), alg->cra_name)) {
+ kobject_unregister(&(alg->cra_obj));
+ ret = 0;
}
-out:
- up_write(&crypto_alg_sem);
return ret;
}

@@ -216,6 +232,7 @@
static int __init init_crypto(void)
{
printk(KERN_INFO "Initializing Cryptographic API\n");
+ subsystem_register(&cryptoapi_subsys);
crypto_init_proc();
return 0;
}
diff -u -N -r linux-2.6.9-rc1/crypto/arc4.c linux-2.6.9-rc1-sys2/crypto/arc4.c
--- linux-2.6.9-rc1/crypto/arc4.c 2004-08-28 16:20:48.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/arc4.c 2004-08-31 22:29:13.000000000 +0200
@@ -75,7 +75,6 @@
.cra_blocksize = ARC4_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct arc4_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(arc4_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = ARC4_MIN_KEY_SIZE,
.cia_max_keysize = ARC4_MAX_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/blowfish.c linux-2.6.9-rc1-sys2/crypto/blowfish.c
--- linux-2.6.9-rc1/crypto/blowfish.c 2004-08-28 16:20:48.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/blowfish.c 2004-08-31 22:29:19.000000000 +0200
@@ -452,7 +452,6 @@
.cra_blocksize = BF_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct bf_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = BF_MIN_KEY_SIZE,
.cia_max_keysize = BF_MAX_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/cast5.c linux-2.6.9-rc1-sys2/crypto/cast5.c
--- linux-2.6.9-rc1/crypto/cast5.c 2004-06-16 07:19:29.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/cast5.c 2004-08-31 22:29:27.000000000 +0200
@@ -821,7 +821,6 @@
.cra_blocksize = CAST5_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct cast5_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = {
.cipher = {
.cia_min_keysize = CAST5_MIN_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/cast6.c linux-2.6.9-rc1-sys2/crypto/cast6.c
--- linux-2.6.9-rc1/crypto/cast6.c 2004-06-16 07:19:01.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/cast6.c 2004-08-31 22:29:37.000000000 +0200
@@ -534,7 +534,6 @@
.cra_blocksize = CAST6_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct cast6_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = {
.cipher = {
.cia_min_keysize = CAST6_MIN_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/crc32c.c linux-2.6.9-rc1-sys2/crypto/crc32c.c
--- linux-2.6.9-rc1/crypto/crc32c.c 2004-06-16 07:19:02.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/crc32c.c 2004-08-31 22:29:46.000000000 +0200
@@ -80,7 +80,6 @@
.cra_blocksize = CHKSUM_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct chksum_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = {
.digest = {
.dia_digestsize= CHKSUM_DIGEST_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/crypto_null.c linux-2.6.9-rc1-sys2/crypto/crypto_null.c
--- linux-2.6.9-rc1/crypto/crypto_null.c 2004-06-16 07:19:22.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/crypto_null.c 2004-08-31 22:29:59.000000000 +0200
@@ -59,7 +59,6 @@
.cra_blocksize = NULL_BLOCK_SIZE,
.cra_ctxsize = 0,
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(compress_null.cra_list),
.cra_u = { .compress = {
.coa_compress = null_compress,
.coa_decompress = null_decompress } }
@@ -71,7 +70,6 @@
.cra_blocksize = NULL_BLOCK_SIZE,
.cra_ctxsize = 0,
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(digest_null.cra_list),
.cra_u = { .digest = {
.dia_digestsize = NULL_DIGEST_SIZE,
.dia_init = null_init,
@@ -85,7 +83,6 @@
.cra_blocksize = NULL_BLOCK_SIZE,
.cra_ctxsize = 0,
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(cipher_null.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = NULL_KEY_SIZE,
.cia_max_keysize = NULL_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/deflate.c linux-2.6.9-rc1-sys2/crypto/deflate.c
--- linux-2.6.9-rc1/crypto/deflate.c 2004-08-28 15:33:46.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/deflate.c 2004-08-31 22:30:04.000000000 +0200
@@ -196,7 +196,6 @@
.cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
.cra_ctxsize = sizeof(struct deflate_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .compress = {
.coa_init = deflate_init,
.coa_exit = deflate_exit,
diff -u -N -r linux-2.6.9-rc1/crypto/des.c linux-2.6.9-rc1-sys2/crypto/des.c
--- linux-2.6.9-rc1/crypto/des.c 2004-06-16 07:20:20.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/des.c 2004-08-31 22:30:16.000000000 +0200
@@ -1245,7 +1245,6 @@
.cra_blocksize = DES_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct des_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(des_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = DES_KEY_SIZE,
.cia_max_keysize = DES_KEY_SIZE,
@@ -1260,7 +1259,6 @@
.cra_blocksize = DES3_EDE_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct des3_ede_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(des3_ede_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = DES3_EDE_KEY_SIZE,
.cia_max_keysize = DES3_EDE_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/khazad.c linux-2.6.9-rc1-sys2/crypto/khazad.c
--- linux-2.6.9-rc1/crypto/khazad.c 2004-08-28 15:33:46.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/khazad.c 2004-08-31 22:30:22.000000000 +0200
@@ -885,7 +885,6 @@
.cra_blocksize = KHAZAD_BLOCK_SIZE,
.cra_ctxsize = sizeof (struct khazad_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(khazad_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = KHAZAD_KEY_SIZE,
.cia_max_keysize = KHAZAD_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/Makefile linux-2.6.9-rc1-sys2/crypto/Makefile
--- linux-2.6.9-rc1/crypto/Makefile 2004-08-28 15:33:46.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/Makefile 2004-08-31 22:21:01.000000000 +0200
@@ -3,9 +3,10 @@
#

proc-crypto-$(CONFIG_PROC_FS) = proc.o
+sysfs-crypto-$(CONFIG_SYSFS) = sysfs.o

obj-$(CONFIG_CRYPTO) += api.o scatterwalk.o cipher.o digest.o compress.o \
- $(proc-crypto-y)
+ $(proc-crypto-y) $(sysfs-crypto-y)

obj-$(CONFIG_CRYPTO_HMAC) += hmac.o
obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o
diff -u -N -r linux-2.6.9-rc1/crypto/md4.c linux-2.6.9-rc1-sys2/crypto/md4.c
--- linux-2.6.9-rc1/crypto/md4.c 2004-06-16 07:19:26.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/md4.c 2004-08-31 22:30:28.000000000 +0200
@@ -224,7 +224,6 @@
.cra_blocksize = MD4_HMAC_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct md4_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .digest = {
.dia_digestsize = MD4_DIGEST_SIZE,
.dia_init = md4_init,
diff -u -N -r linux-2.6.9-rc1/crypto/md5.c linux-2.6.9-rc1-sys2/crypto/md5.c
--- linux-2.6.9-rc1/crypto/md5.c 2004-06-16 07:19:22.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/md5.c 2004-08-31 22:30:34.000000000 +0200
@@ -219,7 +219,6 @@
.cra_blocksize = MD5_HMAC_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct md5_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .digest = {
.dia_digestsize = MD5_DIGEST_SIZE,
.dia_init = md5_init,
diff -u -N -r linux-2.6.9-rc1/crypto/michael_mic.c linux-2.6.9-rc1-sys2/crypto/michael_mic.c
--- linux-2.6.9-rc1/crypto/michael_mic.c 2004-06-16 07:19:37.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/michael_mic.c 2004-08-31 22:30:39.000000000 +0200
@@ -163,7 +163,6 @@
.cra_blocksize = 8,
.cra_ctxsize = sizeof(struct michael_mic_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(michael_mic_alg.cra_list),
.cra_u = { .digest = {
.dia_digestsize = 8,
.dia_init = michael_init,
diff -u -N -r linux-2.6.9-rc1/crypto/proc.c linux-2.6.9-rc1-sys2/crypto/proc.c
--- linux-2.6.9-rc1/crypto/proc.c 2004-06-16 07:19:03.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/proc.c 2004-08-31 22:21:01.000000000 +0200
@@ -18,40 +18,39 @@
#include <linux/seq_file.h>
#include "internal.h"

-extern struct list_head crypto_alg_list;
-extern struct rw_semaphore crypto_alg_sem;
+extern struct subsystem cryptoapi_subsys;

static void *c_start(struct seq_file *m, loff_t *pos)
{
struct list_head *v;
loff_t n = *pos;

- down_read(&crypto_alg_sem);
- list_for_each(v, &crypto_alg_list)
+ down_read(&cryptoapi_subsys.rwsem);
+ list_for_each(v, &cryptoapi_subsys.kset.list)
if (!n--)
- return list_entry(v, struct crypto_alg, cra_list);
+ return list_entry(v, struct kobject, entry);
return NULL;
}

static void *c_next(struct seq_file *m, void *p, loff_t *pos)
{
- struct list_head *v = p;
-
+ struct list_head *e = &(((struct kobject*)p)->entry);
+
(*pos)++;
- v = v->next;
- return (v == &crypto_alg_list) ?
- NULL : list_entry(v, struct crypto_alg, cra_list);
+ e = e->next;
+ return (e == &cryptoapi_subsys.kset.list) ?
+ NULL : list_entry(e, struct kobject, entry);
}

static void c_stop(struct seq_file *m, void *p)
{
- up_read(&crypto_alg_sem);
+ up_read(&cryptoapi_subsys.rwsem);
}

static int c_show(struct seq_file *m, void *p)
{
- struct crypto_alg *alg = (struct crypto_alg *)p;
-
+ struct crypto_alg *alg = container_of(p, struct crypto_alg, cra_obj);
+
seq_printf(m, "name : %s\n", alg->cra_name);
seq_printf(m, "module : %s\n", module_name(alg->cra_module));

diff -u -N -r linux-2.6.9-rc1/crypto/serpent.c linux-2.6.9-rc1-sys2/crypto/serpent.c
--- linux-2.6.9-rc1/crypto/serpent.c 2004-06-16 07:19:09.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/serpent.c 2004-08-31 22:30:46.000000000 +0200
@@ -479,7 +479,6 @@
.cra_blocksize = SERPENT_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct serpent_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(serpent_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = SERPENT_MIN_KEY_SIZE,
.cia_max_keysize = SERPENT_MAX_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/sha1.c linux-2.6.9-rc1-sys2/crypto/sha1.c
--- linux-2.6.9-rc1/crypto/sha1.c 2004-06-16 07:19:02.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/sha1.c 2004-08-31 22:30:52.000000000 +0200
@@ -183,7 +183,6 @@
.cra_blocksize = SHA1_HMAC_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct sha1_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .digest = {
.dia_digestsize = SHA1_DIGEST_SIZE,
.dia_init = sha1_init,
diff -u -N -r linux-2.6.9-rc1/crypto/sha256.c linux-2.6.9-rc1-sys2/crypto/sha256.c
--- linux-2.6.9-rc1/crypto/sha256.c 2004-06-16 07:19:13.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/sha256.c 2004-08-31 22:31:11.000000000 +0200
@@ -337,7 +337,6 @@
.cra_blocksize = SHA256_HMAC_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct sha256_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .digest = {
.dia_digestsize = SHA256_DIGEST_SIZE,
.dia_init = sha256_init,
diff -u -N -r linux-2.6.9-rc1/crypto/sha512.c linux-2.6.9-rc1-sys2/crypto/sha512.c
--- linux-2.6.9-rc1/crypto/sha512.c 2004-06-16 07:20:04.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/sha512.c 2004-08-31 22:31:00.000000000 +0200
@@ -324,7 +324,6 @@
.cra_blocksize = SHA512_HMAC_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct sha512_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(sha512.cra_list),
.cra_u = { .digest = {
.dia_digestsize = SHA512_DIGEST_SIZE,
.dia_init = sha512_init,
@@ -339,7 +338,6 @@
.cra_blocksize = SHA384_HMAC_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct sha512_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(sha384.cra_list),
.cra_u = { .digest = {
.dia_digestsize = SHA384_DIGEST_SIZE,
.dia_init = sha384_init,
diff -u -N -r linux-2.6.9-rc1/crypto/sysfs.c linux-2.6.9-rc1-sys2/crypto/sysfs.c
--- linux-2.6.9-rc1/crypto/sysfs.c 1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.9-rc1-sys2/crypto/sysfs.c 2004-08-31 22:21:01.000000000 +0200
@@ -0,0 +1,95 @@
+#include <linux/init.h>
+#include <linux/crypto.h>
+#include <linux/errno.h>
+#include <linux/rwsem.h>
+#include <linux/slab.h>
+#include <linux/kernel.h>
+#include "internal.h"
+
+struct cryptoapi_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct crypto_alg *, char *);
+};
+
+static ssize_t cryptoapi_show(struct kobject *kobj, struct attribute *attr, char *buffer);
+
+static ssize_t cryptoapi_show_name(struct crypto_alg *tmp, char *buffer);
+static ssize_t cryptoapi_show_blocksize(struct crypto_alg *tmp, char *buffer);
+static ssize_t cryptoapi_show_digestsize(struct crypto_alg *tmp, char *buffer);
+static ssize_t cryptoapi_show_type(struct crypto_alg *tmp, char *buffer);
+static ssize_t cryptoapi_show_module(struct crypto_alg *tmp, char *buffer);
+static ssize_t cryptoapi_show_maxkeysize(struct crypto_alg *tmp, char *buffer);
+static ssize_t cryptoapi_show_minkeysize(struct crypto_alg *tmp, char *buffer);
+
+struct sysfs_ops cryptoapi_ops = {
+ .show = cryptoapi_show,
+ .store = NULL,
+};
+
+#define to_cryptoapi_attribute(X) container_of(X, struct cryptoapi_attribute, attr)
+#define cryptoapi_attribute(X, Y) { .attr = {__stringify(X), NULL, 0444}, .show = Y }
+
+struct cryptoapi_attribute cryptoapi_attr_blocksize = cryptoapi_attribute(blocksize, cryptoapi_show_blocksize);
+struct cryptoapi_attribute cryptoapi_attr_digestsize = cryptoapi_attribute(digestsize, cryptoapi_show_digestsize);
+struct cryptoapi_attribute cryptoapi_attr_minkeysize = cryptoapi_attribute(minkeysize, cryptoapi_show_minkeysize);
+struct cryptoapi_attribute cryptoapi_attr_maxkeysize = cryptoapi_attribute(maxkeysize, cryptoapi_show_maxkeysize);
+struct cryptoapi_attribute cryptoapi_attr_name = cryptoapi_attribute(name, cryptoapi_show_name);
+struct cryptoapi_attribute cryptoapi_attr_module = cryptoapi_attribute(module, cryptoapi_show_module);
+struct cryptoapi_attribute cryptoapi_attr_type = cryptoapi_attribute(type, cryptoapi_show_type);
+
+struct attribute *cryptoapi_attributes[] = {
+ &cryptoapi_attr_name.attr,
+ &cryptoapi_attr_type.attr,
+ &cryptoapi_attr_module.attr,
+ NULL,
+};
+
+static ssize_t cryptoapi_show_blocksize(struct crypto_alg *tmp, char *buffer) {
+ return (snprintf(buffer, PAGE_SIZE, "%u\n", tmp->cra_blocksize)+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show_digestsize(struct crypto_alg *tmp, char *buffer) {
+ return (snprintf(buffer, PAGE_SIZE, "%u\n", tmp->cra_digest.dia_digestsize)+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show_minkeysize(struct crypto_alg *tmp, char *buffer) {
+ return (snprintf(buffer, PAGE_SIZE, "%u\n", tmp->cra_cipher.cia_min_keysize)+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show_maxkeysize(struct crypto_alg *tmp, char *buffer) {
+ return (snprintf(buffer, PAGE_SIZE, "%u\n", tmp->cra_cipher.cia_max_keysize)+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show_name(struct crypto_alg *tmp, char *buffer) {
+ return (snprintf(buffer, PAGE_SIZE, "%s\n", tmp->cra_name)+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show_module(struct crypto_alg *tmp, char *buffer) {
+ return (snprintf(buffer, PAGE_SIZE, "%s\n", module_name(tmp->cra_module))+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show_type(struct crypto_alg *tmp, char *buffer) {
+ switch(tmp->cra_flags & CRYPTO_ALG_TYPE_MASK) {
+ case CRYPTO_ALG_TYPE_CIPHER:
+ strncpy(buffer, "cipher\n", PAGE_SIZE);
+ break;
+ case CRYPTO_ALG_TYPE_DIGEST:
+ strncpy(buffer, "digest\n", PAGE_SIZE);
+ break;
+ case CRYPTO_ALG_TYPE_COMPRESS:
+ strncpy(buffer, "compression\n", PAGE_SIZE);
+ break;
+ default:
+ strncpy(buffer, "unknown\n", PAGE_SIZE);
+ }
+ return (strlen(buffer)+1)*sizeof(char);
+}
+
+static ssize_t cryptoapi_show(struct kobject *kobj, struct attribute *attr,
+ char *buffer) {
+ struct cryptoapi_attribute *ca_attr = to_cryptoapi_attribute(attr);
+
+ if(ca_attr->show)
+ return ca_attr->show(container_of(kobj, struct crypto_alg, cra_obj), buffer);
+ return 0;
+}
diff -u -N -r linux-2.6.9-rc1/crypto/tea.c linux-2.6.9-rc1-sys2/crypto/tea.c
--- linux-2.6.9-rc1/crypto/tea.c 2004-08-28 15:33:46.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/tea.c 2004-08-31 22:31:23.000000000 +0200
@@ -191,7 +191,6 @@
.cra_blocksize = TEA_BLOCK_SIZE,
.cra_ctxsize = sizeof (struct tea_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(tea_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = TEA_KEY_SIZE,
.cia_max_keysize = TEA_KEY_SIZE,
@@ -206,7 +205,6 @@
.cra_blocksize = XTEA_BLOCK_SIZE,
.cra_ctxsize = sizeof (struct xtea_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(xtea_alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = XTEA_KEY_SIZE,
.cia_max_keysize = XTEA_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/crypto/twofish.c linux-2.6.9-rc1-sys2/crypto/twofish.c
--- linux-2.6.9-rc1/crypto/twofish.c 2004-08-28 16:20:48.000000000 +0200
+++ linux-2.6.9-rc1-sys2/crypto/twofish.c 2004-08-31 22:31:32.000000000 +0200
@@ -876,7 +876,6 @@
.cra_blocksize = TF_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct twofish_ctx),
.cra_module = THIS_MODULE,
- .cra_list = LIST_HEAD_INIT(alg.cra_list),
.cra_u = { .cipher = {
.cia_min_keysize = TF_MIN_KEY_SIZE,
.cia_max_keysize = TF_MAX_KEY_SIZE,
diff -u -N -r linux-2.6.9-rc1/include/linux/crypto.h linux-2.6.9-rc1-sys2/include/linux/crypto.h
--- linux-2.6.9-rc1/include/linux/crypto.h 2004-06-16 07:19:03.000000000 +0200
+++ linux-2.6.9-rc1-sys2/include/linux/crypto.h 2004-08-31 22:31:49.000000000 +0200
@@ -94,7 +94,7 @@
#define cra_compress cra_u.compress

struct crypto_alg {
- struct list_head cra_list;
+ struct kobject cra_obj;
u32 cra_flags;
unsigned int cra_blocksize;
unsigned int cra_ctxsize;

Attachment: pgp00000.pgp
Description: PGP signature