[Cryptography] RNGs, Entropy, and Unguessability

Kent Borg kentborg at borg.org
Sun May 30 16:14:02 EDT 2021


Entropy is important to RNGs but unfortunately RNG people are at risk of 
devoutly worshiping at the alter of "Countable Entropy", blinded to 
realities, ready with jeers for anyone who does not share their extreme 
theology.

These people are so in the thrall of the theoretical that they are 
blinded to the practical and any other theories.

And for practical purposes, it is the unguessability of the RNG that 
matters. Any source of unguessable data is a good thing to use to drive 
an RNG. Even sources that are dismissed as "squish" by the most devout 
and most blinded can be good. And there is a great example that these 
disciples can't see.

And now I need to shift the subject for a moment. It is on topic, honest.


      Time Distribution is Hard

NTP is really great, I love it, so cool. It can set my computer's clock 
with a precision measured in milliseconds. Very impressive it can do 
this just by applying algorithms to hardware that is already present.

If one wants better, the next option is to get time from GPS. According 
to gps.gov a specialized receiver, at a fixed location, can know the 
time within 40ns. This is pretty cool, too. It is good enough to 
synchronize RF signals between CDMA cell sites so phones can communicate 
with more than one site as the same time.

GPS also depends on billions of dollars of infrastructure with an annual 
budget that must be in the millions. People think GPS is about location, 
but at its core it is /really/ about time distribution. From end-to-end 
a design where every component is doing its best to carefully keep and 
distribute precise time. If one pays attention to details and has the 
money for good hardware (far more than just a smartphone), to get 40ns 
is very cool.


      Guessing Time is Even Harder

With all that money can constructive effort, one can do 40ns. What are 
/you/ going to do to do better? Get specific. (Warning, it's not going 
to be easy.)


      Cheap Unguessability

A 1 GHz clock has a cycle time of 1ns. (Is it even possible to buy an 
Intel-based machine that runs slower than 1GHz these days?) 1ns is a lot 
smaller than 40ns. You don't know the value of my clock.

Intel chips have a timestamp counter that increments with every tick of 
the system clock. You don't know the value of my counter.

The system clock isn't fed to the CPU, the CPU is fed a much lower 
frequency, that it then multiplies up using analog on-chip PLL 
circuitry. That clock is then (carefully) distributed on-chip. And even 
then, different parts of the chip are in different clock domains, 
because clock distribution and synchronization is hard.

So the "system clock" doesn't exist outside the CPU, it is only a "CPU 
clock", and not all parts of the CPU are even privy to it.

No one at any distance outside that chip knows the value of the 
timestamp counter. A program might contain the instruction to read the 
timestamp counter, but by the time anything is done with that value, it 
will have changed.

Is there "entropy" in that system clock? Some, but only some. The PLL 
will have some jitter, the precision of the lower frequency input clock 
will have iffy precision and be subject to drift.

Is there "unguessability" in that system clock? Plenty! At least to any 
observer at any distance (i.e., outside the computer).

Remember, it takes billions of dollars and lots of careful design and 
cooperation to distribute 40ns. time. No such effort nor expense has 
been made to tell the world the precise value of my 1ns period (or less) 
CPU clock.

No one outside my computer knows its precise value.


      Back on Topic

Intel hardware has a great source of unguessability in its timestamp 
counter. All you need is an uncorrelated sampling of this clock. Say, a 
network interrupt.

I know the squish patrol is now /all/ upset, because external observers 
can be the one's sending these packets with careful timing. So what? The 
timing can't be careful enough. The value that is read from the 
timestamp counter in servicing that interrupt depends on knowing edge 
timings far more closely than 1ns, for every time the observer guesses a 
value on the wrong side of one of these edges, one bit of unguessability 
slips by.


      RNGs are Still Hard

A (1) uncorrelated sampling of a (2) fast clock is, indeed, a good 
source of unguessability.

But, make sure both those things be true.

Is virtualization messing with how these things work? Is variable clock 
scaling messing with it? Have interrupts been virturalized in some 
predictable way? Is the timestamp counter being messed with in an 
attempt to have it not appear to be warped by clock scaling and 
effectively running much slower? Is some OS scheduling algorithm 
synchronizing interrupt servicing with timestamp values?

Just because there is an underappreciated way to feed an RNG doesn't 
mean there aren't plenty of ways to still mess it up. ("Um, it turns out 
the RNG isn't /in/ production builds." Who will notice?)

Implementation matters.


But the fact remains time distribution is hard, the period of a 
gigahertz clock is small. No one at any distance knows its value. An 
awful lot of computers out there can use this to drive their RNGs.


-kb, the Kent who laments that Arm CPUs didn't have something like a 
timestamp counter last he looked.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.metzdowd.com/pipermail/cryptography/attachments/20210530/1d01a59f/attachment.htm>


More information about the cryptography mailing list