diff --git a/src/WireMock.Net.Abstractions/Models/IDigitalSignature.cs b/src/WireMock.Net.Abstractions/Models/IDigitalSignature.cs
new file mode 100644
index 00000000..843b0018
--- /dev/null
+++ b/src/WireMock.Net.Abstractions/Models/IDigitalSignature.cs
@@ -0,0 +1,41 @@
+// Copyright © WireMock.Net
+
+using System.Threading.Tasks;
+using WireMock.Util;
+
+namespace WireMock.Models;
+
+///
+/// A delegate encapsulating logic for fetching or generating a private key.
+///
+/// An async task containing the value of the private key.
+public delegate Task PrivateKeyCallback();
+
+///
+/// A delegate encapsulating logic for fetching or generating a digital signature.
+///
+/// The value of the private key returned by .
+/// The body data associated with the request.
+/// An async task containing the value of the digital signature.
+public delegate Task DigitalSignatureCallback(string privateKey, IBodyData? bodyData);
+
+///
+/// An interface encapsulating logic for generating a digital signature.
+///
+public interface IDigitalSignature
+{
+ ///
+ /// The header name to use for the digital signature.
+ ///
+ string HeaderName { get; set; }
+
+ ///
+ /// The callback used to fetch or generate the private key.
+ ///
+ PrivateKeyCallback PrivateKeyCallback { get; set; }
+
+ ///
+ /// The callback used to fetch or generate the digital signature.
+ ///
+ DigitalSignatureCallback DigitalSignatureCallback { get; set; }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs b/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs
index 5acee5e0..54380e1d 100644
--- a/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs
+++ b/src/WireMock.Net.Abstractions/Models/IWebhookRequest.cs
@@ -60,4 +60,14 @@ public interface IWebhookRequest
/// Gets or sets the maximum random delay in milliseconds.
///
int? MaximumRandomDelay { get; set; }
+
+ ///
+ /// Gets or sets the value used to determine if digital signatures are generated.
+ ///
+ bool? UseDigitalSignatures { get; set; }
+
+ ///
+ /// Gets or sets the values used generate digital signatures.
+ ///
+ IDigitalSignature[]? DigitalSignatures { get; set; }
}
\ No newline at end of file
diff --git a/src/WireMock.Net/Http/WebhookSender.cs b/src/WireMock.Net/Http/WebhookSender.cs
index 95947e45..fe7e0288 100644
--- a/src/WireMock.Net/Http/WebhookSender.cs
+++ b/src/WireMock.Net/Http/WebhookSender.cs
@@ -78,6 +78,31 @@ IResponseMessage originalResponseMessage
webhookRequestUrl = webhookRequest.Url;
}
+ // Add digital signatures to header (if required)
+ if (webhookRequest.UseDigitalSignatures == true)
+ {
+ if (webhookRequest.DigitalSignatures is not null)
+ {
+ foreach (var digitalSignature in webhookRequest.DigitalSignatures)
+ {
+ var privateKey = await digitalSignature.PrivateKeyCallback();
+ var signature = await digitalSignature.DigitalSignatureCallback(privateKey, bodyData);
+
+ // headers may be null here
+ headers ??= new Dictionary>();
+
+ if (headers.ContainsKey(digitalSignature.HeaderName))
+ {
+ headers[digitalSignature.HeaderName].Add(signature);
+ }
+ else
+ {
+ headers[digitalSignature.HeaderName] = new WireMockList(signature);
+ }
+ }
+ }
+ }
+
// Create RequestMessage
var requestMessage = new RequestMessage(
new UrlDetails(webhookRequestUrl),
diff --git a/src/WireMock.Net/Models/DigitalSignature.cs b/src/WireMock.Net/Models/DigitalSignature.cs
new file mode 100644
index 00000000..5bec6880
--- /dev/null
+++ b/src/WireMock.Net/Models/DigitalSignature.cs
@@ -0,0 +1,20 @@
+// Copyright © WireMock.Net
+
+using System.Threading.Tasks;
+
+namespace WireMock.Models;
+
+///
+/// A class encapsulating logic for generating a digital signature.
+///
+public class DigitalSignature : IDigitalSignature
+{
+ ///
+ public string HeaderName { get; set; } = "";
+
+ ///
+ public PrivateKeyCallback PrivateKeyCallback { get; set; } = async () => await Task.FromResult("");
+
+ ///
+ public DigitalSignatureCallback DigitalSignatureCallback { get; set; } = async (privateKey, bodyData) => await Task.FromResult("");
+}
diff --git a/src/WireMock.Net/Models/WebhookRequest.cs b/src/WireMock.Net/Models/WebhookRequest.cs
index 9c6e0978..062618f5 100644
--- a/src/WireMock.Net/Models/WebhookRequest.cs
+++ b/src/WireMock.Net/Models/WebhookRequest.cs
@@ -40,4 +40,10 @@ public class WebhookRequest : IWebhookRequest
///
public int? MaximumRandomDelay { get; set; }
+
+ ///
+ public bool? UseDigitalSignatures { get; set; }
+
+ ///
+ public IDigitalSignature[]? DigitalSignatures { get; set; }
}
\ No newline at end of file