115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
package concentration
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"xdx.jelly/xgcl/gmath"
|
|
"xdx.jelly/xgcl/grand"
|
|
"xdx.jelly/xgcl/sm/sm2"
|
|
)
|
|
|
|
func TestSign(t *testing.T) {
|
|
fmt.Println("============= 生成密钥 =============")
|
|
clientID := []byte("Teacher Tony")
|
|
serverKeyGenCTX := NewServerKeyGenContext()
|
|
clientKeyGenCTX := NewClientKeyGenContext()
|
|
|
|
// 1 server调用密码机获取32字节随机数。 GenerateAgreementData传出数据发送给客户端。
|
|
data, err := serverKeyGenCTX.GenerateAgreementData(grand.GetRandom(sm2.ByteSize()))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
//2 client 调用生成数据和公钥
|
|
data, clientPK, err := clientKeyGenCTX.GenerateAgreementData(data, clientID)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// 3 server 计算密钥对
|
|
sk, serverPK, err := serverKeyGenCTX.ComputeKeyPair(data, clientID)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// 服务端清除敏感信息
|
|
serverKeyGenCTX.Clear()
|
|
|
|
if !serverPK.Equals(clientPK) {
|
|
panic("clientPK != serverPK")
|
|
}
|
|
fmt.Println("server pubkey: ", serverPK)
|
|
fmt.Println("client pubkey: ", clientPK)
|
|
fmt.Printf("sk: %02x\n", sk)
|
|
fmt.Println()
|
|
|
|
fmt.Println("============= 签名 =============")
|
|
e := grand.GetRandom(32)
|
|
serverSignCTX := NewServerSignContext()
|
|
clientSignCTX := NewClientSignContext()
|
|
|
|
data, err = serverSignCTX.GenerateSignData(grand.GetRandom(32))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
data, clientR, err := clientSignCTX.GenerateSignData(data, e)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
sig, err := serverSignCTX.Sign(data, e, sk)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
sk.Clear()
|
|
fmt.Println("sig: ", sig)
|
|
fmt.Printf("client's r: %02x\n", clientR)
|
|
fmt.Println("serverPK verify: ", sm2.Verify(e, serverPK, sig))
|
|
fmt.Println("clientPK verify: ", sm2.Verify(e, clientPK, sig))
|
|
if (bytes.Compare(clientR, gmath.BigIntToNByte(sig.R, 32))) != 0 {
|
|
panic("client r != server r")
|
|
}
|
|
|
|
}
|
|
|
|
func TestMarshal(t *testing.T) {
|
|
ctx := NewServerSignContext()
|
|
ctx.k1 = sm2.NewPrivateKey().Random(grand.Reader)
|
|
ctx.u = sm2.NewPublicKey().Generate(ctx.k1)
|
|
ctx.clientPPub = sm2.NewPublicKey().Generate(sm2.NewPrivateKey().Random(grand.Reader))
|
|
buf, err := ctx.MarshalBinary()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
fmt.Printf("%x\n\n", buf)
|
|
|
|
ctx1 := NewServerSignContext()
|
|
err = ctx1.UnmarshalBinary(buf)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
buf, err = ctx1.MarshalBinary()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
fmt.Printf("%x\n\n", buf)
|
|
|
|
if ctx1.k1.D.Cmp(ctx.k1.D) != 0 {
|
|
t.Log()
|
|
t.Fail()
|
|
}
|
|
if !ctx1.u.Equals(ctx.u) {
|
|
t.Log()
|
|
t.Fail()
|
|
}
|
|
|
|
if !ctx1.clientPPub.Equals(ctx.clientPPub) {
|
|
t.Log()
|
|
t.Fail()
|
|
}
|
|
}
|