diff --git a/WebPush.Test/EncryptorTest.cs b/WebPush.Test/EncryptorTest.cs index 9bde97c..45fbc94 100644 --- a/WebPush.Test/EncryptorTest.cs +++ b/WebPush.Test/EncryptorTest.cs @@ -68,7 +68,7 @@ public void TestKeyGeneration() [TestMethod] public void TestSharedKeyGeneration() { - var UaPublic = @"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4"; + var UaPublic = @"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4"; var uaPublic = Base64UrlEncoder.DecodeBytes(UaPublic); var UaPrivate = @"q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94"; var uaPrivate = Base64UrlEncoder.DecodeBytes(UaPrivate); @@ -106,7 +106,7 @@ public void TestSharedKeyGeneration() public void TestEphemeralSharedKeyGeneration() { var ephemeralEcdh = ECKeyHelper.GenerateKeys(); - var UaPublic = @"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4"; + var UaPublic = @"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4"; var uaPublic = Base64UrlEncoder.DecodeBytes(UaPublic); var UaPrivate = @"q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94"; var uaPrivate = Base64UrlEncoder.DecodeBytes(UaPrivate); @@ -142,7 +142,7 @@ public void Test1_HKDF_Ikm() // key_info = "WebPush: info" || 0x00 || ua_public || as_public // IKM = HMAC-SHA-256(PRK_key, key_info || 0x01) - var UaPublic = @"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4"; + var UaPublic = @"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4"; var uaPublic = Base64UrlEncoder.DecodeBytes(UaPublic); var AsPublic = @"BP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIgDll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A8"; var asPublic = Base64UrlEncoder.DecodeBytes(AsPublic); diff --git a/WebPush.Test/WebPush.Test.csproj b/WebPush.Test/WebPush.Test.csproj index c832a34..dfe8067 100755 --- a/WebPush.Test/WebPush.Test.csproj +++ b/WebPush.Test/WebPush.Test.csproj @@ -1,6 +1,6 @@  - net10.0;net9.0 + net10.0;net9.0;net8.0 false true diff --git a/WebPush.Test/packages.lock.json b/WebPush.Test/packages.lock.json index 5d944d5..b4ca210 100644 --- a/WebPush.Test/packages.lock.json +++ b/WebPush.Test/packages.lock.json @@ -193,6 +193,204 @@ } } }, + "net8.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[18.4.0, )", + "resolved": "18.4.0", + "contentHash": "w49iZdL4HL6V25l41NVQLXWQ+e71GvSkKVteMrOL02gP/PUkcnO/1yEb2s9FntU4wGmJWfKnyrRAhcMHd9ZZNA==", + "dependencies": { + "Microsoft.CodeCoverage": "18.4.0", + "Microsoft.TestPlatform.TestHost": "18.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "lZRgNzaQnffK4XLjM/og4Eoqp/3IkpcyJQQcyKXkPdkzCT3+ghpwHa9zG1xYhQDbUFoc54M+/waLwh31K9stDQ==", + "dependencies": { + "MSTest.TestFramework": "4.2.1", + "Microsoft.Testing.Extensions.VSTestBridge": "2.2.1", + "Microsoft.Testing.Platform.MSBuild": "2.2.1" + } + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "I4/RbS2TpGZ56CE98+jPbrGlcerYtw2LvPVKzQGvyQQcJDekPy2Kd+fnThXYn+geJ1sW+vA9B7++rFNxvKcWxA==", + "dependencies": { + "MSTest.Analyzers": "4.2.1" + } + }, + "Nerdbank.GitVersioning": { + "type": "Direct", + "requested": "[3.9.50, )", + "resolved": "3.9.50", + "contentHash": "HtOgGF6jZ+WYbXnCUCYPT8Y2d6mIJo9ozjK/FINTRsXdm4Zgv9GehUMa7EFoGQkqrMcDJNOIDwCmENnvXg4UbA==" + }, + "RichardSzalay.MockHttp": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "18.4.0", + "contentHash": "9O0BtCfzCWrkAmK187ugKdq72HHOXoOUjuWFDVc2LsZZ0pOnA9bTt+Sg9q4cF+MoAaUU+MuWtvBuFsnduviJow==" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "System.Diagnostics.DiagnosticSource": "10.0.7" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.17.0", + "contentHash": "6NrxQGcZg6IunkN8K2F0UVMavNpfCjbjjjON7PYcL8FwI8aULKUreiHsRX/yaA8j3XsTJnQKUYpoQk5gBjULZw==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "8.17.0", + "contentHash": "JbFZ3OVwtvqcqgBL0cIkhRYbIP7u9GIUYLOgbNqLWtBtZY8tGDpdGyXMzUVX0gVHq1ovuHsKZrkVv+ziHEnBHw==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.17.0" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.17.0", + "contentHash": "w1vjfri0BWqW7RkSZY3ZsqekNfIJJg5BQSFs2j+a+pCXOVrkezmJcn74pT3djwjXJh71577C6wJQgNc2UPz30w==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.17.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "8.17.0", + "contentHash": "teaW35URIV2x78Tzk+dVJiC4M62/9mQoSEoDjDGoEZmcQa3H2rE+XQpm9Tmdo9KK1Lcrnve4zoyLavl69kCFGg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.IdentityModel.Logging": "8.17.0" + } + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "7zB8BjffOyvqfHF26rFVPuK0w1fCf5+j1tLuhHIr76CqxXkGb+fMJtq6YNOV+m6qPytExHMXxluk3RgJ+dSIqw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "RD6D1Jx6cKDA5IHd1H2q8ylIuQG3PD+gdULI0JC8CvsRtaypFzTFpB5xDPuQi8o6kAkcM04cBhAiJPxZboNH2Q==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Extensions.VSTestBridge": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "D8AGlkNtlTQPe3zf4SLnHBMr13lerMe0RuHSoRfnRatcuX/T7YbRtgn39rWBjKhXsNio0WXKrPKv3gfWE2I46w==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "18.3.0", + "Microsoft.Testing.Extensions.Telemetry": "2.2.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "9bbPuls/b6/vUFzxbSjJLZlJHyKBfOZE5kjIY+ITI2ASqlFPJhR83BdLydJeQOCLEZhEbrEcz5xtt1B69nwSVg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "CSJOcZHfKlTyPbS0CTJk6iEnU4gJC+eUA5z72UBnMDRdgVHYOmB8k9Y7jT233gZjnCOQiYFg3acQHRfu2H62nw==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "18.4.0", + "contentHash": "4L6m2kS2pY5uJ9cpeRxzW22opr6ttScIRqsOpMDQpgENp/ZwxkkQCcmc6LRSURo2dFaaSW5KVflQZvroiJ7Wzg==" + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "18.4.0", + "contentHash": "gZsCHI+zOmZCcKZieIL4Jg14qKD2OGZOmX5DehuIk1EA9BN6Crm0+taXQNEuajOH1G9CCyBxw8VWR4t5tumcng==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "18.4.0", + "Newtonsoft.Json": "13.0.3" + } + }, + "MSTest.Analyzers": { + "type": "Transitive", + "resolved": "4.2.1", + "contentHash": "1i9jgE/42KGGyZ4s0MdrYM/Uu/dRYhbRfYQifcO0AZ6vw4sBXRjoQGQRGNSm771AYgPAmoGl0u4sJc2lMET6HQ==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "Fu6AxFf9bHz/Q7DQmxKC0o+UgFes8bs2Xh+PH/x31yExRAOASTwlzjZsISTtqVU5gQshKHLZopxEBTaIyfv0wg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "ClosureOSS.WebPush": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "[10.0.7, )", + "Microsoft.IdentityModel.JsonWebTokens": "[8.17.0, )", + "Microsoft.IdentityModel.Tokens": "[8.17.0, )" + } + } + }, "net9.0": { "Microsoft.NET.Test.Sdk": { "type": "Direct", diff --git a/WebPush/Util/EnumHelper.cs b/WebPush/Util/EnumHelper.cs index 07834d5..50daf0e 100644 --- a/WebPush/Util/EnumHelper.cs +++ b/WebPush/Util/EnumHelper.cs @@ -9,10 +9,10 @@ public static partial class EnumHelper public static string ToKebabCaseLower(this T val) where T : Enum { - return RegexVariableName.Replace(val.ToString()!, "${first}-${remainder}").ToLower(CultureInfo.InvariantCulture); + return RegexVariableName().Replace(val.ToString()!, "${first}-${remainder}").ToLower(CultureInfo.InvariantCulture); } [GeneratedRegex("(?[a-z0-9]|(?<=[a-z0-9]))(?[A-Z])", RegexOptions.None, matchTimeoutMilliseconds: 200)] - private static partial Regex RegexVariableName { get; } + private static partial Regex RegexVariableName(); } diff --git a/WebPush/WebPush.csproj b/WebPush/WebPush.csproj index b2a46a7..3b61e82 100755 --- a/WebPush/WebPush.csproj +++ b/WebPush/WebPush.csproj @@ -5,7 +5,7 @@ Web Push library for C# - net10.0;net9.0 + net10.0;net9.0;net8.0 enable diff --git a/WebPush/WebPushClient.cs b/WebPush/WebPushClient.cs index cd2d271..651c51e 100644 --- a/WebPush/WebPushClient.cs +++ b/WebPush/WebPushClient.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Security.Cryptography; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -202,7 +203,7 @@ private static EncryptionResult EncryptPayload(PushSubscription subscription, st } catch (Exception ex) { - if (ex is FormatException || ex is ArgumentException) + if (ex is FormatException || ex is ArgumentException || ex is CryptographicException) { throw new InvalidEncryptionDetailsException("Unable to encrypt the payload with the encryption key of this subscription.", subscription); } diff --git a/WebPush/packages.lock.json b/WebPush/packages.lock.json index 81c8038..62fe135 100644 --- a/WebPush/packages.lock.json +++ b/WebPush/packages.lock.json @@ -2,12 +2,6 @@ "version": 1, "dependencies": { "net10.0": { - "Meziantou.Analyzer": { - "type": "Direct", - "requested": "[3.0.56, )", - "resolved": "3.0.56", - "contentHash": "kh6dGYKqDkkcrqBFzsd/DWa6thojGSA3+7Ngoft5rkew4+Wyn0WB8K5qqR4IN2y5Jz60230mQpx25X83qBUllA==" - }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", "requested": "[10.0.7, )", @@ -67,13 +61,73 @@ } } }, - "net9.0": { - "Meziantou.Analyzer": { + "net8.0": { + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Direct", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "System.Diagnostics.DiagnosticSource": "10.0.7" + } + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Direct", + "requested": "[8.17.0, )", + "resolved": "8.17.0", + "contentHash": "JbFZ3OVwtvqcqgBL0cIkhRYbIP7u9GIUYLOgbNqLWtBtZY8tGDpdGyXMzUVX0gVHq1ovuHsKZrkVv+ziHEnBHw==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.17.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Direct", + "requested": "[8.17.0, )", + "resolved": "8.17.0", + "contentHash": "teaW35URIV2x78Tzk+dVJiC4M62/9mQoSEoDjDGoEZmcQa3H2rE+XQpm9Tmdo9KK1Lcrnve4zoyLavl69kCFGg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.IdentityModel.Logging": "8.17.0" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.26, )", + "resolved": "8.0.26", + "contentHash": "o7/yVssM2r9Wyln2s9edBd5ANZXqdSdBI+g7JqXkyJmXrhs2WsJp25K5yPnYrTgdKBCjKB8bg+O2oew4sgzFaA==" + }, + "Nerdbank.GitVersioning": { "type": "Direct", - "requested": "[3.0.56, )", - "resolved": "3.0.56", - "contentHash": "kh6dGYKqDkkcrqBFzsd/DWa6thojGSA3+7Ngoft5rkew4+Wyn0WB8K5qqR4IN2y5Jz60230mQpx25X83qBUllA==" + "requested": "[3.9.50, )", + "resolved": "3.9.50", + "contentHash": "HtOgGF6jZ+WYbXnCUCYPT8Y2d6mIJo9ozjK/FINTRsXdm4Zgv9GehUMa7EFoGQkqrMcDJNOIDwCmENnvXg4UbA==" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.17.0", + "contentHash": "6NrxQGcZg6IunkN8K2F0UVMavNpfCjbjjjON7PYcL8FwI8aULKUreiHsRX/yaA8j3XsTJnQKUYpoQk5gBjULZw==" + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.17.0", + "contentHash": "w1vjfri0BWqW7RkSZY3ZsqekNfIJJg5BQSFs2j+a+pCXOVrkezmJcn74pT3djwjXJh71577C6wJQgNc2UPz30w==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.17.0" + } }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "Fu6AxFf9bHz/Q7DQmxKC0o+UgFes8bs2Xh+PH/x31yExRAOASTwlzjZsISTtqVU5gQshKHLZopxEBTaIyfv0wg==" + } + }, + "net9.0": { "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", "requested": "[10.0.7, )",