158 lines
4.1 KiB
Go
158 lines
4.1 KiB
Go
package sm9m
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"xdx.jelly/xgcl/grand/drng"
|
|
"xdx.jelly/xgcl/sm/sm3"
|
|
"xdx.jelly/xgcl/sm/sm9"
|
|
)
|
|
|
|
func TestSignKeyGen(t *testing.T) {
|
|
uid := []byte("Alice")
|
|
ks, pubs, err := sm9.GenerateMastSignPrivateKey(drng.SM3Rng) // use SM3 DRNG
|
|
assert.Nil(t, err)
|
|
_ = pubs
|
|
|
|
ds, err := ks.GenerateUserSignKey(uid)
|
|
assert.Nil(t, err)
|
|
|
|
clientSignKey, serverSignKey, err := GenerateSignKeys(ds, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
|
|
// Check generated keys are valid
|
|
assert.True(t, clientSignKey.p.ScalarMult(&clientSignKey.p, &serverSignKey.k).Equal(&ds.G1))
|
|
}
|
|
|
|
func TestEncKeyGen(t *testing.T) {
|
|
uid := []byte("Alice")
|
|
ke, _, err := sm9.GenerateMastEncPrivateKey(drng.SM3Rng) // use SM3 DRNG
|
|
assert.Nil(t, err)
|
|
|
|
de, err := ke.GenerateUserEncKey(uid)
|
|
assert.Nil(t, err)
|
|
|
|
clientEncKey, serverEncKey, err := GenerateEncKeys(de, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
|
|
// Check generated keys are valid
|
|
assert.True(t, serverEncKey.p.Add(&serverEncKey.p, &clientEncKey.p).Equal(&de.G2))
|
|
}
|
|
|
|
func TestSign(t *testing.T) {
|
|
uid := []byte("Alice")
|
|
ks, pubs, err := sm9.GenerateMastSignPrivateKey(drng.SM3Rng) // use SM3 DRNG
|
|
assert.Nil(t, err)
|
|
|
|
ds, err := ks.GenerateUserSignKey(uid)
|
|
assert.Nil(t, err)
|
|
|
|
clientSignKey, serverSignKey, err := GenerateSignKeys(ds, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
|
|
// SM9签名输入SM3摘要
|
|
hash := sm3.Sum([]byte("abc"))
|
|
|
|
// 客户端第一步
|
|
clientCTX := &ClientSignContext{}
|
|
param, err := clientCTX.GenerateParam(clientSignKey, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
b, err := param.MarshalBinary()
|
|
assert.Nil(t, err)
|
|
|
|
// 服务端
|
|
param = &ClientSignParam{}
|
|
assert.Nil(t, param.UnmarshalBinary(b))
|
|
serverParam, err := ServerSign(hash[:], param, serverSignKey, pubs, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
b, err = serverParam.MarshalBinary()
|
|
assert.Nil(t, err)
|
|
|
|
// 客户端第二步
|
|
serverParam = &ServerSignParam{}
|
|
assert.Nil(t, serverParam.UnmarshalBinary(b))
|
|
sig, err := clientCTX.GenerateSignature(serverParam)
|
|
assert.Nil(t, err)
|
|
|
|
assert.True(t, sm9.Verify(sig, uid, hash[:], pubs))
|
|
}
|
|
|
|
func TestDecryption(t *testing.T) {
|
|
id := []byte("Alice")
|
|
ke, pube, err := sm9.GenerateMastEncPrivateKey(drng.SM3Rng) // use SM3 DRNG
|
|
assert.Nil(t, err)
|
|
|
|
de, err := ke.GenerateUserEncKey(id)
|
|
assert.Nil(t, err)
|
|
|
|
msg := []byte("Chinese IBE standard")
|
|
cipher, err := sm9.Encrypt(sm9.EncTypeKDF, pube, id, msg, drng.SM3Rng, nil)
|
|
assert.Nil(t, err)
|
|
|
|
clientEncKey, serverEncKey, err := GenerateEncKeys(de, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
|
|
// 1
|
|
clientCTX := &ClientDecContext{}
|
|
clientParam, err := clientCTX.GenerateParam(cipher)
|
|
assert.Nil(t, err)
|
|
b, err := clientParam.MarshalBinary()
|
|
assert.Nil(t, err)
|
|
|
|
// 2
|
|
clientParam = &ClientDecParam{}
|
|
assert.Nil(t, clientParam.UnmarshalBinary(b))
|
|
serverParam, err := ServerDecrypt(clientParam, serverEncKey)
|
|
assert.Nil(t, err)
|
|
b, err = serverParam.MarshalBinary()
|
|
assert.Nil(t, err)
|
|
|
|
// 3
|
|
serverParam = &ServerDecParam{}
|
|
assert.Nil(t, serverParam.UnmarshalBinary(b))
|
|
msg1, err := clientCTX.DecryptFinal(id, clientEncKey, serverParam)
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, msg, msg1)
|
|
}
|
|
|
|
func TestDecapsulate(t *testing.T) {
|
|
id := []byte("Alice")
|
|
ke, pube, err := sm9.GenerateMastEncPrivateKey(drng.SM3Rng) // use SM3 DRNG
|
|
assert.Nil(t, err)
|
|
|
|
de, err := ke.GenerateUserEncKey(id)
|
|
assert.Nil(t, err)
|
|
|
|
clientEncKey, serverEncKey, err := GenerateEncKeys(de, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
|
|
keylen := 48
|
|
pack, key0, err := sm9.KeyEncapsulate(id, keylen, pube, drng.SM3Rng)
|
|
assert.Nil(t, err)
|
|
|
|
// 1
|
|
clientCTX := &ClientDecapsulateContext{}
|
|
clientParam, err := clientCTX.GenerateParam(pack)
|
|
assert.Nil(t, err)
|
|
b, err := clientParam.MarshalBinary()
|
|
assert.Nil(t, err)
|
|
|
|
// 2
|
|
clientParam = &ClientDecapsulateParam{}
|
|
assert.Nil(t, clientParam.UnmarshalBinary(b))
|
|
serverParam, err := ServerDecapsulate(clientParam, serverEncKey)
|
|
assert.Nil(t, err)
|
|
b, err = serverParam.MarshalBinary()
|
|
assert.Nil(t, err)
|
|
|
|
// 3
|
|
serverParam = &ServerDecapsulateParam{}
|
|
assert.Nil(t, serverParam.UnmarshalBinary(b))
|
|
key1, err := clientCTX.DecapsulateFinal(id, keylen, clientEncKey, serverParam)
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, key0, key1)
|
|
}
|