Init
This commit is contained in:
commit
c88ab93a10
|
@ -0,0 +1,46 @@
|
||||||
|
# .clang-format for native code portion
|
||||||
|
|
||||||
|
BasedOnStyle: Google
|
||||||
|
|
||||||
|
# force T* or T&
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
PointerAlignment: Left
|
||||||
|
|
||||||
|
TabWidth: 4
|
||||||
|
IndentWidth: 4
|
||||||
|
UseTab: Always
|
||||||
|
IndentPPDirectives: BeforeHash
|
||||||
|
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: InlineOnly
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakStringLiterals: false
|
||||||
|
|
||||||
|
ColumnLimit: 150
|
||||||
|
CompactNamespaces: false
|
||||||
|
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ContinuationIndentWidth: 0
|
||||||
|
|
||||||
|
# turning this on causes major issues with initalizer lists
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
SpaceBeforeCpp11BracedList: true
|
||||||
|
|
||||||
|
FixNamespaceComments: true
|
||||||
|
|
||||||
|
NamespaceIndentation: All
|
||||||
|
ReflowComments: true
|
||||||
|
|
||||||
|
SortIncludes: CaseInsensitive
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
SpaceBeforeParens: Never
|
||||||
|
SpacesBeforeTrailingComments: 1
|
|
@ -0,0 +1,11 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# spefcifically for YAML
|
||||||
|
[yml]
|
||||||
|
indent_style = space
|
|
@ -0,0 +1,7 @@
|
||||||
|
# swap files various editors produce
|
||||||
|
*.kate-swp
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
.cache/
|
||||||
|
build/
|
||||||
|
cmake-build-*/
|
|
@ -0,0 +1,42 @@
|
||||||
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
|
||||||
|
project(swsf_bruteforce
|
||||||
|
LANGUAGES C CXX
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
|
include(Policies)
|
||||||
|
include(ProjectFuncs)
|
||||||
|
|
||||||
|
# required system dependencies
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
find_package(Boost REQUIRED)
|
||||||
|
|
||||||
|
# default linker
|
||||||
|
if(NOT SSXTOOLS_LINKER AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
set(SSXTOOLS_LINKER "lld")
|
||||||
|
elseif(NOT SSXTOOLS_LINKER)
|
||||||
|
set(SSXTOOLS_LINKER "bfd")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
ssxtools_set_alternate_linker()
|
||||||
|
|
||||||
|
add_executable(swsf_scramble
|
||||||
|
src/asio_impl.cpp
|
||||||
|
src/main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(swsf_scramble PRIVATE
|
||||||
|
#-DBOOST_ASIO_HAS_IO_URING=1
|
||||||
|
# We compile Asio in another TU
|
||||||
|
-DBOOST_ASIO_SEPARATE_COMPILATION=1
|
||||||
|
-DBOOST_ASIO_NO_DEPRECATED=1
|
||||||
|
-DBOOST_ASIO_DISABLE_BOOST_ARRAY=1
|
||||||
|
-DBOOST_ASIO_DISABLE_BOOST_BIND=1
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_features(swsf_scramble PRIVATE cxx_std_20)
|
||||||
|
target_include_directories(swsf_scramble PRIVATE ${PROJECT_SOURCE_DIR}/src)
|
||||||
|
|
||||||
|
ssxtools_target(swsf_scramble)
|
|
@ -0,0 +1,22 @@
|
||||||
|
# CMake policy configuration
|
||||||
|
|
||||||
|
# Macro to enable new CMake policy.
|
||||||
|
# Makes this file a *LOT* shorter.
|
||||||
|
macro (_new_cmake_policy policy)
|
||||||
|
if(POLICY ${policy})
|
||||||
|
#message(STATUS "Enabling new policy ${policy}")
|
||||||
|
cmake_policy(SET ${policy} NEW)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
_new_cmake_policy(CMP0026) # CMake 3.0: Disallow use of the LOCATION property for build targets.
|
||||||
|
_new_cmake_policy(CMP0042) # CMake 3.0+ (2.8.12): MacOS "@rpath" in target's install name
|
||||||
|
_new_cmake_policy(CMP0046) # warn about non-existent dependencies
|
||||||
|
_new_cmake_policy(CMP0048) # CMake 3.0+: project() command now maintains VERSION
|
||||||
|
_new_cmake_policy(CMP0054) # CMake 3.1: Only interpret if() arguments as variables or keywords when unquoted.
|
||||||
|
_new_cmake_policy(CMP0056) # try_compile() linker flags
|
||||||
|
_new_cmake_policy(CMP0066) # CMake 3.7: try_compile(): use per-config flags, like CMAKE_CXX_FLAGS_RELEASE
|
||||||
|
_new_cmake_policy(CMP0067) # CMake 3.8: try_compile(): honor language standard variables (like C++11)
|
||||||
|
_new_cmake_policy(CMP0068) # CMake 3.9+: `RPATH` settings on macOS do not affect `install_name`.
|
||||||
|
_new_cmake_policy(CMP0075) # CMake 3.12+: Include file check macros honor `CMAKE_REQUIRED_LIBRARIES`
|
||||||
|
_new_cmake_policy(CMP0077) # CMake 3.13+: option() honors normal variables.
|
|
@ -0,0 +1,73 @@
|
||||||
|
function(ssxtools_target target)
|
||||||
|
target_compile_definitions(${target} PRIVATE "$<$<CONFIG:DEBUG>:SSXTOOLS_DEBUG>")
|
||||||
|
|
||||||
|
# public headers reside with a component (if they exist)
|
||||||
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
target_compile_features(${target} PUBLIC cxx_std_20)
|
||||||
|
|
||||||
|
# some sane compiler flags
|
||||||
|
set(_CORE_COMPILE_ARGS -Wall -Wextra)
|
||||||
|
set(_CORE_LINKER_ARGS "")
|
||||||
|
|
||||||
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
|
||||||
|
set(_CORE_COMPILE_ARGS ${_CORE_COMPILE_ARGS} -Werror)
|
||||||
|
|
||||||
|
# If on Release use link-time optimizations.
|
||||||
|
# On clang we use ThinLTO for even better build performance.
|
||||||
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
set(_CORE_COMPILE_ARGS ${_CORE_COMPILE_ARGS} -flto=thin)
|
||||||
|
set(_CORE_LINKER_ARGS ${_CORE_LINKER_ARGS} -flto=thin)
|
||||||
|
target_link_options(${target} PRIVATE -fuse-ld=${SSXTOOLS_LINKER} -flto=thin)
|
||||||
|
else()
|
||||||
|
set(_CORE_COMPILE_ARGS ${_CORE_COMPILE_ARGS} -flto)
|
||||||
|
set(_CORE_LINKER_ARGS ${_CORE_LINKER_ARGS} -flto)
|
||||||
|
target_link_options(${target} PRIVATE -fuse-ld=${SSXTOOLS_LINKER} -flto)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("asan" IN_LIST SSXTOOLS_BUILD_FEATURES)
|
||||||
|
# Error if someone's trying to mix asan and tsan together,
|
||||||
|
# they aren't compatible.
|
||||||
|
if("tsan" IN_LIST SSXTOOLS_BUILD_FEATURES)
|
||||||
|
message(FATAL_ERROR "ASAN and TSAN cannot be used together.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Enabling ASAN for target ${target}")
|
||||||
|
set(_CORE_COMPILE_ARGS ${_CORE_COMPILE_ARGS} -fsanitize=address)
|
||||||
|
set(_CORE_LINKER_ARGS ${_CORE_LINKER_ARGS} -fsanitize=address)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("tsan" IN_LIST SSXTOOLS_BUILD_FEATURES)
|
||||||
|
message(STATUS "Enabling TSAN for target ${target}")
|
||||||
|
set(_CORE_COMPILE_ARGS ${_CORE_COMPILE_ARGS} -fsanitize=thread)
|
||||||
|
set(_CORE_LINKER_ARGS ${_CORE_LINKER_ARGS} -fsanitize=thread)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("ubsan" IN_LIST SSXTOOLS_BUILD_FEATURES)
|
||||||
|
message(STATUS "Enabling UBSAN for target ${target}")
|
||||||
|
set(_CORE_COMPILE_ARGS ${_CORE_COMPILE_ARGS} -fsanitize=undefined)
|
||||||
|
set(_CORE_LINKER_ARGS ${_CORE_LINKER_ARGS} -fsanitize=undefined)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_compile_options(${target} PRIVATE ${_CORE_COMPILE_ARGS})
|
||||||
|
target_link_options(${target} PRIVATE ${_CORE_LINKER_ARGS})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(ssxtools_header_only_target target)
|
||||||
|
target_include_directories(${target} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
target_compile_features(${target} INTERFACE cxx_std_20)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(ssxtools_set_alternate_linker)
|
||||||
|
find_program(LINKER_EXECUTABLE ld.${SSXTOOLS_LINKER} ${SSXTOOLS_LINKER})
|
||||||
|
if(LINKER_EXECUTABLE)
|
||||||
|
message(STATUS "Using ${SSXTOOLS_LINKER} as linker for ssxtools projects")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Linker ${SSXTOOLS_LINKER} does not exist on your system. Please specify one which does or omit this option from your configure command.")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
|
@ -0,0 +1,5 @@
|
||||||
|
// Since we're using (BOOST_)ASIO_SEPARATE_COMPILATION, we need
|
||||||
|
// to include the <(boost/)asio/impl/src.hpp> header in some TU.
|
||||||
|
// We use this one to explicitly do so.
|
||||||
|
|
||||||
|
#include <boost/asio/impl/src.hpp>
|
|
@ -0,0 +1,114 @@
|
||||||
|
#include <boost/asio/experimental/concurrent_channel.hpp>
|
||||||
|
#include <boost/asio/io_context.hpp>
|
||||||
|
#include <boost/asio/post.hpp>
|
||||||
|
#include <boost/asio/thread_pool.hpp>
|
||||||
|
#include <boost/system/detail/error_code.hpp>
|
||||||
|
#include <format>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace asio = boost::asio;
|
||||||
|
// nvm doesnt work lol :)
|
||||||
|
//using asio::experimental::concurrent_channel;
|
||||||
|
|
||||||
|
template <class TRandomAlgo>
|
||||||
|
std::string RandomString(std::uint32_t length, TRandomAlgo& rng) {
|
||||||
|
std::string s;
|
||||||
|
s.resize(length);
|
||||||
|
while(true) {
|
||||||
|
auto res = rng();
|
||||||
|
auto acc = 0u;
|
||||||
|
|
||||||
|
// I love bit hacks!!!
|
||||||
|
for(int i = 0; i < sizeof(res); ++i) {
|
||||||
|
std::uint8_t c = (res >> acc);
|
||||||
|
if(c >= 0x20 && c <= 0x7e) {
|
||||||
|
if(length-- <= 0)
|
||||||
|
return s;
|
||||||
|
s.push_back(c);
|
||||||
|
}
|
||||||
|
acc += CHAR_BIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::uint32_t SwsfScramble(const std::string& code) {
|
||||||
|
auto copy = std::format("code_{}", code);
|
||||||
|
for(auto& c : copy)
|
||||||
|
c = tolower(c);
|
||||||
|
|
||||||
|
std::uint32_t tally {};
|
||||||
|
for(auto* p = copy.data(); *p; ++p)
|
||||||
|
tally = *p + (tally * 5);
|
||||||
|
return tally;
|
||||||
|
}
|
||||||
|
|
||||||
|
// using ChannelType = concurrent_channel<void(std::string& codeMatch)>;
|
||||||
|
|
||||||
|
// These is not atomic since no other threads update it
|
||||||
|
// there is no real point to making it atomic, other than
|
||||||
|
//
|
||||||
|
// maybe preventing some false sharing or other perf problem
|
||||||
|
// ... but I don't think that matters, lol
|
||||||
|
std::uint32_t code_hash = 0x2c75af55;
|
||||||
|
std::uint32_t code_length = 8;
|
||||||
|
|
||||||
|
bool NextCode(std::string& buffer, size_t start) {
|
||||||
|
size_t len = buffer.length();
|
||||||
|
for(size_t i = len - 1; i >= start; --i) {
|
||||||
|
char c = buffer[i];
|
||||||
|
if(c < 'z') {
|
||||||
|
++buffer[i];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
buffer[i] = 'a';
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThreadFunction(char prefix) {
|
||||||
|
for(std::uint32_t i = 2; i < code_length; ++i) {
|
||||||
|
std::string test_buffer(i, 'a');
|
||||||
|
test_buffer[0] = prefix;
|
||||||
|
|
||||||
|
// test all possible combinations
|
||||||
|
while(true) {
|
||||||
|
std::cout << std::format("trying code \"{}\"...\r", test_buffer);
|
||||||
|
if(SwsfScramble(test_buffer) == code_hash) {
|
||||||
|
std::cerr << std::format("match: {}", test_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!NextCode(test_buffer, 1))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
std::string test_buffer(code_length, 'a');
|
||||||
|
test_buffer[0] = prefix;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
std::cout << std::format("trying code \"{}\"...\r", test_buffer);
|
||||||
|
if(SwsfScramble(test_buffer) == code_hash) {
|
||||||
|
std::cerr << std::format("match: {}", test_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!NextCode(test_buffer, 1))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
asio::io_context ioc;
|
||||||
|
|
||||||
|
asio::thread_pool pool(26);
|
||||||
|
|
||||||
|
// Channel
|
||||||
|
// ChannelType channel(ioc);
|
||||||
|
|
||||||
|
// post onto the thread pool
|
||||||
|
for(int i = 0; i < 26; ++i)
|
||||||
|
asio::post(pool, [i]() { ThreadFunction('a' + i); });
|
||||||
|
|
||||||
|
pool.join();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <climits> // CHAR_BIT
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
namespace swbf {
|
||||||
|
namespace detail {
|
||||||
|
template <class T>
|
||||||
|
constexpr size_t BitSizeOf() {
|
||||||
|
return sizeof(T) * CHAR_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr std::uint64_t splitmix64(std::uint64_t x) {
|
||||||
|
std::uint64_t z = (x += 0x9e3779b97f4a7c15uLL);
|
||||||
|
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9uLL;
|
||||||
|
z = (z ^ (z >> 27)) * 0x94d049bb133111ebuLL;
|
||||||
|
return z ^ (z >> 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr std::uint64_t rotl(std::uint64_t x, int k) {
|
||||||
|
return (x << k) | (x >> (BitSizeOf<std::uint64_t>() - k));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Xoshiro256** as a C++ RandomNumberEngine,
|
||||||
|
* which can be used in C++ random algorithms.
|
||||||
|
*/
|
||||||
|
struct Xoshiro256ss {
|
||||||
|
using result_type = std::uint64_t;
|
||||||
|
|
||||||
|
std::uint64_t s[4] {};
|
||||||
|
|
||||||
|
constexpr explicit Xoshiro256ss() : Xoshiro256ss(0) {}
|
||||||
|
|
||||||
|
constexpr explicit Xoshiro256ss(std::uint64_t seed) {
|
||||||
|
s[0] = splitmix64(seed);
|
||||||
|
s[1] = splitmix64(seed);
|
||||||
|
s[2] = splitmix64(seed);
|
||||||
|
s[3] = splitmix64(seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for seeding from a `std::random_device`.
|
||||||
|
*
|
||||||
|
* \param[in] rd Random device to seed this engine with.
|
||||||
|
*/
|
||||||
|
constexpr explicit Xoshiro256ss(std::random_device& rd) {
|
||||||
|
// Get 64 bits out of the random device.
|
||||||
|
//
|
||||||
|
// This lambda is quite literal, as it fetches
|
||||||
|
// 2 iterations of the random engine, and
|
||||||
|
// shifts + OR's them into a 64bit value.
|
||||||
|
auto get_u64 = [&rd] {
|
||||||
|
std::uint64_t the_thing = rd();
|
||||||
|
return (the_thing << 32) | rd();
|
||||||
|
};
|
||||||
|
|
||||||
|
// seed with 256 bits of entropy from the random device + splitmix64
|
||||||
|
// to ensure we seed it well, as per recommendation.
|
||||||
|
s[0] = splitmix64(get_u64());
|
||||||
|
s[1] = splitmix64(get_u64());
|
||||||
|
s[2] = splitmix64(get_u64());
|
||||||
|
s[3] = splitmix64(get_u64());
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr result_type min() { return 0; }
|
||||||
|
|
||||||
|
static constexpr result_type max() { return std::uint64_t(-1); }
|
||||||
|
|
||||||
|
constexpr result_type operator()() {
|
||||||
|
result_type result = rotl(s[1] * 5, 7) * 9;
|
||||||
|
result_type t = s[1] << 17;
|
||||||
|
s[2] ^= s[0];
|
||||||
|
s[3] ^= s[1];
|
||||||
|
s[1] ^= s[2];
|
||||||
|
s[0] ^= s[3];
|
||||||
|
s[2] ^= t;
|
||||||
|
s[3] = rotl(s[3], 45);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
using detail::Xoshiro256ss;
|
||||||
|
} // namespace swbf
|
Loading…
Reference in New Issue