github.com/ipfans/trojan-go@v0.11.0/api/service/server_test.go (about)

     1  package service
     2  
     3  import (
     4  	"context"
     5  	"crypto/tls"
     6  	"crypto/x509"
     7  	"fmt"
     8  	"os"
     9  	"testing"
    10  	"time"
    11  
    12  	"google.golang.org/grpc"
    13  	"google.golang.org/grpc/credentials"
    14  
    15  	"github.com/ipfans/trojan-go/common"
    16  	"github.com/ipfans/trojan-go/config"
    17  	"github.com/ipfans/trojan-go/statistic/memory"
    18  )
    19  
    20  func TestServerAPI(t *testing.T) {
    21  	ctx, cancel := context.WithCancel(context.Background())
    22  	ctx = config.WithConfig(ctx, memory.Name,
    23  		&memory.Config{
    24  			Passwords: []string{},
    25  		})
    26  	port := common.PickPort("tcp", "127.0.0.1")
    27  	ctx = config.WithConfig(ctx, Name, &Config{
    28  		APIConfig{
    29  			Enabled: true,
    30  			APIHost: "127.0.0.1",
    31  			APIPort: port,
    32  		},
    33  	})
    34  	auth, err := memory.NewAuthenticator(ctx)
    35  	common.Must(err)
    36  	go RunServerAPI(ctx, auth)
    37  	time.Sleep(time.Second * 3)
    38  	common.Must(auth.AddUser("hash1234"))
    39  	_, user := auth.AuthUser("hash1234")
    40  	conn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithInsecure())
    41  	common.Must(err)
    42  	server := NewTrojanServerServiceClient(conn)
    43  	stream1, err := server.ListUsers(ctx, &ListUsersRequest{})
    44  	common.Must(err)
    45  	for {
    46  		resp, err := stream1.Recv()
    47  		if err != nil {
    48  			break
    49  		}
    50  		fmt.Println(resp.Status.User.Hash)
    51  		if resp.Status.User.Hash != "hash1234" {
    52  			t.Fail()
    53  		}
    54  		fmt.Println(resp.Status.SpeedCurrent)
    55  		fmt.Println(resp.Status.SpeedLimit)
    56  	}
    57  	stream1.CloseSend()
    58  	user.AddTraffic(1234, 5678)
    59  	time.Sleep(time.Second * 1)
    60  	stream2, err := server.GetUsers(ctx)
    61  	common.Must(err)
    62  	stream2.Send(&GetUsersRequest{
    63  		User: &User{
    64  			Hash: "hash1234",
    65  		},
    66  	})
    67  	resp2, err := stream2.Recv()
    68  	common.Must(err)
    69  	if resp2.Status.TrafficTotal.DownloadTraffic != 1234 || resp2.Status.TrafficTotal.UploadTraffic != 5678 {
    70  		t.Fatal("wrong traffic")
    71  	}
    72  
    73  	stream3, err := server.SetUsers(ctx)
    74  	common.Must(err)
    75  	stream3.Send(&SetUsersRequest{
    76  		Status: &UserStatus{
    77  			User: &User{
    78  				Hash: "hash1234",
    79  			},
    80  		},
    81  		Operation: SetUsersRequest_Delete,
    82  	})
    83  	resp3, err := stream3.Recv()
    84  	if err != nil || !resp3.Success {
    85  		t.Fatal("user not exists")
    86  	}
    87  	valid, _ := auth.AuthUser("hash1234")
    88  	if valid {
    89  		t.Fatal("failed to auth")
    90  	}
    91  	stream3.Send(&SetUsersRequest{
    92  		Status: &UserStatus{
    93  			User: &User{
    94  				Hash: "newhash",
    95  			},
    96  		},
    97  		Operation: SetUsersRequest_Add,
    98  	})
    99  	resp3, err = stream3.Recv()
   100  	if err != nil || !resp3.Success {
   101  		t.Fatal("failed to read")
   102  	}
   103  	valid, user = auth.AuthUser("newhash")
   104  	if !valid {
   105  		t.Fatal("failed to auth 2")
   106  	}
   107  	stream3.Send(&SetUsersRequest{
   108  		Status: &UserStatus{
   109  			User: &User{
   110  				Hash: "newhash",
   111  			},
   112  			SpeedLimit: &Speed{
   113  				DownloadSpeed: 5000,
   114  				UploadSpeed:   3000,
   115  			},
   116  			TrafficTotal: &Traffic{
   117  				DownloadTraffic: 1,
   118  				UploadTraffic:   1,
   119  			},
   120  		},
   121  		Operation: SetUsersRequest_Modify,
   122  	})
   123  	go func() {
   124  		for {
   125  			select {
   126  			case <-ctx.Done():
   127  				return
   128  			default:
   129  			}
   130  			user.AddTraffic(200, 0)
   131  		}
   132  	}()
   133  	go func() {
   134  		for {
   135  			select {
   136  			case <-ctx.Done():
   137  				return
   138  			default:
   139  			}
   140  			user.AddTraffic(0, 300)
   141  		}
   142  	}()
   143  	time.Sleep(time.Second * 3)
   144  	for i := 0; i < 3; i++ {
   145  		stream2.Send(&GetUsersRequest{
   146  			User: &User{
   147  				Hash: "newhash",
   148  			},
   149  		})
   150  		resp2, err = stream2.Recv()
   151  		common.Must(err)
   152  		fmt.Println(resp2.Status.SpeedCurrent)
   153  		fmt.Println(resp2.Status.SpeedLimit)
   154  		time.Sleep(time.Second)
   155  	}
   156  	stream2.CloseSend()
   157  	cancel()
   158  }
   159  
   160  func TestTLSRSA(t *testing.T) {
   161  	port := common.PickPort("tcp", "127.0.0.1")
   162  	cfg := &Config{
   163  		API: APIConfig{
   164  			Enabled: true,
   165  			APIHost: "127.0.0.1",
   166  			APIPort: port,
   167  			SSL: SSLConfig{
   168  				Enabled:        true,
   169  				CertPath:       "server-rsa2048.crt",
   170  				KeyPath:        "server-rsa2048.key",
   171  				VerifyClient:   false,
   172  				ClientCertPath: []string{"client-rsa2048.crt"},
   173  			},
   174  		},
   175  	}
   176  
   177  	ctx := config.WithConfig(context.Background(), Name, cfg)
   178  	ctx = config.WithConfig(ctx, memory.Name,
   179  		&memory.Config{
   180  			Passwords: []string{},
   181  		})
   182  
   183  	auth, err := memory.NewAuthenticator(ctx)
   184  	common.Must(err)
   185  	go func() {
   186  		common.Must(RunServerAPI(ctx, auth))
   187  	}()
   188  	time.Sleep(time.Second)
   189  	pool := x509.NewCertPool()
   190  	certBytes, err := os.ReadFile("server-rsa2048.crt")
   191  	common.Must(err)
   192  	pool.AppendCertsFromPEM(certBytes)
   193  
   194  	certificate, err := tls.LoadX509KeyPair("client-rsa2048.crt", "client-rsa2048.key")
   195  	common.Must(err)
   196  	creds := credentials.NewTLS(&tls.Config{
   197  		ServerName:   "localhost",
   198  		RootCAs:      pool,
   199  		Certificates: []tls.Certificate{certificate},
   200  	})
   201  	conn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithTransportCredentials(creds))
   202  	common.Must(err)
   203  	server := NewTrojanServerServiceClient(conn)
   204  	stream, err := server.ListUsers(ctx, &ListUsersRequest{})
   205  	common.Must(err)
   206  	stream.CloseSend()
   207  	conn.Close()
   208  }
   209  
   210  func TestTLSECC(t *testing.T) {
   211  	port := common.PickPort("tcp", "127.0.0.1")
   212  	cfg := &Config{
   213  		API: APIConfig{
   214  			Enabled: true,
   215  			APIHost: "127.0.0.1",
   216  			APIPort: port,
   217  			SSL: SSLConfig{
   218  				Enabled:        true,
   219  				CertPath:       "server-ecc.crt",
   220  				KeyPath:        "server-ecc.key",
   221  				VerifyClient:   false,
   222  				ClientCertPath: []string{"client-ecc.crt"},
   223  			},
   224  		},
   225  	}
   226  
   227  	ctx := config.WithConfig(context.Background(), Name, cfg)
   228  	ctx = config.WithConfig(ctx, memory.Name,
   229  		&memory.Config{
   230  			Passwords: []string{},
   231  		})
   232  
   233  	auth, err := memory.NewAuthenticator(ctx)
   234  	common.Must(err)
   235  	go func() {
   236  		common.Must(RunServerAPI(ctx, auth))
   237  	}()
   238  	time.Sleep(time.Second)
   239  	pool := x509.NewCertPool()
   240  	certBytes, err := os.ReadFile("server-ecc.crt")
   241  	common.Must(err)
   242  	pool.AppendCertsFromPEM(certBytes)
   243  
   244  	certificate, err := tls.LoadX509KeyPair("client-ecc.crt", "client-ecc.key")
   245  	common.Must(err)
   246  	creds := credentials.NewTLS(&tls.Config{
   247  		ServerName:   "localhost",
   248  		RootCAs:      pool,
   249  		Certificates: []tls.Certificate{certificate},
   250  	})
   251  	conn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", port), grpc.WithTransportCredentials(creds))
   252  	common.Must(err)
   253  	server := NewTrojanServerServiceClient(conn)
   254  	stream, err := server.ListUsers(ctx, &ListUsersRequest{})
   255  	common.Must(err)
   256  	stream.CloseSend()
   257  	conn.Close()
   258  }
   259  
   260  var serverRSA2048Cert = `
   261  -----BEGIN CERTIFICATE-----
   262  MIIC5TCCAc2gAwIBAgIJAJqNVe6g/10vMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
   263  BAMMCWxvY2FsaG9zdDAeFw0yMTA5MTQwNjE1MTFaFw0yNjA5MTMwNjE1MTFaMBQx
   264  EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
   265  ggEBAK7bupJ8tmHM3shQ/7N730jzpRsXdNiBxq/Jxx8j+vB3AcxuP5bjXQZqS6YR
   266  5W5vrfLlegtq1E/mmaI3Ht0RfIlzev04Dua9PWmIQJD801nEPknbfgCLXDh+pYr2
   267  sfg8mUh3LjGtrxyH+nmbTjWg7iWSKohmZ8nUDcX94Llo5FxibMAz8OsAwOmUueCH
   268  jP3XswZYHEy+OOP3K0ZEiJy0f5T6ZXk9OWYuPN4VQKJx1qrc9KzZtSPHwqVdkGUi
   269  ase9tOPA4aMutzt0btgW7h7UrvG6C1c/Rr1BxdiYq1EQ+yypnAlyToVQSNbo67zz
   270  wGQk4GeruIkOgJOLdooN/HjhbHMCAwEAAaM6MDgwFAYDVR0RBA0wC4IJbG9jYWxo
   271  b3N0MAsGA1UdDwQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0B
   272  AQsFAAOCAQEASsBzHHYiWDDiBVWUEwVZAduTrslTLNOxG0QHBKsHWIlz/3QlhQil
   273  ywb3OhfMTUR1dMGY5Iq5432QiCHO4IMCOv7tDIkgb4Bc3v/3CRlBlnurtAmUfNJ6
   274  pTRSlK4AjWpGHAEEd/8aCaOE86hMP8WDht8MkJTRrQqpJ1HeDISoKt9nepHOIsj+
   275  I2zLZZtw0pg7FuR4MzWuqOt071iRS46Pupryb3ZEGIWNz5iLrDQod5Iz2ZGSRGqE
   276  rB8idX0mlj5AHRRanVR3PAes+eApsW9JvYG/ImuCOs+ZsukY614zQZdR+SyFm85G
   277  4NICyeQsmiypNHHgw+xZmGqZg65bXNGoyg==
   278  -----END CERTIFICATE-----
   279  `
   280  
   281  var serverRSA2048Key = `
   282  -----BEGIN PRIVATE KEY-----
   283  MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu27qSfLZhzN7I
   284  UP+ze99I86UbF3TYgcavyccfI/rwdwHMbj+W410GakumEeVub63y5XoLatRP5pmi
   285  Nx7dEXyJc3r9OA7mvT1piECQ/NNZxD5J234Ai1w4fqWK9rH4PJlIdy4xra8ch/p5
   286  m041oO4lkiqIZmfJ1A3F/eC5aORcYmzAM/DrAMDplLngh4z917MGWBxMvjjj9ytG
   287  RIictH+U+mV5PTlmLjzeFUCicdaq3PSs2bUjx8KlXZBlImrHvbTjwOGjLrc7dG7Y
   288  Fu4e1K7xugtXP0a9QcXYmKtREPssqZwJck6FUEjW6Ou888BkJOBnq7iJDoCTi3aK
   289  Dfx44WxzAgMBAAECggEBAKYhib/H0ZhWB4yWuHqUxG4RXtrAjHlvw5Acy5zgmHiC
   290  +Sh7ztrTJf0EXN9pvWwRm1ldgXj7hMBtPaaLbD1pccM9/qo66p17Sq/LjlyyeTOe
   291  affOHIbz4Sij2zCOdkR9fr0EztTQScF3yBhl4Aa/4cO8fcCeWxm86WEldq9x4xWJ
   292  s5WMR4CnrOJhDINLNPQPKX92KyxEQ/RfuBWovx3M0nl3fcUWfESY134t5g/UBFId
   293  In19tZ+pGIpCkxP0U1AZWrlZRA8Q/3sO2orUpoAOdCrGk/DcCTMh0c1pMzbYZ1/i
   294  cYXn38MpUo8QeG4FElUhAv6kzeBIl2tRBMVzIigo+AECgYEA3No1rHdFu6Ox9vC8
   295  E93PTZevYVcL5J5yx6x7khCaOLKKuRXpjOX/h3Ll+hlN2DVAg5Jli/JVGCco4GeK
   296  kbFLSyxG1+E63JbgsVpaEOgvFT3bHHSPSRJDnIU+WkcNQ2u4Ky5ahZzbNdV+4fj2
   297  NO2iMgkm7hoJANrm3IqqW8epenMCgYEAyq+qdNj5DiDzBcDvLwY+4/QmMOOgDqeh
   298  /TzhbDRyr+m4xNT7LLS4s/3wcbkQC33zhMUI3YvOHnYq5Ze/iL/TSloj0QCp1I7L
   299  J7sZeM1XimMBQIpCfOC7lf4tU76Fz0DTHAL+CmX1DgmRJdYO09843VsKkscC968R
   300  4cwL5oGxxgECgYAM4TTsH/CTJtLEIfn19qOWVNhHhvoMlSkAeBCkzg8Qa2knrh12
   301  uBsU3SCIW11s1H40rh758GICDJaXr7InGP3ZHnXrNRlnr+zeqvRBtCi6xma23B1X
   302  F5eV0zd1sFsXqXqOGh/xVtp54z+JEinZoForLNl2XVJVGG8KQZP50kUR/QKBgH4O
   303  8zzpFT0sUPlrHVdp0wODfZ06dPmoWJ9flfPuSsYN3tTMgcs0Owv3C+wu5UPAegxB
   304  X1oq8W8Qn21cC8vJQmgj19LNTtLcXI3BV/5B+Aghu02gr+lq/EA1bYuAG0jjUGlD
   305  kyx0bQzl9lhJ4b70PjGtxc2z6KyTPdPpTB143FABAoGAQDoIUdc77/IWcjzcaXeJ
   306  8abak5rAZA7cu2g2NVfs+Km+njsB0pbTwMnV1zGoFABdaHLdqbthLWtX7WOb1PDD
   307  MQ+kbiLw5uj8IY2HEqJhDGGEdXBqxbW7kyuIAN9Mw+mwKzkikNcFQdxgchWH1d1o
   308  lVkr92iEX+IhIeYb4DN1vQw=
   309  -----END PRIVATE KEY-----
   310  `
   311  
   312  var clientRSA2048Cert = `
   313  -----BEGIN CERTIFICATE-----
   314  MIIC5TCCAc2gAwIBAgIJAKD1wSl+Mnk7MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
   315  BAMMCWxvY2FsaG9zdDAeFw0yMTA5MTQwNjE2MDBaFw0yNjA5MTMwNjE2MDBaMBQx
   316  EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
   317  ggEBAJeDu630louuf2V4sw396cGiAnxmTseVRMG+m3PnZ831puAsApm3IWSEcOqI
   318  UMk6s1pgSLysg6GxRZhX4L/ljErjMO4+y8riZjqqR0wd0GnhuNxuXaSUsEmKdDZb
   319  cICqXkZeZRn4jw/7L0xgdAdM2w3LXR6aq6CwveFY3/JncEZFQHH5mnorZdpbheR6
   320  rhvIL6AAI0YEY9uzuQBSrzOml3f7D+x5Xll14HoMN0kCysWt8jSP/An5yP8pL5RO
   321  pn5kNBc8Bx8lykuV1uS8ogncSM7JzmpP1SeAViOq8CqXlJtUbUqVPckMmdfMMtbI
   322  qIO7R5/8imrdhLMi25fAOnfmDzcCAwEAAaM6MDgwFAYDVR0RBA0wC4IJbG9jYWxo
   323  b3N0MAsGA1UdDwQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0B
   324  AQsFAAOCAQEAFu2QPE3x1Sm3SfnHzAhvdjviYkbWvM8rQziIlIevbvA9Nl+vxDBf
   325  N5aRR6Hpxq02J2G/w7tzrKB9IluWdMU1+tilph5bCnwx3QUh/GR4oTsFiTvTZ5br
   326  SNf3xfTyIsL+Hf6iLvEgSt15ziY/334wu9NmQrU0FNZ+Lcc7Mx0OgvuP9Zim+6oo
   327  /FW80R3pUSzUZcUQgsI4Sz7/6nJTxhsc+kqtnOXIQLPC9GA06kP8eN6XjTsavP7f
   328  eZq/yozddOk0dqx8uwmKUOb1Rg+pS8VIhQBRv3UPb4L/07AWSTZSMZLf1+CMgzMY
   329  Jtsxa1MLqPkB7fiAR6SFUFW7Q36gDp/Mdw==
   330  -----END CERTIFICATE-----
   331  `
   332  
   333  var clientRSA2048Key = `
   334  -----BEGIN PRIVATE KEY-----
   335  MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXg7ut9JaLrn9l
   336  eLMN/enBogJ8Zk7HlUTBvptz52fN9abgLAKZtyFkhHDqiFDJOrNaYEi8rIOhsUWY
   337  V+C/5YxK4zDuPsvK4mY6qkdMHdBp4bjcbl2klLBJinQ2W3CAql5GXmUZ+I8P+y9M
   338  YHQHTNsNy10emqugsL3hWN/yZ3BGRUBx+Zp6K2XaW4Xkeq4byC+gACNGBGPbs7kA
   339  Uq8zppd3+w/seV5ZdeB6DDdJAsrFrfI0j/wJ+cj/KS+UTqZ+ZDQXPAcfJcpLldbk
   340  vKIJ3EjOyc5qT9UngFYjqvAql5SbVG1KlT3JDJnXzDLWyKiDu0ef/Ipq3YSzItuX
   341  wDp35g83AgMBAAECggEASOv4CjMrubKUUgwTcWqBdNY6iBDdXaVz4COSweffx/qx
   342  BDdqUP0Yrz4m8loFN7Ru2dJ5b4VAHTQqoLW6z+D08p4B0MicYNsyBI4rnnDC/BLN
   343  XBoqK6n8Zoiigf7kWKimkwufcS51/GUSUJojfdf5ndwAx1f9vmsSGEEkF5C9MrQo
   344  Sa4eyySuXuDS9swrXuTn9FcVcbUoIblgL8GIlmX4S1Xl9NaVS/VAVt42FgpNSYy7
   345  2Qf9Medg3ApimjwkLiDSh0RElirlUwzSg9dx2U+hHwWQWimb2AhA85uK3bpFB/x9
   346  b2agS1uxTar4mk4LFppQqVUuXlpj2hW7HxTdcxGHYQKBgQDGA+Wv3b8FMeszYqqx
   347  BbI5+FeXmQ5AoYNdHyPfCH8f2LX1FTnnQbUvFMJ3UQZl/GGHocgyFNvfDo6YyYsg
   348  2XgcNO/JWMbKEw0HkfMgkaIa3Jfq/PTB386NhqBq5FHiBUrvSHzhaIzpuaokBrRk
   349  jFlcqONK+uj77iRgci4wR59POQKBgQDD4fDZzOGQCy/AWrMX/adk8ymoxhWQj6PN
   350  zhy2GZo9jGwyskQr5neIDQtxRbgokMspxpyPdQG2SxbG/zygyFEaCsp/Xb3iB3aA
   351  2dcktkV9agx+g1WrflTpGG9quW5vQJgQv9FtlVXJdiihN9CQvXAcYRjUA/zkadIL
   352  GsrVF9rh7wKBgFoMLaiDU7neEJKGnQ7xgzI/kD29ebDEgkOXxK1JZN4ro9t3MqTK
   353  ycVGUIUIELvSQNv4I107BR3ztb8fcCiZHLjfDehnecctULCPm5vE/o3uoRtYu0lr
   354  KLhNb6gMenwpYgFc2oV7ERG8v/WwItrSxFSR7QMNBWSD0IEXi4+jEnxpAoGAMJTS
   355  5VG5B76egzh7fpG8eH8Ob/tg0c+uMpbR7CABbw5qr1AjNDgeoTGLCvbdq8HtgVju
   356  7213lTyeU5Bt+vpzkt/mRRx8wZhUPbTJdSN3rJkmrCHql3Pnn0AeMfv3dcQxcsYA
   357  LQuCkUqq3QE4yw0QxxkVzU+H4yaTn4lvkNYvxSUCgYEAgD85MM3DaiNcrevQv6Wb
   358  vSo7jBhd8Q/NawH53V32eIlF9Kkm2mqTmPIQ2OxOtdZ3xm+JmPd20jEVg7NcPL58
   359  t6BoSH10pLaI0CP2NdcYfJTIiHAhuQe7PxPCA0nlHTXgSv97QR7y4qMhbf2j1umc
   360  hKym0tdk2QjR3qqglaD572A=
   361  -----END PRIVATE KEY-----
   362  `
   363  
   364  var serverECCCert = `
   365  -----BEGIN CERTIFICATE-----
   366  MIICTDCCAfKgAwIBAgIQDtCrO8cNST2eY2tA/AGrsDAKBggqhkjOPQQDAjBeMQsw
   367  CQYDVQQGEwJDTjEOMAwGA1UEChMFTXlTU0wxKzApBgNVBAsTIk15U1NMIFRlc3Qg
   368  RUNDIC0gRm9yIHRlc3QgdXNlIG9ubHkxEjAQBgNVBAMTCU15U1NMLmNvbTAeFw0y
   369  MTA5MTQwNjQ1MzNaFw0yNjA5MTMwNjQ1MzNaMCExCzAJBgNVBAYTAkNOMRIwEAYD
   370  VQQDEwlsb2NhbGhvc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASvYy/r7XR1
   371  Y39lC2JpRJh582zR2CTNynbuolK9a1jsbXaZv+hpBlHkgzMHsWu7LY9Pnb/Dbp4i
   372  1lRASOddD/rLo4HOMIHLMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEF
   373  BQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUWxGyVxD0fBhTy3tH4eKznRFXFCYw
   374  YwYIKwYBBQUHAQEEVzBVMCEGCCsGAQUFBzABhhVodHRwOi8vb2NzcC5teXNzbC5j
   375  b20wMAYIKwYBBQUHMAKGJGh0dHA6Ly9jYS5teXNzbC5jb20vbXlzc2x0ZXN0ZWNj
   376  LmNydDAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIgDQUa
   377  GEdmKstLMHUmmPMGm/P9S4vvSZV2VHsb3+AEyIUCIQCdJpbyTCz+mEyskhwrGOw/
   378  blh3WBONv6MBtqPpmgE1AQ==
   379  -----END CERTIFICATE-----
   380  `
   381  
   382  var serverECCKey = `
   383  -----BEGIN EC PRIVATE KEY-----
   384  MHcCAQEEIB8G2suYKuBLoodNIwRMp3JPN1fcZxCt3kcOYIx4nbcPoAoGCCqGSM49
   385  AwEHoUQDQgAEr2Mv6+10dWN/ZQtiaUSYefNs0dgkzcp27qJSvWtY7G12mb/oaQZR
   386  5IMzB7Fruy2PT52/w26eItZUQEjnXQ/6yw==
   387  -----END EC PRIVATE KEY-----
   388  `
   389  
   390  var clientECCCert = `
   391  -----BEGIN CERTIFICATE-----
   392  MIICTDCCAfKgAwIBAgIQb5FLuCggTiWFtt/dPh+2bTAKBggqhkjOPQQDAjBeMQsw
   393  CQYDVQQGEwJDTjEOMAwGA1UEChMFTXlTU0wxKzApBgNVBAsTIk15U1NMIFRlc3Qg
   394  RUNDIC0gRm9yIHRlc3QgdXNlIG9ubHkxEjAQBgNVBAMTCU15U1NMLmNvbTAeFw0y
   395  MTA5MTQwNjQ2MTFaFw0yNjA5MTMwNjQ2MTFaMCExCzAJBgNVBAYTAkNOMRIwEAYD
   396  VQQDEwlsb2NhbGhvc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQME+DnYtcK
   397  lbcZmc33oEtoeRWH61DYdl4ei/bM+vkv01MkBB+YTZl0yofJIFJYsfU5pMFK+uyw
   398  D4qdcklKPGIKo4HOMIHLMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEF
   399  BQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUWxGyVxD0fBhTy3tH4eKznRFXFCYw
   400  YwYIKwYBBQUHAQEEVzBVMCEGCCsGAQUFBzABhhVodHRwOi8vb2NzcC5teXNzbC5j
   401  b20wMAYIKwYBBQUHMAKGJGh0dHA6Ly9jYS5teXNzbC5jb20vbXlzc2x0ZXN0ZWNj
   402  LmNydDAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIgfjaU
   403  sCfgklPsjHzs3fUtSRGfWoRLFsRBO66RtHJSzrYCIQDAxgx0FB0mAXbflj4mXJVA
   404  9/SjaCI40D6MhMnJhQS7Zg==
   405  -----END CERTIFICATE-----
   406  `
   407  
   408  var clientECCKey = `
   409  -----BEGIN EC PRIVATE KEY-----
   410  MHcCAQEEINgbap6WOGXm8V+ghIyporGcGWnggbjjP9xNsxhn+0sqoAoGCCqGSM49
   411  AwEHoUQDQgAEDBPg52LXCpW3GZnN96BLaHkVh+tQ2HZeHov2zPr5L9NTJAQfmE2Z
   412  dMqHySBSWLH1OaTBSvrssA+KnXJJSjxiCg==
   413  -----END EC PRIVATE KEY-----
   414  `
   415  
   416  func init() {
   417  	os.WriteFile("server-rsa2048.crt", []byte(serverRSA2048Cert), 0o777)
   418  	os.WriteFile("server-rsa2048.key", []byte(serverRSA2048Key), 0o777)
   419  	os.WriteFile("client-rsa2048.crt", []byte(clientRSA2048Cert), 0o777)
   420  	os.WriteFile("client-rsa2048.key", []byte(clientRSA2048Key), 0o777)
   421  
   422  	os.WriteFile("server-ecc.crt", []byte(serverECCCert), 0o777)
   423  	os.WriteFile("server-ecc.key", []byte(serverECCKey), 0o777)
   424  	os.WriteFile("client-ecc.crt", []byte(clientECCCert), 0o777)
   425  	os.WriteFile("client-ecc.key", []byte(clientECCKey), 0o777)
   426  }