version 0.00 release/0.00
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 14 Jul 2011 03:51:08 +0000 (12:51 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 14 Jul 2011 04:10:24 +0000 (13:10 +0900)
16 files changed:
README [new file with mode: 0644]
boards/OLIMEX_STM32_H103/board.c [new file with mode: 0644]
boards/OLIMEX_STM32_H103/board.h [new file with mode: 0644]
boards/OLIMEX_STM32_H103/mcuconf.h [new file with mode: 0644]
boards/STBEE_MINI/board.h
boards/STBEE_MINI/mcuconf.h
boards/common/board-common.c
src/.gdbinit [new file with mode: 0644]
src/configure
src/random.c
test-results.txt [deleted file]
test-results/nist-sts/finalAnalysisReport.txt [new file with mode: 0644]
test-results/nist-sts/freq.txt [new file with mode: 0644]
test-results/nist-sts/nist-sts.txt [new file with mode: 0644]
test-results/rngtest.txt [new file with mode: 0644]
tool/hub_ctrl.py [new file with mode: 0755]

diff --git a/README b/README
new file mode 100644 (file)
index 0000000..762076d
--- /dev/null
+++ b/README
@@ -0,0 +1,240 @@
+NeuG - a random number generator implementation (for STM32F103)
+
+                                                          Version 0.00
+                                                            2011-07-14
+                                                          Niibe Yutaka
+                                     Free Software Initiative of Japan
+
+What's NeuG?
+============
+
+NeuG is a set of routines of random number generator (RNG) which is
+based on physical noise.  It supports STM32F103.  It can be stand
+alone USB RNG device (with main routine), too.
+
+The name comes from Japanized English word "noidgy" (from English word
+"noisy"), where many Japanese (including me) don't distinguish
+pronunciations of "gee" and "zee".  NeuG includes my important letters
+of "g", "n", and "u", and the word "neu" (German spelling of "new").
+
+My primary intention was to incorporate NeuG routines into Gnuk for
+random number generation, but the stand alone version could be useful
+too.
+
+
+Release notes
+=============
+
+This is the first release of NeuG, which is experimental enough.  You
+can enjoy NeuG device, but I don't know how it is good yet.  Note that
+you need the snapshot of ChibiOS/RT (from trunk).  This means that it
+is covered by GNU GPL.  No "linking exception" option is available for
+the snapshot.
+
+
+FAQ
+===
+
+Q0: How NeuG device is good?
+A0: I don't know yet.  It is under evaluation now.
+A0-dash: For better entropy device, you can get EntropyKey.
+         See http://www.entropykey.co.uk/
+A0-double-dash: STM32F2xx has built-in TRNG, it would be better for you.
+
+Q1: How fast is NeuG device?
+A1: It's something around 24 Ki-byte/second.
+
+Q2: Should we check condition of noise sources?
+A2: Yes, we should.  It's not implemented yet, and I don't have an
+    good idea how to implement.  Please let me know your idea.
+
+
+Targets
+=======
+
+STBee Mini and Olimex STM32-H103 is supported.
+
+
+Souce code
+==========
+
+NeuG source code is under src/ directory.
+
+
+License
+=======
+
+It is distributed under GNU General Public Licence version 3 or later
+(GPLv3+).  Please see src/COPYING.
+
+
+External source code
+====================
+
+To build NeuG device, we need external source code.
+
+* chibios/  -- ChibiOS/RT 2.3.x snapshot
+
+  Please get it from http://chibios.sourceforge.net/
+  We use ChibiOS/RT as the kernel for NeuG device.
+
+
+How to compile
+==============
+
+You need GNU toolchain and newlib for 'arm-none-eabi' target.
+
+See http://github.com/uwehermann/summon-arm-toolchain/ for preparation
+of GNU Toolchain for 'arm-none-eabi' target.
+
+Change directory to `src':
+
+  $ cd neug-VERSION/src
+
+Then, run `configure':
+
+  $ ./configure
+
+Type:
+
+  $ make
+
+Then, we will have "neug.elf".
+
+
+How to install
+==============
+
+STBee Mini
+----------
+
+Reset the board with "USER" switch pushed.  Type following to write
+to flash:
+
+  # cd ../tool
+  # ./dfuse.py ../src/neug.hex
+
+Then, reset the board.
+
+
+Olimex STM32-H103 board
+-----------------------
+
+If you are using Olimex JTAG-Tiny, type following to invoke OpenOCD:
+
+  $ openocd -f interface/olimex-jtag-tiny.cfg -f board/olimex_stm32_h103.cfg
+
+Then, with another terminal, type following to write "gnuk.elf" to Flash ROM:
+
+  $ telnet localhost 4444
+  > reset halt
+  > flash write_image erase neug.elf
+  > reset
+  > exit
+  $ 
+
+
+
+Use of NeuG device
+==================
+
+It is USB CDC ACM device.  On GNU/Linux, it can be /dev/ttyACM0 or like.
+Before using /dev/ttyACM0, you need to configure its TTY discipline.
+
+  $ stty -F /dev/ttyACM0 -echo raw
+
+Then, you can use output of /dev/ttyACM0.
+
+
+
+Structure of the NeuG
+=====================
+
+NeuG consists of two RNG, one is the RNG based on physical noise, and
+another is "Mostly Pseudo" RNG.  Outputs of RNGs are exclusive or-ed
+to generate final output.  Here is a figure of the circuit.
+
+
+                        Entropy Pool (16-byte)
+                       +----------------+
+                   8   | 8 parallel     |   8  ||<-- [ Vref ]
+                 +-/-- |  CRC-16        |<--/--||
+                 |     | shift registers|      ||<-- [ Temperature Sensor ]
+                 |     +----------------+
+               =====    Physical-based RNG
+                 |
+                 / 32
+                 |
+  Random     32  v      32 +--------+        1
+  Number  <--/--[XOR]<--/--| TinyMT |<-------/------ SysTick
+  Output                   +--------+
+                         Mostly Pseudo RNG
+
+
+STM32F103 has built-in Vref (voltage reference) and Temperature Sensor
+which are connected to A/D converter of 12-bit resolution.  NeuG uses
+LSBs of A/D converter's outputs and A/D converter's interrupt timings
+as entropy sources.
+
+By four samplings of two channels, we can get 8-bit, as we can get two
+bits (LSB of Vref and LSB of Temperature Sensor) from one sampling.
+We put this 8-bit noise to entropy pool.  Entropy pool consist of
+16-byte buffer, which is 8 parallel CRC-16 shift registers.  The noise
+source is not "white", but it can be used as RNG with this CRC-16
+filter.  An experiment shows that raw noise source of LSBs has more
+than 6 bit/byte entropy.  So, we put 7-byte to get 4-byte (32-bit)
+output.
+
+I don't know how stable the noise source is.
+
+So, NeuG comes with second RNG.  It is pseudo RNG, shaken by interrupt
+timings.  It is not pure pseudo RNG, where sequence is deterministic.
+We use TinyMT for pseudo RNG.  Please see following page for TinyMT:
+
+   "Tiny Mersenne Twister (TinyMT): A small-sized variant of Mersenne Twister"
+   by Mutsuo Saito and Makoto Matsumoto
+     http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/
+
+
+Test results
+============
+
+See files under the directory test-results, for test result of
+"rngtest" in rng-tools, and NIST STS 2.1.1.  Currently, I am testing
+NeuG device by dieharder, but it seems that it takes a month or so (8
+days passed, it's running RGB Bit distribution test ntup=9).
+
+
+Read-only Git Repository
+========================
+
+You can browse at http://www.gniibe.org/gitweb?p=neug.git;a=summary
+
+You can get it by:
+
+  $ git clone git://www.gniibe.org/neug.git/
+
+or
+
+  $ git clone http://www.gniibe.org/git/neug.git/
+
+
+I put ChibiOS/RT as a submodule of Git.  Please do this:
+
+  $ git submodule init
+  $ git submodule update
+
+
+
+Information on the Web
+======================
+
+Not yet.
+
+
+Your Contributions
+==================
+
+FSIJ welcomes your contributions.  Please assign your copyright
+to FSIJ (if possible).
+-- 
diff --git a/boards/OLIMEX_STM32_H103/board.c b/boards/OLIMEX_STM32_H103/board.c
new file mode 100644 (file)
index 0000000..d675d95
--- /dev/null
@@ -0,0 +1,28 @@
+#include "config.h"
+#include "ch.h"
+#include "hal.h"
+
+/*
+ * Board-specific initialization code.
+ */
+void boardInit(void)
+{
+}
+
+void
+USB_Cable_Config (int NewState)
+{
+  if (NewState != DISABLE)
+    palClearPad (IOPORT3, GPIOC_DISC);
+  else
+    palSetPad (IOPORT3, GPIOC_DISC);
+}
+
+void
+set_led (int value)
+{
+  if (value)
+    palClearPad (IOPORT3, GPIOC_LED);
+  else
+    palSetPad (IOPORT3, GPIOC_LED);
+}
diff --git a/boards/OLIMEX_STM32_H103/board.h b/boards/OLIMEX_STM32_H103/board.h
new file mode 100644 (file)
index 0000000..5e9d0e9
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
+
+    This file is part of ChibiOS/RT.
+
+    ChibiOS/RT is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    ChibiOS/RT is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+                                      ---
+
+    A special exception to the GPL can be applied should you wish to distribute
+    a combined work that includes ChibiOS/RT, without being obliged to provide
+    the source code for any proprietary components. See the file exception.txt
+    for full details of how and when the exception can be applied.
+*/
+
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for the Olimex STM32-H103 proto board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_OLIMEX_STM32_H103
+#define BOARD_NAME "Olimex STM32-H103"
+
+/*
+ * Board frequencies.
+ */
+#define STM32_LSECLK            32768
+#define STM32_HSECLK            8000000
+
+/*
+ * MCU type, this macro is used by both the ST library and the ChibiOS/RT
+ * native STM32 HAL.
+ */
+#define STM32F10X_MD
+
+/*
+ * IO pins assignments.
+ */
+#define GPIOA_BUTTON            0
+#define GPIOA_SPI1NSS           4
+
+#define GPIOB_SPI2NSS           12
+
+#define GPIOC_MMCWP             6
+#define GPIOC_MMCCP             7
+#define GPIOC_CANCNTL           10
+#define GPIOC_DISC              11
+#define GPIOC_LED               12
+
+/*
+ * I/O ports initial setup, this configuration is established soon after reset
+ * in the initialization code.
+ *
+ * The digits have the following meaning:
+ *   0 - Analog input.
+ *   1 - Push Pull output 10MHz.
+ *   2 - Push Pull output 2MHz.
+ *   3 - Push Pull output 50MHz.
+ *   4 - Digital input.
+ *   5 - Open Drain output 10MHz.
+ *   6 - Open Drain output 2MHz.
+ *   7 - Open Drain output 50MHz.
+ *   8 - Digital input with PullUp or PullDown resistor depending on ODR.
+ *   9 - Alternate Push Pull output 10MHz.
+ *   A - Alternate Push Pull output 2MHz.
+ *   B - Alternate Push Pull output 50MHz.
+ *   C - Reserved.
+ *   D - Alternate Open Drain output 10MHz.
+ *   E - Alternate Open Drain output 2MHz.
+ *   F - Alternate Open Drain output 50MHz.
+ * Please refer to the STM32 Reference Manual for details.
+ */
+
+/*
+ * Port A setup.
+ * Everything input with pull-up except:
+ * PA0  - Normal input      (BUTTON).
+ * PA2  - Alternate output  (USART2 TX).
+ * PA3  - Normal input      (USART2 RX).
+ */
+#define VAL_GPIOACRL            0x88884B84      /*  PA7...PA0 */
+#define VAL_GPIOACRH            0x88888888      /* PA15...PA8 */
+#define VAL_GPIOAODR            0xFFFFFFFF
+
+/*
+ * Port B setup.
+ * Everything input with pull-up except:
+ * PB13 - Alternate output  (MMC SPI2 SCK).
+ * PB14 - Normal input      (MMC SPI2 MISO).
+ * PB15 - Alternate output  (MMC SPI2 MOSI).
+ */
+#define VAL_GPIOBCRL            0x88888888      /*  PB7...PB0 */
+#define VAL_GPIOBCRH            0xB4B88888      /* PB15...PB8 */
+#define VAL_GPIOBODR            0xFFFFFFFF
+
+/*
+ * Port C setup.
+ * Everything input with pull-up except:
+ * PC6  - Normal input because there is an external resistor.
+ * PC7  - Normal input because there is an external resistor.
+ * PC11 - Open Drain output (USB disconnect).
+ * PC12 - Push Pull output (LED).
+ */
+#define VAL_GPIOCCRL            0x44888888      /*  PC7...PC0 */
+#define VAL_GPIOCCRH            0x88837888      /* PC15...PC8 */
+#define VAL_GPIOCODR            0xFFFFFFFF
+
+/*
+ * Port D setup.
+ * Everything input with pull-up except:
+ * PD0  - Normal input (XTAL).
+ * PD1  - Normal input (XTAL).
+ */
+#define VAL_GPIODCRL            0x88888844      /*  PD7...PD0 */
+#define VAL_GPIODCRH            0x88888888      /* PD15...PD8 */
+#define VAL_GPIODODR            0xFFFFFFFF
+
+/*
+ * Port E setup.
+ * Everything input with pull-up except:
+ */
+#define VAL_GPIOECRL            0x88888888      /*  PE7...PE0 */
+#define VAL_GPIOECRH            0x88888888      /* PE15...PE8 */
+#define VAL_GPIOEODR            0xFFFFFFFF
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+  void boardInit(void);
+  void USB_Cable_Config (int NewState);
+  void set_led (int value);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _FROM_ASM_ */
+
+#endif /* _BOARD_H_ */
diff --git a/boards/OLIMEX_STM32_H103/mcuconf.h b/boards/OLIMEX_STM32_H103/mcuconf.h
new file mode 100644 (file)
index 0000000..9b670b0
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * HAL driver system settings.
+ */
+#define STM32_SW                    STM32_SW_PLL
+#define STM32_PLLSRC                STM32_PLLSRC_HSE
+#define STM32_PLLXTPRE              STM32_PLLXTPRE_DIV1
+#define STM32_PLLMUL_VALUE          9
+#define STM32_HPRE                  STM32_HPRE_DIV1
+#define STM32_PPRE1                 STM32_PPRE1_DIV2
+#define STM32_PPRE2                 STM32_PPRE2_DIV2
+#define STM32_ADCPRE                STM32_ADCPRE_DIV4
+#define STM32_MCO                   STM32_MCO_NOCLOCK
+
+#include "mcuconf-common.h"
index 2fb1701..a4df59f 100644 (file)
 #define BOARD_STBEE_MINI
 #define BOARD_NAME "STBee Mini"
 
-#if defined(PINPAD_SUPPORT)
-#define HAVE_7SEGLED   1
-#endif
-
 /*
  * Board frequencies.
  */
index fdcd62c..56235c0 100644 (file)
@@ -11,3 +11,5 @@
 #define STM32_ADCPRE                STM32_ADCPRE_DIV4
 #define STM32_USBPRE                STM32_USBPRE_DIV1P5
 #define STM32_MCO                   STM32_MCO_NOCLOCK
+
+#include "mcuconf-common.h"
index ed98441..92321ce 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "ch.h"
 #include "hal.h"
+#include "config.h"
 
 /**
  * @brief   PAL setup.
diff --git a/src/.gdbinit b/src/.gdbinit
new file mode 100644 (file)
index 0000000..3e08392
--- /dev/null
@@ -0,0 +1,3 @@
+set arm force-mode thumb
+set arm fallback-mode thumb
+target remote localhost:3333
index f067809..0433c34 100755 (executable)
@@ -61,14 +61,10 @@ Defaults for the options are specified in brackets.
 
 Configuration:
   -h, --help           display this help and exit      [no]
-  --target=TARGET      specify target                  [OLIMEX_STM32_H103]
+  --target=TARGET      specify target                  [STBEE_MINI]
                        supported targes are:
                           OLIMEX_STM32_H103
-                          STM32_PRIMER2
-                          CQ_STARM
                           STBEE_MINI
-                          STM8S_DISCOVERY
-                          STBEE
   --with-dfu           build image for DFU             [<target specific>]
 EOF
   exit 0
index 9120e08..f30133e 100644 (file)
@@ -22,6 +22,8 @@
  *
  */
 
+#include "config.h"
+
 #include "ch.h"
 #include "hal.h"
 
diff --git a/test-results.txt b/test-results.txt
deleted file mode 100644 (file)
index 7d2ed9f..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-There is a tool named "rngtest" in rng-tools.  I use rng-tools of
-version 2-unofficial-mt.13-3 in Debian.
-
-rngtest: bits received from input: 2015920160
-rngtest: FIPS 140-2 successes: 100721
-rngtest: FIPS 140-2 failures: 75
-rngtest: FIPS 140-2(2001-10-10) Monobit: 12
-rngtest: FIPS 140-2(2001-10-10) Poker: 6
-rngtest: FIPS 140-2(2001-10-10) Runs: 30
-rngtest: FIPS 140-2(2001-10-10) Long run: 27
-rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
-rngtest: input channel speed: (min=122.503; avg=192.322; max=443.358)Kibits/s
-rngtest: FIPS tests speed: (min=1.351; avg=26.373; max=48.287)Mibits/s
-rngtest: Program run time: 10310668494 microseconds
-
diff --git a/test-results/nist-sts/finalAnalysisReport.txt b/test-results/nist-sts/finalAnalysisReport.txt
new file mode 100644 (file)
index 0000000..4dfa488
--- /dev/null
@@ -0,0 +1,208 @@
+------------------------------------------------------------------------------
+RESULTS FOR THE UNIFORMITY OF P-VALUES AND THE PROPORTION OF PASSING SEQUENCES
+------------------------------------------------------------------------------
+   generator is </dev/ttyACM0>
+------------------------------------------------------------------------------
+ C1  C2  C3  C4  C5  C6  C7  C8  C9 C10  P-VALUE  PROPORTION  STATISTICAL TEST
+------------------------------------------------------------------------------
+ 12  14  10   9   8  18  12  19  15  11  0.299251    128/128     Frequency
+ 12  20  16  13   9  12  12   8  16  10  0.311542    125/128     BlockFrequency
+ 16  11  11   9   9  11  19  12  14  16  0.452799    128/128     CumulativeSums
+ 12  18  11   7  17  12  21   8   8  14  0.048716    127/128     CumulativeSums
+ 10  11  12  17  15   7  14  13  19  10  0.337162    128/128     Runs
+ 14  15  18   9  15  12  10  12  11  12  0.739918    126/128     LongestRun
+ 12  18  15  16  10   9  13  15  12   8  0.500934    127/128     Rank
+ 14  15   9  14   4  17  11  17  12  15  0.186566    127/128     FFT
+ 10  16  10  16  21  14  10   8   8  15  0.116519    128/128     NonOverlappingTemplate
+ 14  18  11  12  11  15  12  15  11   9  0.756476    127/128     NonOverlappingTemplate
+ 15   9  14   8  18  15  13  15  13   8  0.422034    126/128     NonOverlappingTemplate
+ 13  16  14  17  15   9  12  10  13   9  0.689019    126/128     NonOverlappingTemplate
+ 17  19  19  12  10   8   8  17  10   8  0.048716    124/128     NonOverlappingTemplate
+ 11  12  11  19  12  21   9  12   8  13  0.155209    127/128     NonOverlappingTemplate
+ 18  11   9  10  15  17  12   9  16  11  0.422034    127/128     NonOverlappingTemplate
+ 10  11  13  12  13  13  18  12  19   7  0.364146    127/128     NonOverlappingTemplate
+ 15   9  14  15   8  13  14  15  14  11  0.788728    127/128     NonOverlappingTemplate
+ 12  16  16  13   7  16  12  11  12  13  0.706149    126/128     NonOverlappingTemplate
+  9  13  14  12  17  10  11  18  17   7  0.287306    126/128     NonOverlappingTemplate
+ 11   8  18  12  16  16   9  16  12  10  0.392456    126/128     NonOverlappingTemplate
+ 17  13  11   9  18  16  10  12  10  12  0.534146    127/128     NonOverlappingTemplate
+  6  18  16  12  11  10  15   9  15  16  0.253551    127/128     NonOverlappingTemplate
+ 16  11  15  10  11  15  13  14   5  18  0.287306    128/128     NonOverlappingTemplate
+ 11   7  19  18  13  15  12  13   8  12  0.242986    128/128     NonOverlappingTemplate
+ 16  16  10   5  19  13   8  16  16   9  0.066882    128/128     NonOverlappingTemplate
+ 18  18  11  11  11  11  10   8  10  20  0.134686    126/128     NonOverlappingTemplate
+ 11  15  17   7  16  15   9  10  17  11  0.324180    128/128     NonOverlappingTemplate
+  8  18  18   6  17  10  13  13  14  11  0.148094    128/128     NonOverlappingTemplate
+ 14  19  11  13  12  10  14  14  13   8  0.637119    127/128     NonOverlappingTemplate
+  9  12  15   7  14  14  20   6  14  17  0.090936    127/128     NonOverlappingTemplate
+ 11  16  11  14  16  16   8  13  12  11  0.739918    128/128     NonOverlappingTemplate
+ 13  12  23  22  13   6  11  12   9   7  0.003577    127/128     NonOverlappingTemplate
+ 16  15   9   9  10  15  15  10  10  19  0.337162    125/128     NonOverlappingTemplate
+ 15   7  17   7  11  11  10  14  14  22  0.057146    126/128     NonOverlappingTemplate
+ 11  17  12  12   8  14  13  16   9  16  0.602458    126/128     NonOverlappingTemplate
+ 15  12  19   7  13   9   9  18  12  14  0.222869    127/128     NonOverlappingTemplate
+ 10  15  12   9  13  17  20   8  10  14  0.253551    126/128     NonOverlappingTemplate
+  8  10   9  10  17  12  19  16  17  10  0.178278    127/128     NonOverlappingTemplate
+ 17  13  18  10   7  19  14  15   8   7  0.063482    127/128     NonOverlappingTemplate
+ 15  19  10  13  15  11  11  12  13   9  0.637119    124/128     NonOverlappingTemplate
+ 11   8  12  13  19  16   8  15  21   5  0.018969    128/128     NonOverlappingTemplate
+  9  16  12  10  11   6  13  22  17  12  0.066882    128/128     NonOverlappingTemplate
+ 10  23  13   5  16  13  13  13  14   8  0.037157    128/128     NonOverlappingTemplate
+ 14   9  15   7  11  15  16  17  13  11  0.500934    128/128     NonOverlappingTemplate
+ 13  13   7  12  10  12  15  10  21  15  0.264458    127/128     NonOverlappingTemplate
+ 19   7  11  14  14  13  11   9  17  13  0.350485    126/128     NonOverlappingTemplate
+ 13  14  10  16   5  11  11  11  19  18  0.141256    128/128     NonOverlappingTemplate
+ 14  17  12   8  14  15  16  11  11  10  0.671779    128/128     NonOverlappingTemplate
+  8  18  12  15  14  12  12  14   7  16  0.422034    126/128     NonOverlappingTemplate
+ 10  10  13  11  17   9  13  15   9  21  0.213309    128/128     NonOverlappingTemplate
+ 14  10  15  15  19  12   9   9  15  10  0.452799    125/128     NonOverlappingTemplate
+ 19  15   9  13  13  15   9  12  13  10  0.568055    126/128     NonOverlappingTemplate
+ 15  17  11  14  14  12  13   6  15  11  0.585209    127/128     NonOverlappingTemplate
+ 15  14  14  10   8  13  11  14  18  11  0.671779    127/128     NonOverlappingTemplate
+ 10   9  14  12  11  17  19  10  16  10  0.378138    126/128     NonOverlappingTemplate
+ 13  17  10  16  15   7  15  14  12   9  0.484646    126/128     NonOverlappingTemplate
+  7  14  12  16  12  15  13  12  11  16  0.739918    128/128     NonOverlappingTemplate
+ 15  12  11  15  11  17  12  13   8  14  0.788728    128/128     NonOverlappingTemplate
+ 17  16   8  12  10  18   8  15   9  15  0.232760    127/128     NonOverlappingTemplate
+  6  11  12  18  14  18  13  10  16  10  0.242986    128/128     NonOverlappingTemplate
+ 10  15   6  15  14  17  13  11  16  11  0.452799    127/128     NonOverlappingTemplate
+ 10  11  10  15  14  19  12  10  11  16  0.568055    128/128     NonOverlappingTemplate
+ 12  20  16  13  13   7   9   9  12  17  0.186566    128/128     NonOverlappingTemplate
+ 12  17  18  13  11   7  13  10   9  18  0.242986    126/128     NonOverlappingTemplate
+ 13   8  13  13  15  14  11  10  14  17  0.788728    128/128     NonOverlappingTemplate
+ 12   7  21  13  10  14   9  14  11  17  0.170294    127/128     NonOverlappingTemplate
+ 13  13   7  14   9  10  16  12  20  14  0.299251    127/128     NonOverlappingTemplate
+ 19   7  16  15  13  10  11  12  11  14  0.422034    126/128     NonOverlappingTemplate
+ 13  12  18  15  15   9   5  16  11  14  0.264458    126/128     NonOverlappingTemplate
+ 14  13  18  14  12  17   8   8  13  11  0.468595    127/128     NonOverlappingTemplate
+ 10  14  18  16   8  10  10  15  15  12  0.484646    126/128     NonOverlappingTemplate
+ 15  13  13  18  10   7  11  12  14  15  0.585209    127/128     NonOverlappingTemplate
+ 19  15  13  14  13  10  10  12   8  14  0.568055    126/128     NonOverlappingTemplate
+ 11  10  14  16   8  18  17  13  12   9  0.407091    128/128     NonOverlappingTemplate
+ 10  14  13   9  13  14  10  11  20  14  0.534146    128/128     NonOverlappingTemplate
+ 16  17  12  10  13  13   8  11  16  12  0.671779    127/128     NonOverlappingTemplate
+  9   9   9  10  18  10  19  10  17  17  0.105618    126/128     NonOverlappingTemplate
+ 10  21  12  18  13   6  10   9  14  15  0.082177    128/128     NonOverlappingTemplate
+ 13  15  14  13  17   7  14  13   9  13  0.671779    128/128     NonOverlappingTemplate
+ 20  19  13  13  13  11   8   6  15  10  0.086458    125/128     NonOverlappingTemplate
+ 11  15  11   6  15  19  13  15  12  11  0.378138    126/128     NonOverlappingTemplate
+ 15  14  13  10   8  13  14  13  13  15  0.900104    128/128     NonOverlappingTemplate
+ 10  16  10  16  21  14  10   8   8  15  0.116519    128/128     NonOverlappingTemplate
+  5  14  14  16   9  18  16  15  10  11  0.195163    128/128     NonOverlappingTemplate
+ 12  18  12  11  16  11  16  12  10  10  0.689019    124/128     NonOverlappingTemplate
+ 18  14  11  11  15  13  13  10   8  15  0.654467    127/128     NonOverlappingTemplate
+ 12  14  14  12   8  14  20  15   9  10  0.392456    125/128     NonOverlappingTemplate
+ 11  11  16  12   4  15  15  13  19  12  0.186566    128/128     NonOverlappingTemplate
+ 15  13  17  11  11  14  14  12  11  10  0.900104    125/128     NonOverlappingTemplate
+ 15  13  11  12  10  11  17   9  13  17  0.706149    126/128     NonOverlappingTemplate
+  9  16  15  16  14  11  11  11  14  11  0.819544    127/128     NonOverlappingTemplate
+ 19  11  12  18  15   7  10   8  12  16  0.162606    125/128     NonOverlappingTemplate
+  6  16  14   9  16  15  20  10  16   6  0.041438    127/128     NonOverlappingTemplate
+ 13  12  13  11  14   9  14  15   9  18  0.723129    127/128     NonOverlappingTemplate
+ 17  11  14  10  13   7   9  14  14  19  0.311542    126/128     NonOverlappingTemplate
+ 15  14   9  15  15  17  12  10   9  12  0.689019    126/128     NonOverlappingTemplate
+ 15   9   7  16  20   8  12  14  18   9  0.074177    124/128     NonOverlappingTemplate
+ 14  14  15  12   6  15  11  16  16   9  0.468595    127/128     NonOverlappingTemplate
+ 15  17   7  17  13  11  10   6  18  14  0.128379    126/128     NonOverlappingTemplate
+ 12  20  11  10  12  12  11  10  11  19  0.324180    128/128     NonOverlappingTemplate
+ 12  19  11  13  15  12  12  18   7   9  0.287306    125/128     NonOverlappingTemplate
+ 15   9  15  10  14  17   8  12  15  13  0.619772    127/128     NonOverlappingTemplate
+ 11  15  14  10  10  16  12  11  11  18  0.706149    128/128     NonOverlappingTemplate
+ 10   9  12  12  13  12  19   7  18  16  0.232760    127/128     NonOverlappingTemplate
+ 12  10  19  15  17  17  10  10  11   7  0.204076    127/128     NonOverlappingTemplate
+ 13  16  10   8  12  15  13  13  12  16  0.804337    128/128     NonOverlappingTemplate
+ 17  13  15  16  10   9  13  13  10  12  0.756476    126/128     NonOverlappingTemplate
+ 14   7   9  14  15  15   9  19  11  15  0.299251    126/128     NonOverlappingTemplate
+  7  11  13  16  19   6  18  13   8  17  0.046169    128/128     NonOverlappingTemplate
+ 16   7   9  12  13  17  12  18  14  10  0.350485    128/128     NonOverlappingTemplate
+ 11  21   7  14  17  12  10   9  18   9  0.063482    127/128     NonOverlappingTemplate
+ 14  11  10  15  10  10  19  11  17  11  0.484646    126/128     NonOverlappingTemplate
+ 15  17  16  13  10  17   9  12   9  10  0.484646    127/128     NonOverlappingTemplate
+  7  14  12  15  14   5  11  19  11  20  0.046169    128/128     NonOverlappingTemplate
+ 22  15   7  16  10  10  14  13  14   7  0.066882    120/128  *  NonOverlappingTemplate
+ 16  16  22  14   7  13  12   9   9  10  0.082177    128/128     NonOverlappingTemplate
+  8  18  16  16  11  10  12  15   8  14  0.364146    127/128     NonOverlappingTemplate
+ 14  11  17  11  16  12  13  14  12   8  0.772760    127/128     NonOverlappingTemplate
+ 10  10   7  26  14  12  15   7  10  17  0.003363    126/128     NonOverlappingTemplate
+ 23   8  14  13   7  18  11  15   8  11  0.023812    127/128     NonOverlappingTemplate
+ 15  16  11  16  15  11  10  11   9  14  0.756476    125/128     NonOverlappingTemplate
+ 14  11  17  11  17  11  14   6  14  13  0.484646    128/128     NonOverlappingTemplate
+ 12  12  11  15   5  11  15  17  14  16  0.392456    128/128     NonOverlappingTemplate
+ 10  18   8  16  10  11  17  15  11  12  0.407091    127/128     NonOverlappingTemplate
+  8  12  15  16  15  13  13   8  15  13  0.689019    128/128     NonOverlappingTemplate
+ 15  12  14   6  17   6  14  15  14  15  0.253551    126/128     NonOverlappingTemplate
+ 16  14  13  14   9  15  10  14  10  13  0.862344    127/128     NonOverlappingTemplate
+ 16  13  10  13  15  12  13  13  10  13  0.957319    127/128     NonOverlappingTemplate
+ 16  18  14  14   6  10  12  16  11  11  0.364146    126/128     NonOverlappingTemplate
+  9  12  13  11  15  10  20  12  11  15  0.517442    126/128     NonOverlappingTemplate
+ 12  16  15   6  11  15  13   9  20  11  0.204076    126/128     NonOverlappingTemplate
+ 13  11  14   8  15  17   9   9  16  16  0.452799    126/128     NonOverlappingTemplate
+ 24  13   1  12  12  14  19  14   9  10  0.000954    123/128     NonOverlappingTemplate
+ 23  14   9   7  12  11  10  11  19  12  0.037157    125/128     NonOverlappingTemplate
+ 18  13  11  13  11  12  15  15  12   8  0.723129    128/128     NonOverlappingTemplate
+ 11  16  11  19  13  15   9  16   4  14  0.116519    127/128     NonOverlappingTemplate
+ 13  15   6   6  18  12  18  12  18  10  0.063482    128/128     NonOverlappingTemplate
+ 17  11  14  17   7  16  15  10  10  11  0.392456    126/128     NonOverlappingTemplate
+ 16  13  13  13   9  17   9  13  13  12  0.804337    125/128     NonOverlappingTemplate
+ 12  11  11  11  20  17   6  12  14  14  0.253551    126/128     NonOverlappingTemplate
+ 15  19  16  12   8   9  10  10  11  18  0.213309    127/128     NonOverlappingTemplate
+  8  14  19   9  21  14  11   6  17   9  0.021262    128/128     NonOverlappingTemplate
+ 16  10  11  10  15   9   9  14  14  20  0.324180    126/128     NonOverlappingTemplate
+ 18   9   8  15  13  15  13  10  11  16  0.484646    126/128     NonOverlappingTemplate
+ 16  11  12   7  21  10  16  13  11  11  0.204076    127/128     NonOverlappingTemplate
+  6  10  22  11  11   9  15  15  13  16  0.078086    127/128     NonOverlappingTemplate
+  6  17  11  13  12  12  13  19  14  11  0.364146    128/128     NonOverlappingTemplate
+ 12  12  12  15  12  11  10  16  15  13  0.949602    126/128     NonOverlappingTemplate
+ 12  13  16  14  23   9   8   8   9  16  0.043745    127/128     NonOverlappingTemplate
+ 10  14  16  13  12  15  12  10  12  14  0.941144    128/128     NonOverlappingTemplate
+  9   9  14  16  17  12  18  11  13   9  0.422034    127/128     NonOverlappingTemplate
+ 12  13  10  14  15  10  16  12  11  15  0.911413    128/128     NonOverlappingTemplate
+ 11   9  11   8  12  16  20  19   9  13  0.128379    128/128     NonOverlappingTemplate
+ 14   9   7  12  11  10  17  15  14  19  0.287306    127/128     NonOverlappingTemplate
+  6  10  14  15  17   6  11  17  14  18  0.090936    126/128     NonOverlappingTemplate
+ 15  14  13  10   8  13  15  12  13  15  0.875539    128/128     NonOverlappingTemplate
+ 17  19  12   9  13  13  16   8   9  12  0.311542    125/128     OverlappingTemplate
+ 18  12  12  11  11  13  12   9  17  13  0.723129    127/128     Universal
+ 13  12  19  13  13  10  12  13  14   9  0.756476    127/128     ApproximateEntropy
+  3   9  15  12  10   8   8   4   7   8  0.122325     84/84      RandomExcursions
+  7   9   8   9   8  13   6   5   9  10  0.764655     84/84      RandomExcursions
+  9  15   8  11  10   3   8   9   5   6  0.174249     84/84      RandomExcursions
+  7   9  13  10  14   8   6   8   6   3  0.186566     83/84      RandomExcursions
+  7  12   5  10  10   4   8  14   7   7  0.275709     82/84      RandomExcursions
+ 10   5  10  14   9   8   8   4   8   8  0.460664     84/84      RandomExcursions
+ 11  12   5  11   7   9   8   8   9   4  0.559523     84/84      RandomExcursions
+ 12  10  10  11   9   1   9  10   6   6  0.213309     84/84      RandomExcursions
+ 11   4  11   7  11   6   3  15  12   4  0.023149     83/84      RandomExcursionsVariant
+ 11   6  11   9   7   8   7   6  11   8  0.855534     83/84      RandomExcursionsVariant
+ 10  13   6  16   7   8   8   7   7   2  0.048716     84/84      RandomExcursionsVariant
+ 10  12   6  12  11  10  10   5   5   3  0.186566     84/84      RandomExcursionsVariant
+ 10   7  12   9  10   8   4  11   9   4  0.484646     84/84      RandomExcursionsVariant
+  9   6   9  11  10   8  10   5   9   7  0.894201     84/84      RandomExcursionsVariant
+  8   9  10   9   5  10   6  12   3  12  0.350485     84/84      RandomExcursionsVariant
+  8   7  11  11   8   9  11   6   6   7  0.855534     84/84      RandomExcursionsVariant
+  7  12  10  10  11   5  10   6   8   5  0.585209     83/84      RandomExcursionsVariant
+  6  21   8  11   4   8   3   6  10   7  0.000648     84/84      RandomExcursionsVariant
+ 10   9  10  10  11   8  10   2   6   8  0.509162     84/84      RandomExcursionsVariant
+  9  12  10   6  11   6   6   9  10   5  0.637119     84/84      RandomExcursionsVariant
+ 10   7  11   8  12   4  13   7   5   7  0.330628     81/84      RandomExcursionsVariant
+  8   9   9  12   8  10  12   5   5   6  0.585209     82/84      RandomExcursionsVariant
+  8   7  10  10   8  11   7   8   6   9  0.964295     81/84      RandomExcursionsVariant
+  9   8   7  10  10   9   9  11   5   6  0.894201     83/84      RandomExcursionsVariant
+  9   4  12  13   6   7   8  11   6   8  0.392456     83/84      RandomExcursionsVariant
+  6  12   6  12   8   8   8  11   8   5  0.611108     81/84      RandomExcursionsVariant
+ 16  14  11  13  12   9  14   8  13  18  0.602458    126/128     Serial
+ 16  13  10  12   7  12   9  17  14  18  0.350485    125/128     Serial
+ 15  13  14  10  12  10  14  16   9  15  0.834308    128/128     LinearComplexity
+
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+The minimum pass rate for each statistical test with the exception of the
+random excursion (variant) test is approximately = 123 for a
+sample size = 128 binary sequences.
+
+The minimum pass rate for the random excursion (variant) test
+is approximately = 80 for a sample size = 84 binary sequences.
+
+For further guidelines construct a probability table using the MAPLE program
+provided in the addendum section of the documentation.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/test-results/nist-sts/freq.txt b/test-results/nist-sts/freq.txt
new file mode 100644 (file)
index 0000000..26595c0
--- /dev/null
@@ -0,0 +1,133 @@
+________________________________________________________________________________
+
+               FILE = /dev/ttyACM0             ALPHA = 0.0100
+________________________________________________________________________________
+
+               BITSREAD = 1048576 0s = 524241 1s = 524335
+               BITSREAD = 1048576 0s = 524220 1s = 524356
+               BITSREAD = 1048576 0s = 524066 1s = 524510
+               BITSREAD = 1048576 0s = 524026 1s = 524550
+               BITSREAD = 1048576 0s = 523921 1s = 524655
+               BITSREAD = 1048576 0s = 524929 1s = 523647
+               BITSREAD = 1048576 0s = 524694 1s = 523882
+               BITSREAD = 1048576 0s = 524922 1s = 523654
+               BITSREAD = 1048576 0s = 524554 1s = 524022
+               BITSREAD = 1048576 0s = 524104 1s = 524472
+               BITSREAD = 1048576 0s = 524758 1s = 523818
+               BITSREAD = 1048576 0s = 523590 1s = 524986
+               BITSREAD = 1048576 0s = 525239 1s = 523337
+               BITSREAD = 1048576 0s = 525121 1s = 523455
+               BITSREAD = 1048576 0s = 524562 1s = 524014
+               BITSREAD = 1048576 0s = 524117 1s = 524459
+               BITSREAD = 1048576 0s = 524440 1s = 524136
+               BITSREAD = 1048576 0s = 524010 1s = 524566
+               BITSREAD = 1048576 0s = 523634 1s = 524942
+               BITSREAD = 1048576 0s = 524573 1s = 524003
+               BITSREAD = 1048576 0s = 524482 1s = 524094
+               BITSREAD = 1048576 0s = 524309 1s = 524267
+               BITSREAD = 1048576 0s = 524569 1s = 524007
+               BITSREAD = 1048576 0s = 525126 1s = 523450
+               BITSREAD = 1048576 0s = 524033 1s = 524543
+               BITSREAD = 1048576 0s = 524134 1s = 524442
+               BITSREAD = 1048576 0s = 523577 1s = 524999
+               BITSREAD = 1048576 0s = 524517 1s = 524059
+               BITSREAD = 1048576 0s = 524565 1s = 524011
+               BITSREAD = 1048576 0s = 524305 1s = 524271
+               BITSREAD = 1048576 0s = 523464 1s = 525112
+               BITSREAD = 1048576 0s = 524552 1s = 524024
+               BITSREAD = 1048576 0s = 523957 1s = 524619
+               BITSREAD = 1048576 0s = 523602 1s = 524974
+               BITSREAD = 1048576 0s = 523855 1s = 524721
+               BITSREAD = 1048576 0s = 524556 1s = 524020
+               BITSREAD = 1048576 0s = 524579 1s = 523997
+               BITSREAD = 1048576 0s = 524387 1s = 524189
+               BITSREAD = 1048576 0s = 523925 1s = 524651
+               BITSREAD = 1048576 0s = 525532 1s = 523044
+               BITSREAD = 1048576 0s = 524563 1s = 524013
+               BITSREAD = 1048576 0s = 524097 1s = 524479
+               BITSREAD = 1048576 0s = 524874 1s = 523702
+               BITSREAD = 1048576 0s = 523278 1s = 525298
+               BITSREAD = 1048576 0s = 524014 1s = 524562
+               BITSREAD = 1048576 0s = 523999 1s = 524577
+               BITSREAD = 1048576 0s = 525110 1s = 523466
+               BITSREAD = 1048576 0s = 525126 1s = 523450
+               BITSREAD = 1048576 0s = 524455 1s = 524121
+               BITSREAD = 1048576 0s = 524368 1s = 524208
+               BITSREAD = 1048576 0s = 523566 1s = 525010
+               BITSREAD = 1048576 0s = 524129 1s = 524447
+               BITSREAD = 1048576 0s = 524622 1s = 523954
+               BITSREAD = 1048576 0s = 523815 1s = 524761
+               BITSREAD = 1048576 0s = 524691 1s = 523885
+               BITSREAD = 1048576 0s = 524361 1s = 524215
+               BITSREAD = 1048576 0s = 524631 1s = 523945
+               BITSREAD = 1048576 0s = 524394 1s = 524182
+               BITSREAD = 1048576 0s = 524361 1s = 524215
+               BITSREAD = 1048576 0s = 524876 1s = 523700
+               BITSREAD = 1048576 0s = 524059 1s = 524517
+               BITSREAD = 1048576 0s = 523763 1s = 524813
+               BITSREAD = 1048576 0s = 524306 1s = 524270
+               BITSREAD = 1048576 0s = 523605 1s = 524971
+               BITSREAD = 1048576 0s = 524902 1s = 523674
+               BITSREAD = 1048576 0s = 525072 1s = 523504
+               BITSREAD = 1048576 0s = 524192 1s = 524384
+               BITSREAD = 1048576 0s = 523620 1s = 524956
+               BITSREAD = 1048576 0s = 524263 1s = 524313
+               BITSREAD = 1048576 0s = 525181 1s = 523395
+               BITSREAD = 1048576 0s = 524137 1s = 524439
+               BITSREAD = 1048576 0s = 524836 1s = 523740
+               BITSREAD = 1048576 0s = 524186 1s = 524390
+               BITSREAD = 1048576 0s = 523958 1s = 524618
+               BITSREAD = 1048576 0s = 523178 1s = 525398
+               BITSREAD = 1048576 0s = 525311 1s = 523265
+               BITSREAD = 1048576 0s = 524625 1s = 523951
+               BITSREAD = 1048576 0s = 524399 1s = 524177
+               BITSREAD = 1048576 0s = 524737 1s = 523839
+               BITSREAD = 1048576 0s = 523856 1s = 524720
+               BITSREAD = 1048576 0s = 524286 1s = 524290
+               BITSREAD = 1048576 0s = 524396 1s = 524180
+               BITSREAD = 1048576 0s = 524267 1s = 524309
+               BITSREAD = 1048576 0s = 523416 1s = 525160
+               BITSREAD = 1048576 0s = 523107 1s = 525469
+               BITSREAD = 1048576 0s = 524142 1s = 524434
+               BITSREAD = 1048576 0s = 524343 1s = 524233
+               BITSREAD = 1048576 0s = 523893 1s = 524683
+               BITSREAD = 1048576 0s = 524324 1s = 524252
+               BITSREAD = 1048576 0s = 524395 1s = 524181
+               BITSREAD = 1048576 0s = 524458 1s = 524118
+               BITSREAD = 1048576 0s = 524149 1s = 524427
+               BITSREAD = 1048576 0s = 524213 1s = 524363
+               BITSREAD = 1048576 0s = 523949 1s = 524627
+               BITSREAD = 1048576 0s = 524433 1s = 524143
+               BITSREAD = 1048576 0s = 524676 1s = 523900
+               BITSREAD = 1048576 0s = 523422 1s = 525154
+               BITSREAD = 1048576 0s = 524725 1s = 523851
+               BITSREAD = 1048576 0s = 523748 1s = 524828
+               BITSREAD = 1048576 0s = 523967 1s = 524609
+               BITSREAD = 1048576 0s = 523819 1s = 524757
+               BITSREAD = 1048576 0s = 524122 1s = 524454
+               BITSREAD = 1048576 0s = 524075 1s = 524501
+               BITSREAD = 1048576 0s = 524401 1s = 524175
+               BITSREAD = 1048576 0s = 524142 1s = 524434
+               BITSREAD = 1048576 0s = 524098 1s = 524478
+               BITSREAD = 1048576 0s = 524402 1s = 524174
+               BITSREAD = 1048576 0s = 524648 1s = 523928
+               BITSREAD = 1048576 0s = 524300 1s = 524276
+               BITSREAD = 1048576 0s = 523425 1s = 525151
+               BITSREAD = 1048576 0s = 524010 1s = 524566
+               BITSREAD = 1048576 0s = 524393 1s = 524183
+               BITSREAD = 1048576 0s = 524423 1s = 524153
+               BITSREAD = 1048576 0s = 524761 1s = 523815
+               BITSREAD = 1048576 0s = 525595 1s = 522981
+               BITSREAD = 1048576 0s = 525075 1s = 523501
+               BITSREAD = 1048576 0s = 523738 1s = 524838
+               BITSREAD = 1048576 0s = 524596 1s = 523980
+               BITSREAD = 1048576 0s = 524121 1s = 524455
+               BITSREAD = 1048576 0s = 524539 1s = 524037
+               BITSREAD = 1048576 0s = 524679 1s = 523897
+               BITSREAD = 1048576 0s = 524884 1s = 523692
+               BITSREAD = 1048576 0s = 524312 1s = 524264
+               BITSREAD = 1048576 0s = 524525 1s = 524051
+               BITSREAD = 1048576 0s = 523309 1s = 525267
+               BITSREAD = 1048576 0s = 524141 1s = 524435
+               BITSREAD = 1048576 0s = 524493 1s = 524083
+               BITSREAD = 1048576 0s = 524978 1s = 523598
diff --git a/test-results/nist-sts/nist-sts.txt b/test-results/nist-sts/nist-sts.txt
new file mode 100644 (file)
index 0000000..90b9cdc
--- /dev/null
@@ -0,0 +1,57 @@
+$ ./assess 1048576
+           G E N E R A T O R    S E L E C T I O N 
+           ______________________________________
+
+    [0] Input File                 [1] Linear Congruential
+    [2] Quadratic Congruential I   [3] Quadratic Congruential II
+    [4] Cubic Congruential         [5] XOR
+    [6] Modular Exponentiation     [7] Blum-Blum-Shub
+    [8] Micali-Schnorr             [9] G Using SHA-1
+
+   Enter Choice: 0
+
+
+               User Prescribed Input File: /dev/ttyACM0 
+
+                S T A T I S T I C A L   T E S T S
+                _________________________________
+
+    [01] Frequency                       [02] Block Frequency
+    [03] Cumulative Sums                 [04] Runs
+    [05] Longest Run of Ones             [06] Rank
+    [07] Discrete Fourier Transform      [08] Nonperiodic Template Matchings
+    [09] Overlapping Template Matchings  [10] Universal Statistical
+    [11] Approximate Entropy             [12] Random Excursions
+    [13] Random Excursions Variant       [14] Serial
+    [15] Linear Complexity
+
+         INSTRUCTIONS
+            Enter 0 if you DO NOT want to apply all of the
+            statistical tests to each sequence and 1 if you DO.
+
+   Enter Choice: 1
+
+        P a r a m e t e r   A d j u s t m e n t s
+        -----------------------------------------
+    [1] Block Frequency Test - block length(M):         128
+    [2] NonOverlapping Template Test - block length(m): 9
+    [3] Overlapping Template Test - block length(m):    9
+    [4] Approximate Entropy Test - block length(m):     10
+    [5] Serial Test - block length(m):                  16
+    [6] Linear Complexity Test - block length(M):       500
+
+   Select Test (0 to continue): 0
+
+   How many bitstreams? 128
+
+   Input File Format:
+    [0] ASCII - A sequence of ASCII 0's and 1's
+    [1] Binary - Each byte in data file contains 8 bits of data
+
+   Select input mode:  1
+
+     Statistical Testing In Progress.........
+
+     Statistical Testing Complete!!!!!!!!!!!!
+
+$ 
diff --git a/test-results/rngtest.txt b/test-results/rngtest.txt
new file mode 100644 (file)
index 0000000..7b14745
--- /dev/null
@@ -0,0 +1,16 @@
+There is a tool named "rngtest" in rng-tools.  I use rng-tools of
+version 2-unofficial-mt.13-3 in Debian.
+
+=============================================
+rngtest: bits received from input: 2015920160
+rngtest: FIPS 140-2 successes: 100721
+rngtest: FIPS 140-2 failures: 75
+rngtest: FIPS 140-2(2001-10-10) Monobit: 12
+rngtest: FIPS 140-2(2001-10-10) Poker: 6
+rngtest: FIPS 140-2(2001-10-10) Runs: 30
+rngtest: FIPS 140-2(2001-10-10) Long run: 27
+rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
+rngtest: input channel speed: (min=122.503; avg=192.322; max=443.358)Kibits/s
+rngtest: FIPS tests speed: (min=1.351; avg=26.373; max=48.287)Mibits/s
+rngtest: Program run time: 10310668494 microseconds
+=============================================
diff --git a/tool/hub_ctrl.py b/tool/hub_ctrl.py
new file mode 100755 (executable)
index 0000000..721b7d1
--- /dev/null
@@ -0,0 +1,256 @@
+#! /usr/bin/python
+
+"""
+hub_ctrl.py - a tool to control port power/led of USB hub
+
+Copyright (C) 2006, 2011 Free Software Initiative of Japan
+
+Author: NIIBE Yutaka  <gniibe@fsij.org>
+
+This file is a part of Gnuk, a GnuPG USB Token implementation.
+
+Gnuk is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Gnuk is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import usb
+
+USB_RT_HUB             =       (usb.TYPE_CLASS | usb.RECIP_DEVICE)
+USB_RT_PORT            =       (usb.TYPE_CLASS | usb.RECIP_OTHER)
+USB_PORT_FEAT_RESET    =       4
+USB_PORT_FEAT_POWER    =       8
+USB_PORT_FEAT_INDICATOR =       22
+USB_DIR_IN             =       0x80             # device to host
+
+COMMAND_SET_NONE  = 0
+COMMAND_SET_LED   = 1
+COMMAND_SET_POWER = 2
+
+HUB_LED_GREEN     = 2
+
+def find_hubs(listing, verbose, busnum=None, devnum=None, hub=None):
+    number_of_hubs_with_feature = 0
+    hubs = []
+    busses = usb.busses()
+    if not busses:
+        raise ValueError, "can't access USB"
+
+    for bus in busses:
+        devices = bus.devices
+        for dev in devices:
+            if dev.deviceClass != usb.CLASS_HUB:
+                continue
+
+            printout_enable = 0
+            if (listing
+                or (verbose
+                    and ((bus.dirname == busnum and dev.devnum == devnumd)
+                         or hub == number_of_hubs_with_feature))):
+                printout_enable = 1
+
+            uh = dev.open()
+
+            desc = None
+            try:
+                # Get USB Hub descriptor
+                desc = uh.controlMsg(requestType = USB_DIR_IN | USB_RT_HUB, 
+                                     request = usb.REQ_GET_DESCRIPTOR,
+                                     value = usb.DT_HUB << 8,
+                                     index = 0, buffer = 1024, timeout = 1000)
+            finally:
+                del uh
+
+            if not desc:
+                continue
+
+            # desc[3] is lower byte of wHubCharacteristics
+            if (desc[3] & 0x80) == 0 and (desc[3] & 0x03) >= 2:
+                # Hub doesn't have features of controling port power/indicator
+                continue
+
+            if printout_enable:
+                print "Hub #%d at %s:%03d" % (number_of_hubs_with_feature,
+                                              bus.dirname, dev.devnum)
+                if (desc[3] & 0x03) == 0:
+                    print " INFO: ganged power switching."
+                elif (desc[3] & 0x03) == 1:
+                    print " INFO: individual power switching."
+                elif (desc[3] & 0x03) == 2 or (desc[3] & 0x03) == 3:
+                    print " WARN: no power switching."
+
+                if (desc[3] & 0x80) == 0:
+                    print " WARN: Port indicators are NOT supported."
+
+            hubs.append({ 'busnum' : bus.dirname, 'devnum' : dev.devnum,
+                          'indicator_support' : (desc[3] & 0x80) == 0x80,
+                          'dev' : dev, 'num_ports' : desc[2] })
+            number_of_hubs_with_feature += 1
+
+    return hubs
+
+def hub_port_status(handle, num_ports):
+    print " Hub Port Status:"
+    for i in range(num_ports):
+        port = i + 1
+        status = handle.controlMsg(requestType = USB_RT_PORT | usb.ENDPOINT_IN, 
+                                   request = usb.REQ_GET_STATUS,
+                                   value = 0,
+                                   index = port, buffer = 4,
+                                   timeout = 1000)
+
+        print "   Port %d: %02x%02x.%02x%02x" % (port, status[3], status[2],
+                                                 status[1], status[0]),
+        if status[1] & 0x10:
+            print " indicator", 
+        if status[1] & 0x08:
+            print " test" ,
+        if status[1] & 0x04:
+            print " highspeed",
+        if status[1] & 0x02:
+            print " lowspeed",
+        if status[1] & 0x01:
+            print " power",
+
+        if status[0] & 0x10:
+            print " RESET",
+        if status[0] & 0x08:
+            print " oc",
+        if status[0] & 0x04:
+            print " suspend",
+        if status[0] & 0x02:
+            print " enable",
+        if status[0] & 0x01:
+            print " connect",
+
+        print 
+
+import sys
+
+COMMAND_SET_NONE  = 0
+COMMAND_SET_LED   = 1
+COMMAND_SET_POWER = 2
+HUB_LED_GREEN  = 2
+
+def usage(progname):
+    print >> sys.stderr, """Usage: %s [{-h HUBNUM | -b BUSNUM -d DEVNUM}]
+          [-P PORT] [{-p [VALUE]|-l [VALUE]}]
+""" % progname
+
+def exit_with_usage(progname):
+    usage(progname)
+    exit(1)
+
+if __name__ == '__main__':
+    busnum = None
+    devnum = None
+    listing = False
+    verbose = False
+    hub = None
+    port = 1
+    cmd = COMMAND_SET_NONE
+
+    if len(sys.argv) == 1:
+        listing = True
+    else:
+        try:
+            while len(sys.argv) >= 2:
+                option = sys.argv[1]
+                sys.argv.pop(1)
+                if option == '-h':
+                    if bunum != None or devnum != None:
+                        exit_with_usage(sys.argv[0])
+                    hub = int(sys.argv[1])
+                    sys.argv.pop(1)
+                elif option == '-b':
+                    busnum = int(sys.argv[1])
+                    sys.argv.pop(1)
+                elif option == '-d':
+                    devnum = int(sys.argv[1])
+                    sys.argv.pop(1)
+                elif option == '-P':
+                    port = int(sys.argv[1])
+                    sys.argv.pop(1)
+                elif option == '-l':
+                    if cmd != COMMAND_SET_NONE:
+                        exit_with_usage(sys.argv[0])
+                    if len(sys.argv) > 1:
+                        value = int(sys.argv[1])
+                        sys.argv.pop(1)
+                    else:
+                        value = HUB_LED_GREEN
+                    cmd = COMMAND_SET_LED
+                elif option == '-p':
+                    if cmd != COMMAND_SET_NONE:
+                        exit_with_usage(sys.argv[0])
+                    if len(sys.argv) > 1:
+                        value = int(sys.argv[1])
+                        sys.argv.pop(1)
+                    else:
+                        value = 0
+                        cmd = COMMAND_SET_POWER
+                elif option == '-v':
+                    verbose = True
+                    if len(sys.argv) == 1:
+                        listing = True
+                else:
+                    exit_with_usage(sys.argv[0])
+        except:
+            exit_with_usage(sys.argv[0])
+
+    if ((busnum != None and devnum == None)
+        or (busnum == None and devnum != None)):
+        exit_with_usage(sys.argv[0])
+
+    if hub == None and busnum == None:
+        hub = 0                 # Default hub = 0
+
+    if cmd == COMMAND_SET_NONE:
+        cmd = COMMAND_SET_POWER
+
+    hubs = find_hubs(listing, verbose, busnum, devnum, hub)
+    if len(hubs) == 0:
+        print >> sys.stderr, "No hubs found."
+        exit(1)
+    if listing:
+        exit(0)
+
+    if hub == None:
+        for h in hubs:
+            if h['busnum'] == busnum and h['devnum'] == devnum:
+                dev_hub = h['dev']
+                nports = h['num_ports']
+    else:
+        dev_hub = hubs[hub]['dev']
+        nports = hubs[hub]['num_ports']
+
+    uh = dev_hub.open()
+    if cmd == COMMAND_SET_POWER:
+        feature = USB_PORT_FEAT_POWER
+        index = port
+        if value:
+            request = usb.REQ_SET_FEATURE
+        else:
+            request = usb.REQ_CLEAR_FEATURE
+    else:
+        request = usb.REQ_SET_FEATURE
+        feature = USB_PORT_FEAT_INDICATOR
+        index = (value << 8) | port
+    if verbose:
+        print "Send control message (REQUEST=%d, FEATURE=%d, INDEX=%d) " % (request, feature, index)
+
+    uh.controlMsg(requestType = USB_RT_PORT, request = request, value = feature,
+                  index = index, buffer = None, timeout = 1000)
+    if verbose:
+       hub_port_status(uh,nports)
+
+    del uh