cryptonite/tests/Number.hs
2015-05-23 15:55:05 +01:00

39 lines
1.7 KiB
Haskell

module Number (tests) where
import Imports
import Crypto.Number.Basic
import Crypto.Number.Generate
import Crypto.Number.Prime
import Data.Bits
tests = testGroup "number"
[ testProperty "num-bits" $ \(Positive i) ->
and [ (numBits (2^i-1) == i)
, (numBits (2^i) == i+1)
, (numBits (2^i + (2^i-1)) == i+1)
]
, testProperty "num-bits2" $ \(Positive i) ->
not (i `testBit` numBits i) && (i `testBit` (numBits i - 1))
, testProperty "generate-param" $ \testDRG (Positive bits) ->
let r = withTestDRG testDRG $ generateParams bits (Just SetHighest) False
in r >= 0 && numBits r == bits && testBit r (bits-1)
, testProperty "generate-param2" $ \testDRG (Positive m1bits) ->
let bits = m1bits + 1 -- make sure minimum is 2
r = withTestDRG testDRG $ generateParams bits (Just SetTwoHighest) False
in r >= 0 && numBits r == bits && testBit r (bits-1) && testBit r (bits-2)
, testProperty "generate-param-odd" $ \testDRG (Positive bits) ->
let r = withTestDRG testDRG $ generateParams bits Nothing True
in r >= 0 && odd r
, testProperty "generate-range" $ \testDRG (Positive range) ->
let r = withTestDRG testDRG $ generateMax range
in 0 <= r && r < range
, testProperty "generate-prime" $ \testDRG (Positive baseBits) ->
let bits = 8 + baseBits
prime = withTestDRG testDRG $ generatePrime bits
-- with small base bits numbers, the probability that we "cross" this bit size ness
-- to the next is quite high, as the number generated has two highest bit set.
--
in bits == numBits prime || (if baseBits < 80 then (bits + 1) == numBits prime else False)
]