init: v1.0.0
This commit is contained in:
@@ -0,0 +1,251 @@
|
||||
package bn256
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"math/big"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"xdx.jelly/xgcl/gmath"
|
||||
)
|
||||
|
||||
func TestCurve(t *testing.T) {
|
||||
pt := &curvePoint{}
|
||||
pt.Set(curveGen)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("IsOnCurve failed!")
|
||||
return
|
||||
}
|
||||
|
||||
pt.Double(curveGen)
|
||||
pt.MakeAffine()
|
||||
fmt.Println("Double of gen:", pt)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("Double failed!")
|
||||
return
|
||||
}
|
||||
|
||||
pt.Add(pt, curveGen)
|
||||
fmt.Println("Triple of gen:", pt)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("Add failed!")
|
||||
return
|
||||
}
|
||||
|
||||
OrderMinus1 := new(big.Int)
|
||||
OrderMinus1.Sub(N, gmath.BigInt1)
|
||||
|
||||
pt.Mul(curveGen, OrderMinus1)
|
||||
pt.Neg(pt)
|
||||
pt.MakeAffine()
|
||||
if *pt != *curveGen {
|
||||
t.Fail()
|
||||
t.Log("Mul failed!")
|
||||
t.Log(pt)
|
||||
t.Log(curveGen)
|
||||
return
|
||||
}
|
||||
|
||||
pt.Mul(curveGen, N)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("Mul N failed!")
|
||||
return
|
||||
}
|
||||
if !pt.IsInfinity() {
|
||||
t.Fail()
|
||||
t.Log("IsInfinity failed!")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestCurveBaseMul(t *testing.T) {
|
||||
pt0 := &curvePoint{}
|
||||
pt1 := &curvePoint{}
|
||||
for i := 0; ; i++ {
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
pt0.Mul(curveGen, k)
|
||||
pt1.MulBase(k, curverBasePrecompted8)
|
||||
if !pt0.Equal(pt1) {
|
||||
t.Log(pt0)
|
||||
t.Log(pt1)
|
||||
t.Fail()
|
||||
return
|
||||
}
|
||||
if i%10000 == 0 {
|
||||
t.Log(i, "passed")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkCurveMul(b *testing.B) {
|
||||
//BenchmarkCurveMul-8 13298 85947 ns/op
|
||||
|
||||
pt := &curvePoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
for i := 0; i < b.N; i++ {
|
||||
pt.Mul(curveGen, k)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkCurveBaseMul(b *testing.B) {
|
||||
//BenchmarkCurveBaseMul-8 28418 40692 ns/op
|
||||
//BenchmarkCurveBaseMul-8 41059 25595 ns/op
|
||||
pt := &curvePoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
for i := 0; i < b.N; i++ {
|
||||
pt.MulBase(k, curverBasePrecompted8)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCurveSpeed(T *testing.T) {
|
||||
{
|
||||
// 11000 次/秒
|
||||
useLattice = true
|
||||
pt := &curvePoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
begin := time.Now()
|
||||
total := 10000
|
||||
for i := 0; i < total; i++ {
|
||||
pt.Mul(curveGen, k)
|
||||
}
|
||||
elaspe := time.Since(begin)
|
||||
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
||||
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
||||
}
|
||||
{
|
||||
// 7300 次/秒
|
||||
useLattice = false
|
||||
pt := &curvePoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
begin := time.Now()
|
||||
total := 10000
|
||||
for i := 0; i < total; i++ {
|
||||
pt.Mul(curveGen, k)
|
||||
}
|
||||
elaspe := time.Since(begin)
|
||||
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
||||
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTwistCurve(t *testing.T) {
|
||||
pt := &twistPoint{}
|
||||
pt.Set(twistGen)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("IsOnCurve failed!")
|
||||
return
|
||||
}
|
||||
|
||||
pt.Double(twistGen)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("Double failed!")
|
||||
return
|
||||
}
|
||||
|
||||
pt.Add(pt, twistGen)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("Add failed!")
|
||||
return
|
||||
}
|
||||
|
||||
OrderMinus1 := new(big.Int)
|
||||
OrderMinus1.Sub(N, gmath.BigInt1)
|
||||
|
||||
pt.Mul(twistGen, OrderMinus1)
|
||||
pt.Neg(pt)
|
||||
pt.MakeAffine()
|
||||
if *pt != *twistGen {
|
||||
t.Fail()
|
||||
t.Log("Mul failed!")
|
||||
fmt.Println(pt)
|
||||
fmt.Println(twistGen)
|
||||
return
|
||||
}
|
||||
|
||||
pt.Mul(twistGen, N)
|
||||
if !pt.IsOnCurve() {
|
||||
t.Fail()
|
||||
t.Log("Mul N failed!")
|
||||
return
|
||||
}
|
||||
if !pt.IsInfinity() {
|
||||
t.Fail()
|
||||
t.Log("IsInfinity failed!")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestTwistBaseMul(t *testing.T) {
|
||||
pt0 := &twistPoint{}
|
||||
pt1 := &twistPoint{}
|
||||
for i := 0; i < 1000000; i++ {
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
pt0.Mul(twistGen, k)
|
||||
pt1.MulBase(k, twistBasePrecomputed8)
|
||||
if !pt0.Equal(pt1) {
|
||||
t.Log(pt0)
|
||||
t.Log(pt1)
|
||||
t.Fail()
|
||||
return
|
||||
}
|
||||
if i%10000 == 0 {
|
||||
t.Log(i, "passed")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkTwistBaseMul(b *testing.B) {
|
||||
//BenchmarkTwistBaseMul-8 11694 101403 ns/op
|
||||
pt := &twistPoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
for i := 0; i < b.N; i++ {
|
||||
pt.MulBase(k, twistBasePrecomputed8)
|
||||
}
|
||||
}
|
||||
func BenchmarkTwistCurve(b *testing.B) {
|
||||
//BenchmarkTwistCurve-8 3090 350948 ns/op
|
||||
pt := &twistPoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
for i := 0; i < b.N; i++ {
|
||||
pt.Mul(twistGen, k)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTwistCurveSpeed(T *testing.T) {
|
||||
{
|
||||
// 2800 次/秒
|
||||
useLattice = true
|
||||
pt := &twistPoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
begin := time.Now()
|
||||
total := 10000
|
||||
for i := 0; i < total; i++ {
|
||||
pt.Mul(twistGen, k)
|
||||
}
|
||||
elaspe := time.Since(begin)
|
||||
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
||||
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
||||
}
|
||||
{
|
||||
// 1900 次/秒
|
||||
useLattice = false
|
||||
pt := &twistPoint{}
|
||||
k, _ := rand.Int(rand.Reader, N)
|
||||
begin := time.Now()
|
||||
total := 10000
|
||||
for i := 0; i < total; i++ {
|
||||
pt.Mul(twistGen, k)
|
||||
}
|
||||
elaspe := time.Since(begin)
|
||||
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
|
||||
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user