aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/api.c')
-rw-r--r--crypto/api.c25
1 files changed, 13 insertions, 12 deletions
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