github.com/mavryk-network/mvgo@v1.19.9/mavryk/sig_test.go (about)

     1  // Copyright (c) 2023 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc
     3  
     4  package mavryk
     5  
     6  import (
     7  	"bytes"
     8  	"testing"
     9  )
    10  
    11  func TestSig(t *testing.T) {
    12  	type testcase struct {
    13  		Name  string
    14  		Sig   string
    15  		Type  SignatureType
    16  		Bytes string
    17  	}
    18  
    19  	cases := []testcase{
    20  		// edsig
    21  		{
    22  			Name:  "edsig",
    23  			Sig:   "edsigtzWvLTwvEqaZy1BMzQoeFTCxALJ94aDx5YyDh6qhYNQowHfAb7k23doKazVMGvGnT6bCeTG9qbJfBqRqeL64zpEFLJyp9C",
    24  			Type:  SignatureTypeEd25519,
    25  			Bytes: "00cc2854776cd0ece57f46a03fde2cce2b95798409f344f379a7a7a0f8835b3fdc76a7fa6827c72f52eeebf2508d35e7b8ac63c90372fa3cb0aaa98c06f96c5e05",
    26  		},
    27  		// spsig
    28  		{
    29  			Name:  "spsig",
    30  			Sig:   "spsig1Joen9pavJsoyjRQ6xEHFEDvB3WUDxX9LxbJKstvXss8b5tJpRqZBMPvWqvQ5xqavjcvpDe4TyvcfJjuYxKBeqGtSUAkBr",
    31  			Type:  SignatureTypeSecp256k1,
    32  			Bytes: "01635310a0b871b948e38dc476edcb9f135a8f148609243a60d9ddccf8b15a350769c2f80fa30fbd1504e84ab88277f081bde79adb2416a898b1e88d0b2e692ceb",
    33  		},
    34  		// p2sig
    35  		{
    36  			Name:  "p2sig",
    37  			Sig:   "p2sigSDjb3CfSRVEYt9X75HAFe29Tf3hqSrQRsnyxvD8k7NDka9SY7oxDmZQGngJcD5E7E4AmVD2iiSveWtWYwT3mMurSMZicA",
    38  			Type:  SignatureTypeP256,
    39  			Bytes: "0225967eb0e75b6a4cab2d764ab0fce1304c6dbca43e7e5f562a8685294226f05f062b4ea9188ac5c5332ccdebdaf465d05c317a8c82a06d649c1ca0f9ac2fb5ac",
    40  		},
    41  		// BLsig
    42  		{
    43  			Name:  "BLsig",
    44  			Sig:   "BLsigAqfbS14US8aPsoe6xu6VbQ3ukXZGbhx7X3WVmk2UpTvkZW4bkEctwvZ8S8ajprdDUfArjc6m4JqWRpffpK6jHKc23hToq8LtCs1fqXB3nfPeAQqiqo5Fe6DoomuJi9NXMMxLQ8N8k",
    45  			Type:  SignatureTypeBls12_381,
    46  			Bytes: "03a25136c9169bf72d62260b49e55c02371e827a5c58b1d5f92b3caee7b90f3abaa4fd384ecbe0489dd06cb2a2f64dcbfe0080508b5593ccdb15c13ab904bab34082db468fae469881568b5afcc70979d964412e1342e3b85f6a9a9b70fbfac021",
    47  		},
    48  		// sig
    49  		{
    50  			Name:  "sig",
    51  			Sig:   "sigphTDQj1xuPXupC4rNxTJ9vSPWDD5wMMhsDUxkqiY2PrdTia6DpvxaZQYPsZBT6S1Z7aiwUnzyLtT3PdzBk6omA9TpiPrq",
    52  			Type:  SignatureTypeGeneric,
    53  			Bytes: "cc2854776cd0ece57f46a03fde2cce2b95798409f344f379a7a7a0f8835b3fdc76a7fa6827c72f52eeebf2508d35e7b8ac63c90372fa3cb0aaa98c06f96c5e05",
    54  		},
    55  		// asig
    56  		// {
    57  		//     Name:  "asig",
    58  		//     Sig:   "",
    59  		//     Type:  SignatureTypeGenericAggregate,
    60  		//     Bytes: "",
    61  		// },
    62  	}
    63  
    64  	for _, c := range cases {
    65  		buf := MustDecodeString(c.Bytes)
    66  
    67  		// base58 must parse
    68  		sig, err := ParseSignature(c.Sig)
    69  		if err != nil {
    70  			t.Fatalf("%s: parsing signature %s: %v", c.Name, c.Sig, err)
    71  		}
    72  
    73  		// check type
    74  		if got, want := sig.Type, c.Type; got != want {
    75  			t.Errorf("%s: mismatched type got=%s want=%s", c.Name, got, want)
    76  		}
    77  
    78  		// check hash
    79  		if !bytes.Equal(sig.Bytes(), buf) {
    80  			t.Errorf("%s: mismatched hash got=%x want=%x", c.Name, sig.Bytes(), buf)
    81  		}
    82  
    83  		// marshal text
    84  		out, err := sig.MarshalText()
    85  		if err != nil {
    86  			t.Errorf("%s: marshal text unexpected error: %v", c.Name, err)
    87  		}
    88  
    89  		if got, want := string(out), c.Sig; got != want {
    90  			t.Errorf("%s: mismatched text encoding got=%s want=%s", c.Name, got, want)
    91  		}
    92  
    93  		// unmarshal from bytes
    94  		var s2 Signature
    95  		err = s2.UnmarshalBinary(buf)
    96  		if err != nil {
    97  			t.Fatalf("%s: unmarshal binary %s: %v", c.Name, c.Bytes, err)
    98  		}
    99  
   100  		if !s2.Equal(sig) {
   101  			t.Errorf("%s: mismatched signature got=%s want=%s", c.Name, s2, sig)
   102  		}
   103  
   104  		// unmarshal text
   105  		err = s2.UnmarshalText([]byte(c.Sig))
   106  		if err != nil {
   107  			t.Fatalf("%s: unmarshal text %s: %v", c.Name, c.Sig, err)
   108  		}
   109  
   110  		if !s2.Equal(sig) {
   111  			t.Errorf("%s: mismatched signature got=%s want=%s", c.Name, s2, sig)
   112  		}
   113  	}
   114  }
   115  
   116  func TestInvalidSig(t *testing.T) {
   117  	// invalid base58 string
   118  	if _, err := ParseAddress("sigVZ3WLNWdhN7VmZxjVycgkkjmGJqSZyAmWctqueGX6NGgdtxCkBMXmyYmREiVpJ3zSMLZFvbksANKnKCs3soZrsVi999tX"); err == nil {
   119  		t.Errorf("Expected error on invalid base58 string")
   120  	}
   121  
   122  	// init from invalid short hash
   123  	hash := MustDecodeString("0b78887fdd0cd3bfbe75a717655728e0205bb9")
   124  	s := NewSignature(SignatureTypeEd25519, hash)
   125  	if s.IsValid() {
   126  		t.Errorf("Expected invalid signature from short hash")
   127  	}
   128  
   129  	// init from invalid empty bytes
   130  	s = NewSignature(SignatureTypeEd25519, nil)
   131  	if s.IsValid() {
   132  		t.Errorf("Expected invalid signature from nil hash")
   133  	}
   134  
   135  	// decode from short buffer
   136  	err := s.UnmarshalBinary(MustDecodeString("000b78887fdd0cd3bfbe75a717655728e0205bb9"))
   137  	if err == nil || s.IsValid() {
   138  		t.Errorf("Expected unmarshal error from short buffer")
   139  	}
   140  
   141  	// decode from nil buffer
   142  	err = s.UnmarshalBinary(nil)
   143  	if err == nil || s.IsValid() {
   144  		t.Errorf("Expected unmarshal error from short buffer")
   145  	}
   146  
   147  	// decode from invalid buffer (wrong type)
   148  	// err = s.UnmarshalBinary(MustDecodeString(""))
   149  	// if err == nil || s.IsValid() {
   150  	//     t.Errorf("Expected unmarshal error from invalid buffer")
   151  	// }
   152  }