<p>Philipp Deppenwiese has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23277">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">security/crypto: WIP // Add Pseudo Random Number Generator support<br><br>* Add TRNG interfacing for different implementations (Intel RDRAND/ TPM)<br>* Add HKDF algorithm as cryptographic secure PRNG (rfc5869).<br>* Add high level get_random interface.<br><br>Change-Id: I59c55b7cb512f0793b4889055fc7749afb525956<br>Signed-off-by: Philipp Deppenwiese <zaolin@das-labor.org><br>---<br>M src/security/crypto/Kconfig<br>M src/security/crypto/Makefile.inc<br>A src/security/crypto/rng.h<br>A src/security/crypto/rng/hkdf.c<br>A src/security/crypto/rng/trng.c<br>5 files changed, 76 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/77/23277/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/security/crypto/Kconfig b/src/security/crypto/Kconfig</span><br><span>index 4fbb808..834bc69 100644</span><br><span>--- a/src/security/crypto/Kconfig</span><br><span>+++ b/src/security/crypto/Kconfig</span><br><span>@@ -68,4 +68,14 @@</span><br><span> </span><br><span>        If unsure, say N.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+config CRYPTO_PRNG</span><br><span style="color: hsl(120, 100%, 40%);">+   bool "PRNG support"</span><br><span style="color: hsl(120, 100%, 40%);">+ default n</span><br><span style="color: hsl(120, 100%, 40%);">+     select CRYPTO_HMAC</span><br><span style="color: hsl(120, 100%, 40%);">+    help</span><br><span style="color: hsl(120, 100%, 40%);">+    Enable this option to to ensure RSA support.</span><br><span style="color: hsl(120, 100%, 40%);">+          Currently only signature verification with PKCS#1.5 is supported.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   If unsure, say N.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> endmenu # Cryptographic Primitives</span><br><span>diff --git a/src/security/crypto/Makefile.inc b/src/security/crypto/Makefile.inc</span><br><span>index d4e4b1b..32ecdba 100644</span><br><span>--- a/src/security/crypto/Makefile.inc</span><br><span>+++ b/src/security/crypto/Makefile.inc</span><br><span>@@ -29,3 +29,8 @@</span><br><span> romstage-$(CONFIG_CRYPTO_RSA) += rsa/rsa.c common/common.c</span><br><span> ramstage-$(CONFIG_CRYPTO_RSA) += rsa/rsa.c common/common.c</span><br><span> smm-$(CONFIG_CRYPTO_RSA) += rsa/rsa.c common/common.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+verstage-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c</span><br><span style="color: hsl(120, 100%, 40%);">+smm-$(CONFIG_CRYPTO_PRNG) += rng/hkdf.c</span><br><span>diff --git a/src/security/crypto/rng.h b/src/security/crypto/rng.h</span><br><span>new file mode 100644</span><br><span>index 0000000..c6075b8</span><br><span>--- /dev/null</span><br><span>+++ b/src/security/crypto/rng.h</span><br><span>@@ -0,0 +1,11 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define HKDF_INFO_LENGTH 4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hkdf_extract(const void *salt, uint32_t salt_length, const void *ikm,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint32_t ikm_length, uint8_t *prk, size_t prk_length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hkdf_expand(const void *prk, uint32_t prk_length,</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t info[HKDF_INFO_LENGTH], uint8_t *data,</span><br><span style="color: hsl(120, 100%, 40%);">+                size_t data_length);</span><br><span>diff --git a/src/security/crypto/rng/hkdf.c b/src/security/crypto/rng/hkdf.c</span><br><span>new file mode 100644</span><br><span>index 0000000..1da8bfe</span><br><span>--- /dev/null</span><br><span>+++ b/src/security/crypto/rng/hkdf.c</span><br><span>@@ -0,0 +1,50 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/crypto/hmac.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/crypto/rng.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define HKDF_MESSAGE_LENGTH 40</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hkdf_extract(const void *salt, uint32_t salt_length, const void *ikm,</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t ikm_length, uint8_t *prk, size_t prk_length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!salt || !salt_length) {</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t zero_salt[SHA256_DIGEST_SIZE] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+          ret = hmac(HASH_SHA256, zero_salt, SHA256_DIGEST_SIZE, ikm,</span><br><span style="color: hsl(120, 100%, 40%);">+                      ikm_length, prk, prk_length);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              ret = hmac(HASH_SHA256, salt, salt_length, ikm, ikm_length, prk,</span><br><span style="color: hsl(120, 100%, 40%);">+                         prk_length);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hkdf_expand(const void *prk, uint32_t prk_length,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t info[HKDF_INFO_LENGTH], uint8_t *data,</span><br><span style="color: hsl(120, 100%, 40%);">+                size_t data_length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+   int ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t t[SHA256_DIGEST_SIZE] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t message[HKDF_MESSAGE_LENGTH] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t rounds;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      rounds = (data_length / SHA256_DIGEST_SIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < rounds; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(message, t, SHA256_DIGEST_SIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+               memcpy(message + SHA256_DIGEST_SIZE, info, HKDF_INFO_LENGTH);</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(message + SHA256_DIGEST_SIZE + HKDF_INFO_LENGTH, &i,</span><br><span style="color: hsl(120, 100%, 40%);">+                      HKDF_INFO_LENGTH);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           ret = hmac(HASH_SHA256, prk, prk_length, message,</span><br><span style="color: hsl(120, 100%, 40%);">+                        HKDF_MESSAGE_LENGTH, t, SHA256_DIGEST_SIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(data + (i * SHA256_DIGEST_SIZE), t, SHA256_DIGEST_SIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/security/crypto/rng/trng.c b/src/security/crypto/rng/trng.c</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/src/security/crypto/rng/trng.c</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23277">change 23277</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/23277"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I59c55b7cb512f0793b4889055fc7749afb525956 </div>
<div style="display:none"> Gerrit-Change-Number: 23277 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>