packages feed

paseto-0.1.0.0: test/Test/Crypto/Paseto/Keys/V3/Gen.hs

module Test.Crypto.Paseto.Keys.V3.Gen
  ( genScalarP384
  , genPrivateKeyP384
  , genKeyPairP384
  ) where

import Crypto.Paseto.Keys.V3
  ( PrivateKeyP384
  , PublicKeyP384
  , curveP384
  , fromPrivateKeyP384
  , isScalarValidP384
  , mkPrivateKeyP384
  )
import qualified Crypto.PubKey.ECC.ECDSA as Crypto
import qualified Crypto.PubKey.ECC.Types as Crypto
import Hedgehog ( Gen )
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Prelude

-- | Generate a valid scalar value for curve P384.
genScalarP384 :: Gen Integer
genScalarP384 =
  Gen.filter isScalarValidP384 (Gen.integral (Range.constant 1 (n - 1)))
  where
    n :: Integer
    n = Crypto.ecc_n (Crypto.common_curve curveP384)

-- | Generate a 'PrivateKeyP384'.
genPrivateKeyP384 :: Gen PrivateKeyP384
genPrivateKeyP384 = do
  s <- genScalarP384
  case mkPrivateKeyP384 (Crypto.PrivateKey curveP384 s) of
    Nothing -> fail "Failed to generate a scalar value"
    Just x -> pure x

genKeyPairP384 :: Gen (PublicKeyP384, PrivateKeyP384)
genKeyPairP384 = toKeyPair <$> genPrivateKeyP384
  where
    toKeyPair privateKey = (fromPrivateKeyP384 privateKey, privateKey)