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 }