diff options
| author | Kent Yoder <key@linux.vnet.ibm.com> | 2012-08-08 15:18:57 -0400 |
|---|---|---|
| committer | Kent Yoder <key@linux.vnet.ibm.com> | 2012-08-22 12:11:41 -0400 |
| commit | 578b016fdc91464c08c096f0c5952cae549fdb8f (patch) | |
| tree | 24c6afd153f4da3c4fed72f6d7932938642a8c8c /drivers/char/hw_random | |
| parent | 41ab999c80f1d368f32a2554ba8f44feff26f54d (diff) | |
hw_random: add support for the TPM chip as a hardware RNG source
This driver will make use of any available TPM chip on the system as a
hwrng source.
Acked-by: David Safford <safford@linux.vnet.ibm.com>
Signed-off-by: Kent Yoder <key@linux.vnet.ibm.com>
Diffstat (limited to 'drivers/char/hw_random')
| -rw-r--r-- | drivers/char/hw_random/Kconfig | 13 | ||||
| -rw-r--r-- | drivers/char/hw_random/Makefile | 1 | ||||
| -rw-r--r-- | drivers/char/hw_random/tpm-rng.c | 50 |
3 files changed, 64 insertions, 0 deletions
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 7c0d391996b..fbd9b2b850e 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig | |||
| @@ -289,3 +289,16 @@ config HW_RANDOM_EXYNOS | |||
| 289 | module will be called exynos-rng. | 289 | module will be called exynos-rng. |
| 290 | 290 | ||
| 291 | If unsure, say Y. | 291 | If unsure, say Y. |
| 292 | |||
| 293 | config HW_RANDOM_TPM | ||
| 294 | tristate "TPM HW Random Number Generator support" | ||
| 295 | depends on HW_RANDOM && TCG_TPM | ||
| 296 | default HW_RANDOM | ||
| 297 | ---help--- | ||
| 298 | This driver provides kernel-side support for the Random Number | ||
| 299 | Generator in the Trusted Platform Module | ||
| 300 | |||
| 301 | To compile this driver as a module, choose M here: the | ||
| 302 | module will be called tpm-rng. | ||
| 303 | |||
| 304 | If unsure, say Y. | ||
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index 39a757ca15b..1fd7eec9fbf 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile | |||
| @@ -25,3 +25,4 @@ obj-$(CONFIG_HW_RANDOM_PICOXCELL) += picoxcell-rng.o | |||
| 25 | obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o | 25 | obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o |
| 26 | obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o | 26 | obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o |
| 27 | obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-rng.o | 27 | obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-rng.o |
| 28 | obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o | ||
diff --git a/drivers/char/hw_random/tpm-rng.c b/drivers/char/hw_random/tpm-rng.c new file mode 100644 index 00000000000..d6d448266f0 --- /dev/null +++ b/drivers/char/hw_random/tpm-rng.c | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Kent Yoder IBM Corporation | ||
| 3 | * | ||
| 4 | * HWRNG interfaces to pull RNG data from a TPM | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/module.h> | ||
| 21 | #include <linux/hw_random.h> | ||
| 22 | #include <linux/tpm.h> | ||
| 23 | |||
| 24 | #define MODULE_NAME "tpm-rng" | ||
| 25 | |||
| 26 | static int tpm_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) | ||
| 27 | { | ||
| 28 | return tpm_get_random(TPM_ANY_NUM, data, max); | ||
| 29 | } | ||
| 30 | |||
| 31 | static struct hwrng tpm_rng = { | ||
| 32 | .name = MODULE_NAME, | ||
| 33 | .read = tpm_rng_read, | ||
| 34 | }; | ||
| 35 | |||
| 36 | static int __init rng_init(void) | ||
| 37 | { | ||
| 38 | return hwrng_register(&tpm_rng); | ||
| 39 | } | ||
| 40 | module_init(rng_init); | ||
| 41 | |||
| 42 | static void __exit rng_exit(void) | ||
| 43 | { | ||
| 44 | hwrng_unregister(&tpm_rng); | ||
| 45 | } | ||
| 46 | module_exit(rng_exit); | ||
| 47 | |||
| 48 | MODULE_LICENSE("GPL v2"); | ||
| 49 | MODULE_AUTHOR("Kent Yoder <key@linux.vnet.ibm.com>"); | ||
| 50 | MODULE_DESCRIPTION("RNG driver for TPM devices"); | ||
