github.com/cloudflare/circl@v1.5.0/sign/ed448/wycheproof_test.go (about)

     1  package ed448_test
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	"encoding/json"
     7  	"io"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/cloudflare/circl/internal/test"
    12  	"github.com/cloudflare/circl/sign/ed448"
    13  )
    14  
    15  type group struct {
    16  	Key struct {
    17  		Curve string `json:"curve"`
    18  		Size  int    `json:"keySize"`
    19  		Pk    string `json:"pk"`
    20  		Sk    string `json:"sk"`
    21  		Type  string `json:"type"`
    22  	} `json:"key"`
    23  	Type  string `json:"type"`
    24  	Tests []struct {
    25  		TcID    int      `json:"tcId"`
    26  		Comment string   `json:"comment"`
    27  		Msg     string   `json:"msg"`
    28  		Sig     string   `json:"sig"`
    29  		Result  string   `json:"result"`
    30  		Flags   []string `json:"flags"`
    31  	} `json:"tests"`
    32  }
    33  
    34  type Wycheproof struct {
    35  	Alg     string  `json:"algorithm"`
    36  	Version string  `json:"generatorVersion"`
    37  	Num     int     `json:"numberOfTests"`
    38  	Groups  []group `json:"testGroups"`
    39  }
    40  
    41  func (kat *Wycheproof) readFile(t *testing.T, fileName string) {
    42  	jsonFile, err := os.Open(fileName)
    43  	if err != nil {
    44  		t.Fatalf("File %v can not be opened. Error: %v", fileName, err)
    45  	}
    46  	defer jsonFile.Close()
    47  	input, err := io.ReadAll(jsonFile)
    48  	if err != nil {
    49  		t.Fatalf("File %v can not be read. Error: %v", fileName, err)
    50  	}
    51  
    52  	err = json.Unmarshal(input, &kat)
    53  	if err != nil {
    54  		t.Fatalf("File %v can not be loaded. Error: %v", fileName, err)
    55  	}
    56  }
    57  
    58  func (kat *Wycheproof) keyPair(t *testing.T) {
    59  	for i, g := range kat.Groups {
    60  		if g.Key.Curve != "edwards448" {
    61  			t.Errorf("Curve not expected %v", g.Key.Curve)
    62  		}
    63  		private, _ := hex.DecodeString(g.Key.Sk)
    64  		public, _ := hex.DecodeString(g.Key.Pk)
    65  		keys := ed448.NewKeyFromSeed(private)
    66  		got := keys.Public().(ed448.PublicKey)
    67  		want := public
    68  
    69  		if !bytes.Equal(got, want) {
    70  			test.ReportError(t, got, want, i, g.Key.Sk)
    71  		}
    72  	}
    73  }
    74  
    75  func (kat *Wycheproof) verify(t *testing.T) {
    76  	ctx := []byte{}
    77  
    78  	for i, g := range kat.Groups {
    79  		for _, gT := range g.Tests {
    80  			isValid := gT.Result == "valid"
    81  			private, _ := hex.DecodeString(g.Key.Sk)
    82  			public, _ := hex.DecodeString(g.Key.Pk)
    83  			sig, _ := hex.DecodeString(gT.Sig)
    84  			msg, _ := hex.DecodeString(gT.Msg)
    85  
    86  			priv := ed448.NewKeyFromSeed(private)
    87  			got := priv.Public().(ed448.PublicKey)
    88  			want := public
    89  			if !bytes.Equal(got, want) {
    90  				test.ReportError(t, got, want, i, gT.TcID)
    91  			}
    92  			if isValid {
    93  				got := ed448.Sign(priv, msg, string(ctx))
    94  				want := sig
    95  				if !bytes.Equal(got, want) {
    96  					test.ReportError(t, got, want, i, gT.TcID)
    97  				}
    98  			}
    99  			{
   100  				got := ed448.Verify(priv.Public().(ed448.PublicKey), msg, sig, string(ctx))
   101  				want := isValid
   102  				if got != want {
   103  					test.ReportError(t, got, want, i, gT.TcID)
   104  				}
   105  			}
   106  		}
   107  	}
   108  }
   109  
   110  func TestWycheproof(t *testing.T) {
   111  	// Test vectors from Wycheproof v0.4.12
   112  	var kat Wycheproof
   113  	kat.readFile(t, "testdata/wycheproof_Ed448.json")
   114  	t.Run("EDDSAKeyPair", kat.keyPair)
   115  	t.Run("EDDSAVerify", kat.verify)
   116  }