packages feed

hsblst-0.0.1: test/Test/BLST/Tezos.hs

-- SPDX-FileCopyrightText: 2022 Serokell <https://serokell.io>
-- SPDX-License-Identifier: MPL-2.0

-- | Test for interoperability with Tezos.
module Test.BLST.Tezos
  ( test_tezos
  ) where

import Data.ByteArray (convert)
import Data.ByteString (ByteString)
import Test.Tasty (TestTree)
import Test.Tasty.HUnit (testCase, (@?=))

import Crypto.BLST qualified as BLST

import Test.BLST.Util

test_tezos :: TestTree
test_tezos = testCase "Congruity with tezos" $ do
  let sk_ser =
        "79cc407e6917b5673a1f6966c23c9e15\
        \d257e5ab46cfe7b9b2f64200f2b2843e"
      pk_exp_ser =
        "b6cf94b6a59d102044d1ff16ebe3eccc\
        \5cd554965bb66ac80fb2728c18715817\
        \e185fb5ac9437908c9e609a742610177"
      signature =
        "8b7cd0689ad2eb42de97258d34db9eb3\
        \8585ec1b1f5be3c4ff580fb3147e33f6\
        \7246cf192b16ded6e9194720a11bf59d\
        \179cea087ef8c03c227ce10ce78bb1c7\
        \4c592e148d9ad0e1cf361b47e1235628\
        \fcf54ccbf6e8bda31f177107377dccda"
      sk = BLST.deserializeSk $ fromHex sk_ser
      pk = BLST.skToPk sk :: BLST.PublicKey 'BLST.G1
      pk_exp = BLST.decompressPk $ fromHex pk_exp_ser
      bytes = "\x12\x34\x56" :: ByteString
      sig = BLST.sign sk msg dst
      sig_ser :: BLST.Signature 'BLST.G1 'BLST.Hash =
        either (error "failed to decompress") id $ BLST.decompressSignature $ fromHex signature
      dst = Just ("BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_AUG_" :: ByteString)
      msg = convert (BLST.compressPk pk) <> bytes
  Right pk @?= pk_exp
  toHex (BLST.compressPk pk) @?= pk_exp_ser
  toHex (BLST.serializeSk sk) @?= sk_ser
  BLST.verify sig_ser pk msg dst @?= BLST.BlstSuccess
  sig @?= sig_ser