| @@ -2,9 +2,8 @@ | |||
| title: Nearly Complete Guide to RNG on a microcontroller | |||
| description: > | |||
| How to initialize and run an RNG on an STM32L151CC microcontroller. | |||
| created: !!timestamp '2021-05-18' | |||
| listable: false | |||
| time: 12:00 PM | |||
| created: !!timestamp '2022-02-12' | |||
| time: 11:50 AM | |||
| tags: | |||
| - security | |||
| - rng | |||
| @@ -29,20 +28,23 @@ for="sn-drbg" class="margin-toggle sidenote-number"></label><input | |||
| type="checkbox" id="sn-drbg" class="margin-toggle"/><span | |||
| class="sidenote">[NIST](https://www.nist.gov/) also refers to a | |||
| PRNG as a Deterministic Random Bit Generator (DRBG).</span>. PRNGs | |||
| take a seed, and can generate large, effectively unlimited when seeded | |||
| properly, amounts of random looking data from them. The issue is than | |||
| if someone is able to obtain the seed, they will be able to predict | |||
| the subsequent values, allowing breaking security. | |||
| take a seed, and can generate large, effectively unlimited amounts of | |||
| random data, when seeded properly. The issue is than if someone is able | |||
| to obtain the seed, they will be able to predict the subsequent values, | |||
| allowing breaking security. | |||
| The standard practice is to gather data from a TRNG, and use it to seed | |||
| a PRNG. It used to be common that the PRNG would be reseeded, but I | |||
| agree w/ djb (D. J. Bernstein) that once seeded, no additional seeding | |||
| is needed<label for="sn-entropy" class="margin-toggle sidenote-number"></label> | |||
| <input type="checkbox" id="sn-entropy" class="margin-toggle"/> | |||
| <span class="sidenote">See his blog post | |||
| a PRNG. It used to be common that the PRNG should more additional random | |||
| data mixed in, but I agree w/ djb (D. J. Bernstein) that once seeded, no | |||
| additional seeding is needed<label for="sn-entropy" class="margin-toggle | |||
| sidenote-number"></label><input type="checkbox" id="sn-entropy" | |||
| class="margin-toggle"/><span class="sidenote">See his blog post | |||
| [Entropy Attacks!](https://blog.cr.yp.to/20140205-entropy.html)</span> | |||
| as modern PRNGs are secure enough and can generate enough randomness | |||
| that their state will not leak. | |||
| as modern PRNGs are secure and can generate random data such that their | |||
| state will not leak.<label for="sn-prng-secure" class="margin-toggle | |||
| sidenote-number"></label><input type="checkbox" id="sn-prng-secure" | |||
| class="margin-toggle"/><span class="sidenote">That is, taking it's output, | |||
| that neither past nor future output can be predicted.</span> | |||
| There are lots of libraries and papers that talk about how to solve the | |||
| problem for RNGs on a microcontroller that may not have an integrated | |||
| @@ -134,8 +136,8 @@ adequate entropy, as discussed in the papers, and so this method should | |||
| not be used in those cases, or not solely relied upon. | |||
| The following is an `awk` script for calculating the min-entropy of the | |||
| provided data. Each sample must the first item on a line, and each sample | |||
| must be a hexadecimal value w/o any leading `0x` or other leading | |||
| provided data. Each sample must be the first item on a line, and each | |||
| sample must be a hexadecimal value w/o any leading `0x` or other leading | |||
| identifier: | |||
| <pre id="min-entropy-awk" class="language-awk fullwidth"><code># Copyright 2021 John-Mark Gurney | |||
| # This script is licensed under the 2-clause BSD license | |||
| @@ -262,9 +264,9 @@ does require a little more work to have the code save to this region, | |||
| rather than RAM, but the STM32 HAL layer has functions that make this | |||
| easy. | |||
| It would be great if where the PRNG seed could be in read-once, | |||
| It would be great if the PRNG seed could be stored in read-once, | |||
| write-once memory to ensure that it can be read, mixed in with any | |||
| additional entropy, and the written out, but I do not know of any | |||
| additional entropy, and then written out, but I do not know of any | |||
| microcontroller that supports this feature. | |||
| Part of this is is to ensure that the the state between the saved | |||