go-iden3-crypto/babyjub/eddsa_test.go
babyjub/eddsa_test.goRaw
1package babyjub
2
3import (
4 "crypto/rand"
5 "encoding/hex"
6 "fmt"
7 "math/big"
8 "testing"
9
10 "github.com/iden3/go-iden3-crypto/constants"
11 "github.com/iden3/go-iden3-crypto/utils"
12 "github.com/stretchr/testify/assert"
13)
14
15func genInputs() (*PrivateKey, *big.Int) {
16 k := NewRandPrivKey()
17 fmt.Println("k", hex.EncodeToString(k[:]))
18
19 msgBuf := [32]byte{}
20 rand.Read(msgBuf[:])
21 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf[:])
22 msg.Mod(msg, constants.Q)
23 fmt.Println("msg", msg)
24
25 return &k, msg
26}
27
28func TestPublicKey(t *testing.T) {
29 var k PrivateKey
30 for i := 0; i < 256; i++ {
31 hex.Decode(k[:], []byte{byte(i)})
32 }
33 pk := k.Public()
34 assert.True(t, pk.X.Cmp(constants.Q) == -1)
35 assert.True(t, pk.Y.Cmp(constants.Q) == -1)
36}
37
38func TestSignVerifyMimc7(t *testing.T) {
39 var k PrivateKey
40 hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
41 msgBuf, err := hex.DecodeString("00010203040506070809")
42 if err != nil {
43 panic(err)
44 }
45 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
46
47 pk := k.Public()
48 assert.Equal(t,
49 "13277427435165878497778222415993513565335242147425444199013288855685581939618",
50 pk.X.String())
51 assert.Equal(t,
52 "13622229784656158136036771217484571176836296686641868549125388198837476602820",
53 pk.Y.String())
54
55 sig := k.SignMimc7(msg)
56 assert.Equal(t,
57 "11384336176656855268977457483345535180380036354188103142384839473266348197733",
58 sig.R8.X.String())
59 assert.Equal(t,
60 "15383486972088797283337779941324724402501462225528836549661220478783371668959",
61 sig.R8.Y.String())
62 assert.Equal(t,
63 "2523202440825208709475937830811065542425109372212752003460238913256192595070",
64 sig.S.String())
65
66 ok := pk.VerifyMimc7(msg, sig)
67 assert.Equal(t, true, ok)
68
69 sigBuf := sig.Compress()
70 sig2, err := new(Signature).Decompress(sigBuf)
71 assert.Equal(t, nil, err)
72
73 assert.Equal(t, ""+
74 "dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
75 "7ed40dab29bf993c928e789d007387998901a24913d44fddb64b1f21fc149405",
76 hex.EncodeToString(sigBuf[:]))
77
78 ok = pk.VerifyMimc7(msg, sig2)
79 assert.Equal(t, true, ok)
80}
81
82func TestSignVerifyPoseidon(t *testing.T) {
83 var k PrivateKey
84 hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
85 msgBuf, err := hex.DecodeString("00010203040506070809")
86 if err != nil {
87 panic(err)
88 }
89 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
90
91 pk := k.Public()
92 assert.Equal(t,
93 "13277427435165878497778222415993513565335242147425444199013288855685581939618",
94 pk.X.String())
95 assert.Equal(t,
96 "13622229784656158136036771217484571176836296686641868549125388198837476602820",
97 pk.Y.String())
98
99 sig := k.SignPoseidon(msg)
100 assert.Equal(t,
101 "11384336176656855268977457483345535180380036354188103142384839473266348197733",
102 sig.R8.X.String())
103 assert.Equal(t,
104 "15383486972088797283337779941324724402501462225528836549661220478783371668959",
105 sig.R8.Y.String())
106 assert.Equal(t,
107 "248298168863866362217836334079793350221620631973732197668910946177382043688",
108 sig.S.String())
109
110 ok := pk.VerifyPoseidon(msg, sig)
111 assert.Equal(t, true, ok)
112
113 sigBuf := sig.Compress()
114 sig2, err := new(Signature).Decompress(sigBuf)
115 assert.Equal(t, nil, err)
116
117 assert.Equal(t, ""+
118 "dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
119 "28506bce274aa1b3f7e7c2fd7e4fe09bff8f9aa37a42def7994e98f322888c00",
120 hex.EncodeToString(sigBuf[:]))
121
122 ok = pk.VerifyPoseidon(msg, sig2)
123 assert.Equal(t, true, ok)
124}
125
126func TestCompressDecompress(t *testing.T) {
127 var k PrivateKey
128 hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
129 pk := k.Public()
130 for i := 0; i < 64; i++ {
131 msgBuf, err := hex.DecodeString(fmt.Sprintf("000102030405060708%02d", i))
132 if err != nil {
133 panic(err)
134 }
135 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
136 sig := k.SignMimc7(msg)
137 sigBuf := sig.Compress()
138 sig2, err := new(Signature).Decompress(sigBuf)
139 assert.Equal(t, nil, err)
140 ok := pk.VerifyMimc7(msg, sig2)
141 assert.Equal(t, true, ok)
142 }
143}