[Cryptech Tech] Entropy source delivered
Benedikt Stockebrand
bs at stepladder-it.com
Fri Aug 29 11:11:28 UTC 2014
Hi folks,
another busy week finished, and time to catch up on the fun stuff...
Fredrik Thulin <fredrik at thulin.net> writes:
> Ok, thanks. I never considered interrupts slow, but this got me experimenting
> with polling again to see if I could reproduce the sort of "fixed steps" I
> thought I saw earlier, or to see if those were just the funny MSP430 counter
> issue viewed through another lens. More below.
Well, the MSP430 may behave somewhat differently than the Atmel MCUs,
but when I checked these things out some time ago I quickly decided
against interrupts.
Another issue with them is that they introduce some level of
non-determinism that makes things difficult to test properly. It's
somewhat counter-intuitive at first, but if we want to make things easy
to test we should avoid all non-determinism except where we really want
to extract the entropy from.
> [...]
> I don't think that is the case provided that a schmitt trigger transition from
> low to high or high to low can be expected to represent a breakdown or
> recovery.
Right; sorry, I didn't have all the details of your design in mind.
>> My guess is that you observed some sort of tolerances, clock
>> synchronization etc. rather than the actual noise from the avalanche
>> effect.
>
> Yes. I have now concluded that the MSP430 timer clocked from the DCO (internal
> digitally controlled oscillator) is unfit for this purpose. Maybe a timer would
> work in the MSP430 if it was clocked from an external oscillator, but then
> that would be a way to possibly inject bias - so...
I don't know enough about the MSP430 yet, so I can't really tell. With
the Atmels, the counters can be synchronized to the man clock signal, so
maybe they are a better option for the job?
> I stopped using the timer all together, and now do the following to extract
> one bit. Since I don't any longer have an unknown start value, I consume two
> full pulses.
>
> inline uint16_t get_one_bit()
> {
> uint16_t start, stop;
>
> start = 0;
> while ( (ENTROPY_PORT(IN) & ENT_AMPLIFIED)) { start++; }
> while (! (ENTROPY_PORT(IN) & ENT_AMPLIFIED)) { start++; }
> stop = 0;
> while ( (ENTROPY_PORT(IN) & ENT_AMPLIFIED)) { stop++; }
> while (! (ENTROPY_PORT(IN) & ENT_AMPLIFIED)) { stop++; }
>
> return (stop - start) & 1;
> }
I think you might be able to simplify this and speed things up even
more, but since I use the Atmel timer so I can poll faster my results
are somewhat difficult to compare.
> This not only actually increased my output speed (now reaching 12688 bit/s),
> but also removed all (!?!) bias as far as I can tell from a couple of hours
> worth of data.
It should, but just one question to be sure we're talking about the same
thing: Are you talking bias at the *bit* or *byte* level here?
Cheers,
Benedikt
--
Benedikt Stockebrand, Stepladder IT Training+Consulting
Dipl.-Inform. http://www.stepladder-it.com/
Business Grade IPv6 --- Consulting, Training, Projects
BIVBlog---Benedikt's IT Video Blog: http://www.stepladder-it.com/bivblog/
More information about the Tech
mailing list