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  }