summaryrefslogtreecommitdiff
path: root/crypto/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/api.c')
-rw-r--r--crypto/api.c120
1 files changed, 8 insertions, 112 deletions
diff --git a/crypto/api.c b/crypto/api.c
index c903f2b39da2..626437fb5dea 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -16,12 +16,11 @@
#include <linux/init.h>
#include <linux/crypto.h>
#include <linux/rwsem.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
+#include <linux/slab.h>
#include "internal.h"
-static LIST_HEAD(crypto_alg_list);
-static DECLARE_RWSEM(crypto_alg_sem);
+LIST_HEAD(crypto_alg_list);
+DECLARE_RWSEM(crypto_alg_sem);
static inline int crypto_alg_get(struct crypto_alg *alg)
{
@@ -124,44 +123,26 @@ struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags)
if (alg == NULL)
goto out;
- tfm = kmalloc(sizeof(*tfm), GFP_KERNEL);
+ tfm = kmalloc(sizeof(*tfm) + alg->cra_ctxsize, GFP_KERNEL);
if (tfm == NULL)
goto out_put;
memset(tfm, 0, sizeof(*tfm));
- if (alg->cra_ctxsize) {
- tfm->crt_ctx = kmalloc(alg->cra_ctxsize, GFP_KERNEL);
- if (tfm->crt_ctx == NULL)
- goto out_free_tfm;
- }
+ tfm->crt_ctx = (void*) &tfm[1];
tfm->__crt_alg = alg;
- if (alg->cra_blocksize) {
- tfm->crt_work_block = kmalloc(alg->cra_blocksize + 1,
- GFP_KERNEL);
- if (tfm->crt_work_block == NULL)
- goto out_free_ctx;
- }
-
if (crypto_init_flags(tfm, flags))
- goto out_free_work_block;
+ goto out_free_tfm;
if (crypto_init_ops(tfm)) {
crypto_exit_ops(tfm);
- goto out_free_ctx;
+ goto out_free_tfm;
}
goto out;
-out_free_work_block:
- if (tfm->__crt_alg->cra_blocksize)
- kfree(tfm->crt_work_block);
-
-out_free_ctx:
- if (tfm->__crt_alg->cra_ctxsize)
- kfree(tfm->crt_ctx);
out_free_tfm:
kfree(tfm);
tfm = NULL;
@@ -173,12 +154,6 @@ out:
void crypto_free_tfm(struct crypto_tfm *tfm)
{
- if (tfm->__crt_alg->cra_ctxsize)
- kfree(tfm->crt_ctx);
-
- if (tfm->__crt_alg->cra_blocksize)
- kfree(tfm->crt_work_block);
-
if (crypto_tfm_alg_type(tfm) == CRYPTO_ALG_TYPE_CIPHER)
if (tfm->crt_cipher.cit_iv)
kfree(tfm->crt_cipher.cit_iv);
@@ -240,89 +215,10 @@ int crypto_alg_available(const char *name, u32 flags)
return ret;
}
-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)
- if (!n--)
- return list_entry(v, struct crypto_alg, cra_list);
- return NULL;
-}
-
-static void *c_next(struct seq_file *m, void *p, loff_t *pos)
-{
- struct list_head *v = p;
-
- (*pos)++;
- v = v->next;
- return (v == &crypto_alg_list) ?
- NULL : list_entry(v, struct crypto_alg, cra_list);
-}
-
-static void c_stop(struct seq_file *m, void *p)
-{
- up_read(&crypto_alg_sem);
-}
-
-static int c_show(struct seq_file *m, void *p)
-{
- struct crypto_alg *alg = (struct crypto_alg *)p;
-
- seq_printf(m, "name : %s\n", alg->cra_name);
- seq_printf(m, "module : %s\n", module_name(alg->cra_module));
- seq_printf(m, "blocksize : %u\n", alg->cra_blocksize);
-
- switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
- case CRYPTO_ALG_TYPE_CIPHER:
- seq_printf(m, "min keysize : %u\n",
- alg->cra_cipher.cia_min_keysize);
- seq_printf(m, "max keysize : %u\n",
- alg->cra_cipher.cia_max_keysize);
- seq_printf(m, "ivsize : %u\n",
- alg->cra_cipher.cia_ivsize);
- break;
-
- case CRYPTO_ALG_TYPE_DIGEST:
- seq_printf(m, "digestsize : %u\n",
- alg->cra_digest.dia_digestsize);
- break;
- }
-
- seq_putc(m, '\n');
- return 0;
-}
-
-static struct seq_operations crypto_seq_ops = {
- .start = c_start,
- .next = c_next,
- .stop = c_stop,
- .show = c_show
-};
-
-static int crypto_info_open(struct inode *inode, struct file *file)
-{
- return seq_open(file, &crypto_seq_ops);
-}
-
-struct file_operations proc_crypto_ops = {
- .open = crypto_info_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release
-};
-
static int __init init_crypto(void)
{
- struct proc_dir_entry *proc;
-
printk(KERN_INFO "Initializing Cryptographic API\n");
- proc = create_proc_entry("crypto", 0, NULL);
- if (proc)
- proc->proc_fops = &proc_crypto_ops;
-
+ crypto_init_proc();
return 0;
}