linux/crypto/fips.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * FIPS 200 support.
   4 *
   5 * Copyright (c) 2008 Neil Horman <nhorman@tuxdriver.com>
   6 */
   7
   8#include <linux/export.h>
   9#include <linux/fips.h>
  10#include <linux/init.h>
  11#include <linux/module.h>
  12#include <linux/kernel.h>
  13#include <linux/sysctl.h>
  14#include <linux/notifier.h>
  15
  16int fips_enabled;
  17EXPORT_SYMBOL_GPL(fips_enabled);
  18
  19ATOMIC_NOTIFIER_HEAD(fips_fail_notif_chain);
  20EXPORT_SYMBOL_GPL(fips_fail_notif_chain);
  21
  22/* Process kernel command-line parameter at boot time. fips=0 or fips=1 */
  23static int fips_enable(char *str)
  24{
  25        fips_enabled = !!simple_strtol(str, NULL, 0);
  26        printk(KERN_INFO "fips mode: %s\n",
  27                fips_enabled ? "enabled" : "disabled");
  28        return 1;
  29}
  30
  31__setup("fips=", fips_enable);
  32
  33static struct ctl_table crypto_sysctl_table[] = {
  34        {
  35                .procname       = "fips_enabled",
  36                .data           = &fips_enabled,
  37                .maxlen         = sizeof(int),
  38                .mode           = 0444,
  39                .proc_handler   = proc_dointvec
  40        },
  41        {}
  42};
  43
  44static struct ctl_table crypto_dir_table[] = {
  45        {
  46                .procname       = "crypto",
  47                .mode           = 0555,
  48                .child          = crypto_sysctl_table
  49        },
  50        {}
  51};
  52
  53static struct ctl_table_header *crypto_sysctls;
  54
  55static void crypto_proc_fips_init(void)
  56{
  57        crypto_sysctls = register_sysctl_table(crypto_dir_table);
  58}
  59
  60static void crypto_proc_fips_exit(void)
  61{
  62        unregister_sysctl_table(crypto_sysctls);
  63}
  64
  65void fips_fail_notify(void)
  66{
  67        if (fips_enabled)
  68                atomic_notifier_call_chain(&fips_fail_notif_chain, 0, NULL);
  69}
  70EXPORT_SYMBOL_GPL(fips_fail_notify);
  71
  72static int __init fips_init(void)
  73{
  74        crypto_proc_fips_init();
  75        return 0;
  76}
  77
  78static void __exit fips_exit(void)
  79{
  80        crypto_proc_fips_exit();
  81}
  82
  83subsys_initcall(fips_init);
  84module_exit(fips_exit);
  85