58 lines
1.5 KiB
C#
58 lines
1.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using ProtoBuf;
|
|
|
|
namespace Integrations.Cod.SecureRcon;
|
|
|
|
public static class Helpers
|
|
{
|
|
private static byte[] ToSerializedMessage(this SecureCommand command)
|
|
{
|
|
using var ms = new MemoryStream();
|
|
Serializer.Serialize(ms, command);
|
|
return ms.ToArray();
|
|
}
|
|
|
|
private static byte[] SignData(byte[] data, string privateKey)
|
|
{
|
|
using var rsa = new RSACryptoServiceProvider();
|
|
rsa.ImportFromPem(privateKey);
|
|
var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
|
|
rsaFormatter.SetHashAlgorithm("SHA512");
|
|
var hash = SHA512.Create();
|
|
var hashedData = hash.ComputeHash(data);
|
|
var signature = rsaFormatter.CreateSignature(hashedData);
|
|
|
|
return signature;
|
|
}
|
|
|
|
public static byte SafeConversion(char c)
|
|
{
|
|
try
|
|
{
|
|
return Convert.ToByte(c);
|
|
}
|
|
|
|
catch
|
|
{
|
|
return (byte)'.';
|
|
}
|
|
}
|
|
|
|
public static byte[] BuildSafeRconPayload(string prefix, string command, string signingKey)
|
|
{
|
|
var message = command.Select(SafeConversion).ToArray();
|
|
var header = (prefix + "\n").Select(SafeConversion).ToArray();
|
|
|
|
var secureCommand = new SecureCommand
|
|
{
|
|
SecMessage = message,
|
|
Signature = SignData(message, signingKey)
|
|
};
|
|
|
|
return header.Concat(secureCommand.ToSerializedMessage()).ToArray();
|
|
}
|
|
}
|