mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2025-07-04 11:20:23 +03:00
Compare commits
130 Commits
a827844cbd
...
win-on-arm
Author | SHA1 | Date | |
---|---|---|---|
9dc6fcaf2c | |||
5b7379a737 | |||
f638c0a94f | |||
1fe412c4d8 | |||
dff86d7652 | |||
c48a006144 | |||
4bb00b02f4 | |||
c0cf80f850 | |||
06b80aed99 | |||
bd47550bf9 | |||
c6dde73529 | |||
0bc1cade98 | |||
48d53bd1a4 | |||
3196af3824 | |||
0c17615e71 | |||
6c97e1ac1a | |||
d46da70f0b | |||
b2a86dc12a | |||
25f73473a5 | |||
fbc88ac346 | |||
d94013669b | |||
58c204684d | |||
89043a8b2c | |||
6305b50be1 | |||
06f83a7cf9 | |||
bcbfbd7402 | |||
cffc7fb4ac | |||
783585eca7 | |||
fdf9cb07dc | |||
0e4faad001 | |||
7efdb9b018 | |||
1e66f80a85 | |||
84303978b1 | |||
23f9aabdc4 | |||
3dd205573d | |||
0e9b6cbbab | |||
ad55abfa25 | |||
4c1f38e3e4 | |||
72f8dde19f | |||
b40b3b391c | |||
27c7e90846 | |||
a60a1cbe2b | |||
40aaa3da80 | |||
c50cc284ca | |||
e8c082f4e0 | |||
468e6805ad | |||
0f62d52ad3 | |||
062c63db5e | |||
909fd76653 | |||
b26ce51cab | |||
698ea3bc65 | |||
9641459248 | |||
9881edc224 | |||
a6c13e83bc | |||
d36c4f8549 | |||
4c52dec51d | |||
6b85771db1 | |||
8db1fe25d7 | |||
0db5d7f982 | |||
25ed8d4f43 | |||
324688e9ef | |||
6ae46d6aa2 | |||
e07c080ee8 | |||
ce9ff7e624 | |||
714895c61b | |||
6ecf9c5309 | |||
9f7d53dab3 | |||
a66e579377 | |||
e30a4713b6 | |||
e9228045d3 | |||
36de07ecdf | |||
a28f4b5ca3 | |||
a0cb9e9869 | |||
6d30abba98 | |||
8b6c3b252b | |||
1fd7550f85 | |||
1f85bf954e | |||
74ff1ea08c | |||
0a63055e91 | |||
94da628e48 | |||
8e58232803 | |||
78ec40f4e3 | |||
9d36fb2f66 | |||
2166ee6e2f | |||
e85add2a54 | |||
f459316865 | |||
60a9b0ea70 | |||
0ebce49cf0 | |||
caa37365d4 | |||
8fe0fc06b2 | |||
fc4b83d1e8 | |||
aa331ad6e4 | |||
9b06fcf162 | |||
a4d810b030 | |||
c209070a66 | |||
9c01c93e77 | |||
b41b596e54 | |||
8723928e48 | |||
8b603c96f1 | |||
403bcb9dd5 | |||
8368b6a6c7 | |||
2415d1374f | |||
d1024950da | |||
1ca5114b21 | |||
da10583fdf | |||
034c00a5b8 | |||
cd050c65d6 | |||
02434e935d | |||
09f1300afc | |||
a3de0e845f | |||
6287b4c773 | |||
a5ce3abe13 | |||
27344f6d4b | |||
01b216dbc4 | |||
c29db1d30a | |||
1c1e26012f | |||
75f22215b1 | |||
be99f6b8e9 | |||
e830f97e7e | |||
0251546d0d | |||
a12afcd601 | |||
c7a555abe4 | |||
74ff4bf144 | |||
2b408913c4 | |||
c965b88113 | |||
2bc3503fd8 | |||
3fbd1cffea | |||
4bf3800281 | |||
8ec60bf396 | |||
5fbbd5e6eb |
105
.github/workflows/dos-djgpp.yml
vendored
105
.github/workflows/dos-djgpp.yml
vendored
@ -37,12 +37,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Source Tree
|
- name: Checkout Source Tree
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- 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,15 +59,32 @@ 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 no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
|
./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
|
||||||
make && make install
|
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,13 +92,91 @@ 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@v3.1.2
|
uses: actions/upload-artifact@v4.6.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-DOS
|
name: UMSKT-DOS
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
34
.github/workflows/freebsd.yml
vendored
34
.github/workflows/freebsd.yml
vendored
@ -24,9 +24,6 @@
|
|||||||
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:
|
||||||
|
|
||||||
@ -35,23 +32,46 @@
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: build-x86_64
|
name: build-x86_64
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- 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: |
|
||||||
@ -59,7 +79,7 @@
|
|||||||
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@v3.1.2
|
uses: actions/upload-artifact@v4.6.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-FreeBSD
|
name: UMSKT-FreeBSD
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
96
.github/workflows/linux.yml
vendored
96
.github/workflows/linux.yml
vendored
@ -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@v3
|
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,34 +61,109 @@ 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
|
||||||
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@v3.1.2
|
uses: actions/upload-artifact@v4.6.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
|
- 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
|
||||||
|
73
.github/workflows/macos.yml
vendored
73
.github/workflows/macos.yml
vendored
@ -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@v3
|
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@v3.1.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
|
||||||
|
245
.github/workflows/windows.yml
vendored
245
.github/workflows/windows.yml
vendored
@ -23,126 +23,165 @@ name: C/C++ CI (Windows)
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "*" ]
|
branches: [ "*" ]
|
||||||
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**']
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-32bit:
|
build:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
arch: [x64, x86, arm64]
|
||||||
steps:
|
steps:
|
||||||
# https://github.com/actions/runner-images/issues/6067#issuecomment-1213069040
|
- name: Setup TDM-GCC
|
||||||
- name: Install Windows XP Support for Visual Studio
|
if: matrix.arch != 'arm64'
|
||||||
run: |
|
run: |
|
||||||
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
|
Write-Host Downloading TDM-GCC v10.3.0...
|
||||||
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
|
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'
|
||||||
$componentsToAdd = @(
|
Write-Host Creating directory...
|
||||||
"Microsoft.VisualStudio.Component.WinXP"
|
New-Item -ItemType Directory -Path 'C:\TDM-GCC-64'
|
||||||
)
|
Write-Host Copying files [Set 1/3]...
|
||||||
[string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_}
|
Start-Process '7z' -ArgumentList 'e C:\Windows\temp\TDM-GCC-64.exe -oC:\TDM-GCC-64 -y' -Wait
|
||||||
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
|
Write-Host Copying files [Set 2/3]...
|
||||||
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
|
Start-Process '7z' -ArgumentList 'e C:\TDM-GCC-64\*.tar.xz -oC:\TDM-GCC-64 -y' -Wait
|
||||||
if ($process.ExitCode -eq 0)
|
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 "components have been successfully added"
|
Write-Host Adding environment variables...
|
||||||
Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.*
|
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||||
}
|
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
|
||||||
else
|
|
||||||
{
|
|
||||||
Write-Host "components were not installed"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
- name: Download And Install 32-bit OpenSSL 3.1.4
|
- name: Setup MSVC for ARM64
|
||||||
run: |
|
if: matrix.arch == 'arm64'
|
||||||
$installDir = "$Env:ProgramFiles\OpenSSL"
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
$installerURL = "https://slproweb.com/download/Win32OpenSSL-3_1_4.exe"
|
with:
|
||||||
$installerName = "Win32OpenSSL-3_1_4.exe"
|
arch: arm64
|
||||||
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
|
|
||||||
|
|
||||||
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
|
|
||||||
|
|
||||||
Remove-Item "$installDir" -Force -Recurse
|
|
||||||
$installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`""
|
|
||||||
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
|
|
||||||
|
|
||||||
- name: Checkout Source Tree
|
- name: Checkout Source Tree
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup MSBuild
|
- name: Download OpenSSL-TDM release asset
|
||||||
uses: microsoft/setup-msbuild@v1
|
if: matrix.arch != 'arm64'
|
||||||
|
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: Configure UMSKT
|
- name: Setup vcpkg for ARM64
|
||||||
uses: threeal/cmake-action@v1.2.0
|
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:
|
||||||
generator: "Visual Studio 17 2022"
|
path: |
|
||||||
options: CMAKE_SYSTEM_VERSION="5.1.2600"
|
${{ github.workspace }}/vcpkg/bincache
|
||||||
args: -A "Win32" -T v141_xp
|
${{ 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: Build UMSKT
|
- name: Install OpenSSL for ARM64
|
||||||
working-directory: build
|
if: matrix.arch == 'arm64'
|
||||||
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release
|
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 }})
|
||||||
|
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)
|
||||||
|
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 }})
|
||||||
|
if: matrix.arch != 'arm64'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||||
|
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@v3.1.2
|
uses: actions/upload-artifact@v4.6.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-Win32
|
name: UMSKT-${{ matrix.arch }}
|
||||||
path: build/Release
|
path: ${{ matrix.arch == 'arm64' && 'Release/umskt.exe' || 'umskt.exe' }}
|
||||||
|
|
||||||
build-64bit:
|
test-arm64:
|
||||||
runs-on: windows-latest
|
needs: build
|
||||||
|
if: success()
|
||||||
|
runs-on: windows-11-arm
|
||||||
steps:
|
steps:
|
||||||
- name: Install Windows XP Support for Visual Studio
|
- name: Download ARM64 artifact
|
||||||
run: |
|
uses: actions/download-artifact@v4
|
||||||
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
|
|
||||||
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
|
|
||||||
$componentsToAdd = @(
|
|
||||||
"Microsoft.VisualStudio.Component.WinXP"
|
|
||||||
)
|
|
||||||
[string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_}
|
|
||||||
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
|
|
||||||
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
|
|
||||||
if ($process.ExitCode -eq 0)
|
|
||||||
{
|
|
||||||
Write-Host "components have been successfully added"
|
|
||||||
Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.*
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Write-Host "components were not installed"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
- name: Download And Install 64-bit OpenSSL 3.1.4
|
|
||||||
run: |
|
|
||||||
$installDir = "$Env:ProgramFiles\OpenSSL"
|
|
||||||
$installerURL = "https://slproweb.com/download/Win64OpenSSL-3_1_4.exe"
|
|
||||||
$installerName = "Win64OpenSSL-3_1_4.exe"
|
|
||||||
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
|
|
||||||
|
|
||||||
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
|
|
||||||
|
|
||||||
Remove-Item "$installDir" -Force -Recurse
|
|
||||||
$installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`""
|
|
||||||
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
|
|
||||||
|
|
||||||
- name: Checkout Source Tree
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup MSBuild
|
|
||||||
uses: microsoft/setup-msbuild@v1
|
|
||||||
|
|
||||||
- name: Configure UMSKT
|
|
||||||
uses: threeal/cmake-action@v1.2.0
|
|
||||||
with:
|
with:
|
||||||
generator: "Visual Studio 17 2022"
|
name: UMSKT-arm64
|
||||||
args: -A "x64" -T "v141_xp"
|
path: .
|
||||||
|
|
||||||
- name: Build UMSKT
|
- name: Run tests (ARM64)
|
||||||
working-directory: build
|
shell: pwsh
|
||||||
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release
|
run: |
|
||||||
|
.\umskt.exe -b 2C -c 365 -s 069420 -v
|
||||||
- name: Upload build artifact
|
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574
|
||||||
uses: actions/upload-artifact@v3.1.2
|
|
||||||
with:
|
|
||||||
name: UMSKT-Win64
|
|
||||||
path: build/Release
|
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -253,3 +253,9 @@ CMakeSettings.json
|
|||||||
|
|
||||||
# Visual Studio
|
# Visual Studio
|
||||||
.vs/
|
.vs/
|
||||||
|
|
||||||
|
CPM_modules
|
||||||
|
CPM_*.cmake
|
||||||
|
cpm-package-lock.cmake
|
||||||
|
*.a
|
||||||
|
*_cmrc*
|
10
.pre-commit-config.yaml
Normal file
10
.pre-commit-config.yaml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Stub so pre-commit can shut up until the refactor
|
||||||
|
|
||||||
|
repos:
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: no-op
|
||||||
|
name: No‑op hook (always passes)
|
||||||
|
entry: "true" # `/usr/bin/true` returns 0 and does nothing
|
||||||
|
language: system
|
||||||
|
pass_filenames: false # don’t bother passing any file paths
|
@ -21,6 +21,31 @@
|
|||||||
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_OSX_SYSROOT "macosx" CACHE PATH "macOS SDK path")
|
||||||
|
|
||||||
@ -29,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
|
||||||
@ -53,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)
|
||||||
@ -63,12 +104,17 @@ 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")
|
##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)
|
||||||
@ -155,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
|
||||||
@ -207,6 +254,12 @@ ELSE()
|
|||||||
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_LIBRARIES} ${ZLIB_LIBRARIES} 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
|
||||||
|
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})
|
SET_PROPERTY(TARGET umskt APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
@ -51,18 +51,17 @@ In light of the recent exponential interest in this project I've decided to put
|
|||||||
* 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+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))
|
||||||
|
|
||||||
|
|
||||||
* ~~*(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)
|
||||||
* No official releases right now, use the other method to get the latest version.
|
|
||||||
|
|
||||||
* **Note:** Before continuing, please ensure you have the `umskt` executable extracted and on UNIX-like systems, have execution permissions (`chmod +x umskt`).
|
* **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 3.1.2.
|
#### 2. Install OpenSSL.
|
||||||
For Windows, click [here](https://slproweb.com/products/Win32OpenSSL.html) and choose the right version. For other operating systems, consult your package manager.
|
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.*
|
*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.
|
||||||
|
|
||||||
|
83
keys.json
83
keys.json
@ -132,12 +132,18 @@
|
|||||||
"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"]
|
||||||
},
|
},
|
||||||
@ -147,6 +153,9 @@
|
|||||||
"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"]
|
||||||
}
|
}
|
||||||
@ -321,15 +330,15 @@
|
|||||||
"a": "1",
|
"a": "1",
|
||||||
"b": "0",
|
"b": "0",
|
||||||
"g": {
|
"g": {
|
||||||
"x": "17272533675023793624680016937607161394427776688401278127884215858369066406365237833207419170117031265147050748737186",
|
"x": "2424861453756882196229359499252409442096928108454123044238107428456451053748664006504056679987776648547354283230029",
|
||||||
"y": "10897684556651576571671151674586120690608236542740270859915076272932083320838022698730208293779451126638581586588925"
|
"y": "7324425970176151969116486392910180591819760394015255323965851504893617199075285355320677185484219270306349221725496"
|
||||||
},
|
},
|
||||||
"n": "44682719955829289",
|
"n": "42173753096150573",
|
||||||
"p": "31123778862031392435299439090755153401162704597024288571183830527113563344679315725116915983118187065183839828632113",
|
"p": "23576896825148261563986794905854575022252138407149635186332207102431578828005131860154350053063599250972940889198609",
|
||||||
"priv": "30177475288172038",
|
"priv": "21644128200478272",
|
||||||
"pub": {
|
"pub": {
|
||||||
"x": "10584120526089473026246191383792758367144927589909587205278073830223938861208553884400816982485323081066790399437204",
|
"x": "22559965909720054111451558679234685221190121968477792217083519033370405738218408301652020048970098652944061723131120",
|
||||||
"y": "19710761542152200618172612283139324015316083022563473705358032993141026289202915973780473937312193485361804450068338"
|
"y": "4867649293914467066273247931825593002116583959412689222356329515920397531410942846741846700237094219959206105155903"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"0C": {
|
"0C": {
|
||||||
@ -797,6 +806,66 @@
|
|||||||
"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",
|
||||||
|
31
src/cli.cpp
31
src/cli.cpp
@ -71,6 +71,8 @@ void CLI::showHelp(char *argv[]) {
|
|||||||
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
||||||
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
||||||
fmt::print("\t-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n");
|
fmt::print("\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");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,6 +94,8 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
MODE_BINK1998_GENERATE,
|
MODE_BINK1998_GENERATE,
|
||||||
WINDOWS
|
WINDOWS
|
||||||
};
|
};
|
||||||
@ -210,6 +214,10 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
|
|
||||||
} else if (arg == "-N" || arg == "--nonewlines") {
|
} else if (arg == "-N" || arg == "--nonewlines") {
|
||||||
options->nonewlines = true;
|
options->nonewlines = true;
|
||||||
|
} else if (arg == "-o" || arg == "--override") {
|
||||||
|
options->overrideVersion = true;
|
||||||
|
} else if (arg == "-D" || arg == "--nodashes") {
|
||||||
|
options->nodashes = true;
|
||||||
} else {
|
} else {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
}
|
}
|
||||||
@ -323,9 +331,14 @@ 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("{}-{}-{}-{}-{}",
|
fmt::print(keyFormat,
|
||||||
spk.substr(0,5),
|
spk.substr(0,5),
|
||||||
spk.substr(5,5),
|
spk.substr(5,5),
|
||||||
spk.substr(10,5),
|
spk.substr(10,5),
|
||||||
@ -419,7 +432,7 @@ 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();
|
||||||
BN_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
|
UMSKT::umskt_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);
|
||||||
@ -480,7 +493,7 @@ 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;
|
||||||
RAND_bytes((BYTE *)&pAuthInfo, 4);
|
UMSKT::umskt_rand_bytes((BYTE *)&pAuthInfo, 4);
|
||||||
pAuthInfo &= BITMASK(10);
|
pAuthInfo &= BITMASK(10);
|
||||||
|
|
||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
@ -559,7 +572,7 @@ int CLI::BINK2002Validate() {
|
|||||||
|
|
||||||
int CLI::ConfirmationID() {
|
int CLI::ConfirmationID() {
|
||||||
char confirmation_id[49];
|
char confirmation_id[49];
|
||||||
int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id, options.activationMode, options.productid);
|
int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id, options.activationMode, options.productid, options.overrideVersion);
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case ERR_TOO_SHORT:
|
case ERR_TOO_SHORT:
|
||||||
@ -587,7 +600,17 @@ int CLI::ConfirmationID() {
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
|
if (this->options.nodashes == true) {
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 0; confirmation_id[i] != '\0'; ++i) {
|
||||||
|
if (confirmation_id[i] != '-') {
|
||||||
|
confirmation_id[j++] = confirmation_id[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
confirmation_id[j] = '\0';
|
||||||
|
}
|
||||||
fmt::print(confirmation_id);
|
fmt::print(confirmation_id);
|
||||||
|
|
||||||
if (this->options.nonewlines == false) {
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,8 @@ struct Options {
|
|||||||
bool error;
|
bool error;
|
||||||
bool list;
|
bool list;
|
||||||
bool nonewlines;
|
bool nonewlines;
|
||||||
|
bool overrideVersion;
|
||||||
|
bool nodashes;
|
||||||
|
|
||||||
MODE applicationMode;
|
MODE applicationMode;
|
||||||
ACTIVATION_ALGORITHM activationMode;
|
ACTIVATION_ALGORITHM activationMode;
|
||||||
@ -92,7 +94,7 @@ public:
|
|||||||
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);
|
||||||
static void printKey(char *pk);
|
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();
|
||||||
|
@ -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
|
||||||
@ -773,7 +783,7 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid)
|
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid, bool overrideVersion)
|
||||||
{
|
{
|
||||||
int version;
|
int version;
|
||||||
unsigned char hardwareID[8];
|
unsigned char hardwareID[8];
|
||||||
@ -870,7 +880,7 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
iid_key[3] = 0xF3;
|
iid_key[3] = 0xF3;
|
||||||
}
|
}
|
||||||
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
||||||
if (installation_id[18] >= 0x10)
|
if (installation_id[18] >= 0x10 && overrideVersion == false)
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
@ -891,6 +901,7 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
productID[2] = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
|
productID[2] = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
|
||||||
version = (parsed.ProductIDLow >> 51) & 15;
|
version = (parsed.ProductIDLow >> 51) & 15;
|
||||||
productID[3] = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
productID[3] = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
||||||
|
if (overrideVersion == false) {
|
||||||
switch (activationMode) {
|
switch (activationMode) {
|
||||||
case 0:
|
case 0:
|
||||||
if (version != (totalCount == 41 ? 9 : 10))
|
if (version != (totalCount == 41 ? 9 : 10))
|
||||||
@ -904,10 +915,13 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
if (version != 4)
|
if (version != 4)
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
decode_iid_new_version(installation_id, hardwareID, &version);
|
decode_iid_new_version(installation_id, hardwareID, &version);
|
||||||
|
if (overrideVersion == false) {
|
||||||
switch (activationMode) {
|
switch (activationMode) {
|
||||||
case 2:
|
case 2:
|
||||||
if (version != 3)
|
if (version != 3)
|
||||||
@ -916,6 +930,8 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
case 3:
|
case 3:
|
||||||
if (version != 4)
|
if (version != 4)
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
memcpy(&parsed, hardwareID, 8);
|
memcpy(&parsed, hardwareID, 8);
|
||||||
productID[0] = stoi(productid.substr(0,5));
|
productID[0] = stoi(productid.substr(0,5));
|
||||||
|
@ -66,7 +66,7 @@ EXPORT class ConfirmationID {
|
|||||||
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid);
|
static int Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid, bool overrideVersion);
|
||||||
//EXPORT static int CLIRun();
|
//EXPORT static int CLIRun();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
#include "pidgen3/BINK2002.h"
|
#include "pidgen3/BINK2002.h"
|
||||||
#include "pidgen2/PIDGEN2.h"
|
#include "pidgen2/PIDGEN2.h"
|
||||||
|
|
||||||
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid) {
|
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid, bool bypassVersion) {
|
||||||
return ConfirmationID::Generate(installation_id_str, confirmation_id, mode, productid);
|
return ConfirmationID::Generate(installation_id_str, confirmation_id, mode, productid, bypassVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
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,3 +58,115 @@ 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
|
||||||
|
}
|
||||||
|
@ -38,6 +38,10 @@
|
|||||||
#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
|
||||||
@ -56,9 +60,31 @@
|
|||||||
#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
|
||||||
|
#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;
|
||||||
@ -67,7 +93,10 @@ 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
|
||||||
|
@ -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,12 +267,14 @@ 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.
|
||||||
BN_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
|
UMSKT::umskt_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;
|
||||||
@ -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:
|
||||||
|
@ -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.
|
||||||
BN_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
|
UMSKT::umskt_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);
|
||||||
|
@ -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.
Reference in New Issue
Block a user