hsblst-0.0.1: test/Test/BLST/Util.hs
-- SPDX-FileCopyrightText: 2022 Serokell <https://serokell.io>
-- SPDX-License-Identifier: MPL-2.0
{-# OPTIONS_GHC -Wwarn #-}
module Test.BLST.Util
( fromHex
, toHex
, deserializePoint
, deserializePoint'
, fromHex'
, deserializeAffine'
) where
import Data.ByteArray (Bytes)
import Data.ByteArray qualified as BA
import Data.ByteArray.Sized (SizedByteArray)
import Data.ByteArray.Sized qualified as AS
import Data.Maybe (fromJust, fromMaybe)
import Data.Proxy (Proxy(..))
import Data.Text (Text, unpack)
import GHC.TypeNats (KnownNat, natVal)
import System.IO.Unsafe (unsafePerformIO)
import Text.Hex (decodeHex, encodeHex)
import Crypto.BLST.Internal.Bindings qualified as B
import Crypto.BLST.Internal.Classy qualified as C
fromHex :: forall n. (KnownNat n) => Text -> SizedByteArray n Bytes
fromHex arg = AS.convert
. fromMaybe (error $ "Expected " <> show (natVal @n Proxy) <> " bytes got " <> unpack arg)
. AS.sizedByteArray . fromJust . decodeHex
$ arg
fromHex' :: BA.ByteArray a => Text -> a
fromHex' = BA.convert . fromJust . decodeHex
toHex :: BA.ByteArray a => SizedByteArray n a -> Text
toHex = encodeHex . BA.convert . AS.unSizedByteArray
deserializePoint :: C.IsPoint p => Text -> B.Point p
deserializePoint = unsafePerformIO . C.fromAffine . deserializeAffine
deserializePoint' :: C.IsPoint p => SizedByteArray (C.SerializedSize p) Bytes -> B.Point p
deserializePoint' = unsafePerformIO . C.fromAffine . deserializeAffine'
deserializeAffine :: C.IsPoint p => Text -> B.Affine p
deserializeAffine = deserializeAffine' . fromHex
deserializeAffine' :: C.IsPoint p => SizedByteArray (C.SerializedSize p) Bytes -> B.Affine p
deserializeAffine' = unsafePerformIO . fmap (either (error . show) id) . C.deserialize