1
15
16 package x509
17
18 import (
19 "crypto/x509/pkix"
20 "encoding/asn1"
21 "fmt"
22 "math/big"
23 "net"
24 "testing"
25 "time"
26
27 "github.com/tjfoc/gmsm/sm2"
28 )
29
30 func TestX509(t *testing.T) {
31 priv, err := sm2.GenerateKey(nil)
32 if err != nil {
33 t.Fatal(err)
34 }
35 privPem, err := WritePrivateKeyToPem(priv, nil)
36 if err != nil {
37 t.Fatal(err)
38 }
39 pubKey, _ := priv.Public().(*sm2.PublicKey)
40 pubkeyPem, err := WritePublicKeyToPem(pubKey)
41 privKey, err := ReadPrivateKeyFromPem(privPem, nil)
42 if err != nil {
43 t.Fatal(err)
44 }
45 pubKey, err = ReadPublicKeyFromPem(pubkeyPem)
46 if err != nil {
47 t.Fatal(err)
48 }
49 templateReq := CertificateRequest{
50 Subject: pkix.Name{
51 CommonName: "test.example.com",
52 Organization: []string{"Test"},
53 },
54
55 SignatureAlgorithm: SM2WithSM3,
56 }
57 reqPem, err := CreateCertificateRequestToPem(&templateReq, privKey)
58 if err != nil {
59 t.Fatal(err)
60 }
61 req, err := ReadCertificateRequestFromPem(reqPem)
62 if err != nil {
63 t.Fatal(err)
64 }
65 err = req.CheckSignature()
66 if err != nil {
67 t.Fatalf("Request CheckSignature error:%v", err)
68 } else {
69 fmt.Printf("CheckSignature ok\n")
70 }
71 testExtKeyUsage := []ExtKeyUsage{ExtKeyUsageClientAuth, ExtKeyUsageServerAuth}
72 testUnknownExtKeyUsage := []asn1.ObjectIdentifier{[]int{1, 2, 3}, []int{2, 59, 1}}
73 extraExtensionData := []byte("extra extension")
74 commonName := "test.example.com"
75 template := Certificate{
76
77
78
79
80 SerialNumber: big.NewInt(-1),
81 Subject: pkix.Name{
82 CommonName: commonName,
83 Organization: []string{"TEST"},
84 Country: []string{"China"},
85 ExtraNames: []pkix.AttributeTypeAndValue{
86 {
87 Type: []int{2, 5, 4, 42},
88 Value: "Gopher",
89 },
90
91 {
92 Type: []int{2, 5, 4, 6},
93 Value: "NL",
94 },
95 },
96 },
97 NotBefore: time.Now(),
98 NotAfter: time.Date(2021, time.October, 10, 12, 1, 1, 1, time.UTC),
99
100
101 SignatureAlgorithm: SM2WithSM3,
102
103 SubjectKeyId: []byte{1, 2, 3, 4},
104 KeyUsage: KeyUsageCertSign,
105
106 ExtKeyUsage: testExtKeyUsage,
107 UnknownExtKeyUsage: testUnknownExtKeyUsage,
108
109 BasicConstraintsValid: true,
110 IsCA: true,
111
112 OCSPServer: []string{"http://ocsp.example.com"},
113 IssuingCertificateURL: []string{"http://crt.example.com/ca1.crt"},
114
115 DNSNames: []string{"test.example.com"},
116 EmailAddresses: []string{"gopher@golang.org"},
117 IPAddresses: []net.IP{net.IPv4(127, 0, 0, 1).To4(), net.ParseIP("2001:4860:0:2001::68")},
118
119 PolicyIdentifiers: []asn1.ObjectIdentifier{[]int{1, 2, 3}},
120 PermittedDNSDomains: []string{".example.com", "example.com"},
121
122 CRLDistributionPoints: []string{"http://crl1.example.com/ca1.crl", "http://crl2.example.com/ca1.crl"},
123
124 ExtraExtensions: []pkix.Extension{
125 {
126 Id: []int{1, 2, 3, 4},
127 Value: extraExtensionData,
128 },
129
130 {
131 Id: oidExtensionSubjectKeyId,
132 Critical: false,
133 Value: []byte{0x04, 0x04, 4, 3, 2, 1},
134 },
135 },
136 }
137 pubKey, _ = priv.Public().(*sm2.PublicKey)
138 certpem, err := CreateCertificateToPem(&template, &template, pubKey, privKey)
139 if err != nil {
140 t.Fatal("failed to create cert file")
141 }
142 cert, err := ReadCertificateFromPem(certpem)
143 if err != nil {
144 t.Fatal("failed to read cert file")
145 }
146 err = cert.CheckSignature(cert.SignatureAlgorithm, cert.RawTBSCertificate, cert.Signature)
147 if err != nil {
148 t.Fatal(err)
149 } else {
150 fmt.Printf("CheckSignature ok\n")
151 }
152 }
153
View as plain text