diff options
| -rw-r--r-- | crypto/Kconfig | 8 | ||||
| -rw-r--r-- | crypto/Makefile | 2 | ||||
| -rw-r--r-- | crypto/fips.c | 27 | ||||
| -rw-r--r-- | crypto/internal.h | 6 | ||||
| -rw-r--r-- | crypto/proc.c | 47 |
5 files changed, 90 insertions, 0 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 776f90d249a0..a784c2dce57e 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
| @@ -21,6 +21,14 @@ if CRYPTO | |||
| 21 | 21 | ||
| 22 | comment "Crypto core or helper" | 22 | comment "Crypto core or helper" |
| 23 | 23 | ||
| 24 | config CRYPTO_FIPS | ||
| 25 | bool "FIPS 200 compliance" | ||
| 26 | help | ||
| 27 | This options enables the fips boot option which is | ||
| 28 | required if you want to system to operate in a FIPS 200 | ||
| 29 | certification. You should say no unless you know what | ||
| 30 | this is. | ||
| 31 | |||
| 24 | config CRYPTO_ALGAPI | 32 | config CRYPTO_ALGAPI |
| 25 | tristate | 33 | tristate |
| 26 | help | 34 | help |
diff --git a/crypto/Makefile b/crypto/Makefile index 256e33e81e3e..8a27b834ea76 100644 --- a/crypto/Makefile +++ b/crypto/Makefile | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | obj-$(CONFIG_CRYPTO) += crypto.o | 5 | obj-$(CONFIG_CRYPTO) += crypto.o |
| 6 | crypto-objs := api.o cipher.o digest.o compress.o | 6 | crypto-objs := api.o cipher.o digest.o compress.o |
| 7 | 7 | ||
| 8 | obj-$(CONFIG_CRYPTO_FIPS) += fips.o | ||
| 9 | |||
| 8 | crypto_algapi-$(CONFIG_PROC_FS) += proc.o | 10 | crypto_algapi-$(CONFIG_PROC_FS) += proc.o |
| 9 | crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y) | 11 | crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y) |
| 10 | obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o | 12 | obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o |
diff --git a/crypto/fips.c b/crypto/fips.c new file mode 100644 index 000000000000..553970081c62 --- /dev/null +++ b/crypto/fips.c | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | /* | ||
| 2 | * FIPS 200 support. | ||
| 3 | * | ||
| 4 | * Copyright (c) 2008 Neil Horman <nhorman@tuxdriver.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms of the GNU General Public License as published by the Free | ||
| 8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
| 9 | * any later version. | ||
| 10 | * | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include "internal.h" | ||
| 14 | |||
| 15 | int fips_enabled; | ||
| 16 | EXPORT_SYMBOL_GPL(fips_enabled); | ||
| 17 | |||
| 18 | /* Process kernel command-line parameter at boot time. fips=0 or fips=1 */ | ||
| 19 | static int fips_enable(char *str) | ||
| 20 | { | ||
| 21 | fips_enabled = !!simple_strtol(str, NULL, 0); | ||
| 22 | printk(KERN_INFO "fips mode: %s\n", | ||
| 23 | fips_enabled ? "enabled" : "disabled"); | ||
| 24 | return 1; | ||
| 25 | } | ||
| 26 | |||
| 27 | __setup("fips=", fips_enable); | ||
diff --git a/crypto/internal.h b/crypto/internal.h index fc93743c5d3e..8ef72d76092e 100644 --- a/crypto/internal.h +++ b/crypto/internal.h | |||
| @@ -26,6 +26,12 @@ | |||
| 26 | #include <linux/rwsem.h> | 26 | #include <linux/rwsem.h> |
| 27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_CRYPTO_FIPS | ||
| 30 | extern int fips_enabled; | ||
| 31 | #else | ||
| 32 | #define fips_enabled 0 | ||
| 33 | #endif | ||
| 34 | |||
| 29 | /* Crypto notification events. */ | 35 | /* Crypto notification events. */ |
| 30 | enum { | 36 | enum { |
| 31 | CRYPTO_MSG_ALG_REQUEST, | 37 | CRYPTO_MSG_ALG_REQUEST, |
diff --git a/crypto/proc.c b/crypto/proc.c index 1d616adead0d..37a13d05636d 100644 --- a/crypto/proc.c +++ b/crypto/proc.c | |||
| @@ -19,8 +19,53 @@ | |||
| 19 | #include <linux/rwsem.h> | 19 | #include <linux/rwsem.h> |
| 20 | #include <linux/proc_fs.h> | 20 | #include <linux/proc_fs.h> |
| 21 | #include <linux/seq_file.h> | 21 | #include <linux/seq_file.h> |
| 22 | #include <linux/sysctl.h> | ||
| 22 | #include "internal.h" | 23 | #include "internal.h" |
| 23 | 24 | ||
| 25 | #ifdef CONFIG_CRYPTO_FIPS | ||
| 26 | static struct ctl_table crypto_sysctl_table[] = { | ||
| 27 | { | ||
| 28 | .ctl_name = CTL_UNNUMBERED, | ||
| 29 | .procname = "fips_enabled", | ||
| 30 | .data = &fips_enabled, | ||
| 31 | .maxlen = sizeof(int), | ||
| 32 | .mode = 0444, | ||
| 33 | .proc_handler = &proc_dointvec | ||
| 34 | }, | ||
| 35 | { | ||
| 36 | .ctl_name = 0, | ||
| 37 | }, | ||
| 38 | }; | ||
| 39 | |||
| 40 | static struct ctl_table crypto_dir_table[] = { | ||
| 41 | { | ||
| 42 | .ctl_name = CTL_UNNUMBERED, | ||
| 43 | .procname = "crypto", | ||
| 44 | .mode = 0555, | ||
| 45 | .child = crypto_sysctl_table | ||
| 46 | }, | ||
| 47 | { | ||
| 48 | .ctl_name = 0, | ||
| 49 | }, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static struct ctl_table_header *crypto_sysctls; | ||
| 53 | |||
| 54 | static void crypto_proc_fips_init(void) | ||
| 55 | { | ||
| 56 | crypto_sysctls = register_sysctl_table(crypto_dir_table); | ||
| 57 | } | ||
| 58 | |||
| 59 | static void crypto_proc_fips_exit(void) | ||
| 60 | { | ||
| 61 | if (crypto_sysctls) | ||
| 62 | unregister_sysctl_table(crypto_sysctls); | ||
| 63 | } | ||
| 64 | #else | ||
| 65 | #define crypto_proc_fips_init() | ||
| 66 | #define crypto_proc_fips_exit() | ||
| 67 | #endif | ||
| 68 | |||
| 24 | static void *c_start(struct seq_file *m, loff_t *pos) | 69 | static void *c_start(struct seq_file *m, loff_t *pos) |
| 25 | { | 70 | { |
| 26 | down_read(&crypto_alg_sem); | 71 | down_read(&crypto_alg_sem); |
| @@ -106,9 +151,11 @@ static const struct file_operations proc_crypto_ops = { | |||
| 106 | void __init crypto_init_proc(void) | 151 | void __init crypto_init_proc(void) |
| 107 | { | 152 | { |
| 108 | proc_create("crypto", 0, NULL, &proc_crypto_ops); | 153 | proc_create("crypto", 0, NULL, &proc_crypto_ops); |
| 154 | crypto_proc_fips_init(); | ||
| 109 | } | 155 | } |
| 110 | 156 | ||
| 111 | void __exit crypto_exit_proc(void) | 157 | void __exit crypto_exit_proc(void) |
| 112 | { | 158 | { |
| 159 | crypto_proc_fips_exit(); | ||
| 113 | remove_proc_entry("crypto", NULL); | 160 | remove_proc_entry("crypto", NULL); |
| 114 | } | 161 | } |
