packages feed

saltine-0.2.2.0: tests/SignProperties.hs

{-# LANGUAGE OverloadedStrings #-}

module SignProperties (
  testSign
  ) where

import           Util
import           Crypto.Saltine.Class

import           Crypto.Saltine.Core.Sign
import           Crypto.Saltine.Internal.Sign
import qualified Crypto.Saltine.Core.Box              as Box
import           Crypto.Saltine.Core.ScalarMult       ()
import           Crypto.Saltine.Internal.ScalarMult
import qualified Data.ByteString                      as S
import           Data.Maybe                           (fromJust)
import           Test.Framework.Providers.QuickCheck2
import           Test.Framework
import           Test.QuickCheck

testSign :: Test
testSign = buildTest $ do
  kp1 <- newKeypair
  let sk1 = secretKey kp1
  let pk1 = publicKey kp1
  kp2 <- newKeypair
  let sk2 = secretKey kp2
  let pk2 = publicKey kp2
  n <- Box.newNonce

  return $ testGroup "...Internal.Sign" [

    testProperty "Verifies signed message"
    $ \(Message bs) -> signOpen pk1 (sign sk1 bs) == Just bs,

    testProperty "Verifies signed message w/ detached signature"
    $ \(Message bs) -> signVerifyDetached pk1 (signDetached sk1 bs) bs,

    testProperty "Signed message longer than message"
    $ \(Message bs) -> S.length (sign sk1 bs) >= S.length bs,

    testProperty "Rejects message with mismatched key"
    $ \(Message bs) -> not (S.null bs) ==>
                         signOpen pk2 (sign sk1 bs) == Nothing,

    testProperty "Rejects message with mismatched key w/ detached signature"
    $ \(Message bs) -> not (S.null bs) ==>
                         not (signVerifyDetached pk2 (signDetached sk1 bs) bs),

    testProperty "Ed25515 -> Curve25519 conversion produces valid keypairs"
    $ \(Message bs) ->
        let p1 = fromJust . decode . unGE . fromJust $ signPublicKeyToScalarMult pk1
            s1 = fromJust . decode . unSc . fromJust $ signSecretKeyToScalarMult sk1

            p2 = fromJust . decode . unGE . fromJust $ signPublicKeyToScalarMult pk2
            s2 = fromJust . decode . unSc . fromJust $ signSecretKeyToScalarMult sk2

        in  (Box.boxOpen p2 s1 n (Box.box p1 s2 n bs)) == Just bs
    ]