Update: Full E2EE + Scripts

This commit is contained in:
2026-03-21 04:45:49 -04:00
parent cc31c4024a
commit 8a771220e4
21 changed files with 940 additions and 207 deletions

View File

@@ -1,10 +1,7 @@
using System.Text.Json;
using System;
using WebSocketSharp.Server;
using WebSocketSharp;
using RelayServer.Models;
using RelayServer.Services;
using WebSocketSharp.Server;
using RelayServer.Models;
var surrealService = new SurrealService();
var coreClient = new CoreClientService();
@@ -12,23 +9,25 @@ var cryptoService = new ChannelCryptoService();
await using var db = await surrealService.ConnectAsync();
ChatTest.ClientKeyService = new ClientKeyService(db);
ChatTest.Db = db;
var wssv = new WebSocketServer("ws://localhost:1337");
wssv.AddWebSocketService<ChatTest>("/");
wssv.Start();
Console.WriteLine("WebSocket server started");
Console.ReadKey(true);
wssv.Stop();
var keeper = await coreClient.GetUserByUsernameAsync("Keeper317");
var kira = await coreClient.GetUserByUsernameAsync("Ru_Kira");
var test = await coreClient.GetUserByUsernameAsync("Test");
if (keeper is null || kira is null)
if (keeper is null || kira is null || test is null)
{
Console.WriteLine("One or more required users do not exist in RelayCore.");
return;
}
if (!keeper.Licensed || !kira.Licensed)
if (!keeper.Licensed || !kira.Licensed || !test.Licensed)
{
Console.WriteLine("One or more required users are not licensed.");
return;
@@ -36,11 +35,12 @@ if (!keeper.Licensed || !kira.Licensed)
Console.WriteLine($"Core verified user: {keeper.Username}");
Console.WriteLine($"Core verified user: {kira.Username}");
Console.WriteLine($"Core verified user: {test.Username}");
var server = await db.Create("servers", new Servers
{
Name = "Test Server",
OwnerUserId = kira.Id,
OwnerUserId = keeper.Id,
CreatedAt = DateTime.UtcNow
});
@@ -60,6 +60,13 @@ var kiraMember = await db.Create("server_members", new ServerMembers
IsOwner = false
});
var testMember = await db.Create("server_members", new ServerMembers
{
UserId = test.Id,
JoinedAt = DateTime.UtcNow,
IsOwner = false
});
Console.WriteLine("Server members created.");
var channel = await db.Create("channels", new Channels
@@ -72,66 +79,29 @@ Console.WriteLine($"Channel created: {ToJsonString(channel)}");
var channelId = GetRecordId(channel.Id);
Console.WriteLine($"Resolved channelId: {channelId}");
ChatTest.DefaultChannelId = channelId;
var keyBase64 = cryptoService.GenerateKey();
var serverKeys = E2EeHelper.GenerateRsaKeyPair();
var serverKey = await db.Create("server_encryption_keys", new ServerEncryptionKeys
{
KeyBase64 = keyBase64,
PublicKey = serverKeys.publicKey,
PrivateKey = serverKeys.privateKey,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow
});
ChatTest.ServerPublicKey = serverKeys.publicKey;
ChatTest.ServerPrivateKey = serverKeys.privateKey;
ChatTest.ChannelDbKey = keyBase64;
Console.WriteLine("Server encryption key created.");
var encrypted = cryptoService.Encrypt("hello from Keeper317 in #general", keyBase64);
Console.ReadKey(true);
wssv.Stop();
var savedMessage = await db.Create("channel_messages", new ChannelMessages
{
ChannelId = channelId,
SenderUserId = keeper.Id,
CipherText = encrypted.cipherText,
Nonce = encrypted.nonce,
Tag = encrypted.tag,
CreatedAt = DateTime.UtcNow
});
Console.WriteLine($"Encrypted message saved: {ToJsonString(savedMessage)}");
var decrypted = cryptoService.Decrypt(
savedMessage.CipherText,
savedMessage.Nonce,
savedMessage.Tag,
keyBase64
);
var storedMessages = await db.Select<ChannelMessages>("channel_messages");
Console.WriteLine("Stored DB messages:");
Console.WriteLine(ToJsonString(storedMessages));
Console.WriteLine();
Console.WriteLine($"Decrypted message: {decrypted}");
Console.WriteLine();
Console.WriteLine("Simulating Kira reading #general...");
var kiraVisibleMessages = storedMessages
.Where(m => m.ChannelId == channelId)
.OrderBy(m => m.CreatedAt)
.ToList();
foreach (var msg in kiraVisibleMessages)
{
var plainText = cryptoService.Decrypt(
msg.CipherText,
msg.Nonce,
msg.Tag,
keyBase64
);
Console.WriteLine($"Kira reads message from {msg.SenderUserId}: {plainText}");
}
return;
static string ToJsonString(object? obj)
@@ -158,15 +128,4 @@ static string GetRecordId(object? id)
var table = root.GetProperty("Table").GetString() ?? string.Empty;
return $"{table}:{recordId}";
}
public class ChatTest : WebSocketBehavior
{
protected override void OnMessage(MessageEventArgs e)
{
// var msg = e.Data.Split(":")[1] == "PING" ? "SERVER:PONG" : "SERVER:RESPONSE";
var msg = e.Data;
Console.WriteLine(msg);
Send(msg);
}
}