github.com/0chain/gosdk@v1.17.11/core/zcncrypto/bls0chain_herumi_test.go (about)

     1  package zcncrypto
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/0chain/errors"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/0chain/gosdk/core/encryption"
    11  )
    12  
    13  var verifyPublickey = `e8a6cfa7b3076ae7e04764ffdfe341632a136b52953dfafa6926361dd9a466196faecca6f696774bbd64b938ff765dbc837e8766a5e2d8996745b2b94e1beb9e`
    14  var signPrivatekey = `5e1fc9c03d53a8b9a63030acc2864f0c33dffddb3c276bf2b3c8d739269cc018`
    15  var data = `TEST`
    16  var blsWallet *Wallet
    17  
    18  func TestSignatureScheme(t *testing.T) {
    19  	sigScheme := &HerumiScheme{}
    20  
    21  	w, err := sigScheme.GenerateKeys()
    22  	if err != nil {
    23  		t.Fatalf("Generate Key failed %s", errors.Top(err))
    24  	}
    25  	if w.ClientID == "" || w.ClientKey == "" || len(w.Keys) != 1 || w.Mnemonic == "" {
    26  		t.Fatalf("Invalid keys generated")
    27  	}
    28  	blsWallet = w
    29  
    30  }
    31  
    32  func TestSSSignAndVerify(t *testing.T) {
    33  	signScheme := NewSignatureScheme("bls0chain")
    34  	err := signScheme.SetPrivateKey(signPrivatekey)
    35  
    36  	require.NoError(t, err)
    37  
    38  	hash := Sha3Sum256(data)
    39  	signature, err := signScheme.Sign(hash)
    40  	if err != nil {
    41  		t.Fatalf("BLS signing failed")
    42  	}
    43  	verifyScheme := NewSignatureScheme("bls0chain")
    44  	err = verifyScheme.SetPublicKey(verifyPublickey)
    45  	require.NoError(t, err)
    46  	if ok, err := verifyScheme.Verify(signature, hash); err != nil || !ok {
    47  		t.Fatalf("Verification failed\n")
    48  	}
    49  }
    50  
    51  func TestSSA(t *testing.T) {
    52  	signScheme := NewSignatureScheme("bls0chain")
    53  	err := signScheme.SetPrivateKey("f482aa19d3a3f6cebcd4f8a99de292bcf4bf07e937be1350634086f4aa02e704")
    54  
    55  	require.NoError(t, err)
    56  
    57  	hash := Sha3Sum256("hello")
    58  	signature, err := signScheme.Sign(hash)
    59  	if err != nil {
    60  		t.Fatalf("BLS signing failed")
    61  	}
    62  	fmt.Println(signature)
    63  	// verifyScheme := NewSignatureScheme("bls0chain")
    64  	// err = verifyScheme.SetPublicKey(verifyPublickey)
    65  	// require.NoError(t, err)
    66  	// if ok, err := verifyScheme.Verify(signature, hash); err != nil || !ok {
    67  	// 	t.Fatalf("Verification failed\n")
    68  	// }
    69  }
    70  
    71  func TestVerify(t *testing.T) {
    72  	sk := "a931522f9949ff26b22db98b26e59cc92258457965f13ce6113cc2b5d2165513"
    73  	hash := "eb82aa875b3298ae7e625d8d8f13475004a4942bd8fcd7285e8ab9ad20651872"
    74  	sm := NewSignatureScheme("bls0chain")
    75  	if err2 := sm.SetPrivateKey(sk); err2 != nil {
    76  		t.Error(err2)
    77  	}
    78  	sig, _ := sm.Sign(hash)
    79  	fmt.Println("now sig:", sig)
    80  
    81  	pk := "47e94b6c5399f8c0005c6f3202dec43e37d171b0eff24d75cdcf14861f088106cf88df15b3335dcd0806365db4d1b3e70579a8bd82eb665c881ef2273d6bdd03"
    82  	verifyScheme := NewSignatureScheme("bls0chain")
    83  	if err := verifyScheme.SetPublicKey(pk); err != nil {
    84  		t.Error(err)
    85  	}
    86  	ok, err := verifyScheme.Verify(sig, hash)
    87  	require.NoError(t, err)
    88  	fmt.Println("verify result:", ok)
    89  }
    90  
    91  func BenchmarkBLSSign(b *testing.B) {
    92  	sigScheme := NewSignatureScheme("bls0chain")
    93  	err := sigScheme.SetPrivateKey(signPrivatekey)
    94  	require.NoError(b, err)
    95  	for i := 0; i < b.N; i++ {
    96  		_, err := sigScheme.Sign(encryption.Hash(data))
    97  		if err != nil {
    98  			b.Fatalf("BLS signing failed")
    99  		}
   100  	}
   101  }
   102  
   103  func TestRecoveryKeys(t *testing.T) {
   104  
   105  	sigScheme := &HerumiScheme{}
   106  
   107  	w, err := sigScheme.RecoverKeys(testMnemonic)
   108  	if err != nil {
   109  		t.Fatalf("set Recover Keys failed")
   110  	}
   111  
   112  	require.Equal(t, testHerumiPrivateKey, w.Keys[0].PrivateKey, "Recover key didn't match with private key")
   113  	require.Equal(t, testHerumiPublicKey, w.Keys[0].PublicKey, "Recover key didn't match with public key")
   114  }
   115  
   116  func TestCombinedSignAndVerify(t *testing.T) {
   117  	sk0 := `c36f2f92b673cf057a32e8bd0ca88888e7ace40337b737e9c7459fdc4c521918`
   118  	sk1 := `704b6f489583bf1118432fcfb38e63fc2d4b61e524fb196cbd95413f8eb91c12`
   119  	primaryKey := `f72fd53ee85e84157d3106053754594f697e0bfca1f73f91a41f7bb0797d901acefd80fcc2da98aae690af0ee9c795d6590c1808f26490306433b4e9c42f7b1f`
   120  
   121  	hash := Sha3Sum256(data)
   122  	// Create signatue for 1
   123  	sig0 := NewSignatureScheme("bls0chain")
   124  	err := sig0.SetPrivateKey(sk0)
   125  	if err != nil {
   126  		t.Fatalf("Set private key failed - %s", errors.Top(err))
   127  	}
   128  	signature, err := sig0.Sign(hash)
   129  	if err != nil {
   130  		t.Fatalf("BLS signing failed")
   131  	}
   132  	// Create signature for second
   133  	sig1 := NewSignatureScheme("bls0chain")
   134  	err = sig1.SetPrivateKey(sk1)
   135  	if err != nil {
   136  		t.Fatalf("Set private key failed - %s", errors.Top(err))
   137  	}
   138  	addSig, err := sig1.Add(signature, hash)
   139  
   140  	require.NoError(t, err)
   141  
   142  	verifyScheme := NewSignatureScheme("bls0chain")
   143  	err = verifyScheme.SetPublicKey(primaryKey)
   144  	if err != nil {
   145  		t.Fatalf("Set public key failed")
   146  	}
   147  	if ok, err := verifyScheme.Verify(addSig, hash); err != nil || !ok {
   148  		t.Fatalf("Verification failed\n")
   149  	}
   150  }
   151  
   152  func TestSplitKey(t *testing.T) {
   153  	primaryKeyStr := `872eac6370c72093535fa395ad41a08ee90c9d0d46df9461eb2515451f389d1b`
   154  	// primaryKeyStr := `c36f2f92b673cf057a32e8bd0ca88888e7ace40337b737e9c7459fdc4c521918`
   155  	sig0 := NewSignatureScheme("bls0chain")
   156  	err := sig0.SetPrivateKey(primaryKeyStr)
   157  	if err != nil {
   158  		t.Fatalf("Set private key failed - %s", errors.Top(err))
   159  	}
   160  	data = "823bb3dc0b80a6c86922a884e63908cb9e963ef488688b41e32cbf4d84471a1f"
   161  	hash := Sha3Sum256(data)
   162  	signature, err := sig0.Sign(hash)
   163  	if err != nil {
   164  		t.Fatalf("BLS signing failed")
   165  	}
   166  	numSplitKeys := int(2)
   167  	w, err := sig0.SplitKeys(numSplitKeys)
   168  	if err != nil {
   169  		t.Fatalf("Splitkeys key failed - %s", errors.Top(err))
   170  	}
   171  	sigAggScheme := make([]SignatureScheme, numSplitKeys)
   172  	for i := 0; i < numSplitKeys; i++ {
   173  		sigAggScheme[i] = NewSignatureScheme("bls0chain")
   174  		err = sigAggScheme[i].SetPrivateKey(w.Keys[i].PrivateKey)
   175  		fmt.Println("seckey:", sigAggScheme[i].GetPrivateKey())
   176  
   177  		require.NoError(t, err)
   178  	}
   179  	var aggrSig string
   180  	for i := 1; i < numSplitKeys; i++ {
   181  		tmpSig, _ := sigAggScheme[i].Sign(hash)
   182  		fmt.Println("tmpSig:", tmpSig)
   183  		aggrSig, _ = sigAggScheme[0].Add(tmpSig, hash)
   184  	}
   185  	if aggrSig != signature {
   186  		t.Fatalf("split key signature failed")
   187  	}
   188  	fmt.Println("aggrSig:", aggrSig)
   189  }