Giter Club home page Giter Club logo

sp800_22_tests's Introduction

sp800_22_tests

A python implementation of the SP800-22 Rev 1a PRNG test suite.

The NIST STS-2.1.2 implementation of the SP800-22 Rev1a tests has some problems. It tends to crash a lot and give the wrong result.

This implementation provides a separate python file, one for each test and a program to read a binary data file and send it to each of the tests. The summary results are output at the end.

In the example below a 1 Mibibit uniform random binary file is generated with djenrandom (https://github.com/dj-on-github/djenrandom) and run through the test.

$ djenrandom -b -k 128 > megabitrand.bin
$ ./sp800_22_tests.py megabitrand.bin
Tests of Distinguishability from Random
TEST: monobit_test
  Ones count   = 523619
  Zeroes count = 524957
  PASS
  P=0.191334792562

[ Lots of per test output ]

SUMMARY
-------
monobit_test                             0.191334792562   PASS
frequency_within_block_test              0.866040491238   PASS
runs_test                                0.45073315513    PASS
longest_run_ones_in_a_block_test         0.464001170438   PASS
binary_matrix_rank_test                  0.405449005115   PASS
dft_test                                 0.852965102607   PASS
non_overlapping_template_matching_test   1.0              PASS
overlapping_template_matching_test       0.91976483935    PASS
maurers_universal_test                   0.998884573989   PASS
linear_complexity_test                   0.0406698787073  PASS
serial_test                              0.895646559993   PASS
approximate_entropy_test                 0.895690030562   PASS
cumulative_sums_test                     0.18603533058    PASS
random_excursion_test                    0.151908516968   PASS
random_excursion_variant_test            0.019160041631   PASS

Next we create a biased data file, where the probability of a 1 is 40% and a 0 is 60% and run it through the test.

$ djenrandom -b -k 128 -m biased --bias=0.4 > biased_megabitrand.bin
$ ./sp800_22_tests.py biased_megabitrand.bin
Tests of Distinguishability from Random
TEST: monobit_test
  Ones count   = 420122
  Zeroes count = 628454
  FAIL

[ Lots of per test output ]

SUMMARY
-------
monobit_test                             0.0                FAIL
frequency_within_block_test              0.0                FAIL
runs_test                                0.0                FAIL
longest_run_ones_in_a_block_test         1.81518103863e-81  FAIL
binary_matrix_rank_test                  0.22156738316      PASS
dft_test                                 3.56787241447e-17  FAIL
non_overlapping_template_matching_test   0.759928185368     PASS
overlapping_template_matching_test       5.31335556946e-91  FAIL
maurers_universal_test                   0.910613044038     PASS
linear_complexity_test                   0.317575269575     PASS
serial_test                              0.0                FAIL
approximate_entropy_test                 0.0                FAIL
cumulative_sums_test                     0.0                FAIL
random_excursion_test                    9.15178471457e-06  FAIL
random_excursion_variant_test            0.121267812518     PASS

Next we create some serially correlated data and run it through the tests.

$ djenrandom -b -k 128 -m correlated --correlation=-0.2 > correlated_megrandom.bin
$ ./sp800_22_tests.py correlated_megabitrand.bin
Tests of Distinguishability from Random
TEST: monobit_test
  Ones count   = 524242
  Zeroes count = 524334
  PASS
  P=0.928411381275

[ Lots of per test output ]

SUMMARY
-------
monobit_test                             0.928411381275     PASS
frequency_within_block_test              0.99598493834      PASS
runs_test                                0.0                FAIL
longest_run_ones_in_a_block_test         3.45886379519e-81  FAIL
binary_matrix_rank_test                  0.379259346315     PASS
dft_test                                 8.67506291511e-16  FAIL
non_overlapping_template_matching_test   0.999999863695     PASS
overlapping_template_matching_test       1.1953875512e-90   FAIL
maurers_universal_test                   0.923207164612     PASS
linear_complexity_test                   0.47696777353      PASS
serial_test                              0.0                FAIL
approximate_entropy_test                 0.0                FAIL
cumulative_sums_test                     0.853890590584     PASS
random_excursion_test                    7.63411305092e-09  FAIL
random_excursion_variant_test            0.0662033926665    PASS

Next we create some data with both bias and serial correlation from an Ornstein–Uhlenbeck process and run it through the tool

$ djenrandom -b -k 128 -m sums -l 0.2 -r 0.3 > sums_megrandom.bin
$ ./sp800_22_tests.py sums_megrandom.bin
Tests of Distinguishability from Random
TEST: monobit_test
  Ones count   = 419429
  Zeroes count = 629147
  FAIL
  P=0.0

[ Lots of per test output ]

SUMMARY
-------
monobit_test                             0.0                FAIL
frequency_within_block_test              0.0                FAIL
runs_test                                0.0                FAIL
longest_run_ones_in_a_block_test         2.32811341972e-159 FAIL
binary_matrix_rank_test                  0.702984863193     PASS
dft_test                                 7.91957168353e-06  FAIL
non_overlapping_template_matching_test   0.949847572332     PASS
overlapping_template_matching_test       1.16046343793e-137 FAIL
maurers_universal_test                   0.90191137295      PASS
linear_complexity_test                   0.16038668337      PASS
serial_test                              0.0                FAIL
approximate_entropy_test                 0.0                FAIL
cumulative_sums_test                     0.0                FAIL
random_excursion_test                    2.20517667303e-09  FAIL
random_excursion_variant_test            0.0                FAIL

sp800_22_tests's People

Contributors

dj-on-github avatar intelentropyreport avatar recvfrom avatar greendow avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.