github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/crypto/poseidon/poseidon_test.go (about)

     1  // from github.com/iden3/go-iden3-crypto/ff/poseidon
     2  package poseidon
     3  
     4  import (
     5  	"math/big"
     6  	"testing"
     7  
     8  	"github.com/iden3/go-iden3-crypto/utils"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestPoseidonHashFixed(t *testing.T) {
    14  	b0 := big.NewInt(0)
    15  	b1 := big.NewInt(1)
    16  	b2 := big.NewInt(2)
    17  	b3 := big.NewInt(3)
    18  	b4 := big.NewInt(4)
    19  	b5 := big.NewInt(5)
    20  	b6 := big.NewInt(6)
    21  	b7 := big.NewInt(7)
    22  	b8 := big.NewInt(8)
    23  	b9 := big.NewInt(9)
    24  	b10 := big.NewInt(10)
    25  	b11 := big.NewInt(11)
    26  	b12 := big.NewInt(12)
    27  	b13 := big.NewInt(13)
    28  	b14 := big.NewInt(14)
    29  	b15 := big.NewInt(15)
    30  	b16 := big.NewInt(16)
    31  
    32  	h, err := HashFixed([]*big.Int{b1})
    33  	assert.Nil(t, err)
    34  	assert.Equal(t,
    35  		"18586133768512220936620570745912940619677854269274689475585506675881198879027",
    36  		h.String())
    37  
    38  	h, err = HashFixed([]*big.Int{b1, b2})
    39  	assert.Nil(t, err)
    40  	assert.Equal(t,
    41  		"7853200120776062878684798364095072458815029376092732009249414926327459813530",
    42  		h.String())
    43  
    44  	h, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0})
    45  	assert.Nil(t, err)
    46  	assert.Equal(t,
    47  		"1018317224307729531995786483840663576608797660851238720571059489595066344487",
    48  		h.String())
    49  	h, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0})
    50  	assert.Nil(t, err)
    51  	assert.Equal(t,
    52  		"15336558801450556532856248569924170992202208561737609669134139141992924267169",
    53  		h.String())
    54  
    55  	h, err = HashFixed([]*big.Int{b3, b4, b0, b0, b0})
    56  	assert.Nil(t, err)
    57  	assert.Equal(t,
    58  		"5811595552068139067952687508729883632420015185677766880877743348592482390548",
    59  		h.String())
    60  	h, err = HashFixed([]*big.Int{b3, b4, b0, b0, b0, b0})
    61  	assert.Nil(t, err)
    62  	assert.Equal(t,
    63  		"12263118664590987767234828103155242843640892839966517009184493198782366909018",
    64  		h.String())
    65  
    66  	h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6})
    67  	assert.Nil(t, err)
    68  	assert.Equal(t,
    69  		"20400040500897583745843009878988256314335038853985262692600694741116813247201",
    70  		h.String())
    71  
    72  	h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14})
    73  	assert.Nil(t, err)
    74  	assert.Equal(t,
    75  		"8354478399926161176778659061636406690034081872658507739535256090879947077494",
    76  		h.String())
    77  
    78  	h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, b0, b0, b0, b0})
    79  	assert.Nil(t, err)
    80  	assert.Equal(t,
    81  		"5540388656744764564518487011617040650780060800286365721923524861648744699539",
    82  		h.String())
    83  
    84  	h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, b0, b0, b0, b0, b0, b0})
    85  	assert.Nil(t, err)
    86  	assert.Equal(t,
    87  		"11882816200654282475720830292386643970958445617880627439994635298904836126497",
    88  		h.String())
    89  
    90  	h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16})
    91  	assert.Nil(t, err)
    92  	assert.Equal(t,
    93  		"9989051620750914585850546081941653841776809718687451684622678807385399211877",
    94  		h.String())
    95  
    96  	h, err = HashFixedWithDomain([]*big.Int{b1, b2}, big.NewInt(256))
    97  	assert.Nil(t, err)
    98  	assert.Equal(t,
    99  		"2362370911616048355006851495576377379220050231129891536935411970097789775493",
   100  		h.String())
   101  	h_ref, _ := HashFixed([]*big.Int{b1, b2})
   102  	assert.NotEqual(t, h_ref, h)
   103  }
   104  
   105  func TestErrorInputs(t *testing.T) {
   106  	b0 := big.NewInt(0)
   107  	b1 := big.NewInt(1)
   108  	b2 := big.NewInt(2)
   109  
   110  	var err error
   111  
   112  	_, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0})
   113  	require.Nil(t, err)
   114  
   115  	_, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0})
   116  	require.NotNil(t, err)
   117  	assert.Equal(t, "invalid inputs length 17, max 16", err.Error())
   118  
   119  	_, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0})
   120  	require.NotNil(t, err)
   121  	assert.Equal(t, "invalid inputs length 18, max 16", err.Error())
   122  }
   123  
   124  func TestInputsNotInField(t *testing.T) {
   125  	var err error
   126  
   127  	// Very big number, should just return error and not go into endless loop
   128  	b1 := utils.NewIntFromString("12242166908188651009877250812424843524687801523336557272219921456462821518061999999999999999999999999999999999999999999999999999999999") //nolint:lll
   129  	_, err = HashFixed([]*big.Int{b1})
   130  	require.Error(t, err, "inputs values not inside Finite Field")
   131  
   132  	// Finite Field const Q, should return error
   133  	b2 := utils.NewIntFromString("21888242871839275222246405745257275088548364400416034343698204186575808495617") //nolint:lll
   134  	_, err = HashFixed([]*big.Int{b2})
   135  	require.Error(t, err, "inputs values not inside Finite Field")
   136  }
   137  
   138  func TestPoseidonHash(t *testing.T) {
   139  	ret, err := Hash(nil, 3)
   140  	if err != nil {
   141  		t.Fatal(err)
   142  	}
   143  
   144  	// Hash nil for width 3 equal to Hash([0, 0])
   145  	retRef, err := HashFixed([]*big.Int{big.NewInt(0), big.NewInt(0)})
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  
   150  	assert.Equal(t, ret, retRef)
   151  
   152  	// hash is different for the cap flag
   153  	ret1, err := Hash([]*big.Int{big.NewInt(0)}, 3)
   154  	if err != nil {
   155  		t.Fatal(err)
   156  	}
   157  
   158  	assert.NotEqual(t, ret1, retRef)
   159  
   160  	ret2, err := HashWithCap([]*big.Int{big.NewInt(0)}, 3, 0)
   161  	if err != nil {
   162  		t.Fatal(err)
   163  	}
   164  
   165  	assert.Equal(t, ret2, retRef)
   166  }
   167  
   168  func BenchmarkPoseidonHash(b *testing.B) {
   169  	b0 := big.NewInt(0)
   170  	b1 := utils.NewIntFromString("12242166908188651009877250812424843524687801523336557272219921456462821518061") //nolint:lll
   171  	b2 := utils.NewIntFromString("12242166908188651009877250812424843524687801523336557272219921456462821518061") //nolint:lll
   172  
   173  	bigArray4 := []*big.Int{b1, b2, b0, b0, b0, b0}
   174  
   175  	for i := 0; i < b.N; i++ {
   176  		HashFixed(bigArray4) //nolint:errcheck,gosec
   177  	}
   178  }