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 {