278 lines
7.8 KiB
Go
278 lines
7.8 KiB
Go
package sm9_test
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"math/big"
|
|
"testing"
|
|
"time"
|
|
|
|
"xdx.jelly/xgcl/sm/sm9"
|
|
)
|
|
|
|
func decodeHex(h string) []byte {
|
|
buf, err := hex.DecodeString(h)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return buf
|
|
}
|
|
|
|
func TestIdentifier(t *testing.T) {
|
|
id := sm9.Identifier{
|
|
IdentityType: sm9.OidSm9,
|
|
Alias: "SM9",
|
|
IdentityData: []byte("alice@xdx.jelly"),
|
|
Serial: big.NewInt(12345678),
|
|
ValidStart: time.Now(),
|
|
ValidEnd: time.Now().Add(time.Hour * 365 * 24),
|
|
IdExtentions: nil,
|
|
}
|
|
|
|
b, err := id.MarshalASN1()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
id2 := &sm9.Identifier{}
|
|
_, err = id2.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !(id.Version == id2.Version) {
|
|
t.Fatal()
|
|
}
|
|
if !(id.IdentityType.Equal(id2.IdentityType)) {
|
|
t.Fatal()
|
|
}
|
|
if !(id.Alias == id2.Alias) {
|
|
t.Fatal()
|
|
}
|
|
if !bytes.Equal(id.IdentityData, id2.IdentityData) {
|
|
t.Fatal()
|
|
}
|
|
|
|
// Can't comapre id.ValidStart == id2.ValidStart or
|
|
// id.ValidStart.Equal(id2.ValidStart)
|
|
if !(id.ValidStart.Unix() == id2.ValidStart.Unix()) {
|
|
t.Fatal()
|
|
}
|
|
if !(id.ValidEnd.Unix() == id2.ValidEnd.Unix()) {
|
|
t.Fatal()
|
|
}
|
|
if !bytes.Equal(id.IdExtentions, id2.IdExtentions) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
|
|
type testKeyVector struct {
|
|
pri []byte
|
|
priAsn1 []byte
|
|
pubAsn1 []byte
|
|
pubAsn1Compressed []byte
|
|
}
|
|
|
|
var testKeyVectors = map[string]*testKeyVector{
|
|
"MastSignPrivateKey": {
|
|
pri: decodeHex("000130E78459D78545CB54C587E02CF480CE0B66340F319F348A1D5B1F2DC5F4"),
|
|
priAsn1: decodeHex("021f0130e78459d78545cb54c587e02cf480ce0b66340f319f348a1d5b1f2dc5f4"),
|
|
pubAsn1: decodeHex("03818200049f64080b3084f733e48aff4b41b565011ce0711c5e392cfb0ab1b6791b94c40829dba116152d1f786ce843ed24a3b573414d2177386a92dd8f14d65696ea5e3269850938abea0112b57329f447e3a0cbad3e2fdb1a77f335e89e1408d0ef1c2541e00a53dda532da1a7ce027b7a46f741006e85f5cdff0730e75c05fb4e3216d"),
|
|
pubAsn1Compressed: decodeHex("034200039f64080b3084f733e48aff4b41b565011ce0711c5e392cfb0ab1b6791b94c40829dba116152d1f786ce843ed24a3b573414d2177386a92dd8f14d65696ea5e32"),
|
|
},
|
|
"MastEncPrivateKey": {
|
|
pri: decodeHex("0002E65B0762D042F51F0D23542B13ED8CFA2E9A0E7206361E013A283905E31F"),
|
|
priAsn1: decodeHex("021f02E65B0762D042F51F0D23542B13ED8CFA2E9A0E7206361E013A283905E31F"),
|
|
pubAsn1: decodeHex("034200049174542668E8F14AB273C0945C3690C66E5DD09678B86F734C4350567ED0628354E598C6BF749A3DACC9FFFEDD9DB6866C50457CFC7AA2A4AD65C3168FF74210"),
|
|
pubAsn1Compressed: decodeHex("032200029174542668E8F14AB273C0945C3690C66E5DD09678B86F734C4350567ED06283"),
|
|
},
|
|
}
|
|
|
|
func TestASN1MastSignKey(t *testing.T) {
|
|
testVector := testKeyVectors["MastSignPrivateKey"]
|
|
ds := &sm9.MastSignPrivateKey{}
|
|
_, _ = ds.SetBytes(testVector.pri)
|
|
b, err := ds.MarshalASN1()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(b, testVector.priAsn1) {
|
|
t.Fatal("MastSignPrivateKey marshal failed")
|
|
}
|
|
ds = &sm9.MastSignPrivateKey{}
|
|
_, err = ds.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal("MastSignPrivateKey unmarshal error")
|
|
}
|
|
if !bytes.Equal(ds.Bytes(), testVector.pri) {
|
|
fmt.Printf("%x\n", ds.Bytes())
|
|
|
|
t.Fatal()
|
|
}
|
|
|
|
pubs := ds.Public()
|
|
b, err = pubs.MarshalASN1(false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(b, testVector.pubAsn1) {
|
|
t.Fatal("MastSignPublicKey marshal failed")
|
|
}
|
|
pubs = &sm9.MastSignPublicKey{}
|
|
_, err = pubs.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal("MastSignPublicKey unmarshal error")
|
|
}
|
|
if !bytes.Equal(pubs.Bytes(), ds.Public().Bytes()) {
|
|
t.Fatal()
|
|
}
|
|
|
|
b, err = pubs.MarshalASN1(true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(b, testVector.pubAsn1Compressed) {
|
|
t.Fatal("MastSignPublicKey marshal failed")
|
|
}
|
|
pubs = &sm9.MastSignPublicKey{}
|
|
_, err = pubs.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(pubs.Bytes(), ds.Public().Bytes()) {
|
|
t.Fatal("MastSignPublicKey unmarshal error")
|
|
}
|
|
}
|
|
|
|
func TestASN1MastEncKey(t *testing.T) {
|
|
testVector := testKeyVectors["MastEncPrivateKey"]
|
|
de := &sm9.MastEncPrivateKey{}
|
|
_, _ = de.SetBytes(testVector.pri)
|
|
b, err := de.MarshalASN1()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(b, testVector.priAsn1) {
|
|
t.Fatal("MastEncPrivateKey marshal failed")
|
|
}
|
|
de = &sm9.MastEncPrivateKey{}
|
|
_, err = de.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal("MastEncPrivateKey unmarshal error")
|
|
}
|
|
if !bytes.Equal(de.Bytes(), testVector.pri) {
|
|
t.Fatal()
|
|
}
|
|
|
|
pube := de.Public()
|
|
b, err = pube.MarshalASN1(true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(b, testVector.pubAsn1Compressed) {
|
|
t.Fatal("MastEncPublicKey marshal failed")
|
|
}
|
|
pube = &sm9.MastEncPublicKey{}
|
|
_, err = pube.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal("MastEncPublicKey unmarshal error")
|
|
}
|
|
if !bytes.Equal(pube.Bytes(), de.Public().Bytes()) {
|
|
t.Fatal()
|
|
}
|
|
|
|
pube = de.Public()
|
|
b, err = pube.MarshalASN1(false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(b, testVector.pubAsn1) {
|
|
t.Fatal("MastEncPublicKey marshal failed")
|
|
}
|
|
pube = &sm9.MastEncPublicKey{}
|
|
_, err = pube.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal("MastEncPublicKey unmarshal error")
|
|
}
|
|
if !bytes.Equal(pube.Bytes(), de.Public().Bytes()) {
|
|
t.Fatal()
|
|
}
|
|
|
|
}
|
|
|
|
func TestASN1Signature(t *testing.T) {
|
|
signature := &sm9.Signature{
|
|
H: *new(big.Int).SetBytes(decodeHex("823C4B21E4BD2DFE1ED92C606653E996668563152FC33F55D7BFBB9BD9705ADB")),
|
|
}
|
|
if _, err := signature.S.Unmarshal(decodeHex("73BF96923CE58B6AD0E13E9643A406D8EB98417C50EF1B29CEF9ADB48B6D598C856712F1C2E0968AB7769F42A99586AED139D5B8B3E15891827CC2ACED9BAA05")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// 压缩模式
|
|
b, err := signature.MarshalASN1(true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
wantedASN1 := decodeHex("30460420823c4b21e4bd2dfe1ed92c606653e996668563152fc33f55d7bfbb9bd9705adb0322000373bf96923ce58b6ad0e13e9643a406d8eb98417c50ef1b29cef9adb48b6d598c")
|
|
if !bytes.Equal(b, wantedASN1) {
|
|
fmt.Printf("%x\n", b)
|
|
t.Fatal()
|
|
}
|
|
|
|
b, err = signature.MarshalASN1(false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
wantedASN1 = decodeHex("30660420823C4B21E4BD2DFE1ED92C606653E996668563152FC33F55D7BFBB9BD9705ADB0342000473BF96923CE58B6AD0E13E9643A406D8EB98417C50EF1B29CEF9ADB48B6D598C856712F1C2E0968AB7769F42A99586AED139D5B8B3E15891827CC2ACED9BAA05")
|
|
if !bytes.Equal(b, wantedASN1) {
|
|
fmt.Printf("%x\n", b)
|
|
t.Fatal()
|
|
}
|
|
signature2 := &sm9.Signature{}
|
|
_, err = signature2.UnmarshalASN1(b)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if signature.H.Cmp(&signature2.H) != 0 ||
|
|
!signature.S.Equal(&signature2.S) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
|
|
func TestASN1Cipher(t *testing.T) {
|
|
id := []byte("Bob")
|
|
rnd, _ := hex.DecodeString("0001EDEE3778F441F8DEA3D9FA0ACC4E07EE36C93F9A08618AF4AD85CEDE1C22")
|
|
_, pube, _ := sm9.GenerateMastEncPrivateKey(bytes.NewReader(rnd))
|
|
|
|
msg := []byte("Chinese IBE standard")
|
|
// _, _ := sm9.GenerateUserEncKey(id, ke)
|
|
rnd, _ = hex.DecodeString("0000AAC0541779C8FC45E3E2CB25C12B5D2576B2129AE8BB5EE2CBE5EC9E785C")
|
|
|
|
c, _ := sm9.Encrypt(sm9.EncTypeKDF, pube, id, msg, bytes.NewReader(rnd), nil)
|
|
var data []byte
|
|
var err error
|
|
if data, err = c.MarshalASN1(false); err != nil ||
|
|
!bytes.Equal(data, decodeHex("307F020100034200042445471164490618E1EE20528FF1D545B0F14C8BCAA44544F03DAB5DAC07D8FF42FFCA97D57CDDC05EA405F2E586FEB3A6930715532B8000759F13059ED59AC00420BA672387BCD6DE5016A158A52BB2E7FC429197BCAB70B25AFEE37A2B9DB9F36704141B5F5B0E951489682F3E64E1378CDD5DA9513B1C")) {
|
|
fmt.Printf("%x\n", data)
|
|
t.Fatal()
|
|
}
|
|
|
|
if data, err = c.MarshalASN1(true); err != nil ||
|
|
!bytes.Equal(data, decodeHex("305f020100032200022445471164490618e1ee20528ff1d545b0f14c8bcaa44544f03dab5dac07d8ff0420ba672387bcd6de5016a158a52bb2e7fc429197bcab70b25afee37a2b9db9f36704141b5f5b0e951489682f3e64e1378cdd5da9513b1c")) {
|
|
fmt.Printf("%x\n", data)
|
|
t.Fatal()
|
|
}
|
|
|
|
c2 := &sm9.Cipher{}
|
|
rest, err := c2.UnmarshalASN1(data)
|
|
if err != nil || len(rest) > 0 ||
|
|
c.EncType != c2.EncType ||
|
|
c.IV != c2.IV ||
|
|
c.C1 != c2.C1 ||
|
|
c.H != c2.H ||
|
|
!bytes.Equal(c.C, c2.C) {
|
|
t.Fatal()
|
|
}
|
|
|
|
}
|