//go:build ignore // Prints the Go reference verdict for every encoding in // src/lib/dkc/testing/bls12381-vectors.json, as a JSON object from label to // "point", "identity" or "invalid". The decoding is the one profile.Validate // uses: the KeyGroup of the drand crypto scheme (G1 for the unchained scheme, // G2 for bls-unchained-g1-rfc9380, Quicknet), whose UnmarshalBinary is // kyber-bls12381 over kilic/bls12-381 FromCompressed, and Equal(Null()) for the // identity. Run it from a scratch module that requires the reference // implementation (replace g.activething.com/go/DateKeys => ../datekeys-go and // GOFLAGS=-mod=mod), passing the path of the vectors file: // // go run bls12381-go-verdicts.go path/to/bls12381-vectors.json package main import ( "encoding/hex" "encoding/json" "fmt" "os" "github.com/drand/drand/v2/crypto" ) func main() { raw, err := os.ReadFile(os.Args[1]) if err != nil { panic(err) } var file struct { Vectors []struct{ Label, Group, Hex string } } if err := json.Unmarshal(raw, &file); err != nil { panic(err) } g1, _ := crypto.GetSchemeByID(crypto.UnchainedSchemeID) g2, _ := crypto.GetSchemeByID(crypto.SigsOnG1ID) out := map[string]string{} for _, v := range file.Vectors { s := g1 if v.Group == "G2" { s = g2 } b, err := hex.DecodeString(v.Hex) if err != nil { panic(err) } k := s.KeyGroup.Point() switch { case k.UnmarshalBinary(b) != nil: out[v.Label] = "invalid" case k.Equal(k.Null()): out[v.Label] = "identity" default: out[v.Label] = "point" } } j, err := json.MarshalIndent(out, "", " ") if err != nil { panic(err) } fmt.Println(string(j)) }