progress on RequestToString

This commit is contained in:
Rusty Striker 2024-12-20 12:13:39 +02:00
parent 90a3be5754
commit 9a0482fd56
Signed by: RustyStriker
GPG key ID: 87E4D691632DFF15
3 changed files with 83 additions and 23 deletions

View file

@ -1,6 +1,7 @@
namespace lib; namespace lib;
public enum RequestType { public enum RequestType
{
Register = 1, Register = 1,
ConfirmRegister = 2, ConfirmRegister = 2,
Login = 3, Login = 3,
@ -9,20 +10,25 @@ public enum RequestType {
SendMessage = 6, SendMessage = 6,
} }
public static class Request { public static class Request
public static byte[] CreateRequest(RequestType Type, ref byte counter, byte[] data) { {
if(data.Length > 13) { public static byte[] CreateRequest(RequestType Type, ref byte counter, byte[] data)
{
if (data.Length > 13)
{
throw new Exception("extra data is too long: " + data.Length.ToString()); throw new Exception("extra data is too long: " + data.Length.ToString());
} }
byte[] msg = new byte[128]; byte[] msg = new byte[16];
msg[0] = 0; // version msg[0] = 0; // version
msg[1] = (byte)Type; msg[1] = (byte)Type;
msg[2] = counter; msg[2] = counter;
if(counter == byte.MaxValue) { if (counter == byte.MaxValue)
{
counter = 0; counter = 0;
} }
else { else
{
counter += 1; counter += 1;
} }
@ -30,4 +36,46 @@ public static class Request {
Array.Copy(data, 0, msg, 3, data.Length); Array.Copy(data, 0, msg, 3, data.Length);
return msg; return msg;
} }
public static string RequestToString(byte[] Request)
{
if (Request.Length != 16)
{
throw new Exception("Request size is not 128!");
}
string res = $"V: {Request[0]}, ";
res += $"Request type: {(RequestType)Request[1]}, ";
res += $"Counter: {Request[2]}\n";
res += $"Extra: {string.Join(' ', Request[3..].Select(b => b.ToString("{b8}")))}";
// also display extra data based on the request itself
switch ((RequestType)Request[1])
{
case RequestType.Register:
string phone = Utils.BytesToNumber(Request[3..11]);
int rsaLen = BitConverter.ToInt32(Request, 11);
res += $"Phone: {phone}, RSA Key length: {rsaLen}";
break;
case RequestType.ConfirmRegister:
string code = string.Join(' ', Request[3..9]);
int sigLen = BitConverter.ToInt32(Request, 9);
res += $"Code: {code}, signature length: {sigLen}";
break;
case RequestType.Login:
phone = Utils.BytesToNumber(Request[3..11]);
sigLen = BitConverter.ToInt16(Request, 11);
res += $"Phone: {phone}, signature length: {sigLen}";
break;
case RequestType.GetMessages:
break;
case RequestType.GetUserKey:
break;
case RequestType.SendMessage:
break;
default:
res += "INVALID REQUEST TYPE";
break;
}
return res;
}
} }

View file

@ -1,18 +1,22 @@
using System.Text;
using System.Linq; using System.Linq;
using System.Text;
namespace lib; namespace lib;
public static class Utils { public static class Utils
public static byte[] NumberToBytes(string Number) { {
if(Number.Any(c => !char.IsDigit(c)) || Number.Length > 16) { public static byte[] NumberToBytes(string Number)
{
if (Number.Any(c => !char.IsDigit(c)) || Number.Length > 16)
{
throw new Exception("Invalid arguments!"); throw new Exception("Invalid arguments!");
} }
byte[] res = Enumerable.Repeat((byte)0b1111_1111, 8).ToArray(); byte[] res = Enumerable.Repeat((byte)0b1111_1111, 8).ToArray();
// Pad Number if needed to be of even length (because each 2 digits are turned into 1 byte) // Pad Number if needed to be of even length (because each 2 digits are turned into 1 byte)
Number = Number.Length % 2 == 0 ? Number : Number + '-'; Number = Number.Length % 2 == 0 ? Number : Number + '-';
for(int i = 0; i < Number.Length - 1; i += 2) { for (int i = 0; i < Number.Length - 1; i += 2)
{
char c1 = Number[i]; char c1 = Number[i];
char c2 = Number[i + 1]; char c2 = Number[i + 1];
res[i / 2] = (byte)((DigitToByte(c1) << 4) | DigitToByte(c2)); res[i / 2] = (byte)((DigitToByte(c1) << 4) | DigitToByte(c2));
@ -20,33 +24,41 @@ public static class Utils {
return res; return res;
} }
public static string BytesToNumber(byte[] Bytes) { public static string BytesToNumber(byte[] Bytes)
{
string s = ""; string s = "";
foreach(byte b in Bytes) { foreach (byte b in Bytes)
{
byte b1 = (byte)((b >> 4) & 0b1111); byte b1 = (byte)((b >> 4) & 0b1111);
byte b2 = (byte)(b & 0b1111); byte b2 = (byte)(b & 0b1111);
s = s + ByteToDigit(b1) + ByteToDigit(b2); s = s + ByteToDigit(b1) + ByteToDigit(b2);
} }
return new string(s.Where(c => char.IsDigit(c)).ToArray()); return new string(s.Where(char.IsDigit).ToArray());
} }
public static byte DigitToByte(char c) { public static byte DigitToByte(char c)
if (int.TryParse(c.ToString(), out int d)) { {
if (int.TryParse(c.ToString(), out int d))
{
return (byte)d; return (byte)d;
} }
else { else
{
return 0b1111; // empty, turned into '-' later to be discarded return 0b1111; // empty, turned into '-' later to be discarded
} }
} }
public static char ByteToDigit(byte b) { public static char ByteToDigit(byte b)
{
byte offset = Encoding.ASCII.GetBytes("0")[0]; byte offset = Encoding.ASCII.GetBytes("0")[0];
if(b == 0b1111) { if (b == 0b1111)
{
return '-'; return '-';
} }
else { else
{
return Encoding.ASCII.GetChars([(byte)(b + offset)])[0]; return Encoding.ASCII.GetChars([(byte)(b + offset)])[0];
} }
} }

View file

@ -60,8 +60,8 @@ public class Program
// Get AES session key // Get AES session key
int len = await stream.ReadAsync(buffer); int len = await stream.ReadAsync(buffer);
Aes sk = Aes.Create(); Aes sk = Aes.Create();
sk.Key = buffer[..256]; // just to make sure no one sends a too big to be true key sk.Key = buffer[..32]; // just to make sure no one sends a too big to be true key
sk.IV = buffer[256..len]; sk.IV = buffer[32..len];
Write(id, "key + iv: " + len.ToString()); Write(id, "key + iv: " + len.ToString());
// Get first message (should be either login or ) // Get first message (should be either login or )