...
1 package gmcredentials
2
3 import (
4 "fmt"
5 "io/ioutil"
6 "log"
7 "net"
8 "testing"
9 "time"
10
11 "github.com/tjfoc/gmsm/gmtls"
12 "github.com/tjfoc/gmsm/gmtls/gmcredentials/echo"
13 "github.com/tjfoc/gmsm/x509"
14 "golang.org/x/net/context"
15 "google.golang.org/grpc"
16 )
17
18 const (
19 port = ":50051"
20 address = "localhost:50051"
21 )
22
23 var end chan bool
24
25 type server struct{}
26
27 func (s *server) Echo(ctx context.Context, req *echo.EchoRequest) (*echo.EchoResponse, error) {
28 return &echo.EchoResponse{Result: req.Req}, nil
29 }
30
31 const ca = "testdata/ca.cert"
32 const signCert = "testdata/sign.cert"
33 const signKey = "testdata/sign.key"
34 const encryptCert = "testdata/encrypt.cert"
35 const encryptKey = "testdata/encrypt.key"
36
37 const userCert = "testdata/user.cert"
38 const userKey = "testdata/user.key"
39
40 func serverRun() {
41 signCert, err := gmtls.LoadX509KeyPair(signCert, signKey)
42 if err != nil {
43 log.Fatal(err)
44 }
45
46 encryptCert, err := gmtls.LoadX509KeyPair(encryptCert, encryptKey)
47 if err != nil {
48 log.Fatal(err)
49 }
50 certPool := x509.NewCertPool()
51 cacert, err := ioutil.ReadFile(ca)
52 if err != nil {
53 log.Fatal(err)
54 }
55 certPool.AppendCertsFromPEM(cacert)
56 lis, err := net.Listen("tcp", port)
57 if err != nil {
58 log.Fatalf("fail to listen: %v", err)
59 }
60 creds := NewTLS(&gmtls.Config{
61 GMSupport: &gmtls.GMSupport{},
62 ClientAuth: gmtls.RequireAndVerifyClientCert,
63 Certificates: []gmtls.Certificate{signCert, encryptCert},
64 ClientCAs: certPool,
65 })
66 s := grpc.NewServer(grpc.Creds(creds))
67 echo.RegisterEchoServer(s, &server{})
68 err = s.Serve(lis)
69 if err != nil {
70 log.Fatalf("Serve: %v", err)
71 }
72 }
73
74 func clientRun() {
75 cert, err := gmtls.LoadX509KeyPair(userCert, userKey)
76 if err != nil {
77 log.Fatal(err)
78 }
79 certPool := x509.NewCertPool()
80 cacert, err := ioutil.ReadFile(ca)
81 if err != nil {
82 log.Fatal(err)
83 }
84 certPool.AppendCertsFromPEM(cacert)
85 creds := NewTLS(&gmtls.Config{
86 GMSupport: &gmtls.GMSupport{},
87 ServerName: "test.example.com",
88 Certificates: []gmtls.Certificate{cert},
89 RootCAs: certPool,
90 ClientAuth: gmtls.RequireAndVerifyClientCert,
91 })
92 conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds))
93 if err != nil {
94 log.Fatalf("cannot to connect: %v", err)
95 }
96 defer conn.Close()
97 c := echo.NewEchoClient(conn)
98 echoTest(c)
99 end <- true
100 }
101
102 func echoTest(c echo.EchoClient) {
103 r, err := c.Echo(context.Background(), &echo.EchoRequest{Req: "hello"})
104 if err != nil {
105 log.Fatalf("failed to echo: %v", err)
106 }
107 fmt.Printf("%s\n", r.Result)
108 }
109
110 func Test(t *testing.T) {
111 end = make(chan bool, 64)
112 go serverRun()
113 time.Sleep(1000000)
114 go clientRun()
115 <-end
116 }
117
View as plain text