/* * Copyright (c) 2025 Proton AG * * This file is part of ProtonVPN. * * ProtonVPN is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProtonVPN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProtonVPN. If not, see . */ using System.Text; using ProtonVPN.Common.Legacy.Vpn; namespace ProtonVPN.Vpn.OpenVpn; public class ConfigTemplate { public string GetConfig(VpnCredentials vpnCredentials, bool isIpv6Supported) { StringBuilder sb = new(); sb.AppendLine("client") .AppendLine("dev tun") .AppendLine("resolv-retry infinite") .AppendLine("cipher AES-256-GCM") .AppendLine("verb 3") .AppendLine("tun-mtu 1500") .AppendLine("tun-mtu-extra 32") .AppendLine("mssfix 1450") .AppendLine("persist-key") .AppendLine("persist-tun") .AppendLine("ping 15") .AppendLine("ping-restart 0") .AppendLine("ping-timer-rem") .AppendLine("reneg-sec 0") .AppendLine("hand-window 15") .AppendLine("connect-timeout 10") .AppendLine("connect-retry-max 1") .AppendLine("remote-cert-tls server") .AppendLine("register-dns") .AppendLine("script-security 2") .AppendLine("key-direction 1") .AppendLine("disable-dco") .AppendLine(GetTlsAuth()) .AppendLine(GetCertificate()); if (!string.IsNullOrEmpty(vpnCredentials.Username) && !string.IsNullOrEmpty(vpnCredentials.Password)) { sb.AppendLine("auth-user-pass"); } else { sb.AppendLine("").AppendLine(vpnCredentials.ClientCertPem.Trim()).AppendLine(""); sb.AppendLine("").AppendLine(vpnCredentials.ClientKeyPair.SecretKey.Pem).AppendLine(""); } if (isIpv6Supported) { sb.AppendLine("push-peer-info"); sb.AppendLine("setenv UV_IPV6 1"); } return sb.ToString(); } private string GetTlsAuth() { return @" -----BEGIN OpenVPN Static key V1----- 6acef03f62675b4b1bbd03e53b187727 423cea742242106cb2916a8a4c829756 3d22c7e5cef430b1103c6f66eb1fc5b3 75a672f158e2e2e936c3faa48b035a6d e17beaac23b5f03b10b868d53d03521d 8ba115059da777a60cbfd7b2c9c57472 78a15b8f6e68a3ef7fd583ec9f398c8b d4735dab40cbd1e3c62a822e97489186 c30a0b48c7c38ea32ceb056d3fa5a710 e10ccc7a0ddb363b08c3d2777a3395e1 0c0b6080f56309192ab5aacd4b45f55d a61fc77af39bd81a19218a79762c3386 2df55785075f37d8c71dc8a42097ee43 344739a0dd48d03025b0450cf1fb5e8c aeb893d9a96d1f15519bb3c4dcb40ee3 16672ea16c012664f8a9f11255518deb -----END OpenVPN Static key V1----- "; } private string GetCertificate() { // Root CA introduced in 2026 return @" -----BEGIN CERTIFICATE----- MIIFnTCCA4WgAwIBAgIUCI574SM3Lyh47GyNl0WAOYrqb5QwDQYJKoZIhvcNAQEL BQAwXjELMAkGA1UEBhMCQ0gxHzAdBgNVBAoMFlByb3RvbiBUZWNobm9sb2dpZXMg QUcxEjAQBgNVBAsMCVByb3RvblZQTjEaMBgGA1UEAwwRUHJvdG9uVlBOIFJvb3Qg Q0EwHhcNMTkxMDE3MDgwNjQxWhcNMzkxMDEyMDgwNjQxWjBeMQswCQYDVQQGEwJD SDEfMB0GA1UECgwWUHJvdG9uIFRlY2hub2xvZ2llcyBBRzESMBAGA1UECwwJUHJv dG9uVlBOMRowGAYDVQQDDBFQcm90b25WUE4gUm9vdCBDQTCCAiIwDQYJKoZIhvcN AQEBBQADggIPADCCAgoCggIBAMkUT7zMUS5C+NjQ7YoGpVFlfbN9HFgG4JiKfHB8 QxnPPRgyTi0zVOAj1ImsRilauY8Ddm5dQtd8qcApoz6oCx5cFiiSQG2uyhS/59Zl 5wqIkw1o+CgwZgeWkq04lcrxhhfPgJZRFjrYVezy/Z2Ssd18s3/FFNQ+2iV1KC2K z8eSPr50u+l9vEKsKiNGkJTdlWjoDKZM2C15i/h8Smi+PdJlx7WMTtYoVC1Fzq0r aCPDQl18kspu11b6d8ECPWghKcDIIKuA0r0nGqF1GvH1AmbC/xUaNrKgz9AfioZL MP/l22tVG3KKM1ku0eYHX7NzNHgkM2JKnBBannImQQBGTAcvvUlnfF3AHx4vzx7H ahpBz8ebThx2uv+vzu8lCVEcKjQObGwLbAONJN2enug8hwSSZQv7tz7onDQWlYh0 El5fnkrEQGbukNnSyOqTwfobvBllIPzBqdO38eZFA0YTlH9plYjIjPjGl931lFAA 3G9t0x7nxAauLXN5QVp1yoF1tzXc5kN0SFAasM9VtVEOSMaGHLKhF+IMyVX8h5Iu IRC8u5O672r7cHS+Dtx87LjxypqNhmbf1TWyLJSoh0qYhMr+BbO7+N6zKRIZPI5b MXc8Be2pQwbSA4ZrDvSjFC9yDXmSuZTyVo6Bqi/KCUZeaXKof68oNxVYeGowNeQd g/znAgMBAAGjUzBRMB0GA1UdDgQWBBR44WtTuEKCaPPUltYEHZoyhJo+4TAfBgNV HSMEGDAWgBR44WtTuEKCaPPUltYEHZoyhJo+4TAPBgNVHRMBAf8EBTADAQH/MA0G CSqGSIb3DQEBCwUAA4ICAQBBmzCQlHxOJ6izys3TVpaze+rUkA9GejgsB2DZXIcm 4Lj/SNzQsPlZRu4S0IZV253dbE1DoWlHanw5lnXwx8iU82X7jdm/5uZOwj2NqSqT bTn0WLAC6khEKKe5bPTf18UOcwN82Le3AnkwcNAaBO5/TzFQVgnVedXr2g6rmpp9 gdedeEl9acB7xqfYfkrmijqYMm+xeG2rXaanch3HjweMDuZdT/Ub5G6oir0Kowft lA1ytjXRg+X+yWymTpF/zGLYfSodWWjMKhpzZtRJZ+9B0pWXUyY7SuCj5T5SMIAu x3NQQ46wSbHRolIlwh7zD7kBgkyLe7ByLvGFKa2Vw4PuWjqYwrRbFjb2+EKAwPu6 VTWz/QQTU8oJewGFipw94Bi61zuaPvF1qZCHgYhVojRy6KcqncX2Hx9hjfVxspBZ DrVH6uofCmd99GmVu+qizybWQTrPaubfc/a2jJIbXc2bRQjYj/qmjE3hTlmO3k7V EP6i8CLhEl+dX75aZw9StkqjdpIApYwX6XNDqVuGzfeTXXclk4N4aDPwPFM/Yo/e KnvlNlKbljWdMYkfx8r37aOHpchH34cv0Jb5Im+1H07ywnshXNfUhRazOpubJRHn bjDuBwWS1/Vwp5AJ+QHsPXhJdl3qHc1szJZVJb3VyAWvG/bWApKfFuZX18tiI4N0 EA== -----END CERTIFICATE----- "; } }