init: v1.0.0
This commit is contained in:
@@ -0,0 +1,205 @@
|
||||
package sm2a
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"xdx.jelly/xgcl/gmath"
|
||||
"xdx.jelly/xgcl/grand"
|
||||
"xdx.jelly/xgcl/sm/sm2"
|
||||
)
|
||||
|
||||
func TestSign(t *testing.T) {
|
||||
// 生成客户端和服务端签名密钥分量
|
||||
serverKeySeg := NewServerSignKeyGenContext()
|
||||
clientKeySeg := NewClientSignKeyGenContext(grand.Reader)
|
||||
buf, err := serverKeySeg.ServerGenKey_one(grand.Reader)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
buf, err = clientKeySeg.ClientKeyGen_one(buf)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
buf, err = serverKeySeg.ServerGenKey_two(buf, grand.Reader)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
buf, err = clientKeySeg.ClientKeyGen_two(buf)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
err = serverKeySeg.ServerGenKey_three(buf)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
dc := clientKeySeg.ClientKey
|
||||
ds := serverKeySeg.ServerKey
|
||||
dc.D.Mod(dc.D, sm2.Curve().Params().N)
|
||||
|
||||
// 协同计算签名
|
||||
e := make([]byte, sm2.ByteSize())
|
||||
grand.GenerateRandom(e)
|
||||
printLog("签名数据e ", e)
|
||||
pk := clientKeySeg.PubKey
|
||||
printLog("终端签名分量", dc.Bytes())
|
||||
printLog("服务端签名分量", ds.Bytes())
|
||||
printLog("公钥", pk.Bytes())
|
||||
clientSign := NewClientSignContext(pk, grand.Reader)
|
||||
buf, _ = clientSign.Initial(e)
|
||||
printLog("T=", buf)
|
||||
|
||||
buf, _ = ServerSign(ds, pk, buf, grand.Reader)
|
||||
printLog("r=", buf[:32])
|
||||
printLog("s1=", buf[32:])
|
||||
|
||||
sig, _ := clientSign.Final(dc, buf)
|
||||
printLog("r=", sig.R.Bytes())
|
||||
printLog("s=", sig.S.Bytes())
|
||||
|
||||
printLog("签名结果", sig.Bytes())
|
||||
|
||||
if !sm2.Verify(e, pk, sig) {
|
||||
t.Fatal("验签失败")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBm(t *testing.T) {
|
||||
rand1 := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
var wt time.Duration = 5
|
||||
|
||||
serverKeySeg := NewServerSignKeyGenContext()
|
||||
clientKeySeg := NewClientSignKeyGenContext(grand.Reader)
|
||||
|
||||
buf, err := serverKeySeg.ServerGenKey_one(grand.Reader)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
serverctx, _ := serverKeySeg.MarshalBinary()
|
||||
fmt.Printf("%d\n", len(serverctx))
|
||||
//rand.Reader will got error? why
|
||||
|
||||
buf, err = clientKeySeg.ClientKeyGen_one(buf)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
// fmt.Printf("%x\n", buf)
|
||||
// fmt.Println("length of buf is ", len(buf))
|
||||
serverKeySeg.UnmarshalBinary(serverctx)
|
||||
buf, err = serverKeySeg.ServerGenKey_two(buf, grand.Reader)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
serverctx, _ = serverKeySeg.MarshalBinary()
|
||||
fmt.Printf("%x\n", serverctx)
|
||||
|
||||
buf, err = clientKeySeg.ClientKeyGen_two(buf)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
fmt.Println("Client public Key = ", clientKeySeg.PubKey)
|
||||
|
||||
serverKeySeg.UnmarshalBinary(serverctx)
|
||||
err = serverKeySeg.ServerGenKey_three(buf)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
fmt.Println("Server public Key = ", serverKeySeg.PubKey)
|
||||
|
||||
dc := clientKeySeg.ClientKey
|
||||
ds := serverKeySeg.ServerKey
|
||||
d := sm2.NewPrivateKey()
|
||||
d.D.Add(dc.D, ds.D)
|
||||
d.D.ModInverse(d.D, sm2.OrderN())
|
||||
d.D.Sub(d.D, gmath.BigInt1)
|
||||
px, py := sm2.Curve256.ScalarBaseMult(d.Bytes())
|
||||
fmt.Println("p=(", px.Text(16)+", "+py.Text(16)+")")
|
||||
|
||||
e := make([]byte, sm2.ByteSize())
|
||||
pk := clientKeySeg.PubKey
|
||||
|
||||
//
|
||||
wg := sync.WaitGroup{}
|
||||
|
||||
totalSuccess := 0
|
||||
totalFailed := 0
|
||||
|
||||
var (
|
||||
fail float32
|
||||
total float32
|
||||
)
|
||||
|
||||
beg := time.Now().UnixNano()
|
||||
|
||||
for j := 0; j < 1; j++ {
|
||||
wg.Add(1)
|
||||
|
||||
wt = time.Duration(rand1.Int() % 100)
|
||||
time.Sleep(wt * time.Millisecond)
|
||||
|
||||
go func(wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
|
||||
for mi := 0; mi < 2000; mi++ {
|
||||
clientSign := NewClientSignContext(pk, grand.Reader)
|
||||
buf2, err := clientSign.Initial(e)
|
||||
if err != nil {
|
||||
totalFailed++
|
||||
continue
|
||||
}
|
||||
|
||||
buf2, err = ServerSign(ds, pk, buf2, grand.Reader)
|
||||
if err != nil {
|
||||
totalFailed++
|
||||
continue
|
||||
}
|
||||
|
||||
//sig, err := clientSign.Final(dc, buf2)
|
||||
_, err = clientSign.Final(dc, buf2)
|
||||
if err != nil {
|
||||
totalFailed++
|
||||
continue
|
||||
}
|
||||
|
||||
totalSuccess++
|
||||
|
||||
//fmt.Println(sig)
|
||||
//fmt.Println(sm2.Verify(e, pk, sig))
|
||||
}
|
||||
}(&wg)
|
||||
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
end := time.Now().UnixNano()
|
||||
|
||||
fail = float32(totalFailed)
|
||||
total = float32(totalSuccess + totalFailed)
|
||||
rate := fail / total
|
||||
|
||||
elapseDenom := float32(end - beg)
|
||||
elapse := elapseDenom / 1000000000
|
||||
one := elapse / total
|
||||
|
||||
fmt.Printf("错误率: %f %% \n", rate*100)
|
||||
fmt.Printf("耗时时间(单位:秒): %f seconds \n", elapse)
|
||||
fmt.Printf("单次请求平均耗时(单位:秒) %f seconds \n", one)
|
||||
fmt.Println("TPS: ", total/elapse)
|
||||
fmt.Println("")
|
||||
fmt.Println("")
|
||||
fmt.Println("")
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user