#!/usr/bin/env python # sp800_22_monobit_test.py # # Copyright (C) 2017 David Johnston # This program is distributed under the terms of the GNU General Public License. # # This file is part of sp800_22_tests. # # sp800_22_tests 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. # # sp800_22_tests 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 sp800_22_tests. If not, see <http://www.gnu.org/licenses/>. from __future__ import print_function import math def count_ones_zeroes(bits): ones = 0 zeroes = 0 for bit in bits: if (bit == 1): ones += 1 else: zeroes += 1 return (zeroes,ones) def monobit_test(bits): n = len(bits) zeroes,ones = count_ones_zeroes(bits) s = abs(ones-zeroes) print(" Ones count = %d" % ones) print(" Zeroes count = %d" % zeroes) p = math.erfc(float(s)/(math.sqrt(float(n)) * math.sqrt(2.0))) success = (p >= 0.01) return (success,p,None)