Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 34209
b: refs/heads/master
c: 2b8c19d
h: refs/heads/master
i:
  34207: e221678
v: v3
  • Loading branch information
Herbert Xu committed Sep 21, 2006
1 parent 08932ea commit 96f4e21
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2825982d9d66ebba4b532a07391dfbb357f71c5f
refs/heads/master: 2b8c19dbdc692e81243a328725a02efb77b144a5
8 changes: 8 additions & 0 deletions trunk/crypto/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ config CRYPTO_ALGAPI
help
This option provides the API for cryptographic algorithms.

config CRYPTO_MANAGER
tristate "Cryptographic algorithm manager"
select CRYPTO_ALGAPI
default m
help
Create default cryptographic template instantiations such as
cbc(aes).

config CRYPTO_HMAC
bool "HMAC support"
help
Expand Down
1 change: 1 addition & 0 deletions trunk/crypto/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ crypto_algapi-$(CONFIG_PROC_FS) += proc.o
crypto_algapi-objs := algapi.o $(crypto_algapi-y)
obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o

obj-$(CONFIG_CRYPTO_MANAGER) += cryptomgr.o
obj-$(CONFIG_CRYPTO_HMAC) += hmac.o
obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o
obj-$(CONFIG_CRYPTO_MD4) += md4.o
Expand Down
10 changes: 9 additions & 1 deletion trunk/crypto/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/kmod.h>
#include <linux/module.h>
#include <linux/param.h>
#include <linux/slab.h>
#include <linux/string.h>
Expand Down Expand Up @@ -170,6 +171,7 @@ static struct crypto_alg *crypto_alg_mod_lookup(const char *name)
{
struct crypto_alg *alg;
struct crypto_alg *larval;
int ok;

alg = try_then_request_module(crypto_alg_lookup(name), name);
if (alg)
Expand All @@ -179,7 +181,13 @@ static struct crypto_alg *crypto_alg_mod_lookup(const char *name)
if (!larval || !crypto_is_larval(larval))
return larval;

if (crypto_notify(CRYPTO_MSG_ALG_REQUEST, larval) == NOTIFY_STOP)
ok = crypto_notify(CRYPTO_MSG_ALG_REQUEST, larval);
if (ok == NOTIFY_DONE) {
request_module("cryptomgr");
ok = crypto_notify(CRYPTO_MSG_ALG_REQUEST, larval);
}

if (ok == NOTIFY_STOP)
alg = crypto_larval_wait(larval);
else {
crypto_mod_put(larval);
Expand Down
146 changes: 146 additions & 0 deletions trunk/crypto/cryptomgr.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/*
* Create default crypto algorithm instances.
*
* Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
*/

#include <linux/crypto.h>
#include <linux/ctype.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/rtnetlink.h>
#include <linux/string.h>
#include <linux/workqueue.h>

#include "internal.h"

struct cryptomgr_param {
struct work_struct work;

struct {
struct rtattr attr;
struct crypto_attr_alg data;
} alg;

struct {
char name[CRYPTO_MAX_ALG_NAME];
} larval;

char template[CRYPTO_MAX_ALG_NAME];
};

static void cryptomgr_probe(void *data)
{
struct cryptomgr_param *param = data;
struct crypto_template *tmpl;
struct crypto_instance *inst;

tmpl = crypto_lookup_template(param->template);
if (!tmpl)
goto err;

inst = tmpl->alloc(&param->alg, sizeof(param->alg));
if (IS_ERR(inst))
goto err;
else if ((err = crypto_register_instance(tmpl, inst))) {
tmpl->free(inst);
goto err;
}

crypto_tmpl_put(tmpl);

out:
kfree(param);
return;

err:
crypto_larval_error(param->larval.name);
goto out;
}

static int cryptomgr_schedule_probe(struct crypto_larval *larval)
{
struct cryptomgr_param *param;
const char *name = larval->alg.cra_name;
const char *p;
unsigned int len;

param = kmalloc(sizeof(*param), GFP_KERNEL);
if (!param)
goto err;

for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++)
;

len = p - name;
if (!len || *p != '(')
goto err_free_param;

memcpy(param->template, name, len);
param->template[len] = 0;

name = p + 1;
for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++)
;

len = p - name;
if (!len || *p != ')' || p[1])
goto err_free_param;

param->alg.attr.rta_len = sizeof(param->alg);
param->alg.attr.rta_type = CRYPTOA_ALG;
memcpy(param->alg.data.name, name, len);
param->alg.data.name[len] = 0;

memcpy(param->larval.name, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME);

INIT_WORK(&param->work, cryptomgr_probe, param);
schedule_work(&param->work);

return NOTIFY_STOP;

err_free_param:
kfree(param);
err:
return NOTIFY_OK;
}

static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
void *data)
{
switch (msg) {
case CRYPTO_MSG_ALG_REQUEST:
return cryptomgr_schedule_probe(data);
}

return NOTIFY_DONE;
}

static struct notifier_block cryptomgr_notifier = {
.notifier_call = cryptomgr_notify,
};

static int __init cryptomgr_init(void)
{
return crypto_register_notifier(&cryptomgr_notifier);
}

static void __exit cryptomgr_exit(void)
{
int err = crypto_unregister_notifier(&cryptomgr_notifier);
BUG_ON(err);
}

module_init(cryptomgr_init);
module_exit(cryptomgr_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Crypto Algorithm Manager");
9 changes: 9 additions & 0 deletions trunk/include/linux/crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,15 @@ struct crypto_tfm {
void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;
};

enum {
CRYPTOA_UNSPEC,
CRYPTOA_ALG,
};

struct crypto_attr_alg {
char name[CRYPTO_MAX_ALG_NAME];
};

/*
* Transform user interface.
*/
Expand Down

0 comments on commit 96f4e21

Please sign in to comment.