Compare commits

..

No commits in common. "49fefca596dcada8395c3b727372f1145180e404" and "b3f64e6330944fd872593c6de15d83a6b3fde0b5" have entirely different histories.

12 changed files with 176 additions and 525 deletions

View File

@ -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

View File

@ -21,10 +21,10 @@
name: C/C++ CI (FreeBSD) name: C/C++ CI (FreeBSD)
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:

View File

@ -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:

View File

@ -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

View File

@ -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:

View File

@ -18,187 +18,92 @@
# @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
GIT_TAG 10.0.0 GIT_TAG 10.0.0
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
GIT_TAG 2.0.1 GIT_TAG 2.0.1
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()

View File

@ -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)
------ ------

View File

@ -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,23 +69,21 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
"", "",
"", "",
"", "",
"",
640, 640,
0, 0,
1, 1,
false,
false,
false,
false,
false,
false,
false, false,
MODE_BINK1998_GENERATE, false,
WINDOWS false,
false,
false,
false,
MODE_BINK1998_GENERATE
}; };
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 {
} else if (arg == "-N" || arg == "--nonewlines") {
options->nonewlines = true;
} 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:

View File

@ -36,18 +36,10 @@
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,
MODE_CONFIRMATION_ID = 2, MODE_CONFIRMATION_ID = 2,
MODE_BINK1998_VALIDATE = 3, MODE_BINK1998_VALIDATE = 3,
MODE_BINK2002_VALIDATE = 4, MODE_BINK2002_VALIDATE = 4,
}; };
@ -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 {

View File

@ -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,26 +628,12 @@ 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) { memcpy(sha1_input, buffer + half, half);
case 0: memcpy(sha1_input + half, key, keySize);
case 1: sha1_input[half + keySize] = 0x80;
case 4: sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
memcpy(sha1_input, buffer + half, half); sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
memcpy(sha1_input + half, key, keySize); sha1_single_block(sha1_input, sha1_result);
sha1_input[half + keySize] = 0x80;
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
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);
size_t i; size_t i;
for (i = half & ~3; i < half; i++) for (i = half & ~3; i < half; i++)
sha1_result[i] = sha1_result[i + 4 - (half & 3)]; sha1_result[i] = sha1_result[i + 4 - (half & 3)];
@ -745,26 +654,12 @@ 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) { memcpy(sha1_input, buffer, half);
case 0: memcpy(sha1_input + half, key, keySize);
case 1: sha1_input[half + keySize] = 0x80;
case 4: sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
memcpy(sha1_input, buffer, half); sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
memcpy(sha1_input + half, key, keySize); sha1_single_block(sha1_input, sha1_result);
sha1_input[half + keySize] = 0x80;
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
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);
size_t i; size_t i;
for (i = half & ~3; i < half; i++) for (i = half & ~3; i < half; i++)
sha1_result[i] = sha1_result[i + 4 - (half & 3)]; sha1_result[i] = sha1_result[i + 4 - (half & 3)];
@ -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) { memcpy(&parsed, installation_id, sizeof(parsed));
case 0: unsigned productId1 = parsed.ProductIDLow & ((1 << 17) - 1);
case 1: unsigned productId2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
case 4: unsigned productId3 = (parsed.ProductIDLow >> 27) & ((1 << 25) - 1);
memcpy(&parsed, installation_id, sizeof(parsed)); unsigned version = (parsed.ProductIDLow >> 52) & 7;
productID1 = parsed.ProductIDLow & ((1 << 17) - 1); unsigned productId4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
productID2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1); if (version != (totalCount == 41 ? 4 : 5))
productID3 = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1); return ERR_UNKNOWN_VERSION;
version = (parsed.ProductIDLow >> 51) & 15;
productID4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
switch (activationMode) {
case 0:
if (version != (totalCount == 41 ? 9 : 10))
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) { u.buffer[7] = attempt;
case 0:
case 1:
case 4:
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;

View File

@ -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();
}; };

View File

@ -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) {
@ -57,4 +57,4 @@ FNEXPORT int PIDGEN2_GenerateRetail(char* channelID, char* &keyout) {
FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) { FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) {
return PIDGEN2::GenerateOEM(year, day, oem, keyout); return PIDGEN2::GenerateOEM(year, day, oem, keyout);
} }