From 6ce974caf737c819cd62a3095f684103e047f5a4 Mon Sep 17 00:00:00 2001
From: Mino <1381835+Minoost@users.noreply.github.com>
Date: Sun, 15 Mar 2020 23:38:57 +0900
Subject: [PATCH] WIP encoded arg
---
Dalamud.Bootstrap/Bootstrapper.cs | 2 +-
Dalamud.Bootstrap/BootstrapperOptions.cs | 2 +-
Dalamud.Bootstrap/SqexArg/EncodedArgument.cs | 64 ++++++++++++++-----
Dalamud.Bootstrap/Windows/ProcessException.cs | 1 +
4 files changed, 52 insertions(+), 17 deletions(-)
diff --git a/Dalamud.Bootstrap/Bootstrapper.cs b/Dalamud.Bootstrap/Bootstrapper.cs
index 9cd0bffe3..4b192f356 100644
--- a/Dalamud.Bootstrap/Bootstrapper.cs
+++ b/Dalamud.Bootstrap/Bootstrapper.cs
@@ -8,7 +8,7 @@ using Dalamud.Bootstrap.SqexArg;
namespace Dalamud.Bootstrap
{
- public sealed class Bootstrapper
+ public class Bootstrapper
{
private readonly BootstrapperOptions m_options;
diff --git a/Dalamud.Bootstrap/BootstrapperOptions.cs b/Dalamud.Bootstrap/BootstrapperOptions.cs
index 52464a988..31da97457 100644
--- a/Dalamud.Bootstrap/BootstrapperOptions.cs
+++ b/Dalamud.Bootstrap/BootstrapperOptions.cs
@@ -3,7 +3,7 @@ using System.IO;
namespace Dalamud.Bootstrap
{
- public sealed class BootstrapperOptions
+ public class BootstrapperOptions
{
public static BootstrapperOptions Default => new BootstrapperOptions
{
diff --git a/Dalamud.Bootstrap/SqexArg/EncodedArgument.cs b/Dalamud.Bootstrap/SqexArg/EncodedArgument.cs
index 95dcba021..ddf307b1c 100644
--- a/Dalamud.Bootstrap/SqexArg/EncodedArgument.cs
+++ b/Dalamud.Bootstrap/SqexArg/EncodedArgument.cs
@@ -15,12 +15,13 @@ namespace Dalamud.Bootstrap.SqexArg
'5', 'C', 'A', 'P', '4', '_', 'V', 'L'
};
+ ///
+ /// Denotes that no checksum is encoded.
+ ///
+ private const char NoChecksumMarker = '!';
+
private readonly ReadOnlyMemory m_data;
- private readonly uint m_key;
-
- //private readonly Blowfish m_cachedBlowfish;
-
public EncodedArgument(ReadOnlyMemory data, uint key)
{
m_data = data;
@@ -51,23 +52,56 @@ namespace Dalamud.Bootstrap.SqexArg
var checksum = argument[^5];
var payload = DecodeUrlSafeBase64(argument.Substring(12, argument.Length - 1 - 12 - 4)); // //**sqex0003, checksum, **//
+
// ...
}
- private static bool GetKeyFragmentFromChecksum(char checksum, out uint recoveredKey)
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static Blowfish RecoverKey(ReadOnlySpan payload, char checksum)
{
- var index = MemoryExtensions.IndexOf(ChecksumTable, checksum);
-
- if (index < 0)
- {
- recoveredKey = 0;
- return false;
- }
+ var (keyFragment, step) = RecoverKeyFragmentFromChecksum(checksum);
- recoveredKey = (uint) (index << 16);
- return true;
+ var keyCandicate = keyFragment;
+ while (true)
+ {
+ // try with keyCandicate
+
+ try
+ {
+ keyCandicate = checked(keyCandicate + step);
+ }
+ catch (OverflowException)
+ {
+ break;
+ }
+ }
}
-
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static (uint keyFragment, uint step) RecoverKeyFragmentFromChecksum(char checksum)
+ {
+ if (checksum == NoChecksumMarker)
+ {
+ return (0x0001_0000, 0x0001_0000);
+ }
+
+ return MemoryExtensions.IndexOf(ChecksumTable, checksum) switch
+ {
+ -1 => throw new SqexArgException($"{checksum} is not a valid checksum character."),
+ var index => ((uint) (index << 16), 0x0010_0000)
+ };
+ }
+
///
/// Converts url safe variant of base64 string to bytes.
///
diff --git a/Dalamud.Bootstrap/Windows/ProcessException.cs b/Dalamud.Bootstrap/Windows/ProcessException.cs
index 61306ad95..4ee9d602e 100644
--- a/Dalamud.Bootstrap/Windows/ProcessException.cs
+++ b/Dalamud.Bootstrap/Windows/ProcessException.cs
@@ -1,4 +1,5 @@
using System;
+using System.ComponentModel;
namespace Dalamud.Bootstrap.Windows
{