56 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
12 changed files with 514 additions and 34 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

@ -28,18 +28,25 @@ on:
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@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: >
@ -54,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
@ -72,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

@ -85,7 +85,8 @@ jobs:
- 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 platform-specific build - name: Upload platform-specific build
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v4.6.2

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

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,6 +54,7 @@ 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})
@ -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)

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.