mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-10 23:31:13 -05:00
implement secure rcon for IW4x
This commit is contained in:
57
Integrations/Cod/SecureRcon/Helpers.cs
Normal file
57
Integrations/Cod/SecureRcon/Helpers.cs
Normal file
@ -0,0 +1,57 @@
|
||||
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(512);
|
||||
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();
|
||||
}
|
||||
}
|
13
Integrations/Cod/SecureRcon/SecureCommand.cs
Normal file
13
Integrations/Cod/SecureRcon/SecureCommand.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using ProtoBuf;
|
||||
|
||||
namespace Integrations.Cod.SecureRcon;
|
||||
|
||||
[ProtoContract]
|
||||
public class SecureCommand
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public byte[] SecMessage { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public byte[] Signature { get; set; }
|
||||
}
|
Reference in New Issue
Block a user