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 }