github.com/prysmaticlabs/prysm@v1.4.4/spectest/general/phase0/bls/fast_aggregate_verify_test.go (about) 1 package bls 2 3 import ( 4 "encoding/hex" 5 "errors" 6 "path" 7 "testing" 8 9 "github.com/ghodss/yaml" 10 "github.com/prysmaticlabs/prysm/shared/bls" 11 "github.com/prysmaticlabs/prysm/shared/bls/common" 12 "github.com/prysmaticlabs/prysm/shared/bytesutil" 13 "github.com/prysmaticlabs/prysm/shared/testutil" 14 "github.com/prysmaticlabs/prysm/shared/testutil/require" 15 "github.com/prysmaticlabs/prysm/spectest/utils" 16 ) 17 18 func TestFastAggregateVerify(t *testing.T) { 19 t.Run("blst", testFastAggregateVerify) 20 } 21 22 func testFastAggregateVerify(t *testing.T) { 23 testFolders, testFolderPath := utils.TestFolders(t, "general", "phase0", "bls/fast_aggregate_verify/small") 24 25 for i, folder := range testFolders { 26 t.Run(folder.Name(), func(t *testing.T) { 27 file, err := testutil.BazelFileBytes(path.Join(testFolderPath, folder.Name(), "data.yaml")) 28 require.NoError(t, err) 29 test := &FastAggregateVerifyTest{} 30 require.NoError(t, yaml.Unmarshal(file, test)) 31 32 pubkeys := make([]common.PublicKey, len(test.Input.Pubkeys)) 33 for j, raw := range test.Input.Pubkeys { 34 pkBytes, err := hex.DecodeString(raw[2:]) 35 require.NoError(t, err) 36 pk, err := bls.PublicKeyFromBytes(pkBytes) 37 if err != nil { 38 if test.Output == false && errors.Is(err, common.ErrInfinitePubKey) { 39 return 40 } 41 t.Fatalf("cannot unmarshal pubkey: %v", err) 42 } 43 pubkeys[j] = pk 44 } 45 46 msg := test.Input.Message 47 // TODO(#7632): Remove when https://github.com/ethereum/eth2.0-spec-tests/issues/22 is resolved. 48 if msg == "" { 49 msg = test.Input.Messages 50 } 51 msgBytes, err := hex.DecodeString(msg[2:]) 52 require.NoError(t, err) 53 sigBytes, err := hex.DecodeString(test.Input.Signature[2:]) 54 require.NoError(t, err) 55 sig, err := bls.SignatureFromBytes(sigBytes) 56 if err != nil { 57 if test.Output == false { 58 return 59 } 60 t.Fatalf("Cannot unmarshal input to signature: %v", err) 61 } 62 63 verified := sig.FastAggregateVerify(pubkeys, bytesutil.ToBytes32(msgBytes)) 64 if verified != test.Output { 65 t.Fatalf("Signature does not match the expected verification output. "+ 66 "Expected %#v but received %#v for test case %d", test.Output, verified, i) 67 } 68 t.Log("Success") 69 }) 70 } 71 }