53 lines
No EOL
1.8 KiB
C#
53 lines
No EOL
1.8 KiB
C#
using System;
|
|
using System.Text;
|
|
using BirdsiteLive.Domain.Factories;
|
|
|
|
namespace BirdsiteLive.Domain
|
|
{
|
|
public interface ICryptoService
|
|
{
|
|
string GetUserPem(string id);
|
|
string SignAndGetSignatureHeader(DateTime date, string actor, string host, string digest, string inbox);
|
|
}
|
|
|
|
public class CryptoService : ICryptoService
|
|
{
|
|
private readonly IMagicKeyFactory _magicKeyFactory;
|
|
|
|
#region Ctor
|
|
public CryptoService(IMagicKeyFactory magicKeyFactory)
|
|
{
|
|
_magicKeyFactory = magicKeyFactory;
|
|
}
|
|
#endregion
|
|
|
|
public string GetUserPem(string id)
|
|
{
|
|
return _magicKeyFactory.GetMagicKey().AsPEM;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="data"></param>
|
|
/// <param name="actor">in the form of https://domain.io/actor</param>
|
|
/// <param name="host">in the form of domain.io</param>
|
|
/// <returns></returns>
|
|
public string SignAndGetSignatureHeader(DateTime date, string actor, string targethost, string digest, string inbox)
|
|
{
|
|
var usedInbox = "/inbox";
|
|
if (!string.IsNullOrWhiteSpace(inbox))
|
|
usedInbox = inbox;
|
|
|
|
var httpDate = date.ToString("r");
|
|
|
|
var signedString = $"(request-target): post {usedInbox}\nhost: {targethost}\ndate: {httpDate}\ndigest: SHA-256={digest}";
|
|
var signedStringBytes = Encoding.UTF8.GetBytes(signedString);
|
|
var signature = _magicKeyFactory.GetMagicKey().Sign(signedStringBytes);
|
|
var sig64 = Convert.ToBase64String(signature);
|
|
|
|
var header = "keyId=\"" + actor + "\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest\",signature=\"" + sig64 + "\"";
|
|
return header;
|
|
}
|
|
}
|
|
} |