From f2f8ed28eaf447bafcc7728e8e12403cd37d3e23 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Sun, 22 Mar 2015 08:56:26 +1000 Subject: [PATCH] Ring oscillator noise source class --- doc/crypto-rng-ring.dox | 187 ++++++++ doc/crypto.dox | 2 +- doc/mainpage.dox | 2 +- .../Crypto/RingOscillatorNoiseSource.cpp | 263 +++++++++++ libraries/Crypto/RingOscillatorNoiseSource.h | 50 ++ libraries/Crypto/TransistorNoiseSource.cpp | 2 +- libraries/Crypto/examples/TestRNG/TestRNG.ino | 2 + .../TestRingOscillatorNoise.ino | 44 ++ .../TestTransistorNoise.ino} | 0 libraries/Crypto/keywords.txt | 1 + libraries/Crypto/ring_oscillator.fig | 441 ++++++++++++++++++ libraries/Crypto/ring_oscillator.png | Bin 0 -> 28361 bytes libraries/Crypto/ring_oscillator_basic.fig | 39 ++ libraries/Crypto/ring_oscillator_basic.png | Bin 0 -> 4142 bytes libraries/Crypto/ring_oscillator_multi.fig | 146 ++++++ libraries/Crypto/ring_oscillator_multi.png | Bin 0 -> 9553 bytes libraries/Crypto/ring_oscillator_sampled.fig | 54 +++ libraries/Crypto/ring_oscillator_sampled.png | Bin 0 -> 6247 bytes 18 files changed, 1230 insertions(+), 3 deletions(-) create mode 100644 doc/crypto-rng-ring.dox create mode 100644 libraries/Crypto/RingOscillatorNoiseSource.cpp create mode 100644 libraries/Crypto/RingOscillatorNoiseSource.h create mode 100644 libraries/Crypto/examples/TestRingOscillatorNoise/TestRingOscillatorNoise.ino rename libraries/Crypto/examples/{TestNoise/TestNoise.ino => TestTransistorNoise/TestTransistorNoise.ino} (100%) create mode 100644 libraries/Crypto/ring_oscillator.fig create mode 100644 libraries/Crypto/ring_oscillator.png create mode 100644 libraries/Crypto/ring_oscillator_basic.fig create mode 100644 libraries/Crypto/ring_oscillator_basic.png create mode 100644 libraries/Crypto/ring_oscillator_multi.fig create mode 100644 libraries/Crypto/ring_oscillator_multi.png create mode 100644 libraries/Crypto/ring_oscillator_sampled.fig create mode 100644 libraries/Crypto/ring_oscillator_sampled.png diff --git a/doc/crypto-rng-ring.dox b/doc/crypto-rng-ring.dox new file mode 100644 index 00000000..d5625dc2 --- /dev/null +++ b/doc/crypto-rng-ring.dox @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2015 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** +\file crypto-rng-ring.dox +\page crypto_rng_ring Ring Oscillator Noise Sources + +This page discusses how to construct and use a noise source based on the +jitter from a ring oscillator. The circuit here is very simple: more +complex ring oscillator designs are possible and may give better results. + +\note The output from a ring oscillator is not generally as good as a +"true" noise source. The oscillation can easily settle into regular +patterns or sync up with other clock sources on the board. It is even +possible to "hack" a ring oscillator by injecting chosen frequencies +on the power supply rails to force the oscillation into a predictable +waveform (see this paper for an example). +It is very important that the output of this class be whitened with +\link RNGClass RNG\endlink before it is used for cryptography and that +the device is isolated from attacker-controlled sources of power. +Unless you have a very good reason to use a ring oscillator, +TransistorNoiseSource is usually a better option. + +\section ring_osc_theory Ring oscillator theory + +A ring oscillator is formed out of an odd number of inverter gates. +A 1 value on the input to the first gate will be inverted several times, +resulting in a 0 value being fed back into the first gate. In turn that +0 is inverted several times to generate another 1. And so on. +In schematic form, a 3-stage ring oscillator looks like this: + +\image html ring_oscillator_basic.png + +Because electronic circuits are not instanteous devices it can take some +time for the values to propagate down the inverter chain. The longer the +chain (5-stage, 7-stage, 9-stage, or more) the longer the propagation delay. +The important thing is that the delay is not fixed: differences in +components, ambient temperature, and other factors combine to introduce a +little bit of random jitter in the output waveform. + +For our purposes, the jitter is what we are after. The timing differences +from one rising edge to the the next gives us the random bits. + +The triangular-shaped output from the final inverter isn't very friendly to +microprocessors. So it is common to select out the jitter using a +D flip-flop and a periodic clock signal: + +\image html ring_oscillator_sampled.png + +Practical designs inside CPU's often use multiple ring oscillators XOR'ed +together: + +\image html ring_oscillator_multi.png + +Even after all that the output won't be uniformly random. It is necessary +to whiten the output with a secure hash function before using the data +for cryptography. Fortunately for us, \link RNGClass::stir() RNG.stir()\endlink +has built-in support for whitening so we just need to collect the raw bits. + +\section ring_osc_ours Our ring oscillator + +To keep things simple, we are going to use a single 5-stage ring oscillator +with a sampling clock provided by a 555 timer: + +\image html ring_oscillator.png + +The components were deliberately chosen to be commonly available. The only +special one is the 555. I recommend using the CMOS LM7555 variant (or +something equivalent) instead because it can operate at higher frequencies +than a garden variety 555. The 56 ohm resistor on the output of U2 inhibits +ringing on the clock line: we want the noise to come from U1 not U2. + +The frequency output from U1 will depend upon the properties of your 4069 +chip. A cheap bargain bin chip is actually better than a high quality chip. +Some inverter datasheets I have read proudly advertise reduced jitter +but the jitter is what we are after here. My 4069 was generating about +1.7MHz with a 5-stage ring oscillator. Other chips I tried were able +to exceed 12MHz with a 3-stage ring oscillator. Because the Arduino isn't +fast enough to sample high frequency signals, lower is actually better +for our needs. + +To further lower the frequency to something the Arduino can measure, +the 555 timer should be set to between 100kHz and 200kHz (it's ok to be +a little over 200kHz). Start with an R1 value of about 2.2K and adjust +it up or down to get the frequency into the target range. Also measure +the output frequency from U3A and try to target between 20kHz and 50kHz. +The Arduino can easily sample that without putting too much burden +on the CPU. The signal should be very jittery at this point. + +This design can of course be improved by using multiple ring oscillators +and an XOR gate, but I wanted to keep the component count low for the +basic design. + +\section ring_osc_parts Parts list + +\li 1 x 4069 CMOS Hex Inverter +\li 1 x 4013 Dual D Flip-Flop +\li 1 x LM7555 CMOS Timer +\li 1 x 10uF electrolytic capacitor (25V or better) +\li 1 x 100nF ceramic capacitor +\li 1 x 10nF ceramic capacitor +\li 1 x 1nF ceramic capacitor +\li 1 x 56 ohm resistor +\li 1 x 1.2k ohm resistor +\li 1 x 2.2k ohm resistor (or some other value for R1) + +\section ring_osc_connecting Connecting to the Arduino + +The RingOscillatorNoiseSource class uses the input capture feature of +the AVR microcontroller to measure the time between successive rising +edges. Input capture is only possible on certain pins and the output +of the circuit above needs to be connected to the correct pin: + + + + + + +
VariantArduino Pin / AVR PinTimer
Arduino UnoD8 / PB0Timer 1
Arduino LeonardoD4 / PD4Timer 1
Arduino Mega or Mega 2560D49 / PL0Timer 4
+ +If your board is not pin-compatible with one of the above, then the +source for the RingOscillatorNoiseSource class will need to be modified +to use a different pin/timer combination. Also, when the timer is in +use by this class it cannot be used for other application tasks. + +The timer is set up in free-running mode to count as fast as possible. +Whenever a rising edge occurs on the input signal, the timer's current +value is written to a special register and an interrupt occurs. +Within the interrupt service routine, the previous register value is +subtracted from the current value to determine the amount of time that +has elapsed between the two rising edges. + +The jitter is extracted from the time difference in a very simple way: +the lowest bit of the difference is the jitter and all other bits +are discarded. The interrupt service routine collects up 16 bits of +jitter over successive input pulses and then passes them to the +higher level code in the RingOscillatorNoiseSource class. + +Within the higher level code, the input bits are first debiased using the +Von Neumann method to discard the parts of the signal that don't jitter +very much: + +\li Collect two input bits. +\li If they are the same, then discard both. +\li If they are different, then choose one as the output bit and discard + the other one. + +The debiased bits are collected up into a 256-bit buffer. Once the buffer +is full it is passed to \link RNGClass::stir() RNG.stir()\endlink to be +whitened and incorporated into the global random number pool. + +And that's it! + +As noted earlier, the output from a ring oscillator is not uniform. +To deal with this, the RingOscillatorNoiseSource class takes a fairly +conservative approach. It credits a very small amount of entropy to +each full buffer, forcing the system to collect more input data +to achieve full entropy. + +My investigations showed that at 20kHz it takes about a second to generate +256 bits of good random data after Von Neumann debiasing and whitening. +Two to three seconds after startup there should be enough entropy in the +random number pool to generate encryption keys and other secret material +safely. The \link RNGClass::available() RNG.available()\endlink function +can be used to determine when there is enough entropy in the pool +for the application's needs. + +*/ diff --git a/doc/crypto.dox b/doc/crypto.dox index 8ea74699..1cd2fa74 100644 --- a/doc/crypto.dox +++ b/doc/crypto.dox @@ -31,7 +31,7 @@ \li Stream ciphers: ChaCha \li Hash algorithms: SHA1, SHA256, SHA512, SHA3_256, SHA3_512, BLAKE2s, BLAKE2b \li Public key algorithms: Curve25519 -\li Random number generation: \link RNGClass RNG\endlink, TransistorNoiseSource +\li Random number generation: \link RNGClass RNG\endlink, TransistorNoiseSource, RingOscillatorNoiseSource All cryptographic algorithms have been optimized for 8-bit Arduino platforms like the Uno. Memory usage is also reduced, particularly for SHA1, SHA256, diff --git a/doc/mainpage.dox b/doc/mainpage.dox index da34f98e..87cbf1d7 100644 --- a/doc/mainpage.dox +++ b/doc/mainpage.dox @@ -95,7 +95,7 @@ realtime clock and the LCD library to implement an alarm clock. \li Stream ciphers: ChaCha \li Hash algorithms: SHA1, SHA256, SHA512, SHA3_256, SHA3_512, BLAKE2s, BLAKE2b \li Public key algorithms: Curve25519 -\li Random number generation: \link RNGClass RNG\endlink, TransistorNoiseSource +\li Random number generation: \link RNGClass RNG\endlink, TransistorNoiseSource, RingOscillatorNoiseSource More information can be found on the \ref crypto "Cryptographic Library" page. diff --git a/libraries/Crypto/RingOscillatorNoiseSource.cpp b/libraries/Crypto/RingOscillatorNoiseSource.cpp new file mode 100644 index 00000000..2f986feb --- /dev/null +++ b/libraries/Crypto/RingOscillatorNoiseSource.cpp @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2015 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "RingOscillatorNoiseSource.h" +#include "Crypto.h" +#include "RNG.h" +#include + +/** + * \class RingOscillatorNoiseSource RingOscillatorNoiseSource.h + * \brief Processes the signal from a ring oscillator based noise source. + * + * This class processes input from a ring oscillator noise source, such as + * that described \ref crypto_rng_ring "here". + * + * \note The output from a ring oscillator is not generally as good as a + * "true" noise source. The oscillation can easily settle into regular + * patterns or sync up with other clock sources on the board. It is even + * possible to "hack" a ring oscillator by injecting chosen frequencies + * on the power supply rails to force the oscillation into a predictable + * waveform (see this paper for an example). + * It is very important that the output of this class be whitened with + * \link RNGClass RNG\endlink before it is used for cryptography and that + * the device is isolated from attacker-controlled sources of power. + * Unless you have a very good reason to use a ring oscillator, + * TransistorNoiseSource is usually a better option. + * + * The noise is read from an input capture pin on the Arduino and stirred + * into the random number pool on a regular basis. The following pins are + * used on different Arduino variants: + * + * + * + * + * + * + *
VariantArduino Pin / AVR PinTimer
Arduino UnoD8 / PB0Timer 1
Arduino LeonardoD4 / PD4Timer 1
Arduino Mega or Mega 2560D49 / PL0Timer 4
+ * + * If your board is not pin-compatible with one of the above, then the + * source for the RingOscillatorNoiseSource class will need to be modified + * to use a different pin/timer combination. Also, when the timer is in + * use by this class it cannot be used for other application tasks. + * + * The example below shows how to initialize a ring oscillator based noise + * source and use it with \link RNGClass RNG\endlink: + * + * \code + * #include + * #include + * #include + * + * // Noise source to seed the random number generator. + * RingOscillatorNoiseSource noise; + * + * void setup() { + * // Initialize the random number generator with the application tag + * // "MyApp 1.0" and load the previous seed from EEPROM address 500. + * RNG.begin("MyApp 1.0", 500); + * + * // ... + * } + * + * void loop() { + * // ... + * + * // If the noise source has accumulated new entropy, then stir it in. + * RNG.stir(noise); + * + * // Perform regular housekeeping on the random number generator. + * RNG.loop(); + * + * // ... + * } + * \endcode + * + * For more information, see the documentation for \link RNGClass RNG\endlink. + * + * \sa \link RNGClass RNG\endlink, NoiseSource, TransistorNoiseSource + */ + +// Choose the input capture timer and pin to use for this board. +#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) +// Arduino Mega or Mega 2560 - input capture on TIMER4 and D49/PL0. +#define RING_TIMER 4 +#define RING_PIN 49 +#define RING_CAPT_vect TIMER4_CAPT_vect +#define RING_ICR ICR4 +#elif defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__) +// Arduino Leonardo - input capture on Timer1 and D4/PD4. +#define RING_TIMER 1 +#define RING_PIN 4 +#define RING_CAPT_vect TIMER1_CAPT_vect +#define RING_ICR ICR1 +#else +// Assuming Arduino Uno or equivalent - input capture on TIMER1 and D8/PB0. +#define RING_TIMER 1 +#define RING_PIN 8 +#define RING_CAPT_vect TIMER1_CAPT_vect +#define RING_ICR ICR1 +#endif + +// Calibration states. +#define NOISE_NOT_CALIBRATING 0 +#define NOISE_CALIBRATING 1 + +// If there is no capture event for this many milliseconds, +// then assume that the oscillator is stopped or disconnected. +#define RING_DISCONNECT_TIME 200 + +RingOscillatorNoiseSource::RingOscillatorNoiseSource() + : calState(NOISE_CALIBRATING) + , lastSignal(millis()) +{ + // Initialize the bit collection routines. + restart(); + + // Set up the capture pin as an input with no pull-ups. + pinMode(RING_PIN, INPUT); + digitalWrite(RING_PIN, LOW); + +#if RING_TIMER == 1 + // Set up TIMER1 to perform input capture on PB8/D8. + TCCR1B = 0; // Turn off TIMER1. + TIMSK1 = 0; // Turn off TIMER1 interrupts. + TCNT1 = 0; // Zero the timer. + TCCR1A = 0; // Turn off output compare. + TCCR1B |= (1 << ICES1); // Input capture on rising edge. + TIMSK1 |= (1 << ICIE1); // Input capture interrupts enabled. + + // Start TIMER1 at the highest frequency with no prescaling. + TCCR1B |= (1 << CS10); +#elif RING_TIMER == 4 + // Set up TIMER4 to perform input capture on PL0/D49. + TCCR4B = 0; // Turn off TIMER4. + TIMSK4 = 0; // Turn off TIMER4 interrupts. + TCNT4 = 0; // Zero the timer. + TCCR4A = 0; // Turn off output compare. + TCCR4B |= (1 << ICES4); // Input capture on rising edge. + TIMSK4 |= (1 << ICIE4); // Input capture interrupts enabled. + + // Start TIMER4 at the highest frequency with no prescaling. + TCCR4B |= (1 << CS10); +#endif +} + +RingOscillatorNoiseSource::~RingOscillatorNoiseSource() +{ + // Turn off the capture timer. +#if RING_TIMER == 1 + TCCR1B = 0; +#elif RING_TIMER == 4 + TCCR4B = 0; +#endif + + // Clean up. + clean(buffer); +} + +bool RingOscillatorNoiseSource::calibrating() const +{ + return calState == NOISE_CALIBRATING; +} + +static uint16_t volatile out = 0; +static uint8_t volatile outBits = 0; + +// Interrupt service routine for the timer's input capture interrupt. +ISR(RING_CAPT_vect) +{ + // We are interested in the jitter; that is the difference in + // time between one rising edge and the next in the signal. + // Extract a single bit from the jitter and add it to the + // rolling "out" buffer for the main code to process later. + // If the buffer overflows, we discard bits and keep going. + static uint16_t prev = 0; + uint16_t next = RING_ICR; + out = (out << 1) | ((next - prev) & 1); + prev = next; + ++outBits; +} + +void RingOscillatorNoiseSource::stir() +{ + // If the "out" buffer is full, then convert the bits. Turn off + // interrupts while we read the "out" buffer and reset "outBits". + unsigned long now = millis(); + cli(); + if (outBits >= 16) { + uint16_t bits = out; + outBits = 0; + sei(); + for (uint8_t index = 0; index < 8; ++index) { + // Collect two bits of input and remove bias using the Von Neumann + // method. If both bits are the same, then discard both. + // Otherwise choose one of the bits and output that one. + // We have to do this carefully so that instruction timing does + // not reveal the value of the bit that is chosen. + if ((bits ^ (bits << 1)) & 0x8000) { + // The bits are different: add the top-most to the buffer. + if (posn < sizeof(buffer)) { + buffer[posn] = (buffer[posn] >> 1) | + (((uint8_t)(bits >> 8)) & (uint8_t)0x80); + if (++bitNum >= 8) { + ++posn; + bitNum = 0; + } + } + } + bits = bits << 2; + } + } else { + // The "out" buffer isn't full yet. Re-enable interrupts. + sei(); + + // If it has been too long since the last useful block, + // then go back to calibrating. The oscillator may be + // stopped or disconnected. + if (calState == NOISE_NOT_CALIBRATING) { + if ((now - lastSignal) >= RING_DISCONNECT_TIME) { + restart(); + calState = NOISE_CALIBRATING; + } + } + } + + // If the buffer is full, then stir it into the random number pool. + // We credit 1 bit of entropy for every 8 bits of output because + // ring oscillators aren't quite as good as a true noise source. + // We have to collect a lot more data to get something random enough. + if (posn >= sizeof(buffer)) { + output(buffer, posn, posn); + restart(); + calState = NOISE_NOT_CALIBRATING; + lastSignal = now; + } +} + +void RingOscillatorNoiseSource::restart() +{ + clean(buffer); + prevBit = 0; + posn = 0; + bitNum = 0; +} diff --git a/libraries/Crypto/RingOscillatorNoiseSource.h b/libraries/Crypto/RingOscillatorNoiseSource.h new file mode 100644 index 00000000..33a6d115 --- /dev/null +++ b/libraries/Crypto/RingOscillatorNoiseSource.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2015 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef CRYPTO_RINGOSCILLATORNOISESOURCE_H +#define CRYPTO_RINGOSCILLATORNOISESOURCE_H + +#include +#include "NoiseSource.h" + +class RingOscillatorNoiseSource : public NoiseSource +{ +public: + RingOscillatorNoiseSource(); + virtual ~RingOscillatorNoiseSource(); + + bool calibrating() const; + + void stir(); + +private: + uint8_t prevBit; + uint8_t posn; + uint8_t bitNum; + uint8_t calState; + uint8_t buffer[32]; + unsigned long lastSignal; + + void restart(); +}; + +#endif diff --git a/libraries/Crypto/TransistorNoiseSource.cpp b/libraries/Crypto/TransistorNoiseSource.cpp index 9ce6c9cf..c8048184 100644 --- a/libraries/Crypto/TransistorNoiseSource.cpp +++ b/libraries/Crypto/TransistorNoiseSource.cpp @@ -72,7 +72,7 @@ * } * \endcode * - * \sa \link RNGClass RNG\endlink, NoiseSource + * \sa \link RNGClass RNG\endlink, NoiseSource, RingOscillatorNoiseSource */ /* diff --git a/libraries/Crypto/examples/TestRNG/TestRNG.ino b/libraries/Crypto/examples/TestRNG/TestRNG.ino index d0df122e..32ab5c2a 100644 --- a/libraries/Crypto/examples/TestRNG/TestRNG.ino +++ b/libraries/Crypto/examples/TestRNG/TestRNG.ino @@ -4,6 +4,7 @@ #include #include #include +#include // Change "MyApp 1.0" to some other tag for your application // so that different applications will generate different results @@ -15,6 +16,7 @@ // Noise source to seed the random number generator. TransistorNoiseSource noise(A1); +//RingOscillatorNoiseSource noise; bool calibrating = false; byte data[32]; diff --git a/libraries/Crypto/examples/TestRingOscillatorNoise/TestRingOscillatorNoise.ino b/libraries/Crypto/examples/TestRingOscillatorNoise/TestRingOscillatorNoise.ino new file mode 100644 index 00000000..056e9fe5 --- /dev/null +++ b/libraries/Crypto/examples/TestRingOscillatorNoise/TestRingOscillatorNoise.ino @@ -0,0 +1,44 @@ + +// This example dumps the raw data from a ring oscillator noise source +// without any of the whitening normally performed by the RNG class. + +#include +#include + +char const hexchars[] = "0123456789ABCDEF"; + +class RawNoiseSource : public RingOscillatorNoiseSource +{ +public: + RawNoiseSource() : RingOscillatorNoiseSource() {} + +protected: + void output(const uint8_t *data, size_t len, unsigned int credit) + { + for (size_t posn = 0; posn < len; ++posn) { + uint8_t value = data[posn]; + Serial.print(hexchars[(value >> 4) & 0x0F]); + Serial.print(hexchars[value & 0x0F]); + } + Serial.println(); + } +}; + +RawNoiseSource noise; +bool calibrating = true; + +void setup() { + Serial.begin(9600); + Serial.println(); + Serial.println("calibrating"); +} + +void loop() { + noise.stir(); + bool nowCalibrating = noise.calibrating(); + if (nowCalibrating != calibrating) { + calibrating = nowCalibrating; + if (calibrating) + Serial.println("calibrating"); + } +} diff --git a/libraries/Crypto/examples/TestNoise/TestNoise.ino b/libraries/Crypto/examples/TestTransistorNoise/TestTransistorNoise.ino similarity index 100% rename from libraries/Crypto/examples/TestNoise/TestNoise.ino rename to libraries/Crypto/examples/TestTransistorNoise/TestTransistorNoise.ino diff --git a/libraries/Crypto/keywords.txt b/libraries/Crypto/keywords.txt index f61b941b..db77a8ac 100644 --- a/libraries/Crypto/keywords.txt +++ b/libraries/Crypto/keywords.txt @@ -17,6 +17,7 @@ CFB KEYWORD1 CTR KEYWORD1 OFB KEYWORD1 +RingOscillatorNoiseSource KEYWORD1 RNG KEYWORD1 TransistorNoiseSource KEYWORD1 diff --git a/libraries/Crypto/ring_oscillator.fig b/libraries/Crypto/ring_oscillator.fig new file mode 100644 index 00000000..20cb6b2d --- /dev/null +++ b/libraries/Crypto/ring_oscillator.fig @@ -0,0 +1,441 @@ +#FIG 3.2 Produced by xfig version 3.2.5c +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 9135 2025 9315 2295 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 9210 2295 9240 2295 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 9175 2250 9275 2250 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 9135 2205 9315 2205 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 9225 2025 9225 2205 +-6 +6 10485 2700 10665 2970 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10560 2970 10590 2970 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10525 2925 10625 2925 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10485 2880 10665 2880 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10575 2700 10575 2880 +-6 +6 8820 1530 8910 1620 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 8865 1575 30 30 8865 1575 8865 1605 +-6 +6 9180 1980 9270 2070 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 9225 2025 30 30 9225 2025 9225 2055 +-6 +6 7785 1125 8865 1755 +6 7785 1395 8865 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 8550 1575 45 45 8550 1575 8550 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 8145 1395 8145 1755 8505 1575 8145 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 8145 1575 7785 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 8595 1575 8865 1575 +4 0 0 0 -1 16 6 0.0000 4 75 120 7875 1530 11\001 +4 0 0 0 -1 16 6 0.0000 4 75 120 8685 1530 10\001 +-6 +4 0 0 50 -1 0 12 0.0000 4 135 360 8190 1260 U1E\001 +-6 +6 6705 1125 7785 1755 +6 6705 1395 7785 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 7470 1575 45 45 7470 1575 7470 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 7065 1395 7065 1755 7425 1575 7065 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 7065 1575 6705 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 7515 1575 7785 1575 +4 0 0 0 -1 16 6 0.0000 4 75 120 6795 1530 13\001 +4 0 0 0 -1 16 6 0.0000 4 75 120 7605 1530 12\001 +-6 +4 0 0 50 -1 0 12 0.0000 4 135 345 7110 1260 U1F\001 +-6 +6 3375 630 6705 1980 +6 3465 1395 4545 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 4230 1575 45 45 4230 1575 4230 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 3825 1395 3825 1755 4185 1575 3825 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 3825 1575 3465 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4275 1575 4545 1575 +4 0 0 0 -1 16 6 0.0000 4 75 60 3600 1530 1\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 4365 1530 2\001 +-6 +6 4545 1395 5625 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 5310 1575 45 45 5310 1575 5310 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 4905 1395 4905 1755 5265 1575 4905 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4905 1575 4545 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5355 1575 5625 1575 +4 0 0 0 -1 16 6 0.0000 4 75 60 4680 1530 3\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 5445 1530 4\001 +-6 +6 5625 1395 6705 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 6390 1575 45 45 6390 1575 6390 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 5985 1395 5985 1755 6345 1575 5985 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5985 1575 5625 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6435 1575 6705 1575 +4 0 0 0 -1 16 6 0.0000 4 75 60 5760 1530 5\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 6525 1530 6\001 +-6 +6 3870 1710 4050 1980 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3945 1980 3975 1980 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3910 1935 4010 1935 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3870 1890 4050 1890 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3960 1710 3960 1890 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3960 1485 3960 900 +4 0 0 10 -1 16 6 0.0000 4 75 60 4050 1800 7\001 +4 0 0 7 -1 16 6 0.0000 4 75 120 4005 1305 14\001 +4 0 0 50 -1 0 12 0.0000 4 135 240 3870 765 5V\001 +4 0 0 50 -1 0 12 0.0000 4 135 375 3375 1260 U1A\001 +4 0 0 50 -1 0 12 0.0000 4 135 375 4950 1260 U1B\001 +4 0 0 50 -1 0 12 0.0000 4 135 375 6030 1260 U1C\001 +-6 +6 1215 1575 1440 1890 +5 1 0 1 0 -1 0 0 -1 0.000 1 0 0 0 1350.000 1900.000 1260 1780 1350 1750 1440 1780 +2 1 0 1 0 -1 0 0 -1 0.000 0 1 -1 0 0 2 + 1350 1750 1350 1890 +2 1 0 1 0 -1 0 0 -1 0.000 0 1 -1 0 0 2 + 1260 1710 1440 1710 +2 1 0 1 0 -1 0 0 -1 0.000 0 1 -1 0 0 2 + 1350 1710 1350 1575 +2 1 0 1 0 -1 0 0 -1 0.000 0 1 -1 0 0 2 + 1286 1604 1286 1674 +2 1 0 1 0 -1 0 0 -1 0.000 0 1 -1 0 0 2 + 1256 1639 1316 1639 +-6 +6 1935 1575 2115 1890 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 2025 1710 2025 1575 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 2025 1755 2025 1890 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 1935 1710 2115 1710 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 1935 1755 2115 1755 +-6 +6 1620 2070 1800 2340 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 1695 2340 1725 2340 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 1660 2295 1760 2295 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 1620 2250 1800 2250 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 1710 2070 1710 2250 +-6 +6 1665 2025 1755 2115 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 1710 2070 30 30 1710 2070 1710 2100 +-6 +6 1665 1305 1755 1395 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 1710 1350 30 30 1710 1350 1710 1380 +-6 +6 3555 3690 3645 4140 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 4045 3600 4140 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7 + 3600 3780 3560 3807 3640 3861 3560 3915 3640 3969 3560 4023 + 3600 4050 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 3690 3600 3785 +-6 +6 3555 4365 3645 4815 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 4720 3600 4815 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7 + 3600 4455 3560 4482 3640 4536 3560 4590 3640 4644 3560 4698 + 3600 4725 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 4365 3600 4460 +-6 +6 3510 5175 3690 5490 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 5310 3600 5175 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 5355 3600 5490 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3510 5310 3690 5310 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3510 5355 3690 5355 +-6 +6 3555 3330 3645 3420 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 3375 30 30 3600 3375 3600 3405 +-6 +6 3555 4230 3645 4320 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 4275 30 30 3600 4275 3600 4305 +-6 +6 3825 4905 3915 4995 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3870 4950 30 30 3870 4950 3870 4980 +-6 +6 3555 4905 3645 4995 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 4950 30 30 3600 4950 3600 4980 +-6 +6 4545 3330 4635 3420 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4590 3375 30 30 4590 3375 4590 3405 +-6 +6 10035 3330 12600 4905 +5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 10575.000 4050.000 10530 4050 10575 4005 10620 4050 +6 10485 4635 10665 4905 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10560 4905 10590 4905 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10525 4860 10625 4860 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10485 4815 10665 4815 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 10575 4635 10575 4815 +-6 +6 10530 3780 10620 3870 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 10575 3825 30 30 10575 3825 10575 3855 +-6 +6 10530 4230 10620 4320 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 10575 4275 30 30 10575 4275 10575 4305 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 11970 4275 45 45 11970 4275 12015 4275 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 11025 3375 11925 3375 11925 4500 11025 4500 11025 3375 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 11025 4185 11115 4275 11025 4365 +2 1 0 1 0 0 20 0 -1 0.000 0 0 0 0 0 2 + 11865 4230 11790 4230 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 11025 3600 10575 3600 10575 4635 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 11025 3825 10575 3825 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 11025 4275 10575 4275 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 11925 3600 12285 3600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 12015 4275 12285 4275 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 11025 4050 10620 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3 + 1 1 1.00 60.00 120.00 + 10530 4050 10125 4050 10125 3600 +4 0 0 20 -1 16 6 0.0000 4 75 90 11790 3645 Q\001 +4 0 0 20 -1 16 6 0.0000 4 75 90 11790 4320 Q\001 +4 0 0 20 -1 16 6 0.0000 4 75 360 11070 4095 RESET\001 +4 0 0 20 -1 16 6 0.0000 4 75 210 11070 3870 SET\001 +4 0 0 20 -1 16 6 0.0000 4 75 75 11070 3645 D\001 +4 0 0 20 -1 16 6 0.0000 4 75 210 11160 4320 CLK\001 +4 0 0 0 -1 16 6 0.0000 4 75 120 11970 3555 13\001 +4 0 0 0 -1 16 6 0.0000 4 75 120 11970 4185 12\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 10935 3555 9\001 +4 0 0 0 -1 16 6 0.0000 4 75 120 10890 4230 11\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 10935 3780 8\001 +4 0 0 0 -1 16 6 0.0000 4 75 120 10890 4005 10\001 +4 0 0 50 -1 0 12 0.0000 4 135 240 10035 3465 5V\001 +4 0 0 50 -1 0 12 0.0000 4 135 375 12195 4005 U3B\001 +-6 +6 4500 6030 4680 6300 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4575 6300 4605 6300 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4540 6255 4640 6255 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4500 6210 4680 6210 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4590 6030 4590 6210 +-6 +6 4995 6030 5175 6300 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 5070 6300 5100 6300 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 5035 6255 5135 6255 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4995 6210 5175 6210 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 5085 6030 5085 6210 +-6 +6 4995 5715 5175 6030 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 5085 5850 5085 5715 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 5085 5895 5085 6030 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4995 5850 5175 5850 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 4995 5895 5175 5895 +-6 +6 3510 5490 3690 5760 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3585 5760 3615 5760 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3550 5715 3650 5715 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3510 5670 3690 5670 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 3600 5490 3600 5670 +-6 +6 7695 2700 8865 3285 +6 7785 2700 8865 3060 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 8550 2880 45 45 8550 2880 8550 2925 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 8145 2700 8145 3060 8505 2880 8145 2700 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 8145 2880 7785 2880 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 8595 2880 8865 2880 +4 0 0 0 -1 16 6 0.0000 4 75 60 7920 2835 9\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 8685 2835 8\001 +-6 +6 7695 2880 7875 3150 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 7770 3150 7800 3150 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 7735 3105 7835 3105 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 7695 3060 7875 3060 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 7785 2880 7785 3060 +-6 +4 0 0 50 -1 0 12 0.0000 4 135 375 8190 3285 U1D\001 +-6 +6 7155 4590 7605 4680 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 7250 4635 7155 4635 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7 + 7515 4635 7488 4595 7434 4675 7380 4595 7326 4675 7272 4595 + 7245 4635 +2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2 + 7605 4635 7510 4635 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 11070 2250 45 45 11070 2250 11115 2250 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 8865 1575 10125 1575 +2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 2 + 11385 2250 11115 2250 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 10125 1800 9225 1800 9225 2115 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 10125 2025 9225 2025 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 10575 1350 10575 900 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 10575 2475 10575 2700 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 10125 1350 11025 1350 11025 2475 10125 2475 10125 1350 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 10125 2160 10215 2250 10125 2340 +2 1 0 1 0 0 20 0 -1 0.000 0 0 0 0 0 2 + 10965 2205 10890 2205 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 8865 1575 8865 2250 3465 2250 3465 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1350 1620 1350 1350 2025 1350 2025 1620 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1350 1890 1350 2070 2025 2070 2025 1845 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1710 1350 1710 900 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4 + 1 1 1.00 60.00 120.00 + 5085 3825 5085 3375 3600 3375 3600 2925 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3600 3735 3600 3330 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3600 4410 3600 4140 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4275 4275 3600 4275 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4275 4950 3600 4950 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 4275 4635 3870 4635 3870 4950 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3600 4725 3600 5220 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4590 5400 4590 6075 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5085 5760 5085 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4275 3825 5400 3825 5400 5400 4275 5400 4275 3825 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4590 3825 4590 3375 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 11025 1575 11925 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 10125 2250 9675 2250 9675 4635 7605 4635 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7155 4635 5400 4635 +4 0 0 50 -1 0 12 0.0000 4 135 240 10485 765 5V\001 +4 0 0 20 -1 16 6 0.0000 4 75 90 10890 1620 Q\001 +4 0 0 20 -1 16 6 0.0000 4 75 90 10890 2295 Q\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 11115 1530 1\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 11115 2160 2\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 9990 1530 5\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 9990 2205 3\001 +4 0 0 20 -1 16 6 0.0000 4 75 360 10170 2070 RESET\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 9990 1755 6\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 9990 1980 4\001 +4 0 0 20 -1 16 6 0.0000 4 75 210 10170 1845 SET\001 +4 0 0 20 -1 16 6 0.0000 4 75 75 10170 1620 D\001 +4 0 0 20 -1 16 6 0.0000 4 75 210 10260 2295 CLK\001 +4 0 0 10 -1 16 6 0.0000 4 75 60 10665 2610 7\001 +4 0 0 7 -1 16 6 0.0000 4 75 120 10620 1260 14\001 +4 0 0 50 -1 0 12 0.0000 4 135 375 11295 1980 U3A\001 +4 0 0 7 -1 16 6 0.0000 4 75 195 10485 1485 Vdd\001 +4 0 0 10 -1 16 6 0.0000 4 75 195 10485 2430 Vss\001 +4 0 0 50 -1 0 12 0.0000 4 135 240 1620 855 5V\001 +4 0 0 50 -1 0 12 0.0000 4 135 525 2205 1800 100nF\001 +4 0 0 50 -1 0 12 0.0000 4 135 420 720 1800 10uF\001 +4 0 0 50 -1 0 12 0.0000 4 135 2070 5130 2655 4069 CMOS Hex Inverter\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 4635 3780 4\001 +4 0 0 10 -1 16 6 0.0000 4 75 60 5130 3780 8\001 +4 0 0 50 -1 0 12 0.0000 4 135 240 4725 4635 U2\001 +4 0 0 50 -1 0 12 0.0000 4 135 240 3510 2790 5V\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 4140 4185 7\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 4140 4590 6\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 4140 4905 2\001 +4 0 0 7 -1 16 6 0.0000 4 75 60 4635 5535 1\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 5130 5535 5\001 +4 0 0 50 -1 0 12 0.0000 4 135 1845 5670 5130 LM7555 CMOS Timer\001 +4 0 0 50 -1 0 12 0.0000 4 180 1845 11025 2970 4013 Dual D Flip-Flop\001 +4 0 0 50 -1 0 12 0.0000 4 135 420 5265 5940 10nF\001 +4 0 0 20 -1 16 6 0.0000 4 75 180 4365 4320 DIS\001 +4 0 0 20 -1 16 6 0.0000 4 75 210 4365 4680 THR\001 +4 0 0 20 -1 16 6 0.0000 4 75 255 4365 4995 TRIG\001 +4 0 0 20 -1 16 6 0.0000 4 75 270 4950 5310 CTRL\001 +4 0 0 20 -1 16 6 0.0000 4 75 240 4455 5310 GND\001 +4 0 0 20 -1 16 6 0.0000 4 75 360 4410 4005 RESET\001 +4 0 0 20 -1 16 6 0.0000 4 75 195 4995 4005 Vcc\001 +4 0 0 0 -1 16 6 0.0000 4 75 60 5490 4545 3\001 +4 0 0 20 -1 16 6 0.0000 4 75 225 5130 4680 OUT\001 +4 0 0 50 -1 0 12 0.0000 4 180 570 12105 1620 Output\001 +4 0 0 50 -1 0 12 0.0000 4 135 315 3105 5400 1nF\001 +4 0 0 50 -1 0 12 0.0000 4 135 390 3060 4680 1.2K\001 +4 0 0 50 -1 0 12 0.0000 4 135 240 3150 4005 R1\001 +4 0 0 50 -1 0 12 0.0000 4 135 1890 945 3870 Choose R1 for between\001 +4 0 0 50 -1 0 12 0.0000 4 135 345 7200 4500 56R\001 +4 0 0 50 -1 0 12 0.0000 4 180 1980 900 4140 100 and 200 kHz output\001 +4 0 0 50 -1 0 12 0.0000 4 135 660 1485 4410 from U2\001 +4 0 0 50 -1 0 12 0.0000 4 180 3315 8280 5895 Place U1 and U2 on opposite sides of the\001 +4 0 0 50 -1 0 12 0.0000 4 180 3540 8280 6120 PCB layout to avoid the regular signal from\001 +# or +4 0 0 50 -1 0 12 0.0000 4 180 3465 8280 6345 U2 affecting the ring oscillator's behaviour\001 diff --git a/libraries/Crypto/ring_oscillator.png b/libraries/Crypto/ring_oscillator.png new file mode 100644 index 0000000000000000000000000000000000000000..c0939bc3f768463026d937b305a72fa01c2e9d3c GIT binary patch literal 28361 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 SD`Xcnv6J^CL`%FjLk literal 0 HcmV?d00001 diff --git a/libraries/Crypto/ring_oscillator_basic.fig b/libraries/Crypto/ring_oscillator_basic.fig new file mode 100644 index 00000000..f3fdc41e --- /dev/null +++ b/libraries/Crypto/ring_oscillator_basic.fig @@ -0,0 +1,39 @@ +#FIG 3.2 Produced by xfig version 3.2.5c +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 7155 1710 7245 1800 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 7200 1755 30 30 7200 1755 7200 1785 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 4590 1755 45 45 4590 1755 4635 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 5715 1755 45 45 5715 1755 5760 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 6840 1755 45 45 6840 1755 6885 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4185 1755 3825 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4635 1755 4950 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 4185 1575 4185 1935 4545 1755 4185 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5310 1755 4950 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5760 1755 6075 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 5310 1575 5310 1935 5670 1755 5310 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6435 1755 6075 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6885 1755 7200 1755 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 6435 1575 6435 1935 6795 1755 6435 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7200 1755 7875 1755 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 7200 1755 7200 1350 3825 1350 3825 1755 +4 0 0 50 -1 0 12 0.0000 4 180 570 8010 1800 Output\001 diff --git a/libraries/Crypto/ring_oscillator_basic.png b/libraries/Crypto/ring_oscillator_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..896fe0ac23fb94d114265d17a4c494ee7151a03f GIT binary patch literal 4142 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 literal 0 HcmV?d00001 diff --git a/libraries/Crypto/ring_oscillator_multi.fig b/libraries/Crypto/ring_oscillator_multi.fig new file mode 100644 index 00000000..ecb2425c --- /dev/null +++ b/libraries/Crypto/ring_oscillator_multi.fig @@ -0,0 +1,146 @@ +#FIG 3.2 Produced by xfig version 3.2.5c +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +5 1 0 1 0 7 0 0 -1 0.000 0 0 0 0 5671.500 1807.500 6221 1515 6294 1808 6221 2100 +5 1 0 1 0 7 0 0 -1 0.000 0 0 0 0 5532.919 1807.500 6074 1515 6148 1808 6074 2100 +6 1125 1170 4995 4050 +6 1125 1170 4995 1755 +6 4185 1395 4635 1755 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 4590 1575 45 45 4590 1575 4635 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 4185 1395 4185 1755 4545 1575 4185 1395 +-6 +6 4905 1530 4995 1620 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4950 1575 30 30 4950 1575 4950 1605 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 1890 1575 45 45 1890 1575 1935 1575 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 3015 1575 45 45 3015 1575 3060 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1485 1575 1125 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1935 1575 2250 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 1485 1395 1485 1755 1845 1575 1485 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 2610 1575 2250 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 3060 1575 3375 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 2610 1395 2610 1755 2970 1575 2610 1395 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4185 1575 3825 1575 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3375 1575 3825 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4635 1575 4950 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 1575 4950 1170 1125 1170 1125 1575 +-6 +6 1125 2070 4995 2655 +6 4185 2295 4635 2655 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 4590 2475 45 45 4590 2475 4635 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 4185 2295 4185 2655 4545 2475 4185 2295 +-6 +6 4905 2430 4995 2520 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4950 2475 30 30 4950 2475 4950 2505 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 1890 2475 45 45 1890 2475 1935 2475 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 3015 2475 45 45 3015 2475 3060 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1485 2475 1125 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1935 2475 2250 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 1485 2295 1485 2655 1845 2475 1485 2295 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 2610 2475 2250 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 3060 2475 3375 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 2610 2295 2610 2655 2970 2475 2610 2295 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4185 2475 3825 2475 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3375 2475 3825 2475 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4635 2475 4950 2475 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 2475 4950 2070 1125 2070 1125 2475 +-6 +6 1125 3465 4995 4050 +6 4185 3690 4635 4050 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 4590 3870 45 45 4590 3870 4635 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 4185 3690 4185 4050 4545 3870 4185 3690 +-6 +6 4905 3825 4995 3915 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4950 3870 30 30 4950 3870 4950 3900 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 1890 3870 45 45 1890 3870 1935 3870 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 3015 3870 45 45 3015 3870 3060 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1485 3870 1125 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1935 3870 2250 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 1485 3690 1485 4050 1845 3870 1485 3690 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 2610 3870 2250 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 3060 3870 3375 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 2610 3690 2610 4050 2970 3870 2610 3690 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4185 3870 3825 3870 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3375 3870 3825 3870 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4635 3870 4950 3870 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 3870 4950 3465 1125 3465 1125 3870 +-6 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 2880 2700 2880 3330 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7875 1575 8775 1575 8775 2700 7875 2700 7875 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 7875 2385 7965 2475 7875 2565 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 8775 1800 9450 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 3 + 8 1 1.00 60.00 120.00 + 6975 3150 6975 2475 7875 2475 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6210 1575 4905 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 3870 5670 3870 5670 2025 5805 2025 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6951 1808 7875 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6221 2027 5709 2027 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6221 1515 6586 1515 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6586 2100 6221 2100 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 2475 5310 2475 5310 1800 6255 1800 +3 2 0 1 0 7 0 0 -1 0.000 0 0 0 3 + 6951 1808 6805 1588 6586 1515 + 0.000 -1.000 0.000 +3 2 0 1 0 7 0 0 -1 0.000 0 0 0 3 + 6951 1808 6805 2027 6586 2100 + 0.000 -1.000 0.000 +4 0 0 50 -1 0 12 0.0000 4 135 135 7920 1845 D\001 +4 0 0 50 -1 0 12 0.0000 4 165 135 8595 1845 Q\001 +4 0 0 50 -1 0 12 0.0000 4 135 390 8010 2520 CLK\001 +4 0 0 50 -1 0 12 0.0000 4 180 570 9540 1845 Output\001 +4 0 0 50 -1 0 12 0.0000 4 180 1320 6435 3375 Sampling Clock\001 diff --git a/libraries/Crypto/ring_oscillator_multi.png b/libraries/Crypto/ring_oscillator_multi.png new file mode 100644 index 0000000000000000000000000000000000000000..d8324d6f880c27c8a55383ccedda66a0d16880f5 GIT binary patch literal 9553 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 T=voDzi~*YJx_3*|o`n1lZg>PV literal 0 HcmV?d00001 diff --git a/libraries/Crypto/ring_oscillator_sampled.fig b/libraries/Crypto/ring_oscillator_sampled.fig new file mode 100644 index 00000000..8fa85d31 --- /dev/null +++ b/libraries/Crypto/ring_oscillator_sampled.fig @@ -0,0 +1,54 @@ +#FIG 3.2 Produced by xfig version 3.2.5c +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 3825 1395 7875 1980 +6 7155 1755 7245 1845 +1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 7200 1800 30 30 7200 1800 7200 1830 +-6 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 4590 1800 45 45 4590 1800 4635 1800 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 5715 1800 45 45 5715 1800 5760 1800 +1 3 0 1 0 7 0 0 -1 0.000 1 0.0000 6840 1800 45 45 6840 1800 6885 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4185 1800 3825 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4635 1800 4950 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 4185 1620 4185 1980 4545 1800 4185 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5310 1800 4950 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5760 1800 6075 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 5310 1620 5310 1980 5670 1800 5310 1620 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6435 1800 6075 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6885 1800 7200 1800 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 4 + 6435 1620 6435 1980 6795 1800 6435 1620 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 7200 1800 7200 1395 3825 1395 3825 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7200 1800 7875 1800 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7875 1575 8775 1575 8775 2700 7875 2700 7875 1575 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 7875 2385 7965 2475 7875 2565 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 8775 1800 9450 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 3 + 8 1 1.00 60.00 120.00 + 6975 3150 6975 2475 7875 2475 +4 0 0 50 -1 0 12 0.0000 4 135 135 7920 1845 D\001 +4 0 0 50 -1 0 12 0.0000 4 165 135 8595 1845 Q\001 +4 0 0 50 -1 0 12 0.0000 4 135 390 8010 2520 CLK\001 +4 0 0 50 -1 0 12 0.0000 4 180 570 9540 1845 Output\001 +4 0 0 50 -1 0 12 0.0000 4 180 1320 6435 3375 Sampling Clock\001 diff --git a/libraries/Crypto/ring_oscillator_sampled.png b/libraries/Crypto/ring_oscillator_sampled.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd3d0711bc15bb5a1dc929d0477935778d5bf9b GIT binary patch literal 6247 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 GBL4%UeG<$7 literal 0 HcmV?d00001