mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2024-11-16 19:00:59 +02:00
Compare commits
No commits in common. "49fefca596dcada8395c3b727372f1145180e404" and "b3f64e6330944fd872593c6de15d83a6b3fde0b5" have entirely different histories.
49fefca596
...
b3f64e6330
50
.github/workflows/dos-djgpp.yml
vendored
50
.github/workflows/dos-djgpp.yml
vendored
@ -22,31 +22,31 @@ name: C/C++ CI (DOS DJGPP)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "*" ]
|
branches: [ "master" ]
|
||||||
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
pull_request:
|
||||||
workflow_dispatch:
|
branches: [ "master" ]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
|
CMAKE_C_COMPILER: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
|
||||||
CXX: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-g++
|
CMAKE_CXX_COMPILER: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-g++
|
||||||
CMAKE_FIND_ROOT_PATH: ${{ github.workspace }}/djgpp
|
CMAKE_FIND_ROOT_PATH: ${{ github.workspace }}/djgpp
|
||||||
|
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: NEVER
|
||||||
|
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: ONLY
|
||||||
|
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: ONLY
|
||||||
|
CMAKE_FIND_ROOT_PATH_MODE_PACKAGE: ONLY
|
||||||
WATT_ROOT: ${{ github.workspace }}/djgpp/watt32
|
WATT_ROOT: ${{ github.workspace }}/djgpp/watt32
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Source Tree
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup build environment
|
- name: Setup build environment
|
||||||
run: |
|
run: |
|
||||||
sudo apt -y update
|
sudo apt -y update
|
||||||
sudo apt -y install build-essential cmake wget 7zip git flex libfl-dev nasm libslang2-dev pkg-config libslang2-modules gcc-multilib
|
sudo apt -y install build-essential cmake wget 7zip git flex nasm libslang2-dev pkg-config libslang2-modules gcc-multilib
|
||||||
|
|
||||||
- name: Download and Setup DJGPP Toolchain
|
- name: Download and Setup DJGPP Toolchain
|
||||||
run: |
|
run: |
|
||||||
pushd ${{ github.workspace }}
|
|
||||||
wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/djgpp-linux64-gcc1220.tar.bz2
|
wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/djgpp-linux64-gcc1220.tar.bz2
|
||||||
tar xjf djgpp-linux64-gcc1220.tar.bz2
|
tar xjf djgpp-linux64-gcc1220.tar.bz2
|
||||||
cd ${{ github.workspace }}/djgpp
|
cd ${{ github.workspace }}/djgpp
|
||||||
@ -54,34 +54,40 @@ jobs:
|
|||||||
cd watt32/util
|
cd watt32/util
|
||||||
make clean && make linux
|
make clean && make linux
|
||||||
cd ../src
|
cd ../src
|
||||||
source ${{ github.workspace }}/djgpp/setenv
|
|
||||||
./configur.sh djgpp
|
./configur.sh djgpp
|
||||||
make -f djgpp.mak
|
make -f djgpp.mak
|
||||||
ln -s ${WATT_ROOT}/lib/libwatt.a ${{ github.workspace }}/djgpp/lib
|
ln -s ${{ github.workspace }}/djgpp/watt32/lib/libwatt.a ${{ github.workspace }}/djgpp/lib
|
||||||
|
|
||||||
- name: Checkout and Cross Compile OpenSSL 3.1.2
|
- name: Checkout and Cross Compile OpenSSL 3.1
|
||||||
run: |
|
run: |
|
||||||
git clone https://github.com/UMSKT/openssl.git openssl
|
git clone https://github.com/UMSKT/openssl.git openssl
|
||||||
pushd openssl
|
pushd openssl
|
||||||
|
git checkout openssl-3.1.1
|
||||||
source ${{ github.workspace }}/djgpp/setenv
|
source ${{ github.workspace }}/djgpp/setenv
|
||||||
./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
|
./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
|
||||||
make && make install
|
make && make install
|
||||||
popd
|
popd
|
||||||
|
ls ${{ github.workspace }}/djgpp/i586-pc-msdosdjgpp/bin/
|
||||||
|
|
||||||
|
- name: Checkout Source Tree
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
uses: threeal/cmake-action@v1.2.0
|
||||||
source ${{ github.workspace }}/djgpp/setenv
|
with:
|
||||||
pushd build
|
c-compiler: gcc
|
||||||
cmake ../ -D DJGPP_WATT32=${WATT_ROOT}/lib/libwatt.a -D CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
|
cxx-compiler: g++
|
||||||
make
|
options: OPENSSL_ROOT_DIR:string=${{ github.workspace }}/djgpp DJGPP_WATT32=ON
|
||||||
|
run-build: true
|
||||||
|
|
||||||
- name: Move executable to upload directory
|
- name: Test & Move files to correct directory
|
||||||
run: |
|
run: |
|
||||||
mkdir build/actions_upload
|
mkdir -p build/actions_upload
|
||||||
mv build/umskt.exe build/actions_upload/
|
mv build/umskt build/actions_upload/umskt
|
||||||
|
|
||||||
- name: Upload build artifact
|
- name: Upload build artifact
|
||||||
uses: actions/upload-artifact@v3.1.2
|
uses: actions/upload-artifact@v3.1.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-DOS
|
name: UMSKT-DOS-DJGPP
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
|
||||||
|
6
.github/workflows/freebsd.yml
vendored
6
.github/workflows/freebsd.yml
vendored
@ -22,9 +22,9 @@
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "*" ]
|
branches: [ "master" ]
|
||||||
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
pull_request:
|
||||||
workflow_dispatch:
|
branches: [ "master" ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
6
.github/workflows/linux.yml
vendored
6
.github/workflows/linux.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (Linux)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "*" ]
|
branches: [ "master" ]
|
||||||
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
pull_request:
|
||||||
workflow_dispatch:
|
branches: [ "master" ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
8
.github/workflows/macos.yml
vendored
8
.github/workflows/macos.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (macOS)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "*" ]
|
branches: [ "master" ]
|
||||||
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
pull_request:
|
||||||
workflow_dispatch:
|
branches: [ "master" ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-x86:
|
build-x86:
|
||||||
@ -56,5 +56,5 @@ jobs:
|
|||||||
- name: Upload build artifact
|
- name: Upload build artifact
|
||||||
uses: actions/upload-artifact@v3.1.2
|
uses: actions/upload-artifact@v3.1.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-macOS-${{ matrix.arch }}
|
name: UMSKT-macOS-${{ matrix.arch }}-static
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
6
.github/workflows/windows.yml
vendored
6
.github/workflows/windows.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (Windows)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "*" ]
|
branches: [ "master" ]
|
||||||
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
pull_request:
|
||||||
workflow_dispatch:
|
branches: [ "master" ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-32bit:
|
build-32bit:
|
||||||
|
201
CMakeLists.txt
201
CMakeLists.txt
@ -18,115 +18,49 @@
|
|||||||
# @FileCreated by Andrew on 05/30/2023
|
# @FileCreated by Andrew on 05/30/2023
|
||||||
# @Maintainer Neo
|
# @Maintainer Neo
|
||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.12)
|
||||||
PROJECT(UMSKT)
|
|
||||||
SET(CMAKE_CXX_STANDARD 17)
|
|
||||||
SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
||||||
SET(CMAKE_OSX_SYSROOT "macosx" CACHE PATH "macOS SDK path")
|
|
||||||
OPTION(UMSKT_USE_SHARED_OPENSSL "Force linking against the system-wide OpenSSL library" OFF)
|
|
||||||
OPTION(MUSL_STATIC "Enable fully static builds in a muslc environment (i.e. Alpine Linux)" OFF)
|
|
||||||
OPTION(DJGPP_WATT32 "Enable compilation and linking with DJGPP/WATT32/OpenSSL" OFF)
|
|
||||||
OPTION(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilation" OFF)
|
|
||||||
|
|
||||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
project(UMSKT)
|
||||||
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
set(CMAKE_OSX_SYSROOT "macosx" CACHE PATH "macOS SDK path")
|
||||||
|
|
||||||
# macOS does not support static build
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
SET(UMSKT_USE_SHARED_OPENSSL ON)
|
|
||||||
|
option(UMSKT_USE_SHARED_OPENSSL "Force linking against the system-wide OpenSSL library" OFF)
|
||||||
|
option(MUSL_STATIC "Enable fully static builds in a muslc environment (i.e. Alpine Linux)" OFF)
|
||||||
|
option(DJGPP_WATT32 "Enable compilation and linking with DJGPP/WATT32/OpenSSL" OFF)
|
||||||
|
option(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilation" OFF)
|
||||||
|
|
||||||
|
find_package(OpenSSL REQUIRED)
|
||||||
|
|
||||||
|
if(NOT OpenSSL_FOUND)
|
||||||
|
message(FATAL_ERROR "OpenSSL Development Libraries Not Found. Please install the required OpenSSL development package.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# neither does dos idk i'm trying random stuff
|
if(UMSKT_USE_SHARED_OPENSSL)
|
||||||
if (DJGPP_WATT32)
|
set(OPENSSL_USE_STATIC_LIBS FALSE)
|
||||||
SET(UMSKT_USE_SHARED_OPENSSL ON)
|
set(OPENSSL_MSVC_STATIC_RT FALSE)
|
||||||
|
else()
|
||||||
|
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
||||||
|
set(OPENSSL_MSVC_STATIC_RT TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
IF(UMSKT_USE_SHARED_OPENSSL)
|
if(MUSL_STATIC AND NOT UMSKT_USE_SHARED_OPENSSL)
|
||||||
SET(OPENSSL_USE_STATIC_LIBS FALSE)
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
SET(OPENSSL_MSVC_STATIC_RT FALSE)
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
MESSAGE(WARNING "[UMSKT] Forcing shared OpenSSL runtime")
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
ELSE()
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
SET(OPENSSL_USE_STATIC_LIBS TRUE)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
SET(OPENSSL_MSVC_STATIC_RT TRUE)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IF(DJGPP_WATT32)
|
|
||||||
SET(CMAKE_SYSTEM_NAME MSDOS)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
||||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32})
|
|
||||||
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS} ${WATT_ROOT}/lib)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# find the system installed OpenSSL development library
|
|
||||||
FIND_PACKAGE(OpenSSL REQUIRED)
|
|
||||||
IF(NOT OPENSSL_FOUND)
|
|
||||||
MESSAGE(SEND_ERROR "OpenSSL Development Libraries Not Found")
|
|
||||||
MESSAGE(SEND_ERROR "Please consult your package manager of choice to install the prerequisite")
|
|
||||||
MESSAGE(SEND_ERROR "The package name is commonly called libssl-dev or openssl-dev depending on distribution")
|
|
||||||
MESSAGE(FATAL_ERROR "Can not continue without OpenSSL")
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# if we found shared libraries - do the following:
|
|
||||||
STRING(REGEX MATCH "(\\.so|\\.dll|\\.dylib)$" OPENSSL_CRYPTO_SHARED "${OPENSSL_CRYPTO_LIBRARY}")
|
|
||||||
IF(OPENSSL_CRYPTO_SHARED)
|
|
||||||
MESSAGE(STATUS "[UMSKT] Detected Shared library version of OpenSSL")
|
|
||||||
SET(BUILD_SHARED_LIBS ON)
|
|
||||||
ELSE()
|
|
||||||
MESSAGE(STATUS "[UMSKT] Detected Static Library version of OpenSSL")
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
||||||
SET(BUILD_SHARED_LIBS ON)
|
|
||||||
MESSAGE(STATUS "[UMSKT] macOS has no static library - Shared library forced on")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DJGPP_WATT32)
|
include(cmake/CPM.cmake)
|
||||||
SET(BUILD_SHARED_LIBS ON)
|
|
||||||
MESSAGE(STATUS "[UMSKT] DOS has no static library - Shared library forced on")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# if we're compiling with MSVC, respect the DEBUG compile option
|
|
||||||
IF(MSVC)
|
|
||||||
SET(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
||||||
IF(NOT BUILD_SHARED_LIBS)
|
|
||||||
SET(CMAKE_CXX_FLAGS_RELEASE "/MT")
|
|
||||||
SET(CMAKE_CXX_FLAGS_DEBUG "/MTd")
|
|
||||||
ELSE()
|
|
||||||
SET(CMAKE_CXX_FLAGS_RELEASE "/MD")
|
|
||||||
SET(CMAKE_CXX_FLAGS_DEBUG "/MDd")
|
|
||||||
ENDIF()
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "/INCREMENTAL:NO /NODEFAULTLIB:MSVCRT")
|
|
||||||
SET(CMAKE_ENABLE_EXPORTS ON)
|
|
||||||
SET(UMSKT_EXE_WINDOWS_EXTRA src/windows/umskt.rc)
|
|
||||||
SET(UMSKT_EXE_WINDOWS_DLL src/windows/dllmain.cpp)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
IF(MUSL_STATIC)
|
|
||||||
MESSAGE(STATUS "[UMSKT] Performing a fully static build using muslc")
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
|
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
|
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc -static-libstdc++")
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# initalize cpm.CMake
|
|
||||||
INCLUDE(cmake/CPM.cmake)
|
|
||||||
|
|
||||||
# fetch cpm.CMake dependencies
|
|
||||||
# Include JSON development library
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME nlohmann_json
|
NAME nlohmann_json
|
||||||
GITHUB_REPOSITORY nlohmann/json
|
GITHUB_REPOSITORY nlohmann/json
|
||||||
VERSION 3.11.2
|
VERSION 3.11.2
|
||||||
)
|
)
|
||||||
|
|
||||||
# Include fmt development library
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME fmt
|
NAME fmt
|
||||||
GITHUB_REPOSITORY fmtlib/fmt
|
GITHUB_REPOSITORY fmtlib/fmt
|
||||||
@ -134,7 +68,6 @@ CPMAddPackage(
|
|||||||
VERSION 10.0.0
|
VERSION 10.0.0
|
||||||
)
|
)
|
||||||
|
|
||||||
# Include cmrc resource compiler
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME cmrc
|
NAME cmrc
|
||||||
GITHUB_REPOSITORY vector-of-bool/cmrc
|
GITHUB_REPOSITORY vector-of-bool/cmrc
|
||||||
@ -142,63 +75,35 @@ CPMAddPackage(
|
|||||||
VERSION 2.0.1
|
VERSION 2.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
# Include Crypto++ development library
|
# For Emscripten builds, set CMAKE_TOOLCHAIN_FILE to the appropriate file
|
||||||
#CPMAddPackage(
|
set(EMSCRIPTEN_BUILD OFF CACHE BOOL "Build for Emscripten" FORCE)
|
||||||
# NAME cryptopp-cmake
|
if(EMSCRIPTEN_BUILD)
|
||||||
# GITHUB_REPOSITORY abdes/cryptopp-cmake
|
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/cmake/Emscripten.cmake" CACHE STRING "Emscripten toolchain file")
|
||||||
# GIT_TAG CRYPTOPP_8_8_0
|
endif()
|
||||||
# VERSION 8.8.0
|
|
||||||
# OPTIONS "CRYPTOPP_BUILD_TESTING OFF"
|
|
||||||
#)
|
|
||||||
|
|
||||||
#include googletest unit testing library
|
|
||||||
#CPMAddPackage(
|
|
||||||
# NAME googletest
|
|
||||||
# GITHUB_REPOSITORY google/googletest
|
|
||||||
# VERSION 1.13.0
|
|
||||||
# OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
|
||||||
#)
|
|
||||||
|
|
||||||
### Resource compilation
|
|
||||||
CMRC_ADD_RESOURCE_LIBRARY(umskt-rc ALIAS umskt::rc NAMESPACE umskt keys.json)
|
CMRC_ADD_RESOURCE_LIBRARY(umskt-rc ALIAS umskt::rc NAMESPACE umskt keys.json)
|
||||||
|
|
||||||
SET(LIBUMSKT_SRC src/libumskt/libumskt.cpp src/libumskt/pidgen3/BINK1998.cpp src/libumskt/pidgen3/BINK2002.cpp src/libumskt/pidgen3/key.cpp src/libumskt/pidgen3/util.cpp src/libumskt/confid/confid.cpp src/libumskt/pidgen2/PIDGEN2.cpp src/libumskt/debugoutput.cpp)
|
set(LIBUMSKT_SRC
|
||||||
|
src/libumskt/libumskt.cpp
|
||||||
|
src/libumskt/pidgen3/BINK1998.cpp
|
||||||
|
src/libumskt/pidgen3/BINK2002.cpp
|
||||||
|
src/libumskt/pidgen3/key.cpp
|
||||||
|
src/libumskt/pidgen3/util.cpp
|
||||||
|
src/libumskt/confid/confid.cpp
|
||||||
|
src/libumskt/pidgen2/PIDGEN2.cpp
|
||||||
|
src/libumskt/debugoutput.cpp
|
||||||
|
)
|
||||||
|
|
||||||
#### Separate Build Path for emscripten
|
if(UMSKT_USE_SHARED_OPENSSL)
|
||||||
IF (EMSCRIPTEN)
|
add_library(_umskt SHARED ${LIBUMSKT_SRC})
|
||||||
ADD_EXECUTABLE(umskt ${LIBUMSKT_SRC})
|
else()
|
||||||
TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
add_library(_umskt STATIC ${LIBUMSKT_SRC})
|
||||||
TARGET_LINK_LIBRARIES(umskt -static OpenSSL::Crypto cryptopp::cryptopp fmt)
|
endif()
|
||||||
SET(CMAKE_EXECUTABLE_SUFFIX ".html")
|
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(umskt PROPERTIES COMPILE_FLAGS "-Os -sEXPORTED_RUNTIME_METHODS=ccall,cwrap")
|
target_include_directories(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
||||||
SET_TARGET_PROPERTIES(umskt PROPERTIES LINK_FLAGS "-Os -sWASM=1 -sEXPORT_ALL=1 -sEXPORTED_RUNTIME_METHODS=ccall,cwrap --no-entry")
|
target_link_libraries(_umskt PRIVATE OpenSSL::Crypto fmt)
|
||||||
ELSE()
|
|
||||||
IF(NOT UMSKT_USE_SHARED_OPENSSL)
|
|
||||||
### Static library compilation
|
|
||||||
ADD_LIBRARY(_umskt STATIC ${LIBUMSKT_SRC})
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
|
||||||
TARGET_LINK_LIBRARIES(_umskt -static OpenSSL::Crypto fmt ${UMSKT_LINK_LIBS})
|
|
||||||
ELSE()
|
|
||||||
### Shared library compilation
|
|
||||||
ADD_LIBRARY(_umskt SHARED ${LIBUMSKT_SRC} ${UMSKT_EXE_WINDOWS_EXTRA} ${UMSKT_EXE_WINDOWS_DLL})
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
|
||||||
TARGET_LINK_LIBRARIES(_umskt OpenSSL::Crypto fmt ${UMSKT_LINK_LIBS})
|
|
||||||
TARGET_LINK_DIRECTORIES(_umskt PUBLIC ${UMSKT_LINK_DIRS})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
### UMSKT executable compilation
|
add_executable(umskt src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
|
||||||
ADD_EXECUTABLE(umskt src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
|
||||||
TARGET_LINK_LIBRARIES(umskt _umskt OpenSSL::Crypto fmt nlohmann_json::nlohmann_json umskt::rc ${UMSKT_LINK_LIBS})
|
|
||||||
TARGET_LINK_DIRECTORIES(umskt PUBLIC ${UMSKT_LINK_DIRS})
|
|
||||||
IF(MSVC AND MSVC_MSDOS_STUB)
|
|
||||||
SET_PROPERTY(TARGET umskt APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
### Copy Shared Libraries and dependency files
|
target_include_directories(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
||||||
IF (OPENSSL_CRYPTO_SHARED)
|
target_link_libraries(umskt PRIVATE _umskt OpenSSL::Crypto fmt nlohmann_json::nlohmann_json umskt::rc)
|
||||||
GET_FILENAME_COMPONENT(OPENSSL_CRYPTO_LIBRARY_FILENAME ${OPENSSL_CRYPTO_LIBRARY} NAME)
|
|
||||||
CONFIGURE_FILE(${OPENSSL_CRYPTO_LIBRARY} "${CMAKE_CURRENT_BINARY_DIR}/${OPENSSL_CRYPTO_LIBRARY_FILENAME}" COPYONLY)
|
|
||||||
ENDIF()
|
|
||||||
ENDIF()
|
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
[![C/C++ CI (Linux)](https://github.com/UMSKT/UMSKT/actions/workflows/linux.yml/badge.svg)](../../actions/workflows/linux.yml)
|
[![C/C++ CI (Linux)](https://github.com/UMSKT/UMSKT/actions/workflows/linux.yml/badge.svg)](../../actions/workflows/linux.yml)
|
||||||
|
|
||||||
[![C/C++ CI (FreeBSD)](https://github.com/UMSKT/UMSKT/actions/workflows/freebsd.yml/badge.svg)](../../actions/workflows/freebsd.yml)
|
[![C/C++ CI (FreeBSD)](https://github.com/UMSKT/UMSKT/actions/workflows/freebsd.yml/badge.svg)](../../actions/workflows/dos-djgpp.yml)
|
||||||
|
|
||||||
[![C/C++ CI (DOS DJGPP)](https://github.com/UMSKT/UMSKT/actions/workflows/dos-djgpp.yml/badge.svg)](../../actions/workflows/dos-djgpp.yml)
|
[![C/C++ CI (DOS DJGPP)](https://github.com/UMSKT/UMSKT/actions/workflows/dos-djgpp.yml/badge.svg)](../../actions/workflows/freebsd.yml)
|
||||||
|
|
||||||
------
|
------
|
||||||
|
|
||||||
|
68
src/cli.cpp
68
src/cli.cpp
@ -53,15 +53,12 @@ void CLI::showHelp(char *argv[]) {
|
|||||||
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
|
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
|
||||||
fmt::print("\t-f --file\tspecify which keys file to load\n");
|
fmt::print("\t-f --file\tspecify which keys file to load\n");
|
||||||
fmt::print("\t-i --instid\tinstallation ID used to generate confirmation ID\n");
|
fmt::print("\t-i --instid\tinstallation ID used to generate confirmation ID\n");
|
||||||
fmt::print("\t-m --mode\tproduct family to activate.\n\t\t\tvalid options are \"WINDOWS\", \"OFFICEXP\", \"OFFICE2K3\", \"OFFICE2K7\" or \"PLUSDME\"\n\t\t\t(defaults to \"WINDOWS\")\n");
|
|
||||||
fmt::print("\t-p --productid\tthe product ID of the Program to activate. only required for Office 2K3 and Office 2K7 programs\n");
|
|
||||||
fmt::print("\t-b --binkid\tspecify which BINK identifier to load (defaults to 2E)\n");
|
fmt::print("\t-b --binkid\tspecify which BINK identifier to load (defaults to 2E)\n");
|
||||||
fmt::print("\t-l --list\tshow which products/binks can be loaded\n");
|
fmt::print("\t-l --list\tshow which products/binks can be loaded\n");
|
||||||
fmt::print("\t-c --channelid\tspecify which Channel Identifier to use (defaults to 640)\n");
|
fmt::print("\t-c --channelid\tspecify which Channel Identifier to use (defaults to 640)\n");
|
||||||
fmt::print("\t-s --serial\tspecifies a serial to use in the product ID (defaults to random, BINK1998 only)\n");
|
fmt::print("\t-s --serial\tspecifies a serial to use in the product ID (defaults to random, BINK1998 only)\n");
|
||||||
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
||||||
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
||||||
fmt::print("\t-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n");
|
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +69,6 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
|
||||||
640,
|
640,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@ -82,13 +78,12 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
MODE_BINK1998_GENERATE
|
||||||
MODE_BINK1998_GENERATE,
|
|
||||||
WINDOWS
|
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
std::string arg = argv[i];
|
std::string arg = argv[i];
|
||||||
|
|
||||||
if (arg == "-v" || arg == "--verbose") {
|
if (arg == "-v" || arg == "--verbose") {
|
||||||
options->verbose = true;
|
options->verbose = true;
|
||||||
UMSKT::setDebugOutput(stderr);
|
UMSKT::setDebugOutput(stderr);
|
||||||
@ -163,28 +158,6 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->instid = argv[i+1];
|
options->instid = argv[i+1];
|
||||||
options->applicationMode = MODE_CONFIRMATION_ID;
|
options->applicationMode = MODE_CONFIRMATION_ID;
|
||||||
i++;
|
i++;
|
||||||
} else if (arg == "-m" || arg == "--mode") {
|
|
||||||
std::string mode = argv[i+1];
|
|
||||||
char *p = &mode[0];
|
|
||||||
for (; *p; p++) {
|
|
||||||
*p = toupper((unsigned char)*p);
|
|
||||||
}
|
|
||||||
p = &mode[0];
|
|
||||||
if (strcmp(p, "WINDOWS") == 0) {
|
|
||||||
options->activationMode = WINDOWS;
|
|
||||||
} else if (strcmp(p, "OFFICEXP") == 0) {
|
|
||||||
options->activationMode = OFFICE_XP;
|
|
||||||
} else if (strcmp(p, "OFFICE2K3") == 0) {
|
|
||||||
options->activationMode = OFFICE_2K3;
|
|
||||||
} else if (strcmp(p, "OFFICE2K7") == 0) {
|
|
||||||
options->activationMode = OFFICE_2K7;
|
|
||||||
} else if (strcmp(p, "PLUSDME") == 0) {
|
|
||||||
options->activationMode = PLUS_DME;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
} else if (arg == "-p" || arg == "--productid") {
|
|
||||||
options->productid = argv[i+1];
|
|
||||||
i++;
|
|
||||||
} else if (arg == "-V" || arg == "--validate") {
|
} else if (arg == "-V" || arg == "--validate") {
|
||||||
if (i == argc - 1) {
|
if (i == argc - 1) {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
@ -194,19 +167,11 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->keyToCheck = argv[i+1];
|
options->keyToCheck = argv[i+1];
|
||||||
options->applicationMode = MODE_BINK1998_VALIDATE;
|
options->applicationMode = MODE_BINK1998_VALIDATE;
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
} else if (arg == "-N" || arg == "--nonewlines") {
|
|
||||||
options->nonewlines = true;
|
|
||||||
} else {
|
} else {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure that a product id is entered for OFFICE_2K3 or OFFICE_2K7 IIDs
|
|
||||||
if ((options->activationMode == OFFICE_2K3 || options->activationMode == OFFICE_2K7) && options->productid == "") {
|
|
||||||
return options->error = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return !options->error;
|
return !options->error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,8 +389,13 @@ int CLI::BINK1998Generate() {
|
|||||||
// generate a key
|
// generate a key
|
||||||
BN_sub(this->privateKey, this->genOrder, this->privateKey);
|
BN_sub(this->privateKey, this->genOrder, this->privateKey);
|
||||||
|
|
||||||
|
// Specify whether an upgrade version or not
|
||||||
|
bool bUpgrade = false;
|
||||||
|
if (options.upgrade == true)
|
||||||
|
bUpgrade = true;
|
||||||
|
|
||||||
for (int i = 0; i < this->total; i++) {
|
for (int i = 0; i < this->total; i++) {
|
||||||
PIDGEN3::BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, options.upgrade, this->pKey);
|
PIDGEN3::BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, bUpgrade, this->pKey);
|
||||||
|
|
||||||
bool isValid = PIDGEN3::BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
bool isValid = PIDGEN3::BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
@ -450,9 +420,10 @@ int CLI::BINK1998Generate() {
|
|||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
||||||
}
|
}
|
||||||
if (this->options.nonewlines == false) {
|
#ifndef _WIN32
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -473,7 +444,12 @@ int CLI::BINK2002Generate() {
|
|||||||
fmt::print("> AuthInfo: {}\n", pAuthInfo);
|
fmt::print("> AuthInfo: {}\n", pAuthInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, options.upgrade, this->pKey);
|
// Specify whether an upgrade version or not
|
||||||
|
bool bUpgrade = false;
|
||||||
|
if (options.upgrade == true)
|
||||||
|
bUpgrade = true;
|
||||||
|
|
||||||
|
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, bUpgrade, this->pKey);
|
||||||
|
|
||||||
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
@ -498,9 +474,9 @@ int CLI::BINK2002Generate() {
|
|||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
||||||
}
|
}
|
||||||
if (this->options.nonewlines == false) {
|
#ifndef _WIN32
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -545,7 +521,7 @@ int CLI::BINK2002Validate() {
|
|||||||
|
|
||||||
int CLI::ConfirmationID() {
|
int CLI::ConfirmationID() {
|
||||||
char confirmation_id[49];
|
char confirmation_id[49];
|
||||||
int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id, options.activationMode, options.productid);
|
int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id);
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case ERR_TOO_SHORT:
|
case ERR_TOO_SHORT:
|
||||||
@ -574,9 +550,9 @@ int CLI::ConfirmationID() {
|
|||||||
|
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
fmt::print(confirmation_id);
|
fmt::print(confirmation_id);
|
||||||
if (this->options.nonewlines == false) {
|
#ifndef _WIN32
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
11
src/cli.h
11
src/cli.h
@ -36,14 +36,6 @@
|
|||||||
|
|
||||||
CMRC_DECLARE(umskt);
|
CMRC_DECLARE(umskt);
|
||||||
|
|
||||||
enum ACTIVATION_ALGORITHM {
|
|
||||||
WINDOWS = 0,
|
|
||||||
OFFICE_XP = 1,
|
|
||||||
OFFICE_2K3 = 2,
|
|
||||||
OFFICE_2K7 = 3,
|
|
||||||
PLUS_DME = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum MODE {
|
enum MODE {
|
||||||
MODE_BINK1998_GENERATE = 0,
|
MODE_BINK1998_GENERATE = 0,
|
||||||
MODE_BINK2002_GENERATE = 1,
|
MODE_BINK2002_GENERATE = 1,
|
||||||
@ -57,7 +49,6 @@ struct Options {
|
|||||||
std::string keysFilename;
|
std::string keysFilename;
|
||||||
std::string instid;
|
std::string instid;
|
||||||
std::string keyToCheck;
|
std::string keyToCheck;
|
||||||
std::string productid;
|
|
||||||
int channelID;
|
int channelID;
|
||||||
int serial;
|
int serial;
|
||||||
int numKeys;
|
int numKeys;
|
||||||
@ -67,10 +58,8 @@ struct Options {
|
|||||||
bool help;
|
bool help;
|
||||||
bool error;
|
bool error;
|
||||||
bool list;
|
bool list;
|
||||||
bool nonewlines;
|
|
||||||
|
|
||||||
MODE applicationMode;
|
MODE applicationMode;
|
||||||
ACTIVATION_ALGORITHM activationMode;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class CLI {
|
class CLI {
|
||||||
|
@ -29,25 +29,9 @@
|
|||||||
|
|
||||||
#include "confid.h"
|
#include "confid.h"
|
||||||
|
|
||||||
QWORD MOD = 0;
|
#define MOD 0x16A6B036D7F2A79ULL
|
||||||
QWORD NON_RESIDUE = 0;
|
#define NON_RESIDUE 43
|
||||||
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
|
static const QWORD f[6] = {0, 0x21840136C85381ULL, 0x44197B83892AD0ULL, 0x1400606322B3B04ULL, 0x1400606322B3B04ULL, 1};
|
||||||
int productID1;
|
|
||||||
int productID2;
|
|
||||||
int productID3;
|
|
||||||
int productID4;
|
|
||||||
int activationMode;
|
|
||||||
|
|
||||||
int ConfirmationID::calculateCheckDigit(int pid)
|
|
||||||
{
|
|
||||||
unsigned int i = 0, j = 0, k = 0;
|
|
||||||
for (j = pid; j; i += k)
|
|
||||||
{
|
|
||||||
k = j % 10;
|
|
||||||
j /= 10;
|
|
||||||
}
|
|
||||||
return ((10 * pid) - (i % 7)) + 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
|
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
|
||||||
{
|
{
|
||||||
@ -111,65 +95,18 @@ QWORD ConfirmationID::ui128_quotient_mod(QWORD lo, QWORD hi)
|
|||||||
{
|
{
|
||||||
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
|
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
|
||||||
QWORD prod1;
|
QWORD prod1;
|
||||||
switch (activationMode) {
|
__umul128(lo, 0x604fa6a1c6346a87, &prod1);
|
||||||
case 0:
|
|
||||||
__umul128(lo, 0x604FA6A1C6346A87, &prod1);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
__umul128(lo, 0x4FA8E4A40CDAE44A, &prod1);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
__umul128(lo, 0x2C5C4D3654A594F0, &prod1);
|
|
||||||
}
|
|
||||||
QWORD part1hi;
|
QWORD part1hi;
|
||||||
QWORD part1lo;
|
QWORD part1lo = __umul128(lo, 0x2d351c6d04f8b, &part1hi);
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
part1lo = __umul128(lo, 0x2D351C6D04F8B, &part1hi);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
part1lo = __umul128(lo, 0x2CBAF12A59BBE, &part1hi);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
part1lo = __umul128(lo, 0x2D36C691A4EA5, &part1hi);
|
|
||||||
}
|
|
||||||
QWORD part2hi;
|
QWORD part2hi;
|
||||||
QWORD part2lo;
|
QWORD part2lo = __umul128(hi, 0x604fa6a1c6346a87, &part2hi);
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
part2lo = __umul128(hi, 0x604FA6A1C6346A87, &part2hi);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
part2lo = __umul128(hi, 0x4FA8E4A40CDAE44A, &part2hi);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
part2lo = __umul128(hi, 0x2C5C4D3654A594F0, &part2hi);
|
|
||||||
}
|
|
||||||
QWORD sum1 = part1lo + part2lo;
|
QWORD sum1 = part1lo + part2lo;
|
||||||
unsigned sum1carry = (sum1 < part1lo);
|
unsigned sum1carry = (sum1 < part1lo);
|
||||||
sum1 += prod1;
|
sum1 += prod1;
|
||||||
sum1carry += (sum1 < prod1);
|
sum1carry += (sum1 < prod1);
|
||||||
QWORD prod2 = part1hi + part2hi + sum1carry;
|
QWORD prod2 = part1hi + part2hi + sum1carry;
|
||||||
QWORD prod3hi;
|
QWORD prod3hi;
|
||||||
QWORD prod3lo;
|
QWORD prod3lo = __umul128(hi, 0x2d351c6d04f8b, &prod3hi);
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
prod3lo = __umul128(hi, 0x2D351C6D04F8B, &prod3hi);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
prod3lo = __umul128(hi, 0x2CBAF12A59BBE, &prod3hi);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
prod3lo = __umul128(hi, 0x2D36C691A4EA5, &prod3hi);
|
|
||||||
}
|
|
||||||
prod3lo += prod2;
|
prod3lo += prod2;
|
||||||
prod3hi += (prod3lo < prod2);
|
prod3hi += (prod3lo < prod2);
|
||||||
return (prod3lo >> 42) | (prod3hi << 22);
|
return (prod3lo >> 42) | (prod3hi << 22);
|
||||||
@ -682,20 +619,6 @@ void ConfirmationID::sha1_single_block(unsigned char input[64], unsigned char ou
|
|||||||
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
|
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfirmationID::decode_iid_new_version(unsigned char* iid, unsigned char* hwid, int* version)
|
|
||||||
{
|
|
||||||
QWORD buffer[5];
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 5; i++)
|
|
||||||
memcpy(&buffer[i], (iid + (4 * i)), 4);
|
|
||||||
DWORD v1 = (buffer[3] & 0xFFFFFFF8) | 2;
|
|
||||||
DWORD v2 = ((buffer[3] & 7) << 29) | (buffer[2] >> 3);
|
|
||||||
QWORD hardwareIDVal = ((QWORD)v1 << 32) | v2;
|
|
||||||
for (i = 0; i < 8; ++i)
|
|
||||||
hwid[i] = (hardwareIDVal >> (8 * i)) & 0xFF;
|
|
||||||
*version = buffer[0] & 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize)
|
void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize)
|
||||||
{
|
{
|
||||||
unsigned char sha1_input[64];
|
unsigned char sha1_input[64];
|
||||||
@ -705,25 +628,11 @@ void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned c
|
|||||||
int external_counter;
|
int external_counter;
|
||||||
for (external_counter = 0; external_counter < 4; external_counter++) {
|
for (external_counter = 0; external_counter < 4; external_counter++) {
|
||||||
memset(sha1_input, 0, sizeof(sha1_input));
|
memset(sha1_input, 0, sizeof(sha1_input));
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 4:
|
|
||||||
memcpy(sha1_input, buffer + half, half);
|
memcpy(sha1_input, buffer + half, half);
|
||||||
memcpy(sha1_input + half, key, keySize);
|
memcpy(sha1_input + half, key, keySize);
|
||||||
sha1_input[half + keySize] = 0x80;
|
sha1_input[half + keySize] = 0x80;
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
sha1_input[0] = 0x79;
|
|
||||||
memcpy(sha1_input + 1, buffer + half, half);
|
|
||||||
memcpy(sha1_input + 1 + half, key, keySize);
|
|
||||||
sha1_input[1 + half + keySize] = 0x80;
|
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (1 + half + keySize) * 8;
|
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (1 + half + keySize) * 8 / 0x100;
|
|
||||||
}
|
|
||||||
sha1_single_block(sha1_input, sha1_result);
|
sha1_single_block(sha1_input, sha1_result);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = half & ~3; i < half; i++)
|
for (i = half & ~3; i < half; i++)
|
||||||
@ -745,25 +654,11 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
|
|||||||
int external_counter;
|
int external_counter;
|
||||||
for (external_counter = 0; external_counter < 4; external_counter++) {
|
for (external_counter = 0; external_counter < 4; external_counter++) {
|
||||||
memset(sha1_input, 0, sizeof(sha1_input));
|
memset(sha1_input, 0, sizeof(sha1_input));
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 4:
|
|
||||||
memcpy(sha1_input, buffer, half);
|
memcpy(sha1_input, buffer, half);
|
||||||
memcpy(sha1_input + half, key, keySize);
|
memcpy(sha1_input + half, key, keySize);
|
||||||
sha1_input[half + keySize] = 0x80;
|
sha1_input[half + keySize] = 0x80;
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
sha1_input[0] = 0x79;
|
|
||||||
memcpy(sha1_input + 1, buffer, half);
|
|
||||||
memcpy(sha1_input + 1 + half, key, keySize);
|
|
||||||
sha1_input[1 + half + keySize] = 0x80;
|
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (1 + half + keySize) * 8;
|
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (1 + half + keySize) * 8 / 0x100;
|
|
||||||
}
|
|
||||||
sha1_single_block(sha1_input, sha1_result);
|
sha1_single_block(sha1_input, sha1_result);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = half & ~3; i < half; i++)
|
for (i = half & ~3; i < half; i++)
|
||||||
@ -776,44 +671,8 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid)
|
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49])
|
||||||
{
|
{
|
||||||
int version;
|
|
||||||
unsigned char hardwareID[8];
|
|
||||||
activationMode = mode;
|
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
MOD = 0x16A6B036D7F2A79;
|
|
||||||
NON_RESIDUE = 43;
|
|
||||||
f[0] = 0x0;
|
|
||||||
f[1] = 0x21840136C85381;
|
|
||||||
f[2] = 0x44197B83892AD0;
|
|
||||||
f[3] = 0x1400606322B3B04;
|
|
||||||
f[4] = 0x1400606322B3B04;
|
|
||||||
f[5] = 0x1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
MOD = 0x16E48DD18451FE9;
|
|
||||||
NON_RESIDUE = 3;
|
|
||||||
f[0] = 0x0;
|
|
||||||
f[1] = 0xE5F5ECD95C8FD2;
|
|
||||||
f[2] = 0xFF28276F11F61;
|
|
||||||
f[3] = 0xFB2BD9132627E6;
|
|
||||||
f[4] = 0xE5F5ECD95C8FD2;
|
|
||||||
f[5] = 0x1;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
MOD = 0x16A5DABA0605983;
|
|
||||||
NON_RESIDUE = 2;
|
|
||||||
f[0] = 0x334F24F75CAA0E;
|
|
||||||
f[1] = 0x1392FF62889BD7B;
|
|
||||||
f[2] = 0x135131863BA2DB8;
|
|
||||||
f[3] = 0x153208E78006010;
|
|
||||||
f[4] = 0x163694F26056DB;
|
|
||||||
f[5] = 0x1;
|
|
||||||
}
|
|
||||||
unsigned char installation_id[19]; // 10**45 < 256**19
|
unsigned char installation_id[19]; // 10**45 < 256**19
|
||||||
size_t installation_id_len = 0;
|
size_t installation_id_len = 0;
|
||||||
const char* p = installation_id_str;
|
const char* p = installation_id_str;
|
||||||
@ -855,23 +714,7 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
return ERR_TOO_SHORT;
|
return ERR_TOO_SHORT;
|
||||||
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
|
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
|
||||||
installation_id[installation_id_len] = 0;
|
installation_id[installation_id_len] = 0;
|
||||||
unsigned char iid_key[4] = { 0x0, 0x0, 0x0, 0x0 };
|
static const unsigned char iid_key[4] = {0x6A, 0xC8, 0x5E, 0xD4};
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
case 4:
|
|
||||||
iid_key[0] = 0x6A;
|
|
||||||
iid_key[1] = 0xC8;
|
|
||||||
iid_key[2] = 0x5E;
|
|
||||||
iid_key[3] = 0xD4;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
iid_key[0] = 0x5A;
|
|
||||||
iid_key[1] = 0x30;
|
|
||||||
iid_key[2] = 0xB9;
|
|
||||||
iid_key[3] = 0xF3;
|
|
||||||
}
|
|
||||||
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
||||||
if (installation_id[18] >= 0x10)
|
if (installation_id[18] >= 0x10)
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
@ -884,65 +727,19 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
unsigned short KeySHA1;
|
unsigned short KeySHA1;
|
||||||
} parsed;
|
} parsed;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 4:
|
|
||||||
memcpy(&parsed, installation_id, sizeof(parsed));
|
memcpy(&parsed, installation_id, sizeof(parsed));
|
||||||
productID1 = parsed.ProductIDLow & ((1 << 17) - 1);
|
unsigned productId1 = parsed.ProductIDLow & ((1 << 17) - 1);
|
||||||
productID2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
|
unsigned productId2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
|
||||||
productID3 = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
|
unsigned productId3 = (parsed.ProductIDLow >> 27) & ((1 << 25) - 1);
|
||||||
version = (parsed.ProductIDLow >> 51) & 15;
|
unsigned version = (parsed.ProductIDLow >> 52) & 7;
|
||||||
productID4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
unsigned productId4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
||||||
switch (activationMode) {
|
if (version != (totalCount == 41 ? 4 : 5))
|
||||||
case 0:
|
|
||||||
if (version != (totalCount == 41 ? 9 : 10))
|
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (version != 1)
|
|
||||||
return ERR_UNKNOWN_VERSION;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if (version != 4)
|
|
||||||
return ERR_UNKNOWN_VERSION;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
decode_iid_new_version(installation_id, hardwareID, &version);
|
|
||||||
productID1 = stoi(productid.substr(0,5));
|
|
||||||
std::string channelid = productid.substr(6,3);
|
|
||||||
char *p = &channelid[0];
|
|
||||||
for (; *p; p++) {
|
|
||||||
*p = toupper((unsigned char)*p);
|
|
||||||
}
|
|
||||||
if (strcmp(&channelid[0], "OEM") == 0) {
|
|
||||||
productID2 = stoi(productid.substr(12,3));
|
|
||||||
productID3 = calculateCheckDigit((stoi(productid.substr(15,1)) * 100000) + (stoi(productid.substr(18,5))));
|
|
||||||
productID4 = (stoi((productid.substr(10,2))) / 100000) * 1000;
|
|
||||||
} else {
|
|
||||||
productID2 = stoi(productid.substr(6,3));
|
|
||||||
productID3 = stoi(productid.substr(10,7));
|
|
||||||
productID4 = stoi(productid.substr(18,5));
|
|
||||||
}
|
|
||||||
switch (activationMode) {
|
|
||||||
case 2:
|
|
||||||
if (version != 3)
|
|
||||||
return ERR_UNKNOWN_VERSION;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if (version != 4)
|
|
||||||
return ERR_UNKNOWN_VERSION;
|
|
||||||
}
|
|
||||||
memcpy(&parsed, hardwareID, 8);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
|
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
|
||||||
|
|
||||||
unsigned char keybuf[16];
|
unsigned char keybuf[16];
|
||||||
memcpy(keybuf, &parsed.HardwareID, 8);
|
memcpy(keybuf, &parsed.HardwareID, 8);
|
||||||
QWORD productIdMixed = (QWORD)productID1 << 41 | (QWORD)productID2 << 58 | (QWORD)productID3 << 17 | productID4;
|
QWORD productIdMixed = (QWORD)productId1 << 41 | (QWORD)productId2 << 58 | (QWORD)productId3 << 17 | productId4;
|
||||||
memcpy(keybuf + 8, &productIdMixed, 8);
|
memcpy(keybuf + 8, &productIdMixed, 8);
|
||||||
|
|
||||||
TDivisor d;
|
TDivisor d;
|
||||||
@ -957,16 +754,7 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
} u;
|
} u;
|
||||||
u.lo = 0;
|
u.lo = 0;
|
||||||
u.hi = 0;
|
u.hi = 0;
|
||||||
switch (activationMode) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 4:
|
|
||||||
u.buffer[7] = attempt;
|
u.buffer[7] = attempt;
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
u.buffer[6] = attempt;
|
|
||||||
}
|
|
||||||
Mix(u.buffer, 14, keybuf, 16);
|
Mix(u.buffer, 14, keybuf, 16);
|
||||||
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
|
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
|
||||||
QWORD x1 = u.lo - x2 * MOD;
|
QWORD x1 = u.lo - x2 * MOD;
|
||||||
@ -978,18 +766,7 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
}
|
}
|
||||||
if (attempt > 0x80)
|
if (attempt > 0x80)
|
||||||
return ERR_UNLUCKY;
|
return ERR_UNLUCKY;
|
||||||
switch (activationMode) {
|
divisor_mul128(&d, 0x04e21b9d10f127c1, 0x40da7c36d44c, &d);
|
||||||
case 0:
|
|
||||||
divisor_mul128(&d, 0x04E21B9D10F127C1, 0x40DA7C36D44C, &d);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
divisor_mul128(&d, 0xEFE0302A1F7A5341, 0x01FB8CF48A70DF, &d);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
divisor_mul128(&d, 0x7C4254C43A5D1181, 0x01C61212ECE610, &d);
|
|
||||||
}
|
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
QWORD encoded_lo, encoded_hi;
|
QWORD encoded_lo, encoded_hi;
|
||||||
|
@ -41,7 +41,6 @@ typedef struct {
|
|||||||
} TDivisor;
|
} TDivisor;
|
||||||
|
|
||||||
EXPORT class ConfirmationID {
|
EXPORT class ConfirmationID {
|
||||||
static int calculateCheckDigit(int pid);
|
|
||||||
static QWORD residue_add(QWORD x, QWORD y);
|
static QWORD residue_add(QWORD x, QWORD y);
|
||||||
static QWORD residue_sub(QWORD x, QWORD y);
|
static QWORD residue_sub(QWORD x, QWORD y);
|
||||||
static QWORD __umul128(QWORD a, QWORD b, QWORD* hi);
|
static QWORD __umul128(QWORD a, QWORD b, QWORD* hi);
|
||||||
@ -61,12 +60,11 @@ EXPORT class ConfirmationID {
|
|||||||
static void divisor_mul128(const TDivisor* src, QWORD mult_lo, QWORD mult_hi, TDivisor* dst);
|
static void divisor_mul128(const TDivisor* src, QWORD mult_lo, QWORD mult_hi, TDivisor* dst);
|
||||||
static unsigned rol(unsigned x, int shift);
|
static unsigned rol(unsigned x, int shift);
|
||||||
static void sha1_single_block(unsigned char input[64], unsigned char output[20]);
|
static void sha1_single_block(unsigned char input[64], unsigned char output[20]);
|
||||||
static void decode_iid_new_version(unsigned char* iid, unsigned char* hwid, int* version);
|
|
||||||
static void Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid);
|
static int Generate(const char* installation_id_str, char confirmation_id[49]);
|
||||||
//EXPORT static int CLIRun();
|
//EXPORT static int CLIRun();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
#include "pidgen3/BINK2002.h"
|
#include "pidgen3/BINK2002.h"
|
||||||
#include "pidgen2/PIDGEN2.h"
|
#include "pidgen2/PIDGEN2.h"
|
||||||
|
|
||||||
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid) {
|
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49]) {
|
||||||
return ConfirmationID::Generate(installation_id_str, confirmation_id, mode, productid);
|
return ConfirmationID::Generate(installation_id_str, confirmation_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
FNEXPORT EC_GROUP* PIDGEN3_initializeEllipticCurve(char* pSel, char* aSel, char* bSel, char* generatorXSel, char* generatorYSel, char* publicKeyXSel, char* publicKeyYSel, EC_POINT *&genPoint, EC_POINT *&pubPoint) {
|
FNEXPORT EC_GROUP* PIDGEN3_initializeEllipticCurve(char* pSel, char* aSel, char* bSel, char* generatorXSel, char* generatorYSel, char* publicKeyXSel, char* publicKeyYSel, EC_POINT *&genPoint, EC_POINT *&pubPoint) {
|
||||||
|
Loading…
Reference in New Issue
Block a user