59 Commits

Author SHA1 Message Date
9dc6fcaf2c 2:10:20 AM 2025-07-04 02:10:21 -05:00
5b7379a737 this also won't work 2025-07-04 01:54:03 -05:00
f638c0a94f this won't work 2025-07-04 01:46:20 -05:00
1fe412c4d8 manually change byte order 2025-07-04 01:37:26 -05:00
dff86d7652 i hate cryptography 2025-07-04 01:30:44 -05:00
c48a006144 freebsd native 2025-07-04 01:18:24 -05:00
4bb00b02f4 more manual sha1 2025-07-04 01:14:36 -05:00
c0cf80f850 TheTank20 is playing Fallout: New Vegas 2025-07-04 01:07:56 -05:00
06b80aed99 logs!!!! 2025-07-04 01:01:29 -05:00
bd47550bf9 native fbsd fxn for little endian (2) 2025-07-04 00:54:44 -05:00
c6dde73529 native fbsd fxn for little endian 2025-07-04 00:47:40 -05:00
0bc1cade98 bignum rng 2025-07-04 00:34:24 -05:00
48d53bd1a4 hard 2025-07-04 00:32:52 -05:00
3196af3824 easy? 2025-07-04 00:15:03 -05:00
0c17615e71 hlep3 2025-07-03 22:32:02 -05:00
6c97e1ac1a hlep2 2025-07-03 22:25:27 -05:00
d46da70f0b hlep 2025-07-03 22:19:51 -05:00
b2a86dc12a Update freebsd.yml 2025-07-03 22:16:07 -05:00
25f73473a5 Update freebsd.yml 2025-07-03 22:14:29 -05:00
fbc88ac346 welcome back 2025-07-03 22:13:55 -05:00
d94013669b Update freebsd.yml 2025-07-03 22:13:33 -05:00
58c204684d always show output 2025-07-03 22:04:36 -05:00
89043a8b2c oopsie (5) 2025-07-03 22:02:32 -05:00
6305b50be1 ids 2025-07-03 21:59:41 -05:00
06f83a7cf9 copy all 2025-07-03 21:51:49 -05:00
bcbfbd7402 regex.... :( 2025-07-03 20:59:58 -05:00
cffc7fb4ac regex!!! :D 2025-07-03 20:49:06 -05:00
783585eca7 no need to extract 2025-07-03 20:43:19 -05:00
fdf9cb07dc working link + saving 2025-07-03 20:32:04 -05:00
0e4faad001 dpmi 2025-07-03 20:24:56 -05:00
7efdb9b018 dos tests (2) 2025-07-03 20:14:47 -05:00
1e66f80a85 dos tests 2025-07-03 19:56:35 -05:00
84303978b1 linux tests 2025-07-03 19:49:28 -05:00
23f9aabdc4 tried to make it clean and it killed it 2025-07-03 19:43:55 -05:00
3dd205573d misspell 2025-07-03 16:22:12 -05:00
0e9b6cbbab powershell smh 2025-07-03 16:21:56 -05:00
ad55abfa25 Update windows.yml 2025-07-03 16:18:30 -05:00
4c1f38e3e4 Update macos.yml 2025-07-03 16:17:15 -05:00
72f8dde19f Update freebsd.yml 2025-07-03 16:16:37 -05:00
b40b3b391c Merge pull request #130 from UMSKT/arm64-linux-fix
merge to win-on-arm
2025-07-03 20:43:37 +00:00
27c7e90846 no way ur still going 2025-07-03 15:37:50 -05:00
a60a1cbe2b 32-bit comp for rc 2025-07-03 15:28:25 -05:00
40aaa3da80 just change it to utf8 2025-07-03 15:25:44 -05:00
c50cc284ca fix broken encoding 2025-07-03 15:22:46 -05:00
e8c082f4e0 add icon back for TDM (done right) 2025-07-03 15:17:03 -05:00
468e6805ad add icon back for TDM 2025-07-03 15:12:53 -05:00
0f62d52ad3 oopsie (3) 2025-07-03 15:04:49 -05:00
062c63db5e cache OpenSSL 2025-07-03 15:03:17 -05:00
909fd76653 lol 2025-07-03 14:29:24 -05:00
b26ce51cab the Bill Gates implementation 2025-07-03 14:21:29 -05:00
698ea3bc65 Add intrin.h if MSVC 2025-07-03 14:14:03 -05:00
9641459248 Update confid.cpp 2025-07-03 14:06:28 -05:00
9881edc224 Add _M_ARM64 to _umul128 2025-07-03 13:50:04 -05:00
a6c13e83bc MSVC compilation for Windows on ARM 2025-07-03 13:36:33 -05:00
d36c4f8549 Merge pull request #128 from UMSKT/master
shove latest changes into new branch
2025-07-03 13:14:30 -05:00
4c52dec51d Faster aarch64 compilation on Linux 2025-07-03 13:13:03 -05:00
6b85771db1 Static OpenSSL for macOS (#127) 2025-07-03 13:03:11 -05:00
8db1fe25d7 Make UMSKT (mostly) static on macOS (#126) 2025-07-03 12:11:00 -05:00
0db5d7f982 Universal binary compilation for macOS (#124) 2025-07-03 10:31:15 -05:00
14 changed files with 592 additions and 44 deletions

View File

@ -42,7 +42,7 @@ jobs:
- name: Setup build environment - name: Setup build environment
run: | run: |
sudo apt -y update sudo apt -y update
sudo apt -y install build-essential cmake wget 7zip git flex libfl-dev nasm libslang2-dev pkg-config libslang2-modules gcc-multilib sudo apt -y install build-essential cmake wget 7zip git flex libfl-dev nasm libslang2-dev pkg-config libslang2-modules gcc-multilib dosbox
- name: Download and Setup DJGPP Toolchain - name: Download and Setup DJGPP Toolchain
run: | run: |
@ -59,7 +59,16 @@ 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
@ -68,6 +77,14 @@ jobs:
make && make install_sw make && make install_sw
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
@ -75,6 +92,84 @@ 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

View File

@ -21,12 +21,9 @@
name: C/C++ CI (FreeBSD) name: C/C++ CI (FreeBSD)
on: on:
#push: push:
# branches: [ "*" ] branches: [ "*" ]
# paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
#pull_request:
# branches: [ "*" ]
# paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch: workflow_dispatch:
@ -39,19 +36,42 @@
- name: Build & Test in FreeBSD - name: Build & Test in FreeBSD
id: test id: test
uses: vmactions/freebsd-vm@v1 uses: vmactions/freebsd-vm@v1.2.1
with: with:
envs: 'MYTOKEN MYTOKEN2' envs: 'MYTOKEN MYTOKEN2'
usesh: true usesh: true
prepare: | prepare: |
pkg install -y cmake openssl git bash pkg install -y cmake openssl git bash
# Debug: Show system state
uname -a
pwd
df -h
ls -la
run: | 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 mkdir build
cd build cd build
echo "Running cmake..."
cmake .. cmake ..
echo "Starting make..."
make make
./umskt # Execute the test here ./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 - name: Move files to correct directory
run: | run: |

View File

@ -33,16 +33,20 @@ jobs:
include: include:
- arch: x86 - arch: x86
runner: ubuntu-latest runner: ubuntu-latest
use_alpine: true
- arch: x86_64 - arch: x86_64
runner: ubuntu-latest runner: ubuntu-latest
use_alpine: true
- arch: aarch64 - arch: aarch64
runner: ubuntu-24.04-arm runner: ubuntu-24.04-arm
use_alpine: false
runs-on: ${{ matrix.runner }} runs-on: ${{ matrix.runner }}
steps: steps:
- name: Checkout Source Tree - name: Checkout Source Tree
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup latest Alpine Linux for ${{ matrix.arch }} - name: Setup latest Alpine Linux
if: ${{ matrix.use_alpine }}
uses: jirutka/setup-alpine@v1 uses: jirutka/setup-alpine@v1
with: with:
packages: > packages: >
@ -57,13 +61,42 @@ jobs:
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
shell-name: alpine-target.sh shell-name: alpine-target.sh
- name: Configure and build UMSKT - name: Install Dependencies (Ubuntu ARM64)
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)
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 - name: Move files to correct directory
run: | run: |
mkdir -p build/actions_upload mkdir -p build/actions_upload
@ -75,16 +108,62 @@ jobs:
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 - name: Configure and build static internal deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8 uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with: with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
run-build: true run-build: true
shell: alpine-target.sh {0} shell: alpine-target.sh {0}
- name: Configure and build shared deps UMSKT - 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 uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with: with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
run-build: true run-build: true
shell: alpine-target.sh {0} 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

@ -27,34 +27,95 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build-x86: build:
runs-on: macos-latest runs-on: macos-latest
strategy: strategy:
matrix: matrix:
include: include:
- arch: x86_64 - arch: x86_64
- arch: arm64
steps: steps:
- name: Checkout Source Tree - name: Checkout Source Tree
uses: actions/checkout@v4 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 - name: Configure and build UMSKT
run: | run: |
cd build cd build
cmake -DCMAKE_BUILD_TYPE=Release .. 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 make
- name: Move files to correct directory - name: Move files to correct directory
run: | run: |
ls -a build
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: Run tests - name: Run tests
run: | run: |
cd build/actions_upload cd build/actions_upload
./umskt ./umskt -b 2C -c 365 -s 069420 -v
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Upload build artifact - name: Upload platform-specific build
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v4.6.2
with: with:
name: UMSKT-macOS-${{ matrix.arch }} name: UMSKT-macOS-${{ matrix.arch }}
path: build/actions_upload 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

@ -27,13 +27,14 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build-tdm: build:
runs-on: windows-latest runs-on: windows-latest
strategy: strategy:
matrix: matrix:
arch: [x64, x86] arch: [x64, x86, arm64]
steps: steps:
- name: Setup TDM-GCC - name: Setup TDM-GCC
if: matrix.arch != 'arm64'
run: | run: |
Write-Host Downloading TDM-GCC v10.3.0... 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' 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'
@ -49,10 +50,17 @@ jobs:
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine) [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@v4
- name: Download OpenSSL-TDM release asset - name: Download OpenSSL-TDM release asset
if: matrix.arch != 'arm64'
shell: pwsh shell: pwsh
run: | run: |
if ('${{ matrix.arch }}' -eq 'x64') { if ('${{ matrix.arch }}' -eq 'x64') {
@ -74,7 +82,39 @@ jobs:
echo "OPENSSL_LIBDIR=$libdir" | 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 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:
path: |
${{ 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
if: matrix.arch == 'arm64'
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE
& "$env:VCPKG_ROOT\vcpkg.exe" install openssl:arm64-windows-static --clean-after-build
- name: Configure UMSKT (TDM-GCC ${{ matrix.arch }}) - name: Configure UMSKT (TDM-GCC ${{ matrix.arch }})
if: matrix.arch != 'arm64'
shell: pwsh shell: pwsh
run: | run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
@ -92,14 +132,56 @@ jobs:
-DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" ` -DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" `
. .
- name: Configure UMSKT (MSVC ARM64)
if: matrix.arch == 'arm64'
shell: pwsh
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: Build UMSKT (TDM-GCC ${{ matrix.arch }})
if: matrix.arch != 'arm64'
shell: pwsh shell: pwsh
run: | run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
mingw32-make mingw32-make
- name: Build UMSKT (MSVC ARM64)
if: matrix.arch == 'arm64'
shell: pwsh
run: |
cmake --build . --config Release
- name: Run tests (x86/x64)
if: matrix.arch != 'arm64'
shell: pwsh
run: |
.\umskt.exe -b 2C -c 365 -s 069420 -v
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574
- name: Upload build artifact - name: Upload build artifact
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v4.6.2
with: with:
name: UMSKT-TDM${{ matrix.arch }} name: UMSKT-${{ matrix.arch }}
path: umskt.exe path: ${{ matrix.arch == 'arm64' && 'Release/umskt.exe' || 'umskt.exe' }}
test-arm64:
needs: build
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: |
.\umskt.exe -b 2C -c 365 -s 069420 -v
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574

10
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,10 @@
# 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

@ -26,6 +26,24 @@ if (WIN32 AND NOT MSVC)
set(CMAKE_C_COMPILER "C:/TDM-GCC-64/bin/gcc.exe" CACHE FILEPATH "C Compiler" FORCE) 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) 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") 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() endif()
SET(CMAKE_CXX_STANDARD 17) SET(CMAKE_CXX_STANDARD 17)
@ -36,13 +54,14 @@ OPTION(UMSKT_USE_SHARED_OPENSSL "Force linking against the system-wide OpenSSL l
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})
# macOS does not support static build
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
SET(UMSKT_USE_SHARED_OPENSSL ON) SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
endif() endif()
# neither does dos idk i'm trying random stuff # neither does dos idk i'm trying random stuff
@ -60,7 +79,22 @@ ELSE()
MESSAGE(STATUS "[UMSKT] Requesting static version of OpenSSL") 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)
@ -77,10 +111,10 @@ IF(DJGPP_WATT32)
MESSAGE(STATUS "[UMSKT] Using i386 target for DOS DGJPP") MESSAGE(STATUS "[UMSKT] Using i386 target for DOS DGJPP")
ENDIF() ENDIF()
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ##if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
SET(BUILD_SHARED_LIBS ON) ## SET(BUILD_SHARED_LIBS ON)
MESSAGE(STATUS "[UMSKT] macOS has no static library - Shared library forced on") ## MESSAGE(STATUS "[UMSKT] macOS has no static library - Shared library forced on")
endif() ##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)
@ -167,6 +201,7 @@ 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

View File

@ -61,7 +61,7 @@ For Windows, click [here](https://slproweb.com/products/Win32OpenSSL.html) and c
*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.* *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. #### 3. Run `umskt` to generate a key, or add `--help` or `-h` 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)* #### 4. *(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.

View File

@ -29,6 +29,10 @@
#include "confid.h" #include "confid.h"
#if defined(_MSC_VER)
#include <intrin.h>
#endif
QWORD MOD = 0; QWORD MOD = 0;
QWORD NON_RESIDUE = 0; QWORD NON_RESIDUE = 0;
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
@ -75,6 +79,12 @@ 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

View File

@ -88,6 +88,10 @@ int UMSKT::umskt_rand_bytes(unsigned char *buf, int num) {
buf[i] ^= (unsigned char)(rand() & 0xFF); buf[i] ^= (unsigned char)(rand() & 0xFF);
} }
return 1; return 1;
#elif defined(__FreeBSD__)
// use arc4random_buf
arc4random_buf(buf, num);
return 1;
#else #else
// Use OpenSSL's RAND_bytes for non-DOS systems // Use OpenSSL's RAND_bytes for non-DOS systems
return RAND_bytes(buf, num); return RAND_bytes(buf, num);
@ -127,6 +131,39 @@ int UMSKT::umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom) {
BN_set_bit(rnd, 0); 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; return 1;
#else #else
// Use OpenSSL's BN_rand for non-DOS systems // Use OpenSSL's BN_rand for non-DOS systems

View File

@ -60,7 +60,18 @@
#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
#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 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 // RNG utility functions

View File

@ -29,6 +29,43 @@
#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],
@ -102,6 +139,8 @@ 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);
/* /*
* *
@ -148,18 +187,50 @@ 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);
// Assemble the SHA message. // Convert pData to little-endian bytes
memcpy((void *)&msgBuffer[0], (void *)&pData, 4); BYTE leBytes[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);
// compHash = SHA1(pSerial || P.x || P.y) // Debug: Print message buffer contents
SHA1(msgBuffer, SHA_MSG_LENGTH_XP, msgDigest); 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");
// Translate the byte digest into a 32-bit integer - this is our computed hash. // pHash = SHA1(pSerial || R.x || R.y)
// Truncate the hash to 28 bits. calculate_sha1((unsigned char *)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.
// 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);
@ -196,6 +267,8 @@ 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);
@ -220,18 +293,50 @@ 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);
// Assemble the SHA message. // Convert pData to little-endian bytes
memcpy((void *)&msgBuffer[0], (void *)&pData, 4); BYTE leBytes[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)
SHA1(msgBuffer, SHA_MSG_LENGTH_XP, msgDigest); calculate_sha1((unsigned char *)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

@ -26,6 +26,9 @@
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);

Binary file not shown.