[coreboot-gerrit] Change in coreboot[master]: security/crypto: WIP // Add Pseudo Random Number Generator support

Philipp Deppenwiese (Code Review) gerrit at coreboot.org
Mon Jan 15 15:37:59 CET 2018


Philipp Deppenwiese has uploaded this change for review. ( https://review.coreboot.org/23277


Change subject: security/crypto: WIP // Add Pseudo Random Number Generator support
......................................................................

security/crypto: WIP // Add Pseudo Random Number Generator support

* Add TRNG interfacing for different implementations (Intel RDRAND/ TPM)
* Add HKDF algorithm as cryptographic secure PRNG (rfc5869).
* Add high level get_random interface.

Change-Id: I59c55b7cb512f0793b4889055fc7749afb525956
Signed-off-by: Philipp Deppenwiese <zaolin at das-labor.org>
---
M src/security/crypto/Kconfig
M src/security/crypto/Makefile.inc
A src/security/crypto/rng.h
A src/security/crypto/rng/hkdf.c
A src/security/crypto/rng/trng.c
5 files changed, 76 insertions(+), 0 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/77/23277/1

diff --git a/src/security/crypto/Kconfig b/src/security/crypto/Kconfig
index 4fbb808..834bc69 100644
--- a/src/security/crypto/Kconfig
+++ b/src/security/crypto/Kconfig
@@ -68,4 +68,14 @@
 
 	  If unsure, say N.
 
+config CRYPTO_PRNG
+	bool "PRNG support"
+	default n
+	select CRYPTO_HMAC
+	help
+	  Enable this option to to ensure RSA support.
+	  Currently only signature verification with PKCS#1.5 is supported.
+
+	  If unsure, say N.
+
 endmenu # Cryptographic Primitives
diff --git a/src/security/crypto/Makefile.inc b/src/security/crypto/Makefile.inc
index d4e4b1b..32ecdba 100644
--- a/src/security/crypto/Makefile.inc
+++ b/src/security/crypto/Makefile.inc
@@ -29,3 +29,8 @@
 romstage-$(CONFIG_CRYPTO_RSA) += rsa/rsa.c common/common.c
 ramstage-$(CONFIG_CRYPTO_RSA) += rsa/rsa.c common/common.c
 smm-$(CONFIG_CRYPTO_RSA) += rsa/rsa.c common/common.c
+
+verstage-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c
+romstage-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c
+ramstage-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c
+smm-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c
diff --git a/src/security/crypto/rng.h b/src/security/crypto/rng.h
new file mode 100644
index 0000000..c6075b8
--- /dev/null
+++ b/src/security/crypto/rng.h
@@ -0,0 +1,11 @@
+
+#include <stdint.h>
+
+#define HKDF_INFO_LENGTH 4
+
+int hkdf_extract(const void *salt, uint32_t salt_length, const void *ikm,
+		 uint32_t ikm_length, uint8_t *prk, size_t prk_length);
+
+int hkdf_expand(const void *prk, uint32_t prk_length,
+		uint8_t info[HKDF_INFO_LENGTH], uint8_t *data,
+		size_t data_length);
diff --git a/src/security/crypto/rng/hkdf.c b/src/security/crypto/rng/hkdf.c
new file mode 100644
index 0000000..1da8bfe
--- /dev/null
+++ b/src/security/crypto/rng/hkdf.c
@@ -0,0 +1,50 @@
+
+
+#include <security/crypto/hmac.h>
+#include <security/crypto/rng.h>
+
+#define HKDF_MESSAGE_LENGTH 40
+
+int hkdf_extract(const void *salt, uint32_t salt_length, const void *ikm,
+		 uint32_t ikm_length, uint8_t *prk, size_t prk_length)
+{
+	int ret;
+
+	if (!salt || !salt_length) {
+		uint8_t zero_salt[SHA256_DIGEST_SIZE] = {0};
+		ret = hmac(HASH_SHA256, zero_salt, SHA256_DIGEST_SIZE, ikm,
+			   ikm_length, prk, prk_length);
+	} else {
+		ret = hmac(HASH_SHA256, salt, salt_length, ikm, ikm_length, prk,
+			   prk_length);
+	}
+
+	return ret;
+}
+
+int hkdf_expand(const void *prk, uint32_t prk_length,
+		uint8_t info[HKDF_INFO_LENGTH], uint8_t *data,
+		size_t data_length)
+{
+	uint32_t i;
+	int ret = 0;
+	uint8_t t[SHA256_DIGEST_SIZE] = {0};
+	uint8_t message[HKDF_MESSAGE_LENGTH] = {0};
+	size_t rounds;
+
+	rounds = (data_length / SHA256_DIGEST_SIZE);
+
+	for (i = 0; i < rounds; i++) {
+		memcpy(message, t, SHA256_DIGEST_SIZE);
+		memcpy(message + SHA256_DIGEST_SIZE, info, HKDF_INFO_LENGTH);
+		memcpy(message + SHA256_DIGEST_SIZE + HKDF_INFO_LENGTH, &i,
+		       HKDF_INFO_LENGTH);
+
+		ret = hmac(HASH_SHA256, prk, prk_length, message,
+			   HKDF_MESSAGE_LENGTH, t, SHA256_DIGEST_SIZE);
+
+		memcpy(data + (i * SHA256_DIGEST_SIZE), t, SHA256_DIGEST_SIZE);
+	}
+
+	return ret;
+}
diff --git a/src/security/crypto/rng/trng.c b/src/security/crypto/rng/trng.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/security/crypto/rng/trng.c

-- 
To view, visit https://review.coreboot.org/23277
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I59c55b7cb512f0793b4889055fc7749afb525956
Gerrit-Change-Number: 23277
Gerrit-PatchSet: 1
Gerrit-Owner: Philipp Deppenwiese <zaolin.daisuki at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180115/997e2cc2/attachment.html>


More information about the coreboot-gerrit mailing list