From 0dd4ed68a5a6d8998330e2e10e78394337dea938 Mon Sep 17 00:00:00 2001 From: craftablescience Date: Mon, 16 Sep 2024 01:42:30 -0400 Subject: [PATCH 1/3] fix(vpkpp): use correct zstd file extension in zip reader --- include/vpkpp/format/ZIP.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/include/vpkpp/format/ZIP.h b/include/vpkpp/format/ZIP.h index ef83dcd71..9b14dff3b 100644 --- a/include/vpkpp/format/ZIP.h +++ b/include/vpkpp/format/ZIP.h @@ -4,14 +4,14 @@ namespace vpkpp { -constexpr std::string_view BMZ_EXTENSION = ".bmz"; -constexpr std::string_view BZ2_EXTENSION = ".bz2"; +constexpr std::string_view BMZ_EXTENSION = ".bmz"; +constexpr std::string_view BZ2_EXTENSION = ".bz2"; constexpr std::string_view GZIP_EXTENSION = ".gz"; -constexpr std::string_view PK3_EXTENSION = ".pk3"; -constexpr std::string_view PK4_EXTENSION = ".pk4"; -constexpr std::string_view XZ_EXTENSION = ".xz"; -constexpr std::string_view ZIP_EXTENSION = ".zip"; -constexpr std::string_view ZSTD_EXTENSION = ".zstd"; +constexpr std::string_view PK3_EXTENSION = ".pk3"; +constexpr std::string_view PK4_EXTENSION = ".pk4"; +constexpr std::string_view XZ_EXTENSION = ".xz"; +constexpr std::string_view ZIP_EXTENSION = ".zip"; +constexpr std::string_view ZST_EXTENSION = ".zst"; class ZIP : public PackFile { public: @@ -59,14 +59,14 @@ class ZIP : public PackFile { bool zipOpen = false; private: - VPKPP_REGISTER_PACKFILE_OPEN(BMZ_EXTENSION, &ZIP::open); - VPKPP_REGISTER_PACKFILE_OPEN(BZ2_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(BMZ_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(BZ2_EXTENSION, &ZIP::open); VPKPP_REGISTER_PACKFILE_OPEN(GZIP_EXTENSION, &ZIP::open); - VPKPP_REGISTER_PACKFILE_OPEN(PK3_EXTENSION, &ZIP::open); - VPKPP_REGISTER_PACKFILE_OPEN(PK4_EXTENSION, &ZIP::open); - VPKPP_REGISTER_PACKFILE_OPEN(XZ_EXTENSION, &ZIP::open); - VPKPP_REGISTER_PACKFILE_OPEN(ZIP_EXTENSION, &ZIP::open); - VPKPP_REGISTER_PACKFILE_OPEN(ZSTD_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(PK3_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(PK4_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(XZ_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(ZIP_EXTENSION, &ZIP::open); + VPKPP_REGISTER_PACKFILE_OPEN(ZST_EXTENSION, &ZIP::open); }; } // namespace vpkpp From 520f1f08c901a62b1cd44e79aa7dca8948682b0e Mon Sep 17 00:00:00 2001 From: craftablescience Date: Mon, 16 Sep 2024 23:34:39 -0400 Subject: [PATCH 2/3] chore(vcryptpp): rename vicepp to vcryptpp --- CMakeLists.txt | 24 ++++++------- README.md | 2 +- docs/index.md | 2 +- include/{vicepp/vicepp.h => vcryptpp/VICE.h} | 4 +-- include/vcryptpp/vcryptpp.h | 8 +++++ lang/c/include/vcryptppc/VICE.h | 34 ++++++++++++++++++ lang/c/include/vcryptppc/vcryptpp.h | 8 +++++ lang/c/include/viceppc/vicepp.h | 34 ------------------ lang/c/src/vcryptppc/VICE.cpp | 23 ++++++++++++ lang/c/src/vcryptppc/_vcryptppc.cmake | 5 +++ lang/c/src/viceppc/_viceppc.cmake | 4 --- lang/c/src/viceppc/vicepp.cpp | 21 ----------- lang/csharp/src/{vicepp.sln => vcryptpp.sln} | 2 +- .../{vicepp/vicepp.cs => vcryptpp/VICE.cs} | 18 +++++----- src/{vicepp/vicepp.cpp => vcryptpp/VICE.cpp} | 8 +++-- src/vcryptpp/_vcryptpp.cmake | 6 ++++ src/vicepp/_vicepp.cmake | 5 --- .../{vicepp => vcryptpp}/weapon_pistol.dec | 0 .../{vicepp => vcryptpp}/weapon_pistol.enc | Bin test/vcryptpp.cpp | 31 ++++++++++++++++ test/vicepp.cpp | 31 ---------------- 21 files changed, 146 insertions(+), 124 deletions(-) rename include/{vicepp/vicepp.h => vcryptpp/VICE.h} (97%) create mode 100644 include/vcryptpp/vcryptpp.h create mode 100644 lang/c/include/vcryptppc/VICE.h create mode 100644 lang/c/include/vcryptppc/vcryptpp.h delete mode 100644 lang/c/include/viceppc/vicepp.h create mode 100644 lang/c/src/vcryptppc/VICE.cpp create mode 100644 lang/c/src/vcryptppc/_vcryptppc.cmake delete mode 100644 lang/c/src/viceppc/_viceppc.cmake delete mode 100644 lang/c/src/viceppc/vicepp.cpp rename lang/csharp/src/{vicepp.sln => vcryptpp.sln} (87%) rename lang/csharp/src/{vicepp/vicepp.cs => vcryptpp/VICE.cs} (78%) rename src/{vicepp/vicepp.cpp => vcryptpp/VICE.cpp} (77%) create mode 100644 src/vcryptpp/_vcryptpp.cmake delete mode 100644 src/vicepp/_vicepp.cmake rename test/res/{vicepp => vcryptpp}/weapon_pistol.dec (100%) rename test/res/{vicepp => vcryptpp}/weapon_pistol.enc (100%) create mode 100644 test/vcryptpp.cpp delete mode 100644 test/vicepp.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 25ecb5e85..93ee9184d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ option(SOURCEPP_USE_KVPP "Build kvpp library" ${SOURC option(SOURCEPP_USE_MDLPP "Build mdlpp library" ${SOURCEPP_LIBS_START_ENABLED}) option(SOURCEPP_USE_STEAMPP "Build steampp library" ${SOURCEPP_LIBS_START_ENABLED}) option(SOURCEPP_USE_TOOLPP "Build toolpp library" ${SOURCEPP_LIBS_START_ENABLED}) -option(SOURCEPP_USE_VICEPP "Build vicepp library" ${SOURCEPP_LIBS_START_ENABLED}) +option(SOURCEPP_USE_VCRYPTPP "Build vcryptpp library" ${SOURCEPP_LIBS_START_ENABLED}) option(SOURCEPP_USE_VPKPP "Build vpkpp library" ${SOURCEPP_LIBS_START_ENABLED}) option(SOURCEPP_USE_VTFPP "Build vtfpp library" ${SOURCEPP_LIBS_START_ENABLED}) @@ -117,16 +117,16 @@ endif() # Add libraries -add_sourcepp_library(bsppp NO_TEST ) # sourcepp::bsppp -add_sourcepp_library(dmxpp ) # sourcepp::dmxpp -add_sourcepp_library(gamepp ) # sourcepp::gamepp -add_sourcepp_library(kvpp ) # sourcepp::kvpp -add_sourcepp_library(mdlpp ) # sourcepp::mdlpp -add_sourcepp_library(steampp C ) # sourcepp::steampp -add_sourcepp_library(toolpp ) # sourcepp::toolpp -add_sourcepp_library(vicepp C CSHARP ) # sourcepp::vicepp -add_sourcepp_library(vpkpp C CSHARP NO_TEST ) # sourcepp::vpkpp -add_sourcepp_library(vtfpp BENCH) # sourcepp::vtfpp +add_sourcepp_library(bsppp NO_TEST ) # sourcepp::bsppp +add_sourcepp_library(dmxpp ) # sourcepp::dmxpp +add_sourcepp_library(gamepp ) # sourcepp::gamepp +add_sourcepp_library(kvpp ) # sourcepp::kvpp +add_sourcepp_library(mdlpp ) # sourcepp::mdlpp +add_sourcepp_library(steampp C ) # sourcepp::steampp +add_sourcepp_library(toolpp ) # sourcepp::toolpp +add_sourcepp_library(vcryptpp C CSHARP ) # sourcepp::vcryptpp +add_sourcepp_library(vpkpp C CSHARP NO_TEST ) # sourcepp::vpkpp +add_sourcepp_library(vtfpp BENCH) # sourcepp::vtfpp # Tests, part 2 @@ -149,6 +149,6 @@ endif() # Print options print_options(OPTIONS - USE_BSPPP USE_DMXPP USE_GAMEPP USE_KVPP USE_MDLPP USE_STEAMPP USE_TOOLPP USE_VICEPP USE_VPKPP USE_VTFPP + USE_BSPPP USE_DMXPP USE_GAMEPP USE_KVPP USE_MDLPP USE_STEAMPP USE_TOOLPP USE_VCRYPTPP USE_VPKPP USE_VTFPP BUILD_BENCHMARKS BUILD_C_WRAPPERS BUILD_WITH_OPENCL BUILD_WITH_TBB BUILD_TESTS BUILD_WIN7_COMPAT LINK_STATIC_MSVC_RUNTIME) diff --git a/README.md b/README.md index e43f2c8c9..e8182f63f 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Several modern C++20 libraries for sanely parsing Valve formats, rolled into one - vicepp + vcryptpp VICE Encrypted Files ✅ ✅ diff --git a/docs/index.md b/docs/index.md index 66a1cd033..f0ea959f6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -103,7 +103,7 @@ Several modern C++20 libraries for sanely parsing Valve formats, rolled into one ✅ - vicepp + vcryptpp VICE Encrypted Files ✅ ✅ diff --git a/include/vicepp/vicepp.h b/include/vcryptpp/VICE.h similarity index 97% rename from include/vicepp/vicepp.h rename to include/vcryptpp/VICE.h index c6b4fb7d6..f3548242e 100644 --- a/include/vicepp/vicepp.h +++ b/include/vcryptpp/VICE.h @@ -5,7 +5,7 @@ #include #include -namespace vicepp { +namespace vcryptpp::VICE { // https://developer.valvesoftware.com/wiki/ICE // https://developer.valvesoftware.com/wiki/Encrypted_Key_Values @@ -47,4 +47,4 @@ constexpr std::string_view EKV_GPU_PORTAL_2 = "UrE66!Ap"; [[nodiscard]] std::vector decrypt(std::span data, std::string_view code = KnownCodes::DEFAULT); -} // namespace vicepp +} // namespace vcryptpp::VICE diff --git a/include/vcryptpp/vcryptpp.h b/include/vcryptpp/vcryptpp.h new file mode 100644 index 000000000..5235b927d --- /dev/null +++ b/include/vcryptpp/vcryptpp.h @@ -0,0 +1,8 @@ +#pragma once + +/* + * This header is just included so consumers of this library can + * include it the same way as any of the other SourcePP libraries. + */ + +#include "VICE.h" diff --git a/lang/c/include/vcryptppc/VICE.h b/lang/c/include/vcryptppc/VICE.h new file mode 100644 index 000000000..7751e3078 --- /dev/null +++ b/lang/c/include/vcryptppc/VICE.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +#define VCRYPTPP_VICE_KNOWN_CODES_DEFAULT "x9Ke0BY7"; + +#define VCRYPTPP_VICE_KNOWN_CODES_CONTAGION_WEAPONS "fUk0fF69" +#define VCRYPTPP_VICE_KNOWN_CODES_CONTAGION_SCRIPTS "5!rrFz6p" +#define VCRYPTPP_VICE_KNOWN_CODES_COUNTER_STRIKE_SOURCE "d7NSuLq2" +#define VCRYPTPP_VICE_KNOWN_CODES_COUNTER_STRIKE_GLOBAL_OFFENSIVE VICEPP_KNOWN_CODES_COUNTER_STRIKE_SOURCE +#define VCRYPTPP_VICE_KNOWN_CODES_COUNTER_STRIKE_2 VICEPP_KNOWN_CODES_COUNTER_STRIKE_GLOBAL_OFFENSIVE +#define VCRYPTPP_VICE_KNOWN_CODES_COUNTER_STRIKE_PROMOD "H1aRQ0n1" +#define VCRYPTPP_VICE_KNOWN_CODES_DAY_OF_DEFEAT_SOURCE "Wl0u5B3F" +#define VCRYPTPP_VICE_KNOWN_CODES_DYSTOPIA_1_2 "pH3apO8w" +#define VCRYPTPP_VICE_KNOWN_CODES_DYSTOPIA_1_3 "G8stUh3F" +#define VCRYPTPP_VICE_KNOWN_CODES_GOLDEN_EYE_SOURCE "Gr3naDes" +#define VCRYPTPP_VICE_KNOWN_CODES_HALF_LIFE_2_CTF "R1dj3axP" +#define VCRYPTPP_VICE_KNOWN_CODES_HALF_LIFE_2_DM VICEPP_KNOWN_CODES_DEFAULT +#define VCRYPTPP_VICE_KNOWN_CODES_INSURGENCY "DrA5e3EB" +#define VCRYPTPP_VICE_KNOWN_CODES_LEFT_4_DEAD_2 "SDhfi878" +#define VCRYPTPP_VICE_KNOWN_CODES_NO_MORE_ROOM_IN_HELL "lREeeapA" +#define VCRYPTPP_VICE_KNOWN_CODES_NUCLEAR_DAWN "TA+*veh9" +#define VCRYPTPP_VICE_KNOWN_CODES_TACTICAL_INTERVENTION "71B4Dt1Z" +#define VCRYPTPP_VICE_KNOWN_CODES_TEAM_FORTRESS_2 "E2NcUkG2" +#define VCRYPTPP_VICE_KNOWN_CODES_TEAM_FORTRESS_2_ITEMS "A5fSXbf7" +#define VCRYPTPP_VICE_KNOWN_CODES_THE_SHIP "eb3A4m79" +#define VCRYPTPP_VICE_KNOWN_CODES_ZOMBIE_PANIC_SOURCE "5R0ni0pZ" + +// REQUIRES MANUAL FREE: sourcepp_buffer_free +SOURCEPP_API sourcepp_buffer_t vcryptpp_vice_encrypt(const unsigned char* buffer, size_t bufferLen, const char* code); + +// REQUIRES MANUAL FREE: sourcepp_buffer_free +SOURCEPP_API sourcepp_buffer_t vcryptpp_vice_decrypt(const unsigned char* buffer, size_t bufferLen, const char* code); diff --git a/lang/c/include/vcryptppc/vcryptpp.h b/lang/c/include/vcryptppc/vcryptpp.h new file mode 100644 index 000000000..5235b927d --- /dev/null +++ b/lang/c/include/vcryptppc/vcryptpp.h @@ -0,0 +1,8 @@ +#pragma once + +/* + * This header is just included so consumers of this library can + * include it the same way as any of the other SourcePP libraries. + */ + +#include "VICE.h" diff --git a/lang/c/include/viceppc/vicepp.h b/lang/c/include/viceppc/vicepp.h deleted file mode 100644 index a539d46f3..000000000 --- a/lang/c/include/viceppc/vicepp.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include -#include - -#define VICEPP_KNOWN_CODES_DEFAULT "x9Ke0BY7"; - -#define VICEPP_KNOWN_CODES_CONTAGION_WEAPONS "fUk0fF69" -#define VICEPP_KNOWN_CODES_CONTAGION_SCRIPTS "5!rrFz6p" -#define VICEPP_KNOWN_CODES_COUNTER_STRIKE_SOURCE "d7NSuLq2" -#define VICEPP_KNOWN_CODES_COUNTER_STRIKE_GLOBAL_OFFENSIVE VICEPP_KNOWN_CODES_COUNTER_STRIKE_SOURCE -#define VICEPP_KNOWN_CODES_COUNTER_STRIKE_2 VICEPP_KNOWN_CODES_COUNTER_STRIKE_GLOBAL_OFFENSIVE -#define VICEPP_KNOWN_CODES_COUNTER_STRIKE_PROMOD "H1aRQ0n1" -#define VICEPP_KNOWN_CODES_DAY_OF_DEFEAT_SOURCE "Wl0u5B3F" -#define VICEPP_KNOWN_CODES_DYSTOPIA_1_2 "pH3apO8w" -#define VICEPP_KNOWN_CODES_DYSTOPIA_1_3 "G8stUh3F" -#define VICEPP_KNOWN_CODES_GOLDEN_EYE_SOURCE "Gr3naDes" -#define VICEPP_KNOWN_CODES_HALF_LIFE_2_CTF "R1dj3axP" -#define VICEPP_KNOWN_CODES_HALF_LIFE_2_DM VICEPP_KNOWN_CODES_DEFAULT -#define VICEPP_KNOWN_CODES_INSURGENCY "DrA5e3EB" -#define VICEPP_KNOWN_CODES_LEFT_4_DEAD_2 "SDhfi878" -#define VICEPP_KNOWN_CODES_NO_MORE_ROOM_IN_HELL "lREeeapA" -#define VICEPP_KNOWN_CODES_NUCLEAR_DAWN "TA+*veh9" -#define VICEPP_KNOWN_CODES_TACTICAL_INTERVENTION "71B4Dt1Z" -#define VICEPP_KNOWN_CODES_TEAM_FORTRESS_2 "E2NcUkG2" -#define VICEPP_KNOWN_CODES_TEAM_FORTRESS_2_ITEMS "A5fSXbf7" -#define VICEPP_KNOWN_CODES_THE_SHIP "eb3A4m79" -#define VICEPP_KNOWN_CODES_ZOMBIE_PANIC_SOURCE "5R0ni0pZ" - -// REQUIRES MANUAL FREE: sourcepp_buffer_free -SOURCEPP_API sourcepp_buffer_t vicepp_encrypt(const unsigned char* buffer, size_t bufferLen, const char* code); - -// REQUIRES MANUAL FREE: sourcepp_buffer_free -SOURCEPP_API sourcepp_buffer_t vicepp_decrypt(const unsigned char* buffer, size_t bufferLen, const char* code); diff --git a/lang/c/src/vcryptppc/VICE.cpp b/lang/c/src/vcryptppc/VICE.cpp new file mode 100644 index 000000000..6d948e94d --- /dev/null +++ b/lang/c/src/vcryptppc/VICE.cpp @@ -0,0 +1,23 @@ +#include + +#include +#include +#include + +using namespace vcryptpp; + +SOURCEPP_API sourcepp_buffer_t vcryptpp_vice_encrypt(const unsigned char* buffer, size_t bufferLen, const char* code) { + SOURCEPP_EARLY_RETURN_VAL(buffer, SOURCEPP_BUFFER_INVALID); + SOURCEPP_EARLY_RETURN_VAL(bufferLen, SOURCEPP_BUFFER_INVALID); + SOURCEPP_EARLY_RETURN_VAL(code, SOURCEPP_BUFFER_INVALID); + + return Convert::toBuffer(VICE::encrypt(std::span{reinterpret_cast(buffer), bufferLen}, code)); +} + +SOURCEPP_API sourcepp_buffer_t vcryptpp_vice_decrypt(const unsigned char* buffer, size_t bufferLen, const char* code) { + SOURCEPP_EARLY_RETURN_VAL(buffer, SOURCEPP_BUFFER_INVALID); + SOURCEPP_EARLY_RETURN_VAL(bufferLen, SOURCEPP_BUFFER_INVALID); + SOURCEPP_EARLY_RETURN_VAL(code, SOURCEPP_BUFFER_INVALID); + + return Convert::toBuffer(VICE::decrypt(std::span{reinterpret_cast(buffer), bufferLen}, code)); +} diff --git a/lang/c/src/vcryptppc/_vcryptppc.cmake b/lang/c/src/vcryptppc/_vcryptppc.cmake new file mode 100644 index 000000000..dccc1d987 --- /dev/null +++ b/lang/c/src/vcryptppc/_vcryptppc.cmake @@ -0,0 +1,5 @@ +add_pretty_parser(vcryptpp C + SOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/lang/c/include/vcryptppc/vcryptpp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/lang/c/include/vcryptppc/VICE.h" + "${CMAKE_CURRENT_LIST_DIR}/VICE.cpp") diff --git a/lang/c/src/viceppc/_viceppc.cmake b/lang/c/src/viceppc/_viceppc.cmake deleted file mode 100644 index 041c3a596..000000000 --- a/lang/c/src/viceppc/_viceppc.cmake +++ /dev/null @@ -1,4 +0,0 @@ -add_pretty_parser(vicepp C - SOURCES - "${CMAKE_CURRENT_SOURCE_DIR}/lang/c/include/viceppc/vicepp.h" - "${CMAKE_CURRENT_LIST_DIR}/vicepp.cpp") diff --git a/lang/c/src/viceppc/vicepp.cpp b/lang/c/src/viceppc/vicepp.cpp deleted file mode 100644 index bb26c62de..000000000 --- a/lang/c/src/viceppc/vicepp.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -#include -#include -#include - -SOURCEPP_API sourcepp_buffer_t vicepp_encrypt(const unsigned char* buffer, size_t bufferLen, const char* code) { - SOURCEPP_EARLY_RETURN_VAL(buffer, SOURCEPP_BUFFER_INVALID); - SOURCEPP_EARLY_RETURN_VAL(bufferLen, SOURCEPP_BUFFER_INVALID); - SOURCEPP_EARLY_RETURN_VAL(code, SOURCEPP_BUFFER_INVALID); - - return Convert::toBuffer(vicepp::encrypt(std::span{reinterpret_cast(buffer), bufferLen}, code)); -} - -SOURCEPP_API sourcepp_buffer_t vicepp_decrypt(const unsigned char* buffer, size_t bufferLen, const char* code) { - SOURCEPP_EARLY_RETURN_VAL(buffer, SOURCEPP_BUFFER_INVALID); - SOURCEPP_EARLY_RETURN_VAL(bufferLen, SOURCEPP_BUFFER_INVALID); - SOURCEPP_EARLY_RETURN_VAL(code, SOURCEPP_BUFFER_INVALID); - - return Convert::toBuffer(vicepp::decrypt(std::span{reinterpret_cast(buffer), bufferLen}, code)); -} diff --git a/lang/csharp/src/vicepp.sln b/lang/csharp/src/vcryptpp.sln similarity index 87% rename from lang/csharp/src/vicepp.sln rename to lang/csharp/src/vcryptpp.sln index a6372754a..19b2c4de6 100644 --- a/lang/csharp/src/vicepp.sln +++ b/lang/csharp/src/vcryptpp.sln @@ -2,7 +2,7 @@ # Visual Studio Version 17 VisualStudioVersion = 17.9.34622.214 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "vicepp", "vicepp\vicepp.csproj", "{1A936830-5F97-4722-9012-67A324764879}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "vcryptpp", "vcryptpp\vcryptpp.csproj", "{1A936830-5F97-4722-9012-67A324764879}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/lang/csharp/src/vicepp/vicepp.cs b/lang/csharp/src/vcryptpp/VICE.cs similarity index 78% rename from lang/csharp/src/vicepp/vicepp.cs rename to lang/csharp/src/vcryptpp/VICE.cs index 3c4cd0ae0..bd2dfde44 100644 --- a/lang/csharp/src/vicepp/vicepp.cs +++ b/lang/csharp/src/vcryptpp/VICE.cs @@ -3,15 +3,15 @@ using System.Linq; using System.Runtime.InteropServices; -namespace vicepp +namespace vcryptpp { internal static unsafe partial class Extern { - [DllImport("viceppc")] - public static extern Buffer vicepp_decrypt(byte* buffer, ulong bufferLen, [MarshalAs(UnmanagedType.LPStr)] string code); + [DllImport("vcryptppc")] + public static extern Buffer vcryptpp_vice_decrypt(byte* buffer, ulong bufferLen, [MarshalAs(UnmanagedType.LPStr)] string code); - [DllImport("viceppc")] - public static extern Buffer vicepp_encrypt(byte* buffer, ulong bufferLen, [MarshalAs(UnmanagedType.LPStr)] string code); + [DllImport("vcryptppc")] + public static extern Buffer vcryptpp_vice_encrypt(byte* buffer, ulong bufferLen, [MarshalAs(UnmanagedType.LPStr)] string code); } public static class KnownCodes { @@ -48,7 +48,7 @@ public static byte[] Decrypt(byte[] buffer, string code = KnownCodes.DEFAULT) { fixed (byte* bufferPtr = buffer) { - Buffer ret = Extern.vicepp_decrypt(bufferPtr, (ulong) buffer.LongLength, code); + Buffer ret = Extern.vcryptpp_vice_decrypt(bufferPtr, (ulong) buffer.LongLength, code); return BufferUtils.ConvertToArrayAndDelete(ref ret); } } @@ -61,7 +61,7 @@ public static byte[] Decrypt(IEnumerable buffer, string code = KnownCodes. var data = buffer.ToArray(); fixed (byte* bufferPtr = data) { - Buffer ret = Extern.vicepp_decrypt(bufferPtr, (ulong) data.LongLength, code); + Buffer ret = Extern.vcryptpp_vice_decrypt(bufferPtr, (ulong) data.LongLength, code); return BufferUtils.ConvertToArrayAndDelete(ref ret); } } @@ -73,7 +73,7 @@ public static byte[] Encrypt(byte[] buffer, string code) { fixed (byte* bufferPtr = buffer) { - Buffer ret = Extern.vicepp_encrypt(bufferPtr, (ulong) buffer.LongLength, code); + Buffer ret = Extern.vcryptpp_vice_encrypt(bufferPtr, (ulong) buffer.LongLength, code); return BufferUtils.ConvertToArrayAndDelete(ref ret); } } @@ -86,7 +86,7 @@ public static byte[] Encrypt(IEnumerable buffer, string code) var data = buffer.ToArray(); fixed (byte* bufferPtr = data) { - Buffer ret = Extern.vicepp_encrypt(bufferPtr, (ulong) data.LongLength, code); + Buffer ret = Extern.vcryptpp_vice_encrypt(bufferPtr, (ulong) data.LongLength, code); return BufferUtils.ConvertToArrayAndDelete(ref ret); } } diff --git a/src/vicepp/vicepp.cpp b/src/vcryptpp/VICE.cpp similarity index 77% rename from src/vicepp/vicepp.cpp rename to src/vcryptpp/VICE.cpp index a2f237f00..444206a63 100644 --- a/src/vicepp/vicepp.cpp +++ b/src/vcryptpp/VICE.cpp @@ -1,9 +1,11 @@ -#include +#include #include #include +using namespace vcryptpp; + namespace { std::vector applyIce(std::span data, std::string_view code, bool encrypt) { @@ -35,10 +37,10 @@ std::vector applyIce(std::span data, std::string_vie } // namespace -std::vector vicepp::encrypt(std::span data, std::string_view code) { +std::vector VICE::encrypt(std::span data, std::string_view code) { return ::applyIce(data, code, true); } -std::vector vicepp::decrypt(std::span data, std::string_view code) { +std::vector VICE::decrypt(std::span data, std::string_view code) { return ::applyIce(data, code, false); } diff --git a/src/vcryptpp/_vcryptpp.cmake b/src/vcryptpp/_vcryptpp.cmake new file mode 100644 index 000000000..506c15893 --- /dev/null +++ b/src/vcryptpp/_vcryptpp.cmake @@ -0,0 +1,6 @@ +add_pretty_parser(vcryptpp + DEPS sourcepp_ice + SOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/include/vcryptpp/vcryptpp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/include/vcryptpp/VICE.h" + "${CMAKE_CURRENT_LIST_DIR}/VICE.cpp") diff --git a/src/vicepp/_vicepp.cmake b/src/vicepp/_vicepp.cmake deleted file mode 100644 index ee3be25eb..000000000 --- a/src/vicepp/_vicepp.cmake +++ /dev/null @@ -1,5 +0,0 @@ -add_pretty_parser(vicepp - DEPS sourcepp_ice - SOURCES - "${CMAKE_CURRENT_SOURCE_DIR}/include/vicepp/vicepp.h" - "${CMAKE_CURRENT_LIST_DIR}/vicepp.cpp") diff --git a/test/res/vicepp/weapon_pistol.dec b/test/res/vcryptpp/weapon_pistol.dec similarity index 100% rename from test/res/vicepp/weapon_pistol.dec rename to test/res/vcryptpp/weapon_pistol.dec diff --git a/test/res/vicepp/weapon_pistol.enc b/test/res/vcryptpp/weapon_pistol.enc similarity index 100% rename from test/res/vicepp/weapon_pistol.enc rename to test/res/vcryptpp/weapon_pistol.enc diff --git a/test/vcryptpp.cpp b/test/vcryptpp.cpp new file mode 100644 index 000000000..21daf7b1f --- /dev/null +++ b/test/vcryptpp.cpp @@ -0,0 +1,31 @@ +#include + +#include +#include + +using namespace sourcepp; +using namespace vcryptpp; + +TEST(vcryptpp, decrypt) { + auto encrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.enc"); + auto decrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.dec"); + + auto test = VICE::decrypt(encrypted); + ASSERT_EQ(test.size(), decrypted.size()); + + for (int i = 0; i < test.size(); i++) { + EXPECT_EQ(test[i], decrypted[i]); + } +} + +TEST(vcryptpp, encrypt) { + auto encrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.enc"); + auto decrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.dec"); + + auto test = VICE::encrypt(decrypted); + ASSERT_EQ(test.size(), encrypted.size()); + + for (int i = 0; i < test.size(); i++) { + EXPECT_EQ(test[i], encrypted[i]); + } +} diff --git a/test/vicepp.cpp b/test/vicepp.cpp deleted file mode 100644 index 286fb5503..000000000 --- a/test/vicepp.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include - -#include -#include - -using namespace sourcepp; -using namespace vicepp; - -TEST(vicepp, decrypt) { - auto encrypted = fs::readFileBuffer(ASSET_ROOT "vicepp/weapon_pistol.enc"); - auto decrypted = fs::readFileBuffer(ASSET_ROOT "vicepp/weapon_pistol.dec"); - - auto test = decrypt(encrypted); - ASSERT_EQ(test.size(), decrypted.size()); - - for (int i = 0; i < test.size(); i++) { - EXPECT_EQ(test[i], decrypted[i]); - } -} - -TEST(vicepp, encrypt) { - auto encrypted = fs::readFileBuffer(ASSET_ROOT "vicepp/weapon_pistol.enc"); - auto decrypted = fs::readFileBuffer(ASSET_ROOT "vicepp/weapon_pistol.dec"); - - auto test = encrypt(decrypted); - ASSERT_EQ(test.size(), encrypted.size()); - - for (int i = 0; i < test.size(); i++) { - EXPECT_EQ(test[i], encrypted[i]); - } -} From 522938b9185f90d9958070b5b7b07e532a994603 Mon Sep 17 00:00:00 2001 From: craftablescience Date: Tue, 17 Sep 2024 01:08:44 -0400 Subject: [PATCH 3/3] feat(vcryptpp): add vfont decompiler --- README.md | 12 ++++++-- docs/index.md | 11 +++++-- include/vcryptpp/VFONT.h | 18 +++++++++++ include/vcryptpp/vcryptpp.h | 1 + lang/c/include/vcryptppc/VFONT.h | 6 ++++ lang/c/include/vcryptppc/VICE.h | 1 - lang/c/include/vcryptppc/vcryptpp.h | 1 + lang/c/src/vcryptppc/VFONT.cpp | 14 +++++++++ lang/c/src/vcryptppc/VICE.cpp | 2 +- lang/c/src/vcryptppc/_vcryptppc.cmake | 2 ++ lang/csharp/src/vcryptpp/VFONT.cs | 41 ++++++++++++++++++++++++++ src/vcryptpp/VFONT.cpp | 36 ++++++++++++++++++++++ src/vcryptpp/_vcryptpp.cmake | 2 ++ test/res/vcryptpp/test.ttf | Bin 0 -> 66528 bytes test/res/vcryptpp/test.vfont | Bin 0 -> 66550 bytes test/vcryptpp.cpp | 18 +++++++++-- 16 files changed, 154 insertions(+), 11 deletions(-) create mode 100644 include/vcryptpp/VFONT.h create mode 100644 lang/c/include/vcryptppc/VFONT.h create mode 100644 lang/c/src/vcryptppc/VFONT.cpp create mode 100644 lang/csharp/src/vcryptpp/VFONT.cs create mode 100644 src/vcryptpp/VFONT.cpp create mode 100644 test/res/vcryptpp/test.ttf create mode 100644 test/res/vcryptpp/test.vfont diff --git a/README.md b/README.md index e8182f63f..c9297f996 100644 --- a/README.md +++ b/README.md @@ -115,11 +115,17 @@ Several modern C++20 libraries for sanely parsing Valve formats, rolled into one - vcryptpp - VICE Encrypted Files + vcryptpp + VICE encrypted files ✅ ✅ - C
C# + C
C# + + + + VFONT encrypted fonts + ✅ + ❌ diff --git a/docs/index.md b/docs/index.md index f0ea959f6..97879cccf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -103,11 +103,16 @@ Several modern C++20 libraries for sanely parsing Valve formats, rolled into one ✅ - vcryptpp - VICE Encrypted Files + vcryptpp + VICE encrypted files ✅ ✅ - C
C# + C
C# + + + VFONT encrypted fonts + ✅ + ❌ vpkpp diff --git a/include/vcryptpp/VFONT.h b/include/vcryptpp/VFONT.h new file mode 100644 index 000000000..011a8db0f --- /dev/null +++ b/include/vcryptpp/VFONT.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace vcryptpp::VFONT { + +constexpr std::string_view IDENTIFIER = "VFONT1"; + +constexpr uint8_t MAGIC = 167; + +[[nodiscard]] std::vector decrypt(std::span data); + +} // namespace vcryptpp::VFONT diff --git a/include/vcryptpp/vcryptpp.h b/include/vcryptpp/vcryptpp.h index 5235b927d..6994876eb 100644 --- a/include/vcryptpp/vcryptpp.h +++ b/include/vcryptpp/vcryptpp.h @@ -5,4 +5,5 @@ * include it the same way as any of the other SourcePP libraries. */ +#include "VFONT.h" #include "VICE.h" diff --git a/lang/c/include/vcryptppc/VFONT.h b/lang/c/include/vcryptppc/VFONT.h new file mode 100644 index 000000000..6b6276c48 --- /dev/null +++ b/lang/c/include/vcryptppc/VFONT.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// REQUIRES MANUAL FREE: sourcepp_buffer_free +SOURCEPP_API sourcepp_buffer_t vcryptpp_vfont_decrypt(const unsigned char* buffer, size_t bufferLen); diff --git a/lang/c/include/vcryptppc/VICE.h b/lang/c/include/vcryptppc/VICE.h index 7751e3078..5c6dc9da9 100644 --- a/lang/c/include/vcryptppc/VICE.h +++ b/lang/c/include/vcryptppc/VICE.h @@ -1,7 +1,6 @@ #pragma once #include -#include #define VCRYPTPP_VICE_KNOWN_CODES_DEFAULT "x9Ke0BY7"; diff --git a/lang/c/include/vcryptppc/vcryptpp.h b/lang/c/include/vcryptppc/vcryptpp.h index 5235b927d..6994876eb 100644 --- a/lang/c/include/vcryptppc/vcryptpp.h +++ b/lang/c/include/vcryptppc/vcryptpp.h @@ -5,4 +5,5 @@ * include it the same way as any of the other SourcePP libraries. */ +#include "VFONT.h" #include "VICE.h" diff --git a/lang/c/src/vcryptppc/VFONT.cpp b/lang/c/src/vcryptppc/VFONT.cpp new file mode 100644 index 000000000..deea319fb --- /dev/null +++ b/lang/c/src/vcryptppc/VFONT.cpp @@ -0,0 +1,14 @@ +#include + +#include +#include +#include + +using namespace vcryptpp; + +SOURCEPP_API sourcepp_buffer_t vcryptpp_vfont_decrypt(const unsigned char* buffer, size_t bufferLen) { + SOURCEPP_EARLY_RETURN_VAL(buffer, SOURCEPP_BUFFER_INVALID); + SOURCEPP_EARLY_RETURN_VAL(bufferLen, SOURCEPP_BUFFER_INVALID); + + return Convert::toBuffer(VFONT::decrypt(std::span{reinterpret_cast(buffer), bufferLen})); +} diff --git a/lang/c/src/vcryptppc/VICE.cpp b/lang/c/src/vcryptppc/VICE.cpp index 6d948e94d..8e71aa0fb 100644 --- a/lang/c/src/vcryptppc/VICE.cpp +++ b/lang/c/src/vcryptppc/VICE.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/lang/c/src/vcryptppc/_vcryptppc.cmake b/lang/c/src/vcryptppc/_vcryptppc.cmake index dccc1d987..da353e0e8 100644 --- a/lang/c/src/vcryptppc/_vcryptppc.cmake +++ b/lang/c/src/vcryptppc/_vcryptppc.cmake @@ -1,5 +1,7 @@ add_pretty_parser(vcryptpp C SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/lang/c/include/vcryptppc/vcryptpp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/lang/c/include/vcryptppc/VFONT.h" "${CMAKE_CURRENT_SOURCE_DIR}/lang/c/include/vcryptppc/VICE.h" + "${CMAKE_CURRENT_LIST_DIR}/VFONT.cpp" "${CMAKE_CURRENT_LIST_DIR}/VICE.cpp") diff --git a/lang/csharp/src/vcryptpp/VFONT.cs b/lang/csharp/src/vcryptpp/VFONT.cs new file mode 100644 index 000000000..4898f08da --- /dev/null +++ b/lang/csharp/src/vcryptpp/VFONT.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; + +namespace vcryptpp +{ + internal static unsafe partial class Extern + { + [DllImport("vcryptppc")] + public static extern Buffer vcryptpp_vfont_decrypt(byte* buffer, ulong bufferLen); + } + + public static class VFONT + { + public static byte[] Decrypt(byte[] buffer) + { + unsafe + { + fixed (byte* bufferPtr = buffer) + { + Buffer ret = Extern.vcryptpp_vfont_decrypt(bufferPtr, (ulong) buffer.LongLength); + return BufferUtils.ConvertToArrayAndDelete(ref ret); + } + } + } + + public static byte[] Decrypt(IEnumerable buffer) + { + unsafe + { + var data = buffer.ToArray(); + fixed (byte* bufferPtr = data) + { + Buffer ret = Extern.vcryptpp_vfont_decrypt(bufferPtr, (ulong) data.LongLength); + return BufferUtils.ConvertToArrayAndDelete(ref ret); + } + } + } + } +} diff --git a/src/vcryptpp/VFONT.cpp b/src/vcryptpp/VFONT.cpp new file mode 100644 index 000000000..b5cdb14ef --- /dev/null +++ b/src/vcryptpp/VFONT.cpp @@ -0,0 +1,36 @@ +#include + +#include + +#include + +using namespace vcryptpp; + +std::vector VFONT::decrypt(std::span data) { + BufferStreamReadOnly reader{data.data(), data.size()}; + + if (reader.seek(IDENTIFIER.length(), std::ios::end).read_string(IDENTIFIER.length()) != IDENTIFIER) { + return {}; + } + reader.seek(IDENTIFIER.length() + sizeof(uint8_t), std::ios::end); + + auto bytes = reader.read(); + + std::vector out; + out.resize(reader.size() - IDENTIFIER.length() - bytes); + + reader.seek(-static_cast(bytes), std::ios::cur); + uint8_t magic = MAGIC; + for (int i = 0; i < bytes - 1; i++) { + magic ^= reader.read() + MAGIC; + } + + reader.seek(0); + for (auto& outByte : out) { + auto byte = reader.read(); + outByte = static_cast(byte ^ magic); + magic = byte + MAGIC; + } + + return out; +} diff --git a/src/vcryptpp/_vcryptpp.cmake b/src/vcryptpp/_vcryptpp.cmake index 506c15893..57c7cbf51 100644 --- a/src/vcryptpp/_vcryptpp.cmake +++ b/src/vcryptpp/_vcryptpp.cmake @@ -2,5 +2,7 @@ add_pretty_parser(vcryptpp DEPS sourcepp_ice SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/include/vcryptpp/vcryptpp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/include/vcryptpp/VFONT.h" "${CMAKE_CURRENT_SOURCE_DIR}/include/vcryptpp/VICE.h" + "${CMAKE_CURRENT_LIST_DIR}/VFONT.cpp" "${CMAKE_CURRENT_LIST_DIR}/VICE.cpp") diff --git a/test/res/vcryptpp/test.ttf b/test/res/vcryptpp/test.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f091cffae3091d5ee475e5b15d703dc629dd51d9 GIT binary patch literal 66528 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 literal 0 HcmV?d00001 diff --git a/test/res/vcryptpp/test.vfont b/test/res/vcryptpp/test.vfont new file mode 100644 index 0000000000000000000000000000000000000000..8e2936787a343342dd1439a8af73157aad5efb26 GIT binary patch literal 66550 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

64Y;q3ph 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 literal 0 HcmV?d00001 diff --git a/test/vcryptpp.cpp b/test/vcryptpp.cpp index 21daf7b1f..4ab27ea07 100644 --- a/test/vcryptpp.cpp +++ b/test/vcryptpp.cpp @@ -1,12 +1,12 @@ #include #include -#include +#include using namespace sourcepp; using namespace vcryptpp; -TEST(vcryptpp, decrypt) { +TEST(vcryptpp, viceDecrypt) { auto encrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.enc"); auto decrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.dec"); @@ -18,7 +18,7 @@ TEST(vcryptpp, decrypt) { } } -TEST(vcryptpp, encrypt) { +TEST(vcryptpp, viceEncrypt) { auto encrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.enc"); auto decrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/weapon_pistol.dec"); @@ -29,3 +29,15 @@ TEST(vcryptpp, encrypt) { EXPECT_EQ(test[i], encrypted[i]); } } + +TEST(vcryptpp, vfontDecrypt) { + auto encrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/test.vfont"); + auto decrypted = fs::readFileBuffer(ASSET_ROOT "vcryptpp/test.ttf"); + + auto test = VFONT::decrypt(encrypted); + ASSERT_EQ(test.size(), decrypted.size()); + + for (int i = 0; i < test.size(); i++) { + EXPECT_EQ(test[i], decrypted[i]); + } +}