github.com/jiajun1992/watercarver@v0.0.0-20191031150618-dfc2b17c0c4a/go-ethereum/ctcrypto/crypto/multiexp_test.go (about) 1 package crypto 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "testing" 7 ) 8 9 const maxN = 64 10 const maxM = 16 11 12 func get_exponent(base Key, idx uint64) Key { 13 14 salt := "bulletproof" 15 var idx_buf [9]byte 16 17 idx_buf_size := binary.PutUvarint(idx_buf[:], idx) 18 19 hash_buf := append(base[:], []byte(salt)...) 20 hash_buf = append(hash_buf, idx_buf[:idx_buf_size]...) 21 22 output_hash_good := Key(Keccak256(hash_buf[:])) 23 24 return Key(output_hash_good.HashToPoint()) 25 26 } 27 28 func init() { 29 data := make([]MultiexpData, 2 * maxN * maxM) 30 var Hi [maxN* maxM]Key 31 var Gi [maxN* maxM]Key 32 var Hi_p3 [maxN* maxM]ExtendedGroupElement 33 var Gi_p3 [maxN* maxM]ExtendedGroupElement 34 for i := uint64(0); i < maxN*maxM; i++ { 35 Hi[i] = get_exponent(H, i*2) 36 Hi_p3[i].FromBytes(&Hi[i]) 37 38 Gi[i] = get_exponent(H, i*2+1) 39 Gi_p3[i].FromBytes(&Gi[i]) 40 41 data[i * 2].Scalar = Zero 42 data[i * 2].Point = Gi_p3[i] 43 data[i * 2 + 1].Scalar = Zero 44 data[i * 2 + 1].Point = Hi_p3[i] 45 } 46 InitCache(data) 47 } 48 49 func Test_Multiexp(t *testing.T) { 50 { 51 var testData []MultiexpData 52 53 var MINUS_INV_EIGHT = HexToKey("74a4197af07d0bf705c2da252b5c0b0d0000000000000000000000000000000a") 54 var MINUS_ONE = HexToKey("ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010") 55 var N1 ExtendedGroupElement 56 N1.FromBytes(&MINUS_ONE) 57 var result Key 58 var B_Precomputed [8]CachedGroupElement 59 GePrecompute(&B_Precomputed, &N1) 60 AddKeys3(&result, &MINUS_INV_EIGHT, &MINUS_ONE, &MINUS_ONE, &B_Precomputed) 61 62 testData = append(testData, MultiexpData{Point: N1, Scalar:MINUS_INV_EIGHT}) 63 testData = append(testData, MultiexpData{Point: N1, Scalar:MINUS_ONE}) 64 result2, err := Multiexp(&testData, 0) 65 if err != nil { 66 t.Fatal(err) 67 } 68 if bytes.Compare(result[:], result2[:]) != 0 { 69 t.Fatalf("result != result2. result:%s result2:%s", result, result2) 70 } 71 term := result 72 73 for i := 0; i < 50; i++ { 74 testData = append(testData, MultiexpData{Point: N1, Scalar:MINUS_INV_EIGHT}) 75 testData = append(testData, MultiexpData{Point: N1, Scalar:MINUS_ONE}) 76 result2, err = Multiexp(&testData, 0) 77 if err != nil { 78 t.Fatal(err) 79 } 80 AddKeys(&result, &result, &term) 81 if bytes.Compare(result[:], result2[:]) != 0 { 82 t.Fatalf("result != result2. i:%d result:%s result2:%s", i, result, result2) 83 } 84 } 85 } 86 }