Skip to content

Commit ccb778e

Browse files
nhormanherbertx
authored andcommitted
crypto: api - Add fips_enable flag
Add the ability to turn FIPS-compliant mode on or off at boot In order to be FIPS compliant, several check may need to be preformed that may be construed as unusefull in a non-compliant mode. This patch allows us to set a kernel flag incating that we are running in a fips-compliant mode from boot up. It also exports that mode information to user space via a sysctl (/proc/sys/crypto/fips_enabled). Tested successfully by me. Signed-off-by: Neil Horman <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 5be5e66 commit ccb778e

File tree

5 files changed

+90
-0
lines changed

5 files changed

+90
-0
lines changed

crypto/Kconfig

+8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ if CRYPTO
2121

2222
comment "Crypto core or helper"
2323

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+
2432
config CRYPTO_ALGAPI
2533
tristate
2634
help

crypto/Makefile

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
obj-$(CONFIG_CRYPTO) += crypto.o
66
crypto-objs := api.o cipher.o digest.o compress.o
77

8+
obj-$(CONFIG_CRYPTO_FIPS) += fips.o
9+
810
crypto_algapi-$(CONFIG_PROC_FS) += proc.o
911
crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y)
1012
obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o

crypto/fips.c

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* FIPS 200 support.
3+
*
4+
* Copyright (c) 2008 Neil Horman <[email protected]>
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);

crypto/internal.h

+6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
#include <linux/rwsem.h>
2727
#include <linux/slab.h>
2828

29+
#ifdef CONFIG_CRYPTO_FIPS
30+
extern int fips_enabled;
31+
#else
32+
#define fips_enabled 0
33+
#endif
34+
2935
/* Crypto notification events. */
3036
enum {
3137
CRYPTO_MSG_ALG_REQUEST,

crypto/proc.c

+47
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,53 @@
1919
#include <linux/rwsem.h>
2020
#include <linux/proc_fs.h>
2121
#include <linux/seq_file.h>
22+
#include <linux/sysctl.h>
2223
#include "internal.h"
2324

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+
2469
static void *c_start(struct seq_file *m, loff_t *pos)
2570
{
2671
down_read(&crypto_alg_sem);
@@ -106,9 +151,11 @@ static const struct file_operations proc_crypto_ops = {
106151
void __init crypto_init_proc(void)
107152
{
108153
proc_create("crypto", 0, NULL, &proc_crypto_ops);
154+
crypto_proc_fips_init();
109155
}
110156

111157
void __exit crypto_exit_proc(void)
112158
{
159+
crypto_proc_fips_exit();
113160
remove_proc_entry("crypto", NULL);
114161
}

0 commit comments

Comments
 (0)