13 Commits

23 changed files with 249 additions and 1541 deletions

View File

@ -21,10 +21,7 @@
name: C/C++ CI (DOS DJGPP) name: C/C++ CI (DOS DJGPP)
on: on:
push: workflow_call:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
env: env:
CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
@ -37,12 +34,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Source Tree - name: Checkout Source Tree
uses: actions/checkout@v4 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 dosbox sudo apt -y install build-essential cmake wget 7zip git flex libfl-dev nasm libslang2-dev pkg-config libslang2-modules gcc-multilib
- name: Download and Setup DJGPP Toolchain - name: Download and Setup DJGPP Toolchain
run: | run: |
@ -59,32 +56,15 @@ jobs:
make -f djgpp.mak make -f djgpp.mak
ln -s ${WATT_ROOT}/lib/libwatt.a ${{ github.workspace }}/djgpp/lib ln -s ${WATT_ROOT}/lib/libwatt.a ${{ github.workspace }}/djgpp/lib
- name: Cache OpenSSL 3.1.2
uses: actions/cache/restore@v4
id: cache-openssl
with:
path: |
${{ github.workspace }}/djgpp
key: openssl-3.1.2-${{ hashFiles('**/CMakeLists.txt') }}
- name: Checkout and Cross Compile OpenSSL 3.1.2 - name: Checkout and Cross Compile OpenSSL 3.1.2
if: steps.cache-openssl.outputs.cache-hit != 'true'
run: | run: |
git clone https://github.com/UMSKT/openssl.git openssl git clone https://github.com/UMSKT/openssl.git openssl
pushd openssl pushd openssl
source ${{ github.workspace }}/djgpp/setenv source ${{ github.workspace }}/djgpp/setenv
./Configure 386 no-threads no-tests no-sse2 no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i386 --prefix=${{ github.workspace }}/djgpp DJGPP ./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
make && make install_sw make && make install
popd popd
- name: Save OpenSSL 3.1.2
if: steps.cache-openssl.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
${{ github.workspace }}/djgpp
key: openssl-3.1.2-${{ hashFiles('**/CMakeLists.txt') }}
- name: Build - name: Build
run: | run: |
source ${{ github.workspace }}/djgpp/setenv source ${{ github.workspace }}/djgpp/setenv
@ -92,91 +72,13 @@ jobs:
cmake ../ -D DJGPP_WATT32=${WATT_ROOT}/lib/libwatt.a -D CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH} cmake ../ -D DJGPP_WATT32=${WATT_ROOT}/lib/libwatt.a -D CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
make make
- name: Setup DOSBox test environment
run: |
mkdir -p dosbox_test
cp build/umskt.exe dosbox_test/
# Download DPMI server directly
wget https://github.com/UMSKT/winactiontest/raw/refs/heads/main/CWSDPMI.EXE -O dosbox_test/CWSDPMI.EXE
# Create test batch file
cat > dosbox_test/test.bat << EOL
@echo off
echo Running test 1...
umskt.exe -b 2C -c 365 -s 069420 -v > TEST1.TXT
if errorlevel 1 goto error
echo Running test 2...
umskt.exe -i 253286028742154311079061239762245184619981623171292574 > TEST2.TXT
if errorlevel 1 goto error
echo Tests completed > DONE.TXT
goto end
:error
echo Test failed > ERROR.TXT
:end
exit
EOL
# Create DOSBox configuration
cat > dosbox_test/dosbox.conf << EOL
[sdl]
nosound=true
[cpu]
core=dynamic
cycles=max
[autoexec]
mount c .
c:
test.bat
exit
EOL
- name: Run tests in DOSBox
run: |
cd dosbox_test
timeout 30s dosbox -conf dosbox.conf -nogui -exit
# Check if the test completed successfully
if [ ! -f DONE.TXT ]; then
echo "Tests did not complete successfully"
if [ -f ERROR.TXT ]; then
echo "Test execution failed"
fi
if [ -f TEST1.TXT ]; then
echo "Test 1 output:"
cat TEST1.TXT
fi
if [ -f TEST2.TXT ]; then
echo "Test 2 output:"
cat TEST2.TXT
fi
exit 1
fi
# Verify test outputs
if [ ! -f TEST1.TXT ] || [ ! -f TEST2.TXT ]; then
echo "Test output files missing"
exit 1
fi
# Check test results - looking for key format patterns
if ! grep -qE '[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}' TEST1.TXT || \
! grep -qE '[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}' TEST2.TXT; then
echo "Tests failed - unexpected output format"
echo "Test 1 output:"
cat TEST1.TXT
echo "Test 2 output:"
cat TEST2.TXT
exit 1
else
echo "All tests passed successfully"
echo "Test 1 output:"
cat TEST1.TXT
echo "Test 2 output:"
cat TEST2.TXT
fi
- name: Move executable to upload directory - name: Move executable to upload directory
run: | run: |
mkdir build/actions_upload mkdir build/actions_upload
mv build/umskt.exe build/actions_upload/ mv build/umskt.exe build/actions_upload/
- name: Upload build artifact - name: Upload build artifact
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v3.1.2
with: with:
name: UMSKT-DOS name: UMSKT-DOS
path: build/actions_upload path: build/actions_upload

View File

@ -1,85 +0,0 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by techguy16 on 07/23/2023
# @Maintainer techguy16
name: C/C++ CI (FreeBSD)
on:
push:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
name: build-x86_64
steps:
- uses: actions/checkout@v4
- name: Build & Test in FreeBSD
id: test
uses: vmactions/freebsd-vm@v1.2.1
with:
envs: 'MYTOKEN MYTOKEN2'
usesh: true
prepare: |
pkg install -y cmake openssl git bash
# Debug: Show system state
uname -a
pwd
df -h
ls -la
run: |
# Debug: Initial environment
echo "Starting build process..."
pwd
ls -la
# Create/clean build directory
echo "Setting up build directory..."
rm -rf build
mkdir build
cd build
echo "Running cmake..."
cmake ..
echo "Starting make..."
make
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
# Debug: List files and permissions
ls -la
pwd
# Ensure directory exists and has correct permissions
mkdir -p actions_upload
cp umskt actions_upload/
chmod -R 755 .
ls -la actions_upload/
- name: Move files to correct directory
run: |
mkdir -p build/actions_upload
mv build/umskt build/actions_upload/umskt
- name: Upload build artifact
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-FreeBSD
path: build/actions_upload

View File

@ -22,31 +22,24 @@ 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:
runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
include: include:
- arch: x86 - arch: x86
runner: ubuntu-latest
use_alpine: true
- arch: x86_64 - arch: x86_64
runner: ubuntu-latest
use_alpine: true
- arch: aarch64 - arch: aarch64
runner: ubuntu-24.04-arm
use_alpine: false
runs-on: ${{ matrix.runner }}
steps: steps:
- name: Checkout Source Tree - name: Checkout Source Tree
uses: actions/checkout@v4 uses: actions/checkout@v3
- name: Setup latest Alpine Linux - name: Setup latest Alpine Linux for ${{ matrix.arch }}
if: ${{ matrix.use_alpine }}
uses: jirutka/setup-alpine@v1 uses: jirutka/setup-alpine@v1
with: with:
packages: > packages: >
@ -57,113 +50,23 @@ jobs:
musl-dev musl-dev
openssl-dev openssl-dev
openssl-libs-static openssl-libs-static
zlib-dev
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
shell-name: alpine-target.sh shell-name: alpine-target.sh
- name: Install Dependencies (Ubuntu ARM64) - name: Configure and build UMSKT
if: ${{ !matrix.use_alpine }}
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake git libssl-dev zlib1g-dev
- name: Configure and build UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8 uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with: with:
options: MUSL_STATIC=ON options: MUSL_STATIC=ON
run-build: true run-build: true
shell: alpine-target.sh {0} shell: alpine-target.sh {0}
- name: Configure and build UMSKT (Ubuntu) - name: Move executable to upload directory
if: ${{ !matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=ON
run-build: true
- name: Test UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
run: |
cd build
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
shell: alpine-target.sh {0}
- name: Test UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
run: |
cd build
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Move files to correct directory
run: | run: |
mkdir -p build/actions_upload mkdir -p build/actions_upload
mv build/umskt build/actions_upload/umskt mv build/umskt build/actions_upload/umskt
- name: Upload build artifact - name: Upload build artifact
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v3.1.2
with: with:
name: UMSKT-linux-${{ matrix.arch }}-static name: UMSKT-linux-${{ matrix.arch }}-static
path: build/actions_upload path: build/actions_upload
- name: Configure and build static internal deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
run-build: true
shell: alpine-target.sh {0}
- name: Configure and build static internal deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
run-build: true
- name: Test static internal deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
run: |
cd build
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
shell: alpine-target.sh {0}
- name: Test static internal deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
run: |
cd build
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Configure and build shared deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
run-build: true
shell: alpine-target.sh {0}
- name: Configure and build shared deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
run-build: true
- name: Test shared deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
run: |
cd build
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
shell: alpine-target.sh {0}
- name: Test shared deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
run: |
cd build
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574

View File

@ -1,121 +0,0 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by techguy16 on 07/23/2023
# @Maintainer techguy16
name: C/C++ CI (macOS)
on:
push:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
jobs:
build:
runs-on: macos-latest
strategy:
matrix:
include:
- arch: x86_64
- arch: arm64
steps:
- name: Checkout Source Tree
uses: actions/checkout@v4
- name: Install Rosetta
if: matrix.arch == 'x86_64'
run: |
sudo softwareupdate --install-rosetta --agree-to-license || true
- name: Install Homebrew for x86_64
if: matrix.arch == 'x86_64'
env: { NONINTERACTIVE: 1 }
run: |
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- name: Install x86_64 OpenSSL
if: matrix.arch == 'x86_64'
run: |
arch -x86_64 /usr/local/bin/brew install openssl@3
echo "OPENSSL_ROOT_DIR=/usr/local/opt/openssl@3" >> $GITHUB_ENV
echo "OPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@3/include" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=/usr/local/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
- name: Install arm64 OpenSSL
if: matrix.arch == 'arm64'
run: |
brew install openssl@3
echo "OPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3" >> $GITHUB_ENV
echo "OPENSSL_INCLUDE_DIR=/opt/homebrew/opt/openssl@3/include" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=/opt/homebrew/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
- name: Configure and build UMSKT
run: |
cd build
cmake -DCMAKE_BUILD_TYPE=Release .. \
-DCMAKE_OSX_ARCHITECTURES=${{matrix.arch}} \
-DOPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR \
-DOPENSSL_INCLUDE_DIR=$OPENSSL_INCLUDE_DIR \
-DOPENSSL_USE_STATIC_LIBS=TRUE \
-DBUILD_SHARED_LIBS=OFF
make
- name: Move files to correct directory
run: |
ls -a build
mkdir -p build/actions_upload
mv build/umskt build/actions_upload/umskt
- name: Run tests
run: |
cd build/actions_upload
./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Upload platform-specific build
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-macOS-${{ matrix.arch }}
path: build/actions_upload
universal:
needs: build
runs-on: macos-latest
steps:
- name: Download x86_64 slice
uses: actions/download-artifact@v4
with:
name: UMSKT-macOS-x86_64
path: x86
- name: Download arm64 slice
uses: actions/download-artifact@v4
with:
name: UMSKT-macOS-arm64
path: arm
- name: Create universal binary
shell: bash
run: |
mkdir fat
lipo -create x86/umskt arm/umskt -output fat/umskt
lipo -info fat/umskt
- name: Upload universal build
uses: actions/upload-artifact@v4
with:
name: UMSKT-macOS-universal
path: fat

View File

@ -22,166 +22,96 @@ name: C/C++ CI (Windows)
on: on:
push: push:
branches: [ "*" ] branches: [ "master" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] pull_request:
workflow_dispatch: branches: [ "master" ]
jobs: jobs:
build-djgpp:
uses: ./.github/workflows/dos-djgpp.yml
build: build:
runs-on: windows-latest runs-on: windows-latest
needs: build-djgpp
strategy: strategy:
matrix: matrix:
arch: [x64, x86, arm64] include:
- arch: Win32
OpenSSL-File: Win32OpenSSL-3_1_1.exe
msbuild-arch: Win32
cmake-args: -D MSVC_MSDOS_STUB=..\umskt.exe
- arch: Win64
OpenSSL-File: Win64OpenSSL-3_1_1.exe
msbuild-arch: x64
cmake-args: ""
steps: steps:
- name: Setup TDM-GCC
if: matrix.arch != 'arm64'
run: |
Write-Host Downloading TDM-GCC v10.3.0...
Invoke-WebRequest -Uri 'https://github.com/jmeubank/tdm-gcc/releases/download/v10.3.0-tdm64-2/tdm64-gcc-10.3.0-2.exe' -OutFile 'C:\Windows\temp\TDM-GCC-64.exe'
Write-Host Creating directory...
New-Item -ItemType Directory -Path 'C:\TDM-GCC-64'
Write-Host Copying files [Set 1/3]...
Start-Process '7z' -ArgumentList 'e C:\Windows\temp\TDM-GCC-64.exe -oC:\TDM-GCC-64 -y' -Wait
Write-Host Copying files [Set 2/3]...
Start-Process '7z' -ArgumentList 'e C:\TDM-GCC-64\*.tar.xz -oC:\TDM-GCC-64 -y' -Wait
Write-Host Copying files [Set 3/3]...
Start-Process '7z' -ArgumentList 'x C:\TDM-GCC-64\*.tar -oC:\TDM-GCC-64 -y' -Wait
Write-Host Adding environment variables...
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
- name: Setup MSVC for ARM64
if: matrix.arch == 'arm64'
uses: ilammy/msvc-dev-cmd@v1
with:
arch: arm64
- name: Checkout Source Tree - name: Checkout Source Tree
uses: actions/checkout@v4 uses: actions/checkout@v3
- name: Download OpenSSL-TDM release asset - name: Install Windows XP Support for Visual Studio
if: matrix.arch != 'arm64' uses: thepwrtank18/install-vs-components@v1.0.0
shell: pwsh
run: |
if ('${{ matrix.arch }}' -eq 'x64') {
$url = "https://github.com/UMSKT/winactiontest/releases/download/openssl/OpenSSL-TDM-64.zip"
$dest = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-64"
$libdir = "lib64"
$cmake_flags = "-m64"
$openssl_root = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-64"
} else {
$url = "https://github.com/UMSKT/winactiontest/releases/download/openssl/OpenSSL-TDM-32.zip"
$dest = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-32"
$libdir = "lib32"
$cmake_flags = "-m32"
$openssl_root = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-32"
}
Invoke-WebRequest -Uri $url -OutFile "OpenSSL-TDM.zip"
Expand-Archive -Path "OpenSSL-TDM.zip" -DestinationPath $env:GITHUB_WORKSPACE
echo "OPENSSL_ROOT=$openssl_root" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "OPENSSL_LIBDIR=$libdir" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "CMAKE_FLAGS=$cmake_flags" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Setup vcpkg for ARM64
if: matrix.arch == 'arm64'
shell: pwsh
run: |
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
echo "VCPKG_ROOT=$env:GITHUB_WORKSPACE/vcpkg" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "VCPKG_DEFAULT_BINARY_CACHE=$env:GITHUB_WORKSPACE/vcpkg/bincache" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "VCPKG_BINARY_SOURCES=clear;default,readwrite" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Cache vcpkg packages
if: matrix.arch == 'arm64'
uses: actions/cache@v4
with: with:
path: | components: Microsoft.VisualStudio.Component.WinXP
${{ github.workspace }}/vcpkg/bincache
${{ github.workspace }}/vcpkg/installed
${{ github.workspace }}/vcpkg/packages
key: vcpkg-arm64-${{ hashFiles('**/CMakeLists.txt') }}-${{ hashFiles('**/*.cmake') }}
restore-keys: |
vcpkg-arm64-${{ hashFiles('**/CMakeLists.txt') }}-
vcpkg-arm64-
- name: Install OpenSSL for ARM64 - name: Download And Install ${{ matrix.OpenSSL-File }}
if: matrix.arch == 'arm64'
shell: pwsh
run: | run: |
New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE $installDir = "$Env:ProgramFiles\OpenSSL"
& "$env:VCPKG_ROOT\vcpkg.exe" install openssl:arm64-windows-static --clean-after-build $installerURL = "https://slproweb.com/download/${{ matrix.OpenSSL-File }}"
$installerName = "${{ matrix.OpenSSL-File }}"
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
- name: Configure UMSKT (TDM-GCC ${{ matrix.arch }}) (New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
if: matrix.arch != 'arm64'
shell: pwsh
run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
$OPENSSL_ROOT = "$env:OPENSSL_ROOT"
$OPENSSL_LIB = "$OPENSSL_ROOT/$env:OPENSSL_LIBDIR"
$OPENSSL_INC = "$OPENSSL_ROOT/include"
cmake -G "MinGW Makefiles" `
-DCMAKE_C_COMPILER="gcc" `
-DCMAKE_CXX_COMPILER="g++" `
-DOPENSSL_ROOT_DIR="$OPENSSL_ROOT" `
-DOPENSSL_INCLUDE_DIR="$OPENSSL_INC" `
-DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_LIB/libcrypto.a" `
-DOPENSSL_SSL_LIBRARY="$OPENSSL_LIB/libssl.a" `
-DCMAKE_C_FLAGS="$env:CMAKE_FLAGS" `
-DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" `
.
- name: Configure UMSKT (MSVC ARM64) Remove-Item "$installDir" -Force -Recurse
if: matrix.arch == 'arm64' $installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`""
shell: pwsh Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
run: |
cmake -G "Visual Studio 17 2022" `
-A ARM64 `
-DWINDOWS_ARM=ON `
-DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" `
-DVCPKG_TARGET_TRIPLET=arm64-windows-static `
.
- name: Build UMSKT (TDM-GCC ${{ matrix.arch }}) - name: Setup MSBuild
if: matrix.arch != 'arm64' uses: microsoft/setup-msbuild@v1
shell: pwsh
run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
mingw32-make
- name: Build UMSKT (MSVC ARM64) - name: Download UMSKT-DJGPP compiled artifact
if: matrix.arch == 'arm64' if: matrix.arch == 'Win32'
shell: pwsh uses: actions/download-artifact@v3
run: | with:
cmake --build . --config Release name: UMSKT-DOS
- name: Run tests (x86/x64) - name: List build directory contents
if: matrix.arch != 'arm64' if: matrix.arch == 'Win32'
shell: pwsh
run: | run: |
.\umskt.exe -b 2C -c 365 -s 069420 -v Get-ChildItem
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574
- name: Configure UMSKT
uses: threeal/cmake-action@v1.2.0
with:
generator: "Visual Studio 17 2022"
options: CMAKE_SYSTEM_VERSION="5.1.2600"
args: -A ${{ matrix.msbuild-arch }} -T v141_xp ${{ matrix.cmake-args }}
- name: Build UMSKT
working-directory: build
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release /P:XPDeprecationWarning=false
- name: Move executable to upload directory
run: |
mkdir build/actions_upload
Move-Item build/Release/umskt.exe build/actions_upload
- name: Upload build artifact - name: Upload build artifact
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v3.1.2
with: with:
name: UMSKT-${{ matrix.arch }} name: UMSKT-${{ matrix.arch }}
path: ${{ matrix.arch == 'arm64' && 'Release/umskt.exe' || 'umskt.exe' }} path: build/actions_upload
test-arm64: - name: Move Win32+DOS executable to upload directory
needs: build if: matrix.arch == 'Win32'
if: success()
runs-on: windows-11-arm
steps:
- name: Download ARM64 artifact
uses: actions/download-artifact@v4
with:
name: UMSKT-arm64
path: .
- name: Run tests (ARM64)
shell: pwsh
run: | run: |
.\umskt.exe -b 2C -c 365 -s 069420 -v Remove-Item "build/actions_upload" -Force -Recurse
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574 mkdir build/actions_upload
Move-Item build/Release/umskt_win32_dos.exe build/actions_upload/umskt.exe
- name: Upload build artifact
if: matrix.arch == 'Win32'
uses: actions/upload-artifact@v3.1.2
with:
name: UMSKT-Win32+DOS
path: build/actions_upload

6
.gitignore vendored
View File

@ -253,9 +253,3 @@ CMakeSettings.json
# Visual Studio # Visual Studio
.vs/ .vs/
CPM_modules
CPM_*.cmake
cpm-package-lock.cmake
*.a
*_cmrc*

View File

@ -1,10 +0,0 @@
# Stub so pre-commit can shut up until the refactor
repos:
- repo: local
hooks:
- id: no-op
name: Noop hook (always passes)
entry: "true" # `/usr/bin/true` returns 0 and does nothing
language: system
pass_filenames: false # dont bother passing any file paths

View File

@ -20,82 +20,25 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.12) CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
PROJECT(UMSKT) PROJECT(UMSKT)
# Force TDM-GCC on Windows if not using MSVC
if (WIN32 AND NOT MSVC)
set(CMAKE_C_COMPILER "C:/TDM-GCC-64/bin/gcc.exe" CACHE FILEPATH "C Compiler" FORCE)
set(CMAKE_CXX_COMPILER "C:/TDM-GCC-64/bin/g++.exe" CACHE FILEPATH "C++ Compiler" FORCE)
message(STATUS "[UMSKT] Forcing use of TDM-GCC in C:/TDM-GCC-64")
# Configure windres for resource compilation
set(CMAKE_RC_COMPILER "C:/TDM-GCC-64/bin/windres.exe")
set(CMAKE_RC_COMPILER_INIT windres)
enable_language(RC)
set(CMAKE_RC_FLAGS "--use-temp-file -c65001")
# Match resource architecture with target architecture
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -F pe-i386")
else()
set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -F pe-x86-64")
endif()
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff -I${CMAKE_CURRENT_SOURCE_DIR}/src/windows <DEFINES> -i <SOURCE> -o <OBJECT>")
# Set the Windows resource file for GCC builds
set(UMSKT_EXE_WINDOWS_EXTRA src/windows/umskt.rc)
endif()
SET(CMAKE_CXX_STANDARD 17) SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_OSX_SYSROOT "macosx" CACHE PATH "macOS SDK path") SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
OPTION(BUILD_SHARED_LIBS "Build internal libraries as dynamic" OFF)
OPTION(UMSKT_USE_SHARED_OPENSSL "Force linking against the system-wide OpenSSL library" OFF) 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(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(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) OPTION(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilation" OFF)
OPTION(WINDOWS_ARM "Enable compilation for Windows on ARM (requires appropriate toolchain)" OFF)
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS}) SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS}) SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
endif()
# neither does dos idk i'm trying random stuff
if (DJGPP_WATT32)
SET(UMSKT_USE_SHARED_OPENSSL ON)
endif()
IF(UMSKT_USE_SHARED_OPENSSL) IF(UMSKT_USE_SHARED_OPENSSL)
SET(OPENSSL_USE_STATIC_LIBS FALSE) SET(OPENSSL_USE_STATIC_LIBS FALSE)
SET(OPENSSL_MSVC_STATIC_RT FALSE) SET(OPENSSL_MSVC_STATIC_RT FALSE)
MESSAGE(STATUS "[UMSKT] Requesting dynamic version of OpenSSL") MESSAGE(WARNING "[UMSKT] Forcing shared OpenSSL runtime")
ELSE() ELSE()
SET(OPENSSL_USE_STATIC_LIBS TRUE) SET(OPENSSL_USE_STATIC_LIBS TRUE)
SET(OPENSSL_MSVC_STATIC_RT TRUE) SET(OPENSSL_MSVC_STATIC_RT TRUE)
MESSAGE(STATUS "[UMSKT] Requesting static version of OpenSSL")
ENDIF() ENDIF()
# Configure ARM-specific settings if enabled
if (WINDOWS_ARM)
if (MSVC)
# MSVC ARM64 settings
set(CMAKE_SYSTEM_PROCESSOR ARM64)
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE ARM64)
else()
# MinGW/GCC ARM settings
set(CMAKE_SYSTEM_PROCESSOR arm)
if (CMAKE_CROSSCOMPILING)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a")
endif()
endif()
message(STATUS "[UMSKT] Configuring for Windows on ARM")
endif()
IF(DJGPP_WATT32) IF(DJGPP_WATT32)
SET(CMAKE_SYSTEM_NAME MSDOS) SET(CMAKE_SYSTEM_NAME MSDOS)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
@ -104,17 +47,25 @@ IF(DJGPP_WATT32)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32}) SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32})
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS} ${WATT_ROOT}/lib) SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS} ${WATT_ROOT}/lib)
# Maximum compatibility flags for DOS/NTVDM
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i386 -mtune=i386 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -mno-ssse3 -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-fma -mno-fma4")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i386 -mtune=i386 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -mno-ssse3 -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-fma -mno-fma4")
MESSAGE(STATUS "[UMSKT] Using i386 target for DOS DGJPP")
ENDIF() ENDIF()
##if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # find the system installed OpenSSL development library
## SET(BUILD_SHARED_LIBS ON) FIND_PACKAGE(OpenSSL REQUIRED)
## MESSAGE(STATUS "[UMSKT] macOS has no static library - Shared library forced on") IF(NOT OPENSSL_FOUND)
##endif() 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 we're compiling with MSVC, respect the DEBUG compile option # if we're compiling with MSVC, respect the DEBUG compile option
IF(MSVC) IF(MSVC)
@ -134,9 +85,6 @@ ENDIF()
IF(MUSL_STATIC) IF(MUSL_STATIC)
MESSAGE(STATUS "[UMSKT] Performing a fully static build using muslc") MESSAGE(STATUS "[UMSKT] Performing a fully static build using muslc")
SET(BUILD_SHARED_LIBS OFF)
SET(OPENSSL_USE_STATIC_LIBS TRUE)
SET(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++") SET(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
SET(CMAKE_SHARED_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_FIND_LIBRARY_SUFFIXES ".a")
@ -144,46 +92,6 @@ IF(MUSL_STATIC)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
ENDIF() 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(NOT MUSL_STATIC)
# if we found shared libraries - do the following:
IF (OPENSSL_USE_STATIC_LIBS)
MESSAGE(STATUS "[UMSKT] requested static version of OpenSSL")
if (NOT UMSKT_USE_SHARED_OPENSSL)
MESSAGE(STATUS "[UMSKT] not asked for shared version of OpenSSL")
ENDIF()
IF(MSVC)
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} "ws2_32.lib")
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} "crypt32.lib")
MESSAGE(STATUS "[UMSKT] msvc adding ws2_32.lib crypt32.lib")
ENDIF()
ENDIF()
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")
ELSE()
MESSAGE(STATUS "[UMSKT] Detected Static Library version of OpenSSL")
# static libcrypto on Fedora needs -lz at link time
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
FIND_PACKAGE(ZLIB REQUIRED)
IF (NOT ZLIB_FOUND)
MESSAGE(FATAL_ERROR "[UMSKT] linux static OpenSSL requires zlib")
ENDIF()
ENDIF()
ENDIF()
ENDIF()
# initalize cpm.CMake # initalize cpm.CMake
INCLUDE(cmake/CPM.cmake) INCLUDE(cmake/CPM.cmake)
@ -201,7 +109,6 @@ CPMAddPackage(
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
#OPTIONS "FMT_INSTALL YES" "BUILD_SHARED_LIBS OFF"
) )
# Include cmrc resource compiler # Include cmrc resource compiler
@ -238,34 +145,38 @@ SET(LIBUMSKT_SRC src/libumskt/libumskt.cpp src/libumskt/pidgen3/BINK1998.cpp src
IF (EMSCRIPTEN) IF (EMSCRIPTEN)
ADD_EXECUTABLE(umskt ${LIBUMSKT_SRC}) ADD_EXECUTABLE(umskt ${LIBUMSKT_SRC})
TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR}) TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(umskt -static OpenSSL::Crypto cryptopp::cryptopp fmt) TARGET_LINK_LIBRARIES(umskt -static OpenSSL::Crypto fmt)
SET(CMAKE_EXECUTABLE_SUFFIX ".html") SET(CMAKE_EXECUTABLE_SUFFIX ".html")
SET_TARGET_PROPERTIES(umskt PROPERTIES COMPILE_FLAGS "-Os -sEXPORTED_RUNTIME_METHODS=ccall,cwrap") SET_TARGET_PROPERTIES(umskt PROPERTIES COMPILE_FLAGS "-Os -sEXPORTED_RUNTIME_METHODS=ccall,cwrap")
SET_TARGET_PROPERTIES(umskt PROPERTIES LINK_FLAGS "-Os -sWASM=1 -sEXPORT_ALL=1 -sEXPORTED_RUNTIME_METHODS=ccall,cwrap --no-entry") SET_TARGET_PROPERTIES(umskt PROPERTIES LINK_FLAGS "-Os -sWASM=1 -sEXPORT_ALL=1 -sEXPORTED_RUNTIME_METHODS=ccall,cwrap --no-entry")
ELSE() ELSE()
ADD_LIBRARY(_umskt ${LIBUMSKT_SRC} ${UMSKT_EXE_WINDOWS_EXTRA} ${UMSKT_EXE_WINDOWS_DLL}) IF(NOT UMSKT_USE_SHARED_OPENSSL)
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR}) ### Static library compilation
TARGET_LINK_DIRECTORIES(_umskt PUBLIC ${UMSKT_LINK_DIRS}) ADD_LIBRARY(_umskt STATIC ${LIBUMSKT_SRC})
TARGET_LINK_LIBRARIES(_umskt ${OPENSSL_CRYPTO_LIBRARIES} fmt ${UMSKT_LINK_LIBS}) 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 ### 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_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(umskt _umskt ${OPENSSL_CRYPTO_LIBRARIES} ${ZLIB_LIBRARIES} fmt nlohmann_json::nlohmann_json umskt::rc ${UMSKT_LINK_LIBS}) 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}) TARGET_LINK_DIRECTORIES(umskt PUBLIC ${UMSKT_LINK_DIRS})
# Link required Windows system libraries for OpenSSL ### UMSKT with specified DOS Stub compilation
if (WIN32)
target_link_libraries(umskt crypt32 ws2_32)
endif()
IF(MSVC AND MSVC_MSDOS_STUB) IF(MSVC AND MSVC_MSDOS_STUB)
SET_PROPERTY(TARGET umskt APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB}) ADD_EXECUTABLE(umskt_win32_dos src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
ENDIF() TARGET_INCLUDE_DIRECTORIES(umskt_win32_dos PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(umskt_win32_dos _umskt OpenSSL::Crypto fmt nlohmann_json::nlohmann_json umskt::rc ${UMSKT_LINK_LIBS})
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux") TARGET_LINK_DIRECTORIES(umskt_win32_dos PUBLIC ${UMSKT_LINK_DIRS})
install(TARGETS umskt DESTINATION bin) SET_PROPERTY(TARGET umskt_win32_dos APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB})
ENDIF() ENDIF()
### Copy Shared Libraries and dependency files ### Copy Shared Libraries and dependency files

View File

@ -54,16 +54,9 @@ WORKDIR /tmp
# Stage 2: compile djgpp for muslc # Stage 2: compile djgpp for muslc
ENV DJGPP_PREFIX=/djgpp BUILD_VER=12.2.0-i386 ENV DJGPP_PREFIX=/djgpp BUILD_VER=12.2.0-i386
RUN git clone https://github.com/andrewwutw/build-djgpp.git djgpp \ RUN git clone https://github.com/UMSKT/build-djgpp.git djgpp \
&& cd djgpp \ && cd djgpp \
&& cd script \ && chmod +x script/$BUILD_VER \
&& wget https://gist.github.com/Neo-Desktop/4cfd708f61f5847a7bf457d38db3b59f/raw/25d24cf509b0fc486d5d18ecb6656f120c3d0e51/12.2.0-i386 -O 12.2.0-i386 \
&& chmod +x 12.2.0-i386 \
&& cd ../patch \
&& wget https://gist.github.com/Neo-Desktop/4cfd708f61f5847a7bf457d38db3b59f/raw/25d24cf509b0fc486d5d18ecb6656f120c3d0e51/patch-alpine-Fix-attempt-to-use-poisoned-calloc-error-in-libgccji.patch -O patch-alpine-Fix-attempt-to-use-poisoned-calloc-error-in-libgccji.patch \
&& cd .. \
&& sed -i 's/i586/i386/g' setenv/setenv \
&& sed -i 's/i586/i386/g' setenv/setenv.bat \
&& ./build-djgpp.sh $BUILD_VER \ && ./build-djgpp.sh $BUILD_VER \
&& rm -rf /tmp/djgpp && rm -rf /tmp/djgpp
@ -72,15 +65,12 @@ FROM djgpp as watt32
WORKDIR /djgpp WORKDIR /djgpp
ENV WATT_ROOT=/djgpp/watt32 DJGPP_PREFIX=i386-pc-msdosdjgpp ENV WATT_ROOT=/djgpp/watt32 DJGPP_PREFIX=i386-pc-msdosdjgpp
SHELL ["/bin/bash", "-c"] SHELL ["/bin/bash", "-c"]
RUN git clone https://github.com/gvanem/Watt-32.git watt32 \ RUN git clone https://github.com/UMSKT/Watt-32.git watt32 \
&& cd watt32/util \ && cd watt32/util \
&& make clean && make linux \ && make clean && make linux \
&& cd ../src \ && cd ../src \
&& source /djgpp/setenv \ && source /djgpp/setenv \
&& ./configur.sh djgpp \ && ./configur.sh djgpp \
&& sed -i 's/i586/i386/g' djgpp.mak \
&& wget https://gist.github.com/Neo-Desktop/ad26e888d64b22a59c743ab4e21ac186/raw/c9a73e1eb75ba8857883ac5c08691d2fe5b82594/djgpp.err -O ../inc/sys/djgpp.err \
&& wget https://gist.github.com/Neo-Desktop/ad26e888d64b22a59c743ab4e21ac186/raw/c9a73e1eb75ba8857883ac5c08691d2fe5b82594/syserr.c -O build/djgpp/syserr.c \
&& make -f djgpp.mak \ && make -f djgpp.mak \
&& ln -s /djgpp/watt32/lib/libwatt.a /djgpp/lib && ln -s /djgpp/watt32/lib/libwatt.a /djgpp/lib
@ -88,12 +78,9 @@ RUN git clone https://github.com/gvanem/Watt-32.git watt32 \
FROM watt32 as openssl FROM watt32 as openssl
WORKDIR /tmp WORKDIR /tmp
SHELL ["/bin/bash", "-c"] SHELL ["/bin/bash", "-c"]
RUN git clone https://github.com/openssl/openssl.git openssl \ RUN git clone https://github.com/umskt/openssl.git openssl \
&& cd openssl \ && cd openssl \
&& git checkout openssl-3.1.1 \
&& source /djgpp/setenv \ && source /djgpp/setenv \
&& wget https://gist.github.com/Neo-Desktop/ad26e888d64b22a59c743ab4e21ac186/raw/c9a73e1eb75ba8857883ac5c08691d2fe5b82594/50-djgpp.conf.patch -O Configurations/50-djgpp.conf.patch \
&& git apply Configurations/50-djgpp.conf.patch \
&& ./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=/djgpp DJGPP \ && ./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=/djgpp DJGPP \
&& make && make install && make && make install

View File

@ -78,6 +78,7 @@ RUN C:\BuildTools\Common7\Tools\VsDevCmd.bat && `
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8.1 as output FROM mcr.microsoft.com/dotnet/framework/runtime:4.8.1 as output
COPY --from=Build32 C:\umskt\build\Release\umskt.exe C:\umskt\umskt.exe COPY --from=Build32 C:\umskt\build\Release\umskt.exe C:\umskt\umskt.exe
COPY --from=Build32 C:\umskt\build\Release\umskt_win32_dos.exe C:\umskt\umskt_win32_dos.exe
COPY --from=Build64 C:\umskt\build\Release\umskt.exe C:\umskt\umskt64.exe COPY --from=Build64 C:\umskt\build\Release\umskt.exe C:\umskt\umskt64.exe
#invoke via #invoke via

View File

@ -1,30 +1,17 @@
# Universal MS Key Toolkit (UMSKT) # **Universal MS Key Toolkit (UMSKT)**
**Connect with us**
[![Zulip chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://umskt.zulipchat.com) [![Zulip chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://umskt.zulipchat.com)
[![libera.chat - #mspid](https://img.shields.io/badge/libera.chat-%23mspid-brightgreen)](https://web.libera.chat/gamja/?nick=Guest?#mspid) [![libera.chat - #mspid](https://img.shields.io/badge/libera.chat-%23mspid-brightgreen)](https://web.libera.chat/gamja/?nick=Guest?#mspid)
[![Discord](https://dcbadge.vercel.app/api/server/cUZxfNNSdt?style=flat)](https://discord.gg/PpBSpuphWM) [![C/C++ CI (Linux)](https://github.com/UMSKT/UMSKT/actions/workflows/linux.yml/badge.svg)](../../actions/workflows/linux.yml)
**Build status**
[![C/C++ CI (Windows)](https://github.com/UMSKT/UMSKT/actions/workflows/windows.yml/badge.svg)](../../actions/workflows/windows.yml) [![C/C++ CI (Windows)](https://github.com/UMSKT/UMSKT/actions/workflows/windows.yml/badge.svg)](../../actions/workflows/windows.yml)
[![C/C++ CI (macOS)](https://github.com/UMSKT/UMSKT/actions/workflows/macos.yml/badge.svg)](../../actions/workflows/macos.yml)
[![C/C++ CI (Linux)](https://github.com/UMSKT/UMSKT/actions/workflows/linux.yml/badge.svg)](../../actions/workflows/linux.yml) ### **Plan of Action / ToDo List**
[![C/C++ CI (FreeBSD)](https://github.com/UMSKT/UMSKT/actions/workflows/freebsd.yml/badge.svg)](../../actions/workflows/freebsd.yml)
[![C/C++ CI (DOS DJGPP)](https://github.com/UMSKT/UMSKT/actions/workflows/dos-djgpp.yml/badge.svg)](../../actions/workflows/dos-djgpp.yml)
------
### Plan of Action / ToDo List
In light of the recent exponential interest in this project I've decided to put updates of this project here: In light of the recent exponential interest in this project I've decided to put updates of this project here:
[Please see ticket #8 for more information](https://github.com/UMSKT/UMSKT/issues/8) * [Please see ticket #8 for more information](../../issues/8)
------ ------
@ -42,33 +29,27 @@ In light of the recent exponential interest in this project I've decided to put
* It all comes down to four simple steps: * It all comes down to four simple steps:
------
### **Usage** ### **Usage**
#### 1. Download the latest version of UMSKT #### 1. Download the latest version of WindowsXPKg
* *(GitHub account required)* * *(GitHub account required)*
* Download the latest experimental version using the Actions tab ([Windows](../../actions/workflows/windows.yml?query=branch%3Amaster+is%3Asuccess), [Linux](../../actions/workflows/linux.yml?query=branch%3Amaster+is%3Asuccess), [macOS](../../actions/workflows/macos.yml?query=branch%3Amaster+is%3Asuccess), [FreeBSD](../../actions/workflows/freebsd.yml?query=branch%3Amaster+is%3Asuccess), [DOS DJGPP](../../actions/workflows/dos-djgpp.yml?query=branch%3Amaster+is%3Asuccess)) * Download the latest experimental version using the Actions tab ([Windows](../../actions/workflows/windows.yml?query=branch%3Amaster), [Linux](../../actions/workflows/linux.yml?query=branch%3Amaster)).
* *(GitHub account \*not\* required)* * *(GitHub account \*not\* required)*
* Download the latest release for your operating system and architecture from [the releases page](../../releases) * Download the latest release for your operating system and architecture from [the releases page](../../releases)
* **Note:** Before continuing, please ensure you have the `umskt` executable extracted and on UNIX-like systems, have execution permissions (`chmod +x umskt`).
#### 2. Install OpenSSL. * **Note:** Before continuing, please ensure you have both the `xpkey` program and the `keys.json` datum extracted and in the same directory
For Windows, click [here](https://slproweb.com/products/Win32OpenSSL.html) and choose the right version. For other operating systems, consult your package manager.
*Note: This only applies if the build you download has OpenSSL embedded (static library) or not. You can usually tell if the download size is measured in KB or MB. If it's MB, you don't need this.*
#### 3. Run `umskt` to generate a key, or add `--help` or `-h` to see more options. #### 2. Run `xpkey` to generate a key, or add `--help` to see more options.
*Note: on macOS, like all unsigned executables, you'll need to hold Ctrl while right clicking and selecting Open to actually open it.*
#### 4. *(Activation step for `Retail` and `OEM` only)* #### 3. *(Activation step for `Retail` and `OEM` only)*
* After installation, you will be prompted to activate Windows. * After installation, you will be prompted to activate Windows.
* Select the **telephone activation** method, then, run `umskt -i <Installation ID>` using the `Installation ID` the activation Wizard provides for you * Select the **telephone activation** method, then, run `xpkey -i <Installation ID>` using the `Installation ID` the activation Wizard provides for you
* If you're activating a non-Windows product, use `umskt -i <Installation ID> -m <Product>`, where `<Product>` is one of `OFFICEXP`, `OFFICE2K3`, `OFFICE2K7`, or `PLUSDME`
* If activating Office 2003/2007, use `umskt -i <Installation ID> -m <Product> -p <Product ID>`
#### 4. Profit! #### 4. Profit!
@ -80,16 +61,15 @@ For Windows, click [here](https://slproweb.com/products/Win32OpenSSL.html) and c
The list of people who have helped to bring the XP generation to where it is now: The list of people who have helped to bring the XP generation to where it is now:
* z22 * z22
* MSKey * MSKey
* sk00ter
* diamondggg * diamondggg
* pottzman * pottzman
* david4599
* Endermanch * Endermanch
* Neo-Desktop * Neo-Desktop
* WitherOrNot * WitherOrNot
* TheTank20 * TheTank20
* InvoxiPlayGames * InvoxiPlayGames
* brakmic * brakmic
* techguy16
(the list will be updated to add more collaborators) (the list will be updated to add more collaborators)
@ -97,26 +77,20 @@ The list of people who have helped to bring the XP generation to where it is now
### **Development Requirements:** ### **Development Requirements:**
* `build-essential` * `CMake, make, gcc` (`build-essential`)
* `cmake`
* `make`
* `gcc`
* `g++`
* `git` * `git`
#### Build Steps: #### Build Steps:
1. `git clone https://github.com/UMSKT/UMSKT` 1. `git clone`
2. `cd UMSKT/build` 2. `cd build/ && cmake ../ && make`
3. `cmake ..`
4. `make`
----- -----
### **Known Ports** ### **Known Ports**
| Language | Author | Repo URL | | Language | Author | Repo URL |
|----------|-----------|-----------------------------------------------------------| |----------|-----------|-------------------------------------------------------|
| Rust | Alex Page | [anpage/umskt-rs](https://github.com/anpage/umskt-rs) | | Rust | Alex Page | [anpage/umskt-rs](https://github.com/anpage/umskt-rs) |
| Python | techguy16 | [techguy16/umsktpy](https://github.com/techguy16/umsktpy) |

109
keys.json
View File

@ -33,9 +33,6 @@
"Commerce Server 2002": { "Commerce Server 2002": {
"BINK": ["0E", "0F"] "BINK": ["0E", "0F"]
}, },
"Passport Manager": {
"BINK": ["10"]
},
"Windows 2000 Professional": { "Windows 2000 Professional": {
"BINK": ["12", "13"] "BINK": ["12", "13"]
}, },
@ -48,9 +45,6 @@
"Office XP Applications": { "Office XP Applications": {
"BINK": ["20", "21"] "BINK": ["20", "21"]
}, },
"Works Suite 2003 and 2004": {
"BINK": ["20", "21"]
},
"Office XP": { "Office XP": {
"BINK": ["22", "23"] "BINK": ["22", "23"]
}, },
@ -123,27 +117,18 @@
"Office 2003 Small Business": { "Office 2003 Small Business": {
"BINK": ["70", "71"] "BINK": ["70", "71"]
}, },
"Office 2003 Student and Teacher": {
"BINK": ["70", "71"]
},
"Office 2003 Professional": { "Office 2003 Professional": {
"BINK": ["72", "73"] "BINK": ["72", "73"]
}, },
"Windows Longhorn (6.0.4039.0 -> Pre PIDGENX)": { "Windows Longhorn (6.0.4039.0 -> Pre PIDGENX)": {
"BINK": ["74", "75"] "BINK": ["74", "75"]
}, },
"Expression Web 2007 / Sharepoint Server 2007": {
"BINK": ["76", "77"]
},
"Identity Lifecycle Manager 2007": { "Identity Lifecycle Manager 2007": {
"BINK": ["78", "79"] "BINK": ["78", "79"]
}, },
"Visual Studio 2008": { "Visual Studio 2008": {
"BINK": ["78", "79"] "BINK": ["78", "79"]
}, },
"Sharepoint Designer 2007": {
"BINK": ["7C", "7D"]
},
"Office 2007 Applications": { "Office 2007 Applications": {
"BINK": ["7E", "7F"] "BINK": ["7E", "7F"]
}, },
@ -153,9 +138,6 @@
"Office 2007 Standard / Professional / Ultimate / Enterprise": { "Office 2007 Standard / Professional / Ultimate / Enterprise": {
"BINK": ["82", "83"] "BINK": ["82", "83"]
}, },
"Office 2007 Hybrid": {
"BINK": ["84", "85"]
},
"Office 2007 Home & Student": { "Office 2007 Home & Student": {
"BINK": ["88", "89"] "BINK": ["88", "89"]
} }
@ -330,15 +312,15 @@
"a": "1", "a": "1",
"b": "0", "b": "0",
"g": { "g": {
"x": "2424861453756882196229359499252409442096928108454123044238107428456451053748664006504056679987776648547354283230029", "x": "17272533675023793624680016937607161394427776688401278127884215858369066406365237833207419170117031265147050748737186",
"y": "7324425970176151969116486392910180591819760394015255323965851504893617199075285355320677185484219270306349221725496" "y": "10897684556651576571671151674586120690608236542740270859915076272932083320838022698730208293779451126638581586588925"
}, },
"n": "42173753096150573", "n": "44682719955829289",
"p": "23576896825148261563986794905854575022252138407149635186332207102431578828005131860154350053063599250972940889198609", "p": "31123778862031392435299439090755153401162704597024288571183830527113563344679315725116915983118187065183839828632113",
"priv": "21644128200478272", "priv": "30177475288172038",
"pub": { "pub": {
"x": "22559965909720054111451558679234685221190121968477792217083519033370405738218408301652020048970098652944061723131120", "x": "10584120526089473026246191383792758367144927589909587205278073830223938861208553884400816982485323081066790399437204",
"y": "4867649293914467066273247931825593002116583959412689222356329515920397531410942846741846700237094219959206105155903" "y": "19710761542152200618172612283139324015316083022563473705358032993141026289202915973780473937312193485361804450068338"
} }
}, },
"0C": { "0C": {
@ -401,21 +383,6 @@
"y": "12300711937755714474221683340048792628817501853269187222732097530965245794898485391792926982501341822327927281168157" "y": "12300711937755714474221683340048792628817501853269187222732097530965245794898485391792926982501341822327927281168157"
} }
}, },
"10": {
"a": "1",
"b": "0",
"g": {
"x": "18651628392962497698304079461858800038021595035623099589626558411789423821835513779530629747878048328422716050099296",
"y": "28457790016119433859033076174489680371110176047623886251847351799861435189214769185332948508935608870611015909181946"
},
"n": "63517138149940081",
"p": "34850883414891516310048088524473091032039735302322749072119923383901524249650054933039485488287948424536010614809529",
"priv": "42074657350570560",
"pub": {
"x": "14897248889444524585539298515527812307525445072093905045143283125792133561464628729391995919418984547359131800953862",
"y": "30590224388131521072842776697623219502924625149179219913459005347798492666726177600440842678766281012690402321113086"
}
},
"12": { "12": {
"a": "1", "a": "1",
"b": "0", "b": "0",
@ -806,66 +773,6 @@
"y": "4166331361209663080277908775030002767045551689443380649904104094047767422069625957190676222747168197864341871814070164924686453916110248521040648287862677" "y": "4166331361209663080277908775030002767045551689443380649904104094047767422069625957190676222747168197864341871814070164924686453916110248521040648287862677"
} }
}, },
"42": {
"a": "1",
"b": "0",
"g": {
"x": "11640071446359917693418230277272135573556102510768548148030840368465631925066661215750608051818744662399431859372010847799326485284550650513243041633181229",
"y": "1117219266737324272317290420713713230170128897725948728570838742460014554810962916878884036620621200355133560155042440959180864818213121429155138181344653"
},
"n": "5280334341756112909",
"p": "12942978066077029419384467090650680778545791198987839112733218154226202456650854446314697588718267646821306053679758777877942489272278682133825653213117273",
"priv": "1465309884720242143",
"pub": {
"x": "9351207863776380035890122409035060669425884047354848374635961783863142135448736359201437768670165682794001791952363648653230539557613342151297569318010149",
"y": "9639173047661422234418044696501057599355311018715184869788900265449733286127996011980477454425481367874466175535746037008129571512803245134460273061854442"
}
},
"43": {
"a": "1",
"b": "0",
"g": {
"x": "2834486376491690368456603825217677225471198398912779448345352642108764638231378782668499190157872740666167080466219457629252550710819781972327332131965258",
"y": "4797700757852014957418479446842892711716196864495788466729606301384034376631555735482572108714361434720650684534546885209233659101211883665277770145423350"
},
"n": "5523679238757269761",
"p": "6926191998299775557228051679990184107308003134668712746978570129316018332430570191924825301565850815568703875111335260944754577838427804555602564950786897",
"priv": "2809607843179400714",
"pub": {
"x": "5801087961280458909792080253947945286111446355062440146334723296822174085898835796467483513249817617372724731293482946799424523234786103045200852470225011",
"y": "1919606609989436277853545800995092035920586757555046809012910563836843544210421704301817498648513315478648381017523132165198480986231348796390852153074721"
}
},
"44": {
"a": "1",
"b": "0",
"g": {
"x": "9680658238923578678202657184293847763076151678383489086861167893944370179297511555508861816858010248459991161671607410772896973557285105910275482332653112",
"y": "38902477949345497450784597636513692713869581728781957101503157321110858542746905996206655102425053611084383171688496202957335182347019199622239575131319"
},
"n": "4714695763604443541",
"p": "10060218540908435736634173235406368357048589196592148828376201588591059234309957485052136941552686476146780926855972646273339825261674895471491324476121697",
"priv": "952494568445020851",
"pub": {
"x": "7809435572353033432542259944225681069776007713441000282689259450883474252378043956762041876078756182695744718782433033396721679522564745671507681698680124",
"y": "2120018000497598938986702274873490939171797105426386828711756267078880551570146718754825759969119264518218486103010877173921337418786732248062865348045969"
}
},
"45": {
"a": "1",
"b": "0",
"g": {
"x": "1415506028429814835609318901328901279725664469601609961018689628962980229383879276982285895935656882715108992785111554965336919510937749428526698965204901",
"y": "6142658768171534784725381543698447822724946469773052050322995135930968261406067031627504011235735426349765719550450476207341330596203075437382377459404055"
},
"n": "4705733954672224129",
"p": "8420779903875279756603065163346889837055414440294897668354571673595315405287353764209959201404596284932170027888535337670888642377481800445761115380269649",
"priv": "1845297747391977061",
"pub": {
"x": "5979408142886940137052651399684513359780629840102111793966097396623272737697258705143841606573133958717430112526043253582151662435203695216093728339267096",
"y": "3518591391911442753664238113448734968964864723243113225953452544472418473210828150121884867152997802156077007186900916060906287620287437578440526157889485"
}
},
"50": { "50": {
"a": "1", "a": "1",
"b": "0", "b": "0",
@ -1618,7 +1525,7 @@
} }
}, },
"Activation": { "Activation": {
"Windows XP": { "Windowws XP": {
"p": "102011604035381881", "p": "102011604035381881",
"x": { "x": {
"0": "0", "0": "0",

View File

@ -22,15 +22,6 @@
#include "cli.h" #include "cli.h"
CLI::~CLI()
{
EC_GROUP_free(eCurve);
EC_POINT_free(genPoint);
EC_POINT_free(pubPoint);
BN_free(privateKey);
BN_free(genOrder);
}
bool CLI::loadJSON(const fs::path& filename, json *output) { bool CLI::loadJSON(const fs::path& filename, json *output) {
if (!filename.empty() && !fs::exists(filename)) { if (!filename.empty() && !fs::exists(filename)) {
fmt::print("ERROR: File {} does not exist\n", filename.string()); fmt::print("ERROR: File {} does not exist\n", filename.string());
@ -62,17 +53,11 @@ 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-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("\t-o --override\tDisables version check for confirmation IDs, if you need this send an issue on GitHub\n");
fmt::print("\t-D --nodashes\tDisables dashes in product keys and confirmation IDs (for easier copy-pasting)");
fmt::print("\n"); fmt::print("\n");
} }
@ -83,7 +68,6 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
"", "",
"", "",
"", "",
"",
640, 640,
0, 0,
1, 1,
@ -92,16 +76,12 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
false, false,
false, false,
false, false,
false, MODE_BINK1998_GENERATE
false,
false,
false,
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);
@ -157,8 +137,6 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
options->serial = serial_val; options->serial = serial_val;
} }
i++; i++;
} else if (arg == "-u" || arg == "--upgrade") {
options->upgrade = true;
} else if (arg == "-f" || arg == "--file") { } else if (arg == "-f" || arg == "--file") {
if (i == argc - 1) { if (i == argc - 1) {
options->error = true; options->error = true;
@ -176,32 +154,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") {
if (i == argc -1) {
options->error = true;
break;
}
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;
@ -211,23 +163,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 if (arg == "-o" || arg == "--override") {
options->overrideVersion = true;
} else if (arg == "-D" || arg == "--nodashes") {
options->nodashes = 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.empty() || options->instid.empty()) ) {
return options->error = true;
}
return !options->error; return !options->error;
} }
@ -276,12 +216,6 @@ int CLI::validateCommandLine(Options* options, char *argv[], json *keys) {
int intBinkID; int intBinkID;
sscanf(options->binkid.c_str(), "%x", &intBinkID); sscanf(options->binkid.c_str(), "%x", &intBinkID);
// FE and FF are BINK 1998, but do not generate valid keys, so we throw an error
if (intBinkID >= 0xFE) {
fmt::print("ERROR: Terminal Services BINKs (FE and FF) are unsupported at this time\n");
return 1;
}
if (intBinkID >= 0x40) { if (intBinkID >= 0x40) {
// set bink2002 validate mode if in bink1998 validate mode, else set bink2002 generate mode // set bink2002 validate mode if in bink1998 validate mode, else set bink2002 generate mode
options->applicationMode = (options->applicationMode == MODE_BINK1998_VALIDATE) ? MODE_BINK2002_VALIDATE : MODE_BINK2002_GENERATE; options->applicationMode = (options->applicationMode == MODE_BINK1998_VALIDATE) ? MODE_BINK2002_VALIDATE : MODE_BINK2002_GENERATE;
@ -307,7 +241,7 @@ void CLI::printID(DWORD *pid) {
int i, digit = 0; int i, digit = 0;
// Convert PID to ascii-number (=raw) // Convert PID to ascii-number (=raw)
snprintf(raw, sizeof(raw), "%09u", pid[0]); sprintf(raw, "%09u", pid[0]);
// Make b-part {640-....} // Make b-part {640-....}
strncpy(b, raw, 3); strncpy(b, raw, 3);
@ -331,14 +265,9 @@ void CLI::printID(DWORD *pid) {
void CLI::printKey(char *pk) { void CLI::printKey(char *pk) {
assert(strlen(pk) >= PK_LENGTH); assert(strlen(pk) >= PK_LENGTH);
std::string keyFormat = "{}-{}-{}-{}-{}";
if (this->options.nodashes == true) {
keyFormat = "{}{}{}{}{}";
}
std::string spk = pk; std::string spk = pk;
fmt::print(keyFormat, fmt::print("{}-{}-{}-{}-{}",
spk.substr(0,5), spk.substr(0,5),
spk.substr(5,5), spk.substr(5,5),
spk.substr(10,5), spk.substr(10,5),
@ -432,14 +361,13 @@ int CLI::BINK1998Generate() {
} else { } else {
// generate a random number to use as a serial // generate a random number to use as a serial
BIGNUM *bnrand = BN_new(); BIGNUM *bnrand = BN_new();
UMSKT::umskt_bn_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); BN_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
int oRaw; int oRaw;
char *cRaw = BN_bn2dec(bnrand); char *cRaw = BN_bn2dec(bnrand);
sscanf(cRaw, "%d", &oRaw); sscanf(cRaw, "%d", &oRaw);
nRaw += (oRaw % 999999); // ensure our serial is less than 999999 nRaw += (oRaw % 999999); // ensure our serial is less than 999999
BN_free(bnrand);
} }
if (this->options.verbose) { if (this->options.verbose) {
@ -451,8 +379,11 @@ 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;
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) {
@ -477,9 +408,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;
} }
@ -493,28 +425,30 @@ int CLI::BINK2002Generate() {
// generate a key // generate a key
for (int i = 0; i < this->total; i++) { for (int i = 0; i < this->total; i++) {
DWORD pAuthInfo; DWORD pAuthInfo;
UMSKT::umskt_rand_bytes((BYTE *)&pAuthInfo, 4); RAND_bytes((BYTE *)&pAuthInfo, 4);
pAuthInfo &= BITMASK(10); pAuthInfo &= BITMASK(10);
if (this->options.verbose) { if (this->options.verbose) {
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); PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, false, this->pKey);
CLI::printKey(this->pKey);
fmt::print("\n");
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) {
CLI::printKey(this->pKey); CLI::printKey(this->pKey);
if (i < this->total - 1 || this->options.verbose) { // check if end of list or verbose if (i < this->total - 1 || this->options.verbose) {
fmt::print("\n"); fmt::print("\n");
} }
this->count += isValid; // add to count this->count += isValid;
} }
else { else {
if (this->options.verbose) { if (this->options.verbose) {
CLI::printKey(this->pKey); // print the key CLI::printKey(this->pKey);
fmt::print(" [Invalid]"); // and add " [Invalid]" to the key fmt::print(" [Invalid]");
if (i < this->total - 1) { // check if end of list if (i < this->total - 1) {
fmt::print("\n"); fmt::print("\n");
} }
} }
@ -525,9 +459,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;
} }
@ -572,7 +506,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, options.overrideVersion); int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id);
switch (err) { switch (err) {
case ERR_TOO_SHORT: case ERR_TOO_SHORT:
@ -600,20 +534,10 @@ int CLI::ConfirmationID() {
return 1; return 1;
case SUCCESS: case SUCCESS:
if (this->options.nodashes == true) { fmt::print(confirmation_id);
int j = 0; #ifndef _WIN32
for (int i = 0; confirmation_id[i] != '\0'; ++i) { fmt::print("\n");
if (confirmation_id[i] != '-') { #endif
confirmation_id[j++] = confirmation_id[i];
}
}
confirmation_id[j] = '\0';
}
fmt::print(confirmation_id);
if (this->options.nonewlines == false) {
fmt::print("\n");
}
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,22 +49,16 @@ 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;
bool upgrade;
bool serialSet; bool serialSet;
bool verbose; bool verbose;
bool help; bool help;
bool error; bool error;
bool list; bool list;
bool nonewlines;
bool overrideVersion;
bool nodashes;
MODE applicationMode; MODE applicationMode;
ACTIVATION_ALGORITHM activationMode;
}; };
class CLI { class CLI {
@ -87,14 +73,13 @@ class CLI {
public: public:
CLI(Options options, json keys); CLI(Options options, json keys);
~CLI();
static bool loadJSON(const fs::path& filename, json *output); static bool loadJSON(const fs::path& filename, json *output);
static void showHelp(char *argv[]); static void showHelp(char *argv[]);
static int parseCommandLine(int argc, char* argv[], Options *options); static int parseCommandLine(int argc, char* argv[], Options *options);
static int validateCommandLine(Options* options, char *argv[], json *keys); static int validateCommandLine(Options* options, char *argv[], json *keys);
static void printID(DWORD *pid); static void printID(DWORD *pid);
void printKey(char *pk); static void printKey(char *pk);
static bool stripKey(const char *in_key, char out_key[PK_LENGTH]); static bool stripKey(const char *in_key, char out_key[PK_LENGTH]);
int BINK1998Generate(); int BINK1998Generate();

View File

@ -29,26 +29,9 @@
#include "confid.h" #include "confid.h"
#if defined(_MSC_VER) #define MOD 0x16A6B036D7F2A79ULL
#include <intrin.h> #define NON_RESIDUE 43
#endif static const QWORD f[6] = {0, 0x21840136C85381ULL, 0x44197B83892AD0ULL, 0x1400606322B3B04ULL, 0x1400606322B3B04ULL, 1};
QWORD MOD = 0;
QWORD NON_RESIDUE = 0;
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
int productID[4];
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)
{ {
@ -79,12 +62,6 @@ inline QWORD ConfirmationID::__umul128(QWORD a, QWORD b, QWORD* hi)
#else #else
#define __umul128 _umul128 #define __umul128 _umul128
#endif #endif
#elif defined(_M_ARM64) // Microsoft implementation of ARM64
inline QWORD ConfirmationID::__umul128(QWORD a, QWORD b, QWORD* hi)
{
*hi = __umulh(a, b);
return a * b;
}
#elif defined(__i386__) || defined(_M_IX86) || defined(__arm__) || defined(__EMSCRIPTEN__) #elif defined(__i386__) || defined(_M_IX86) || defined(__arm__) || defined(__EMSCRIPTEN__)
inline QWORD ConfirmationID::__umul128(QWORD multiplier, QWORD multiplicand, QWORD *product_hi) { inline QWORD ConfirmationID::__umul128(QWORD multiplier, QWORD multiplicand, QWORD *product_hi) {
// multiplier = ab = a * 2^32 + b // multiplier = ab = a * 2^32 + b
@ -118,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);
@ -689,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];
@ -712,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)];
@ -752,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)];
@ -783,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, bool overrideVersion) 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;
@ -862,25 +714,9 @@ 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 && overrideVersion == false) if (installation_id[18] >= 0x10)
return ERR_UNKNOWN_VERSION; return ERR_UNKNOWN_VERSION;
#pragma pack(push, 1) #pragma pack(push, 1)
@ -891,71 +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;
productID[0] = parsed.ProductIDLow & ((1 << 17) - 1); unsigned productId4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
productID[1] = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1); if (version != (totalCount == 41 ? 4 : 5))
productID[2] = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1); return ERR_UNKNOWN_VERSION;
version = (parsed.ProductIDLow >> 51) & 15; //printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
productID[3] = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
if (overrideVersion == false) {
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);
if (overrideVersion == false) {
switch (activationMode) {
case 2:
if (version != 3)
return ERR_UNKNOWN_VERSION;
break;
case 3:
if (version != 4)
return ERR_UNKNOWN_VERSION;
break;
}
}
memcpy(&parsed, hardwareID, 8);
productID[0] = 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) {
productID[1] = stoi(productid.substr(12,3));
productID[2] = (stoi(productid.substr(15,1)) * 100000) + stoi(productid.substr(18,5));
productID[2] = calculateCheckDigit(productID[2]);
productID[3] = ((stoi(productid.substr(10,2))) * 1000) + productID[3];
} else {
productID[1] = stoi(productid.substr(6,3));
productID[2] = stoi(productid.substr(10,7));
productID[3] = stoi(productid.substr(18,5));
}
//fmt::print("ProductID: {}-{}-{}-{} \n", productID[0], productID[1], productID[2], productID[3]);
}
unsigned char keybuf[16]; unsigned char keybuf[16];
memcpy(keybuf, &parsed.HardwareID, 8); memcpy(keybuf, &parsed.HardwareID, 8);
QWORD productIdMixed = (QWORD)productID[0] << 41 | (QWORD)productID[1] << 58 | (QWORD)productID[2] << 17 | productID[3]; 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;
@ -970,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;
@ -991,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, bool overrideVersion); 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, bool bypassVersion) { FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49]) {
return ConfirmationID::Generate(installation_id_str, confirmation_id, mode, productid, bypassVersion); 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) {
@ -58,115 +58,3 @@ 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);
} }
// RNG utility functions
int UMSKT::umskt_rand_bytes(unsigned char *buf, int num) {
#if UMSKT_RNG_DJGPP
// DOS-compatible RNG using DJGPP's random() function
static bool initialized = false;
if (!initialized) {
// Get initial seed from multiple sources for better entropy
struct timeval tv;
gettimeofday(&tv, NULL);
// Combine microseconds with BIOS timer ticks
unsigned long ticks = *(volatile unsigned long *)0x0040001CL;
int seed = (int)((tv.tv_sec ^ tv.tv_usec) ^ (ticks * 100000));
// Initialize both random() and rand() with different seeds
srandom(seed);
srand(seed ^ 0x1234ABCD); // Use a different seed for rand
initialized = true;
}
for (int i = 0; i < num; i++) {
// Use random() for better randomness, especially in lower bits
buf[i] = (unsigned char)(random() & 0xFF);
// Mix in rand() as an additional source
buf[i] ^= (unsigned char)(rand() & 0xFF);
}
return 1;
#elif defined(__FreeBSD__)
// use arc4random_buf
arc4random_buf(buf, num);
return 1;
#else
// Use OpenSSL's RAND_bytes for non-DOS systems
return RAND_bytes(buf, num);
#endif
}
int UMSKT::umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom) {
#if UMSKT_RNG_DJGPP
// DOS-compatible RNG implementation for BIGNUMs
unsigned char *buf = (unsigned char *)malloc((bits + 7) / 8);
if (!buf) return 0;
// Generate random bytes
umskt_rand_bytes(buf, (bits + 7) / 8);
// Convert to BIGNUM
if (!BN_bin2bn(buf, (bits + 7) / 8, rnd)) {
free(buf);
return 0;
}
free(buf);
// Apply top/bottom constraints like BN_rand does
if (top != -1) {
if (top) {
if (bits == 0) {
BN_zero(rnd);
return 1;
}
BN_set_bit(rnd, bits - 1);
}
BN_mask_bits(rnd, bits);
}
if (bottom) {
BN_set_bit(rnd, 0);
}
return 1;
#elif defined(__FreeBSD__)
// FreeBSD-compatible RNG implementation for BIGNUMs
unsigned char *buf = (unsigned char *)malloc((bits + 7) / 8);
if (!buf) return 0;
// Generate random bytes using arc4random_buf
arc4random_buf(buf, (bits + 7) / 8);
// Convert to BIGNUM
if (!BN_bin2bn(buf, (bits + 7) / 8, rnd)) {
free(buf);
return 0;
}
free(buf);
// Apply top/bottom constraints like BN_rand does
if (top != -1) {
if (top) {
if (bits == 0) {
BN_zero(rnd);
return 1;
}
BN_set_bit(rnd, bits - 1);
}
BN_mask_bits(rnd, bits);
}
if (bottom) {
BN_set_bit(rnd, 0);
}
return 1;
#else
// Use OpenSSL's BN_rand for non-DOS systems
return BN_rand(rnd, bits, top, bottom);
#endif
}

View File

@ -38,10 +38,6 @@
#include <fmt/core.h> #include <fmt/core.h>
#include <fmt/format.h> #include <fmt/format.h>
#ifdef __DJGPP__
#include <sys/time.h>
#endif
// Algorithm macros // Algorithm macros
#define PK_LENGTH 25 #define PK_LENGTH 25
#define NULL_TERMINATOR 1 #define NULL_TERMINATOR 1
@ -60,31 +56,9 @@
#define HIBYTES(field, bytes) NEXTSNBITS((QWORD)(field), ((bytes) * 8), ((bytes) * 8)) #define HIBYTES(field, bytes) NEXTSNBITS((QWORD)(field), ((bytes) * 8), ((bytes) * 8))
#define LOBYTES(field, bytes) FIRSTNBITS((QWORD)(field), ((bytes) * 8)) #define LOBYTES(field, bytes) FIRSTNBITS((QWORD)(field), ((bytes) * 8))
// Platform-specific byte order handling #define BYDWORD(n) (DWORD)(*((n) + 0) | *((n) + 1) << 8 | *((n) + 2) << 16 | *((n) + 3) << 24)
#if defined(__FreeBSD__)
#include <sys/endian.h>
#define BYDWORD(n) le32toh(*((const DWORD*)(n)))
#define HTOLE32(n) htole32(n)
#define LETOH32(n) le32toh(n)
#else
#define BYDWORD(n) (DWORD)(*((n) + 0) | *((n) + 1) << 8 | *((n) + 2) << 16 | *((n) + 3) << 24)
#define HTOLE32(n) (n)
#define LETOH32(n) (n)
#endif
#define BITMASK(n) ((1ULL << (n)) - 1) #define BITMASK(n) ((1ULL << (n)) - 1)
// RNG utility functions
#ifdef __DJGPP__
#define UMSKT_RNG_DJGPP 1
extern "C" {
long int random(void);
int srandom(int seed);
}
#else
#define UMSKT_RNG_DJGPP 0
#endif
class UMSKT { class UMSKT {
public: public:
static std::FILE* debug; static std::FILE* debug;
@ -93,10 +67,7 @@ public:
class ConfigurationID; class ConfigurationID;
static void setDebugOutput(std::FILE* input); static void setDebugOutput(std::FILE* input);
// RNG utility functions
static int umskt_rand_bytes(unsigned char *buf, int num);
static int umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom);
}; };
#endif //UMSKT_LIBUMSKT_H #endif //UMSKT_LIBUMSKT_H

View File

@ -29,43 +29,6 @@
#include "BINK1998.h" #include "BINK1998.h"
// Helper function to calculate SHA1 using EVP interface
static void calculate_sha1(const unsigned char* data, size_t len, unsigned char* digest) {
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
if (!ctx) {
fmt::print(UMSKT::debug, "Error: Failed to create EVP_MD_CTX\n");
return;
}
const EVP_MD* sha1 = EVP_sha1();
if (!sha1) {
fmt::print(UMSKT::debug, "Error: Failed to get SHA1 algorithm\n");
EVP_MD_CTX_free(ctx);
return;
}
if (EVP_DigestInit_ex(ctx, sha1, NULL) != 1) {
fmt::print(UMSKT::debug, "Error: Failed to initialize SHA1\n");
EVP_MD_CTX_free(ctx);
return;
}
if (EVP_DigestUpdate(ctx, data, len) != 1) {
fmt::print(UMSKT::debug, "Error: Failed to update SHA1\n");
EVP_MD_CTX_free(ctx);
return;
}
unsigned int md_len;
if (EVP_DigestFinal_ex(ctx, digest, &md_len) != 1) {
fmt::print(UMSKT::debug, "Error: Failed to finalize SHA1\n");
EVP_MD_CTX_free(ctx);
return;
}
EVP_MD_CTX_free(ctx);
}
/* Unpacks a Windows XP-like Product Key. */ /* Unpacks a Windows XP-like Product Key. */
void PIDGEN3::BINK1998::Unpack( void PIDGEN3::BINK1998::Unpack(
QWORD (&pRaw)[2], QWORD (&pRaw)[2],
@ -139,8 +102,6 @@ bool PIDGEN3::BINK1998::Verify(
fmt::print(UMSKT::debug, "\n"); fmt::print(UMSKT::debug, "\n");
pData = pSerial << 1 | pUpgrade; pData = pSerial << 1 | pUpgrade;
// Convert to little-endian for consistent hash calculation
DWORD leData = HTOLE32(pData);
/* /*
* *
@ -187,50 +148,18 @@ bool PIDGEN3::BINK1998::Verify(
BN_bn2lebin(x, xBin, FIELD_BYTES); BN_bn2lebin(x, xBin, FIELD_BYTES);
BN_bn2lebin(y, yBin, FIELD_BYTES); BN_bn2lebin(y, yBin, FIELD_BYTES);
// Convert pData to little-endian bytes // Assemble the SHA message.
BYTE leBytes[4]; memcpy((void *)&msgBuffer[0], (void *)&pData, 4);
leBytes[0] = (BYTE)(leData & 0xFF);
leBytes[1] = (BYTE)((leData >> 8) & 0xFF);
leBytes[2] = (BYTE)((leData >> 16) & 0xFF);
leBytes[3] = (BYTE)((leData >> 24) & 0xFF);
// Assemble the SHA message with little-endian data
memcpy((void *)&msgBuffer[0], leBytes, 4);
memcpy((void *)&msgBuffer[4], (void *)xBin, FIELD_BYTES); memcpy((void *)&msgBuffer[4], (void *)xBin, FIELD_BYTES);
memcpy((void *)&msgBuffer[4 + FIELD_BYTES], (void *)yBin, FIELD_BYTES); memcpy((void *)&msgBuffer[4 + FIELD_BYTES], (void *)yBin, FIELD_BYTES);
// Debug: Print message buffer contents // compHash = SHA1(pSerial || P.x || P.y)
fmt::print(UMSKT::debug, "Debug: Message buffer contents:\n"); SHA1(msgBuffer, SHA_MSG_LENGTH_XP, msgDigest);
fmt::print(UMSKT::debug, " leData: 0x{:08x}\n", leData);
fmt::print(UMSKT::debug, " First 4 bytes: 0x{:02x}{:02x}{:02x}{:02x}\n",
msgBuffer[0], msgBuffer[1], msgBuffer[2], msgBuffer[3]);
fmt::print(UMSKT::debug, " Full buffer:");
for(size_t i = 0; i < SHA_MSG_LENGTH_XP; i++) {
if(i % 16 == 0) fmt::print(UMSKT::debug, "\n ");
fmt::print(UMSKT::debug, "{:02x} ", msgBuffer[i]);
}
fmt::print(UMSKT::debug, "\n");
// pHash = SHA1(pSerial || R.x || R.y) // Translate the byte digest into a 32-bit integer - this is our computed hash.
calculate_sha1((unsigned char *)msgBuffer, SHA_MSG_LENGTH_XP, msgDigest); // Truncate the hash to 28 bits.
// Debug: Print SHA1 digest
fmt::print(UMSKT::debug, "Debug: SHA1 digest:\n");
for(int i = 0; i < SHA_DIGEST_LENGTH; i++) {
fmt::print(UMSKT::debug, "{:02x}", msgDigest[i]);
}
fmt::print(UMSKT::debug, "\n");
// Translate the byte digest into a 32-bit integer - this is our computed pHash.
// Truncate the pHash to 28 bits.
DWORD compHash = BYDWORD(msgDigest) >> 4 & BITMASK(28); DWORD compHash = BYDWORD(msgDigest) >> 4 & BITMASK(28);
// Debug: Print hash calculation steps
fmt::print(UMSKT::debug, "Debug: Hash calculation:\n");
fmt::print(UMSKT::debug, " Raw BYDWORD: 0x{:08x}\n", BYDWORD(msgDigest));
fmt::print(UMSKT::debug, " After shift: 0x{:08x}\n", BYDWORD(msgDigest) >> 4);
fmt::print(UMSKT::debug, " Final hash: 0x{:08x}\n", compHash);
BN_free(e); BN_free(e);
BN_free(s); BN_free(s);
BN_free(x); BN_free(x);
@ -267,14 +196,12 @@ void PIDGEN3::BINK1998::Generate(
// Data segment of the RPK. // Data segment of the RPK.
DWORD pData = pSerial << 1 | pUpgrade; DWORD pData = pSerial << 1 | pUpgrade;
// Convert to little-endian for consistent hash calculation
DWORD leData = HTOLE32(pData);
do { do {
EC_POINT *r = EC_POINT_new(eCurve); EC_POINT *r = EC_POINT_new(eCurve);
// Generate a random number c consisting of 384 bits without any constraints. // Generate a random number c consisting of 384 bits without any constraints.
UMSKT::umskt_bn_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); BN_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
// Pick a random derivative of the base point on the elliptic curve. // Pick a random derivative of the base point on the elliptic curve.
// R = cG; // R = cG;
@ -293,50 +220,18 @@ void PIDGEN3::BINK1998::Generate(
BN_bn2lebin(x, xBin, FIELD_BYTES); BN_bn2lebin(x, xBin, FIELD_BYTES);
BN_bn2lebin(y, yBin, FIELD_BYTES); BN_bn2lebin(y, yBin, FIELD_BYTES);
// Convert pData to little-endian bytes // Assemble the SHA message.
BYTE leBytes[4]; memcpy((void *)&msgBuffer[0], (void *)&pData, 4);
leBytes[0] = (BYTE)(leData & 0xFF);
leBytes[1] = (BYTE)((leData >> 8) & 0xFF);
leBytes[2] = (BYTE)((leData >> 16) & 0xFF);
leBytes[3] = (BYTE)((leData >> 24) & 0xFF);
// Assemble the SHA message with little-endian data
memcpy((void *)&msgBuffer[0], leBytes, 4);
memcpy((void *)&msgBuffer[4], (void *)xBin, FIELD_BYTES); memcpy((void *)&msgBuffer[4], (void *)xBin, FIELD_BYTES);
memcpy((void *)&msgBuffer[4 + FIELD_BYTES], (void *)yBin, FIELD_BYTES); memcpy((void *)&msgBuffer[4 + FIELD_BYTES], (void *)yBin, FIELD_BYTES);
// Debug: Print message buffer contents
fmt::print(UMSKT::debug, "Debug: Message buffer contents:\n");
fmt::print(UMSKT::debug, " leData: 0x{:08x}\n", leData);
fmt::print(UMSKT::debug, " First 4 bytes: 0x{:02x}{:02x}{:02x}{:02x}\n",
msgBuffer[0], msgBuffer[1], msgBuffer[2], msgBuffer[3]);
fmt::print(UMSKT::debug, " Full buffer:");
for(size_t i = 0; i < SHA_MSG_LENGTH_XP; i++) {
if(i % 16 == 0) fmt::print(UMSKT::debug, "\n ");
fmt::print(UMSKT::debug, "{:02x} ", msgBuffer[i]);
}
fmt::print(UMSKT::debug, "\n");
// pHash = SHA1(pSerial || R.x || R.y) // pHash = SHA1(pSerial || R.x || R.y)
calculate_sha1((unsigned char *)msgBuffer, SHA_MSG_LENGTH_XP, msgDigest); SHA1(msgBuffer, SHA_MSG_LENGTH_XP, msgDigest);
// Debug: Print SHA1 digest
fmt::print(UMSKT::debug, "Debug: SHA1 digest:\n");
for(int i = 0; i < SHA_DIGEST_LENGTH; i++) {
fmt::print(UMSKT::debug, "{:02x}", msgDigest[i]);
}
fmt::print(UMSKT::debug, "\n");
// Translate the byte digest into a 32-bit integer - this is our computed pHash. // Translate the byte digest into a 32-bit integer - this is our computed pHash.
// Truncate the pHash to 28 bits. // Truncate the pHash to 28 bits.
DWORD pHash = BYDWORD(msgDigest) >> 4 & BITMASK(28); DWORD pHash = BYDWORD(msgDigest) >> 4 & BITMASK(28);
// Debug: Print hash calculation steps
fmt::print(UMSKT::debug, "Debug: Hash calculation:\n");
fmt::print(UMSKT::debug, " Raw BYDWORD: 0x{:08x}\n", BYDWORD(msgDigest));
fmt::print(UMSKT::debug, " After shift: 0x{:08x}\n", BYDWORD(msgDigest) >> 4);
fmt::print(UMSKT::debug, " Final hash: 0x{:08x}\n", pHash);
/* /*
* *
* Scalars: * Scalars:

View File

@ -236,7 +236,7 @@ void PIDGEN3::BINK2002::Generate(
EC_POINT *r = EC_POINT_new(eCurve); EC_POINT *r = EC_POINT_new(eCurve);
// Generate a random number c consisting of 512 bits without any constraints. // Generate a random number c consisting of 512 bits without any constraints.
UMSKT::umskt_bn_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); BN_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
// R = cG // R = cG
EC_POINT_mul(eCurve, r, nullptr, basePoint, c, numContext); EC_POINT_mul(eCurve, r, nullptr, basePoint, c, numContext);

View File

@ -100,13 +100,6 @@ EC_GROUP* PIDGEN3::initializeEllipticCurve(
// Cleanup // Cleanup
BN_CTX_free(context); BN_CTX_free(context);
BN_free(p);
BN_free(a);
BN_free(b);
BN_free(generatorX);
BN_free(generatorY);
BN_free(publicKeyX);
BN_free(publicKeyY);
return eCurve; return eCurve;
} }

View File

@ -26,9 +26,6 @@
Options options; Options options;
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// Initialize OpenSSL
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, NULL);
if (!CLI::parseCommandLine(argc, argv, &options)) { if (!CLI::parseCommandLine(argc, argv, &options)) {
fmt::print("error parsing command line options\n"); fmt::print("error parsing command line options\n");
CLI::showHelp(argv); CLI::showHelp(argv);
@ -42,23 +39,23 @@ int main(int argc, char *argv[]) {
return status; return status;
} }
CLI run(options, keys); CLI* run = new CLI(options, keys);
switch(options.applicationMode) { switch(options.applicationMode) {
case MODE_BINK1998_GENERATE: case MODE_BINK1998_GENERATE:
return run.BINK1998Generate(); return run->BINK1998Generate();
case MODE_BINK2002_GENERATE: case MODE_BINK2002_GENERATE:
return run.BINK2002Generate(); return run->BINK2002Generate();
case MODE_BINK1998_VALIDATE: case MODE_BINK1998_VALIDATE:
return run.BINK1998Validate(); return run->BINK1998Validate();
case MODE_BINK2002_VALIDATE: case MODE_BINK2002_VALIDATE:
return run.BINK2002Validate(); return run->BINK2002Validate();
case MODE_CONFIRMATION_ID: case MODE_CONFIRMATION_ID:
return run.ConfirmationID(); return run->ConfirmationID();
default: default:
return 1; return 1;

Binary file not shown.