diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs index c58aa58..b1e1433 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs @@ -1,5 +1,6 @@ using DysonNetwork.Shared.Models; using Microsoft.EntityFrameworkCore; +using System.Security.Cryptography; using System.Text; using System.Text.Json; @@ -235,6 +236,12 @@ public class ActivityPubDeliveryService( request.Content = new StringContent(json, Encoding.UTF8, "application/activity+json"); request.Headers.Date = DateTimeOffset.UtcNow; + var bodyBytes = Encoding.UTF8.GetBytes(json); + using var sha256 = SHA256.Create(); + var hash = sha256.ComputeHash(bodyBytes); + var digest = $"SHA-256={Convert.ToBase64String(hash)}"; + request.Headers.Add("Digest", digest); + var signatureHeaders = await signatureService.SignOutgoingRequest(request, actorUri); var signature = signatureHeaders; diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs index 9af22fb..63c5cf7 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs @@ -82,7 +82,7 @@ public class ActivityPubSignatureService( var keyPair = GetOrGenerateKeyPair(publisher); var keyId = $"{actorUri}#main-key"; - var headersToSign = new[] { "(request-target)", "host", "date" }; + var headersToSign = new[] { "(request-target)", "host", "date", "digest" }; var signingString = BuildSigningStringForRequest(request, headersToSign); var signature = keyService.Sign(keyPair.privateKeyPem, signingString); @@ -223,6 +223,13 @@ public class ActivityPubSignatureService( sb.Append(request.Headers.GetValues("Date").First()); } } + else if (header == "digest") + { + if (request.Headers.Contains("Digest")) + { + sb.Append(request.Headers.GetValues("Digest").First()); + } + } } return sb.ToString();