Skip to content

Commit 07ea2e1

Browse files
committed
Revert to BouncyCastle for .NET Standard 2.0 support
1 parent 146dd50 commit 07ea2e1

File tree

4 files changed

+61
-23
lines changed

4 files changed

+61
-23
lines changed

CorePush/Apple/ApnSender.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,18 @@ public async Task<ApnsResponse> SendAsync(
7575
request.Headers.Add(apnidHeader, apnsId);
7676
}
7777

78-
using var response = await http.SendAsync(request);
79-
var succeed = response.IsSuccessStatusCode;
80-
var content = await response.Content.ReadAsStringAsync();
81-
var error = JsonHelper.Deserialize<ApnsError>(content);
82-
83-
return new ApnsResponse
78+
using (var response = await http.SendAsync(request))
8479
{
85-
IsSuccess = succeed,
86-
Error = error
87-
};
80+
var succeed = response.IsSuccessStatusCode;
81+
var content = await response.Content.ReadAsStringAsync();
82+
var error = JsonHelper.Deserialize<ApnsError>(content);
83+
84+
return new ApnsResponse
85+
{
86+
IsSuccess = succeed,
87+
Error = error
88+
};
89+
}
8890
}
8991

9092
private string GetJwtToken()
@@ -107,10 +109,12 @@ private string CreateJwtToken()
107109
var payloadBasae64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(payload));
108110
var unsignedJwtData = $"{headerBase64}.{payloadBasae64}";
109111
var unsignedJwtBytes = Encoding.UTF8.GetBytes(unsignedJwtData);
110-
using var dsa = ECDsa.Create();
111-
dsa.ImportPkcs8PrivateKey(Convert.FromBase64String(CleanP8Key(settings.P8PrivateKey)), out _);
112-
var signature = dsa.SignData(unsignedJwtBytes, 0, unsignedJwtBytes.Length, HashAlgorithmName.SHA256);
113-
return $"{unsignedJwtData}.{Convert.ToBase64String(signature)}";
112+
113+
using (var dsa = AppleCryptoHelper.GetEllipticCurveAlgorithm(CleanP8Key(settings.P8PrivateKey)))
114+
{
115+
var signature = dsa.SignData(unsignedJwtBytes, 0, unsignedJwtBytes.Length, HashAlgorithmName.SHA256);
116+
return $"{unsignedJwtData}.{Convert.ToBase64String(signature)}";
117+
}
114118
}
115119

116120
private static int ToEpoch(DateTime time)

CorePush/CorePush.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.1</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0</TargetFrameworks>
55
<Description>.NET Core C# Push Notifications for Android Google Firebase Messaging (FCM) and Apple push notifications (APN).</Description>
66
<Authors>Andrei M</Authors>
77
<Company />
@@ -39,6 +39,7 @@ Previous Versions:
3939

4040
<ItemGroup>
4141
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
42+
<PackageReference Include="Portable.BouncyCastle" Version="1.8.9" />
4243
</ItemGroup>
43-
44+
4445
</Project>

CorePush/Google/FcmSender.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,20 @@ public async Task<FcmResponse> SendAsync(string deviceId, object payload)
3939
jsonObject.Add("to", JToken.FromObject(deviceId));
4040
var json = jsonObject.ToString();
4141

42-
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, fcmUrl);
43-
httpRequest.Headers.Add("Authorization", $"key = {settings.ServerKey}");
44-
httpRequest.Headers.Add("Sender", $"id = {settings.SenderId}");
45-
httpRequest.Content = new StringContent(json, Encoding.UTF8, "application/json");
46-
using var response = await http.SendAsync(httpRequest);
47-
response.EnsureSuccessStatusCode();
48-
var responseString = await response.Content.ReadAsStringAsync();
42+
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, fcmUrl))
43+
{
44+
httpRequest.Headers.Add("Authorization", $"key = {settings.ServerKey}");
45+
httpRequest.Headers.Add("Sender", $"id = {settings.SenderId}");
46+
httpRequest.Content = new StringContent(json, Encoding.UTF8, "application/json");
4947

50-
return JsonHelper.Deserialize<FcmResponse>(responseString);
48+
using (var response = await http.SendAsync(httpRequest))
49+
{
50+
response.EnsureSuccessStatusCode();
51+
var responseString = await response.Content.ReadAsStringAsync();
52+
53+
return JsonHelper.Deserialize<FcmResponse>(responseString);
54+
}
55+
}
5156
}
5257
}
5358
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+

2+
using System;
3+
using System.Security.Cryptography;
4+
using Org.BouncyCastle.Crypto.Parameters;
5+
using Org.BouncyCastle.Security;
6+
7+
namespace CorePush.Utils
8+
{
9+
public static class AppleCryptoHelper
10+
{
11+
public static ECDsa GetEllipticCurveAlgorithm(string privateKey)
12+
{
13+
var keyParams = (ECPrivateKeyParameters) PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
14+
var q = keyParams.Parameters.G.Multiply(keyParams.D).Normalize();
15+
16+
return ECDsa.Create(new ECParameters
17+
{
18+
Curve = ECCurve.CreateFromValue(keyParams.PublicKeyParamSet.Id),
19+
D = keyParams.D.ToByteArrayUnsigned(),
20+
Q =
21+
{
22+
X = q.XCoord.GetEncoded(),
23+
Y = q.YCoord.GetEncoded()
24+
}
25+
});
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)