packages feed

musig2-0.2.0: test/AggNonces.hs

{-# LANGUAGE OverloadedStrings #-}

module AggNonces (testAggNonces) where

import Crypto.Curve.Secp256k1 (_CURVE_ZERO)
import Crypto.Curve.Secp256k1.MuSig2 (PubNonce (..), aggNonces)
import Test.Tasty
import Test.Tasty.HUnit
import Util (parsePoint, parsePubNonce, unsafeRight)

-- | Input 'PubNonce's from BIP-0327 test vectors
inputPubNonces :: [PubNonce]
inputPubNonces =
  map
    parsePubNonce
    [ "020151C80F435648DF67A22B749CD798CE54E0321D034B92B709B567D60A42E66603BA47FBC1834437B3212E89A84D8425E7BF12E0245D98262268EBDCB385D50641"
    , "03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60248C264CDD57D3C24D79990B0F865674EB62A0F9018277A95011B41BFC193B833"
    , "020151C80F435648DF67A22B749CD798CE54E0321D034B92B709B567D60A42E6660279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
    , "03FF406FFD8ADB9CD29877E4985014F66A59F6CD01C0E88CAA8E5F3166B1F676A60379BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
    ]

-- | Test vector data: (input 'PubNonce' indices, expected 'PubNonce' result).
testVectors :: [([Int], PubNonce)]
testVectors =
  [ ([0, 1], parsePubNonce "035FE1873B4F2967F52FEA4A06AD5A8ECCBE9D0FD73068012C894E2E87CCB5804B024725377345BDE0E9C33AF3C43C0A29A9249F2F2956FA8CFEB55C8573D0262DC8")
  , -- Sum of second points encoded in the nonces is point at infinity which is serialized as 33 zero bytes.
    ([2, 3], PubNonce (parsePoint "035FE1873B4F2967F52FEA4A06AD5A8ECCBE9D0FD73068012C894E2E87CCB5804B") _CURVE_ZERO)
  ]

-- | Creates test case from vector data.
makeTestCase :: Int -> ([Int], PubNonce) -> TestTree
makeTestCase i (indices, expected) =
  testCase ("BIP-0327 test vector " <> show (i + 1)) $
    unsafeRight aggNonce @=? expected
 where
  selectedNonces = map (inputPubNonces !!) indices
  aggNonce = aggNonces selectedNonces

-- | Test vectors from [BIP-0327 `nonce_agg_vectors.json`](https://github.com/bitcoin/bips/blob/master/bip-0327/vectors/nonce_agg_vectors.json).
testAggNonces :: TestTree
testAggNonces =
  testGroup "aggregating pubkeys" $
    zipWith makeTestCase [0 ..] testVectors