216 lines
4.9 KiB
Go
216 lines
4.9 KiB
Go
package bn256
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestLatticeReduceCurve(t *testing.T) {
|
|
for {
|
|
k, _ := rand.Int(rand.Reader, N)
|
|
//for i:=255;i>100;i-- {
|
|
// k.SetBit(k, i, 0)
|
|
//}
|
|
ks := curveLattice.decompose(k)
|
|
fmt.Println("============================================")
|
|
fmt.Println("k = ", k.Text(16), k.BitLen(), k.Sign())
|
|
fmt.Println("k1 = ", ks[0].Text(16), ks[0].BitLen(), ks[0].Sign())
|
|
fmt.Println("k2 = ", ks[1].Text(16), ks[1].BitLen(), ks[1].Sign())
|
|
if ks[0].BitLen() > 130 || ks[1].BitLen() > 130 {
|
|
t.Fatal("reduction too large")
|
|
} else if ks[0].Sign() < 0 || ks[1].Sign() < 0 {
|
|
t.Fatal("reduction must be positive")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLatticeReduceTarget(t *testing.T) {
|
|
k, _ := rand.Int(rand.Reader, N)
|
|
ks := targetLattice.decompose(k)
|
|
|
|
if ks[0].BitLen() > 66 || ks[1].BitLen() > 66 || ks[2].BitLen() > 66 || ks[3].BitLen() > 66 {
|
|
t.Fatal("reduction too large")
|
|
} else if ks[0].Sign() < 0 || ks[1].Sign() < 0 || ks[2].Sign() < 0 || ks[3].Sign() < 0 {
|
|
t.Fatal("reduction must be positive")
|
|
}
|
|
}
|
|
|
|
func TestLatticeCurveMul(t *testing.T) {
|
|
useLattice = false
|
|
pt := &curvePoint{}
|
|
t.Log("G =", curveGen)
|
|
l2 := bigFromBase10("82434016654578246432914077779442682275270229881604616279947255993657999048255")
|
|
l := bigFromBase10("11916685325803286854045818138240527491926474132365765087461")
|
|
pt.Mul(curveGen, l)
|
|
t.Log("[l]G=", pt)
|
|
pt.Add(curveGen, pt)
|
|
t.Log("[l+1]G=", pt)
|
|
pt.Neg(pt)
|
|
t.Log("-[l+1]G=", pt)
|
|
pt.Mul(curveGen, l2)
|
|
t.Log("[l2]G=", pt)
|
|
|
|
pt.Set(curveGen)
|
|
gfpMul(&pt.x, &curveGen.x, xiTo2PMinus2Over3)
|
|
t.Log("phiG=", pt)
|
|
t.Log("phi(G) is on curve:", pt.IsOnCurve())
|
|
|
|
}
|
|
|
|
func TestLatticeTwistCurveMul(t *testing.T) {
|
|
useLattice = false
|
|
pt := &twistPoint{}
|
|
t.Log("G =", twistGen)
|
|
l2 := bigFromBase10("82434016654578246432914077779442682275270229881604616279947255993657999048255")
|
|
l := bigFromBase10("11916685325803286854045818138240527491926474132365765087461")
|
|
pt.Mul(twistGen, l)
|
|
t.Log("[l]G=", pt)
|
|
pt.Add(twistGen, pt)
|
|
t.Log("[l+1]G=", pt)
|
|
pt.Neg(pt)
|
|
t.Log("-[l+1]G=", pt)
|
|
pt.Mul(twistGen, l2)
|
|
t.Log("[l2]G=", pt)
|
|
|
|
pt.Set(twistGen)
|
|
//gfpMul(&pt.x, &twistGen.x, xiTo2PMinus2Over3)
|
|
pt.x.MulScalar(&pt.x, xiTo2PSquaredMinus2Over3)
|
|
t.Log("phiG=", pt)
|
|
t.Log("phi(G) is on curve:", pt.IsOnCurve())
|
|
|
|
}
|
|
|
|
func TestTemp(t *testing.T) {
|
|
useLattice = true
|
|
l := bigFromBase10("11916685325803286854045818138240527491926474132365765087461")
|
|
// a := bigFromBase10("18601171214415468628822298024872005604767796808132779597987639723831549415194")
|
|
a := bigFromBase10("186011712144154686288222980248720056047677968081327795979876397238315495")
|
|
//a = new(big.Int).Sub(Order,gmath.BigInt2)
|
|
//multiScalar := curveLattice.Multi(a)
|
|
decomp := curveLattice.decompose(a)
|
|
fmt.Println(decomp)
|
|
s := decomp[1]
|
|
s.Mul(s, l)
|
|
s.Add(s, decomp[0])
|
|
s.Mod(s, N)
|
|
fmt.Println(s)
|
|
fmt.Println(a)
|
|
|
|
pt1 := &curvePoint{}
|
|
pt1.Mul(curveGen, a)
|
|
fmt.Println(pt1)
|
|
|
|
useLattice = false
|
|
pt2 := &curvePoint{}
|
|
pt2.Mul(curveGen, a)
|
|
fmt.Println(pt2)
|
|
|
|
}
|
|
|
|
func TestTemp1(t *testing.T) {
|
|
count := 0
|
|
for {
|
|
a, _ := rand.Int(rand.Reader, N)
|
|
useLattice = true
|
|
pt1 := &curvePoint{}
|
|
pt1.Mul(curveGen, a)
|
|
|
|
useLattice = false
|
|
pt2 := &curvePoint{}
|
|
pt2.Mul(curveGen, a)
|
|
|
|
pt1.MakeAffine()
|
|
pt2.MakeAffine()
|
|
if *pt1 != *pt2 {
|
|
fmt.Println(pt1)
|
|
fmt.Println(pt2)
|
|
t.Fail()
|
|
return
|
|
}
|
|
count++
|
|
if count%10000 == 0 {
|
|
fmt.Println(count, "pass")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGfP12Lattice(t *testing.T) {
|
|
k, _ := rand.Int(rand.Reader, N)
|
|
e := &gfP12{}
|
|
f := &gfP12{}
|
|
e.Exp(gfP12Gen, k)
|
|
f.latticeExp(gfP12Gen, k)
|
|
if *e != *f {
|
|
t.Log(e)
|
|
t.Log(f)
|
|
t.Fatalf("bad lattice exponitial:")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func TestGfP12LatticePairint(t *testing.T) {
|
|
useLattice = true
|
|
fmt.Println("Test bilinear")
|
|
|
|
k1, p1, _ := RandomG1(rand.Reader)
|
|
k2, p2, _ := RandomG2(rand.Reader)
|
|
e1 := Pair(p1, p2)
|
|
|
|
e2 := >{*gfP12Gen}
|
|
e2.ScalarBaseMult(k1)
|
|
e2.ScalarMult(e2, k2)
|
|
|
|
if e1.p != e2.p {
|
|
t.Log(e1)
|
|
t.Log(e2)
|
|
t.Fatalf("bad pairing result:")
|
|
}
|
|
}
|
|
|
|
func BenchmarkLatticeGFP12(b *testing.B) {
|
|
k, _ := rand.Int(rand.Reader, N)
|
|
e := &gfP12{}
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
e.latticeExp(gfP12Gen, k)
|
|
}
|
|
}
|
|
func BenchmarkNormalLatticeGFP12(b *testing.B) {
|
|
k, _ := rand.Int(rand.Reader, N)
|
|
e := &gfP12{}
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
e.Exp(gfP12Gen, k)
|
|
}
|
|
}
|
|
func TestGfP12LatticeSpeed(t *testing.T) {
|
|
k, _ := rand.Int(rand.Reader, N)
|
|
e := &gfP12{}
|
|
f := &gfP12{}
|
|
total := 1000
|
|
{
|
|
//800
|
|
begin := time.Now()
|
|
for i := 0; i < total; i++ {
|
|
e.Exp(gfP12Gen, k)
|
|
}
|
|
elaspe := time.Since(begin)
|
|
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
|
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
|
}
|
|
{
|
|
// 1600 次/秒
|
|
begin := time.Now()
|
|
|
|
for i := 0; i < total; i++ {
|
|
f.latticeExp(gfP12Gen, k)
|
|
}
|
|
elaspe := time.Since(begin)
|
|
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
|
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
|
}
|
|
}
|