aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-01-24 04:50:26 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2007-02-06 17:21:01 -0500
commit27d2a3300755387d2fec231d37944907ff992ce8 (patch)
treec42138c0160b8f0aa3d79860557514e73577e885
parent2e306ee016fd4750289e65c3b1856db569f1f3f2 (diff)
[CRYPTO] api: Allow multiple frontends per backend
This patch adds support for multiple frontend types for each backend algorithm by passing the type and mask through to the backend type init function. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/algapi.c2
-rw-r--r--crypto/api.c25
-rw-r--r--crypto/blkcipher.c5
-rw-r--r--crypto/hash.c5
-rw-r--r--crypto/internal.h3
-rw-r--r--include/crypto/algapi.h4
6 files changed, 24 insertions, 20 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c
index 0f1abca1b98c..f7d2185b2c8f 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -401,7 +401,7 @@ struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type,
401 if (unlikely((alg->cra_flags ^ type) & mask)) 401 if (unlikely((alg->cra_flags ^ type) & mask))
402 goto out_put_alg; 402 goto out_put_alg;
403 403
404 tfm = __crypto_alloc_tfm(alg); 404 tfm = __crypto_alloc_tfm(alg, type, mask);
405 if (IS_ERR(tfm)) 405 if (IS_ERR(tfm))
406 goto out_put_alg; 406 goto out_put_alg;
407 407
diff --git a/crypto/api.c b/crypto/api.c
index 8b80baec853a..55af8bb0f050 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -212,12 +212,12 @@ struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask)
212} 212}
213EXPORT_SYMBOL_GPL(crypto_alg_mod_lookup); 213EXPORT_SYMBOL_GPL(crypto_alg_mod_lookup);
214 214
215static int crypto_init_ops(struct crypto_tfm *tfm) 215static int crypto_init_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
216{ 216{
217 const struct crypto_type *type = tfm->__crt_alg->cra_type; 217 const struct crypto_type *type_obj = tfm->__crt_alg->cra_type;
218 218
219 if (type) 219 if (type_obj)
220 return type->init(tfm); 220 return type_obj->init(tfm, type, mask);
221 221
222 switch (crypto_tfm_alg_type(tfm)) { 222 switch (crypto_tfm_alg_type(tfm)) {
223 case CRYPTO_ALG_TYPE_CIPHER: 223 case CRYPTO_ALG_TYPE_CIPHER:
@@ -266,14 +266,14 @@ static void crypto_exit_ops(struct crypto_tfm *tfm)
266 } 266 }
267} 267}
268 268
269static unsigned int crypto_ctxsize(struct crypto_alg *alg) 269static unsigned int crypto_ctxsize(struct crypto_alg *alg, u32 type, u32 mask)
270{ 270{
271 const struct crypto_type *type = alg->cra_type; 271 const struct crypto_type *type_obj = alg->cra_type;
272 unsigned int len; 272 unsigned int len;
273 273
274 len = alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1); 274 len = alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1);
275 if (type) 275 if (type_obj)
276 return len + type->ctxsize(alg); 276 return len + type_obj->ctxsize(alg, type, mask);
277 277
278 switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) { 278 switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
279 default: 279 default:
@@ -303,20 +303,21 @@ void crypto_shoot_alg(struct crypto_alg *alg)
303} 303}
304EXPORT_SYMBOL_GPL(crypto_shoot_alg); 304EXPORT_SYMBOL_GPL(crypto_shoot_alg);
305 305
306struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg) 306struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
307 u32 mask)
307{ 308{
308 struct crypto_tfm *tfm = NULL; 309 struct crypto_tfm *tfm = NULL;
309 unsigned int tfm_size; 310 unsigned int tfm_size;
310 int err = -ENOMEM; 311 int err = -ENOMEM;
311 312
312 tfm_size = sizeof(*tfm) + crypto_ctxsize(alg); 313 tfm_size = sizeof(*tfm) + crypto_ctxsize(alg, type, mask);
313 tfm = kzalloc(tfm_size, GFP_KERNEL); 314 tfm = kzalloc(tfm_size, GFP_KERNEL);
314 if (tfm == NULL) 315 if (tfm == NULL)
315 goto out_err; 316 goto out_err;
316 317
317 tfm->__crt_alg = alg; 318 tfm->__crt_alg = alg;
318 319
319 err = crypto_init_ops(tfm); 320 err = crypto_init_ops(tfm, type, mask);
320 if (err) 321 if (err)
321 goto out_free_tfm; 322 goto out_free_tfm;
322 323
@@ -372,7 +373,7 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask)
372 goto err; 373 goto err;
373 } 374 }
374 375
375 tfm = __crypto_alloc_tfm(alg); 376 tfm = __crypto_alloc_tfm(alg, type, mask);
376 if (!IS_ERR(tfm)) 377 if (!IS_ERR(tfm))
377 return tfm; 378 return tfm;
378 379
diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c
index cbb4c4e5c229..b5befe8c3a96 100644
--- a/crypto/blkcipher.c
+++ b/crypto/blkcipher.c
@@ -349,7 +349,8 @@ static int setkey(struct crypto_tfm *tfm, const u8 *key,
349 return cipher->setkey(tfm, key, keylen); 349 return cipher->setkey(tfm, key, keylen);
350} 350}
351 351
352static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg) 352static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg, u32 type,
353 u32 mask)
353{ 354{
354 struct blkcipher_alg *cipher = &alg->cra_blkcipher; 355 struct blkcipher_alg *cipher = &alg->cra_blkcipher;
355 unsigned int len = alg->cra_ctxsize; 356 unsigned int len = alg->cra_ctxsize;
@@ -362,7 +363,7 @@ static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg)
362 return len; 363 return len;
363} 364}
364 365
365static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm) 366static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
366{ 367{
367 struct blkcipher_tfm *crt = &tfm->crt_blkcipher; 368 struct blkcipher_tfm *crt = &tfm->crt_blkcipher;
368 struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; 369 struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher;
diff --git a/crypto/hash.c b/crypto/hash.c
index cdec23d885fe..12c4514f3478 100644
--- a/crypto/hash.c
+++ b/crypto/hash.c
@@ -16,12 +16,13 @@
16 16
17#include "internal.h" 17#include "internal.h"
18 18
19static unsigned int crypto_hash_ctxsize(struct crypto_alg *alg) 19static unsigned int crypto_hash_ctxsize(struct crypto_alg *alg, u32 type,
20 u32 mask)
20{ 21{
21 return alg->cra_ctxsize; 22 return alg->cra_ctxsize;
22} 23}
23 24
24static int crypto_init_hash_ops(struct crypto_tfm *tfm) 25static int crypto_init_hash_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
25{ 26{
26 struct hash_tfm *crt = &tfm->crt_hash; 27 struct hash_tfm *crt = &tfm->crt_hash;
27 struct hash_alg *alg = &tfm->__crt_alg->cra_hash; 28 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
diff --git a/crypto/internal.h b/crypto/internal.h
index 784a7745315f..60acad9788c5 100644
--- a/crypto/internal.h
+++ b/crypto/internal.h
@@ -120,7 +120,8 @@ void crypto_exit_compress_ops(struct crypto_tfm *tfm);
120void crypto_larval_error(const char *name, u32 type, u32 mask); 120void crypto_larval_error(const char *name, u32 type, u32 mask);
121 121
122void crypto_shoot_alg(struct crypto_alg *alg); 122void crypto_shoot_alg(struct crypto_alg *alg);
123struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg); 123struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
124 u32 mask);
124 125
125int crypto_register_instance(struct crypto_template *tmpl, 126int crypto_register_instance(struct crypto_template *tmpl,
126 struct crypto_instance *inst); 127 struct crypto_instance *inst);
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h
index 99c534d573d2..4e05e93ff681 100644
--- a/include/crypto/algapi.h
+++ b/include/crypto/algapi.h
@@ -18,8 +18,8 @@ struct module;
18struct seq_file; 18struct seq_file;
19 19
20struct crypto_type { 20struct crypto_type {
21 unsigned int (*ctxsize)(struct crypto_alg *alg); 21 unsigned int (*ctxsize)(struct crypto_alg *alg, u32 type, u32 mask);
22 int (*init)(struct crypto_tfm *tfm); 22 int (*init)(struct crypto_tfm *tfm, u32 type, u32 mask);
23 void (*exit)(struct crypto_tfm *tfm); 23 void (*exit)(struct crypto_tfm *tfm);
24 void (*show)(struct seq_file *m, struct crypto_alg *alg); 24 void (*show)(struct seq_file *m, struct crypto_alg *alg);
25}; 25};