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 #include #include +#include #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 #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 +#include +#include +#include +#include +#include +#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;