diff options
Diffstat (limited to 'security')
| -rw-r--r-- | security/keys/big_key.c | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/security/keys/big_key.c b/security/keys/big_key.c index c0b3030b5634..835c1ab30d01 100644 --- a/security/keys/big_key.c +++ b/security/keys/big_key.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | * 2 of the Licence, or (at your option) any later version. | 9 | * 2 of the Licence, or (at your option) any later version. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #define pr_fmt(fmt) "big_key: "fmt | ||
| 12 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 13 | #include <linux/seq_file.h> | 14 | #include <linux/seq_file.h> |
| 14 | #include <linux/file.h> | 15 | #include <linux/file.h> |
| @@ -341,44 +342,48 @@ error: | |||
| 341 | */ | 342 | */ |
| 342 | static int __init big_key_init(void) | 343 | static int __init big_key_init(void) |
| 343 | { | 344 | { |
| 344 | return register_key_type(&key_type_big_key); | 345 | struct crypto_skcipher *cipher; |
| 345 | } | 346 | struct crypto_rng *rng; |
| 346 | 347 | int ret; | |
| 347 | /* | ||
| 348 | * Initialize big_key crypto and RNG algorithms | ||
| 349 | */ | ||
| 350 | static int __init big_key_crypto_init(void) | ||
| 351 | { | ||
| 352 | int ret = -EINVAL; | ||
| 353 | 348 | ||
| 354 | /* init RNG */ | 349 | rng = crypto_alloc_rng(big_key_rng_name, 0, 0); |
| 355 | big_key_rng = crypto_alloc_rng(big_key_rng_name, 0, 0); | 350 | if (IS_ERR(rng)) { |
| 356 | if (IS_ERR(big_key_rng)) { | 351 | pr_err("Can't alloc rng: %ld\n", PTR_ERR(rng)); |
| 357 | big_key_rng = NULL; | 352 | return PTR_ERR(rng); |
| 358 | return -EFAULT; | ||
| 359 | } | 353 | } |
| 360 | 354 | ||
| 355 | big_key_rng = rng; | ||
| 356 | |||
| 361 | /* seed RNG */ | 357 | /* seed RNG */ |
| 362 | ret = crypto_rng_reset(big_key_rng, NULL, crypto_rng_seedsize(big_key_rng)); | 358 | ret = crypto_rng_reset(rng, NULL, crypto_rng_seedsize(rng)); |
| 363 | if (ret) | 359 | if (ret) { |
| 364 | goto error; | 360 | pr_err("Can't reset rng: %d\n", ret); |
| 361 | goto error_rng; | ||
| 362 | } | ||
| 365 | 363 | ||
| 366 | /* init block cipher */ | 364 | /* init block cipher */ |
| 367 | big_key_skcipher = crypto_alloc_skcipher(big_key_alg_name, | 365 | cipher = crypto_alloc_skcipher(big_key_alg_name, 0, CRYPTO_ALG_ASYNC); |
| 368 | 0, CRYPTO_ALG_ASYNC); | 366 | if (IS_ERR(cipher)) { |
| 369 | if (IS_ERR(big_key_skcipher)) { | 367 | ret = PTR_ERR(cipher); |
| 370 | big_key_skcipher = NULL; | 368 | pr_err("Can't alloc crypto: %d\n", ret); |
| 371 | ret = -EFAULT; | 369 | goto error_rng; |
| 372 | goto error; | 370 | } |
| 371 | |||
| 372 | big_key_skcipher = cipher; | ||
| 373 | |||
| 374 | ret = register_key_type(&key_type_big_key); | ||
| 375 | if (ret < 0) { | ||
| 376 | pr_err("Can't register type: %d\n", ret); | ||
| 377 | goto error_cipher; | ||
| 373 | } | 378 | } |
| 374 | 379 | ||
| 375 | return 0; | 380 | return 0; |
| 376 | 381 | ||
| 377 | error: | 382 | error_cipher: |
| 383 | crypto_free_skcipher(big_key_skcipher); | ||
| 384 | error_rng: | ||
| 378 | crypto_free_rng(big_key_rng); | 385 | crypto_free_rng(big_key_rng); |
| 379 | big_key_rng = NULL; | ||
| 380 | return ret; | 386 | return ret; |
| 381 | } | 387 | } |
| 382 | 388 | ||
| 383 | device_initcall(big_key_init); | 389 | late_initcall(big_key_init); |
| 384 | late_initcall(big_key_crypto_init); | ||
