mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2025-07-10 22:30:22 +03:00
Compare commits
226 Commits
dos-window
...
v0.3.2-bet
Author | SHA1 | Date | |
---|---|---|---|
ed19cf2148 | |||
4de84b6439 | |||
827c26bc45 | |||
a0e7a2561f | |||
8d92cc123d | |||
7af4a1fbcf | |||
2796923983 | |||
6fda0c9ab8 | |||
5e9ebe10cd | |||
f216019046 | |||
9663669c0c | |||
af35f41c3f | |||
0a4561b1cd | |||
fe8e7c72e0 | |||
f630ed1e53 | |||
7c8a7dd54c | |||
befe149285 | |||
5eb3ed11f8 | |||
f3be9fb950 | |||
761ba76081 | |||
c072d096f3 | |||
1002e0a6d5 | |||
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 | |||
d378c6499e | |||
3ea8731271 | |||
018f9f533c | |||
f1f1e0e6ea | |||
c4b63c15b2 | |||
1548e14169 | |||
72d48dd38b | |||
00d4906b28 | |||
88f60630c1 | |||
2ac6920e2c | |||
8f843ad4c3 | |||
2753bf2a40 | |||
d17ada2e64 | |||
6685b38aac | |||
884d8c9703 | |||
5ba2dbddd4 | |||
bf40bb6402 | |||
12a041c380 | |||
ecd9cd8dd2 | |||
6989ae6c94 | |||
ac510f8253 | |||
72c42f66c9 | |||
759c4009ef | |||
78c358c933 | |||
1d5e233c19 | |||
6c06732331 | |||
f347231362 | |||
a7e97e45ee | |||
bf57c32eae | |||
25db955b61 | |||
1aeceb28f1 | |||
b451a04f3c | |||
3e5e03df4d | |||
e3bdc93249 | |||
36b2eb3e7d | |||
49fefca596 | |||
178c9e0689 | |||
214d2d38a5 | |||
3ae078e3c5 | |||
12e511b3a5 | |||
21bac3b66c | |||
09842ace12 | |||
0d016b8872 | |||
b1743f4bff | |||
cc765edb4f | |||
4d1b5d6681 | |||
f59d77bdd1 | |||
71cbd19017 | |||
974f400cfc | |||
a2d521c230 | |||
d53409f5bd | |||
2703e17f69 | |||
680239bdb7 | |||
104bdb19e3 | |||
f2f859faeb | |||
a2d9c46a4b | |||
f65533bbb3 | |||
90e31b667a | |||
492d245f86 | |||
361a39e204 | |||
31993afb62 | |||
b3f64e6330 | |||
ccf93a0089 | |||
ae391a5e50 | |||
3620cf5af6 | |||
33774f7ad2 | |||
06ed5ef240 | |||
161aa2de4c | |||
a50688657d | |||
1679583e64 | |||
02c85b50b1 | |||
93732e152b | |||
95803054ba | |||
8619fccb11 | |||
06b9d937b1 | |||
453151f20f | |||
1bb00cf53d | |||
a787fc8e85 | |||
582ddf1bb8 | |||
13bf69c7e1 | |||
b7965f19e8 | |||
52c9a57ea2 | |||
283df1c1fe | |||
c1eb81490b | |||
2ee6a99acd | |||
1370a6ecff | |||
e3a6b78407 | |||
9fec269ad0 | |||
6ae5c9e435 | |||
a6bfaed6e8 | |||
f7b41a9810 | |||
e76eb7ac33 | |||
c91bbad69a | |||
75e81e7049 | |||
e9131e45c8 | |||
c664ea7f9c | |||
f95501b789 | |||
444f8c45c7 | |||
de09feb18f | |||
bde4371cbe | |||
f43a2d5c37 | |||
46c39df15d | |||
c078247bea | |||
232be6aba2 | |||
c0c3149be7 | |||
8e15a4f5b8 | |||
d411d56d81 | |||
11253c5e2c | |||
9f7920ca2d | |||
9063e32a89 | |||
958169ccb5 | |||
63fbbd83ef | |||
de659846d4 | |||
7c4bcdc847 | |||
859a21656c | |||
4b2ef7ac72 | |||
216c9cdf9d | |||
8f685a022c | |||
e4058ddf19 | |||
45004623be | |||
a4cb524fed | |||
03ae90163a | |||
c1e9a0f021 | |||
152c03456c | |||
ea51438766 | |||
8ee1acc2be | |||
3134a6f7a3 | |||
b75d08b3be | |||
20c84661b2 | |||
fefc8552b6 |
155
.github/workflows/dos-djgpp.yml
vendored
155
.github/workflows/dos-djgpp.yml
vendored
@ -20,70 +20,171 @@
|
|||||||
|
|
||||||
name: C/C++ CI (DOS DJGPP)
|
name: C/C++ CI (DOS DJGPP)
|
||||||
|
|
||||||
on: workflow_dispatch
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "*" ]
|
||||||
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CMAKE_C_COMPILER: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
|
CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
|
||||||
CMAKE_CXX_COMPILER: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-g++
|
CXX: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-g++
|
||||||
CMAKE_FIND_ROOT_PATH: ${{ github.workspace }}/djgpp
|
CMAKE_FIND_ROOT_PATH: ${{ github.workspace }}/djgpp
|
||||||
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: NEVER
|
|
||||||
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: ONLY
|
|
||||||
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: ONLY
|
|
||||||
CMAKE_FIND_ROOT_PATH_MODE_PACKAGE: ONLY
|
|
||||||
WATT_ROOT: ${{ github.workspace }}/djgpp/watt32
|
WATT_ROOT: ${{ github.workspace }}/djgpp/watt32
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: Checkout Source Tree
|
||||||
|
uses: actions/checkout@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 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 tree
|
||||||
|
|
||||||
- name: Download and Setup DJGPP Toolchain
|
- name: Download and Setup DJGPP Toolchain
|
||||||
run: |
|
run: |
|
||||||
|
pushd ${{ github.workspace }}
|
||||||
wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/djgpp-linux64-gcc1220.tar.bz2
|
wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/djgpp-linux64-gcc1220.tar.bz2
|
||||||
tar xjf djgpp-linux64-gcc1220.tar.bz2
|
tar xjf djgpp-linux64-gcc1220.tar.bz2
|
||||||
cd ${{ github.workspace }}/djgpp
|
cd ${{ github.workspace }}/djgpp
|
||||||
|
tree . -S
|
||||||
git clone https://github.com/UMSKT/Watt-32.git watt32
|
git clone https://github.com/UMSKT/Watt-32.git watt32
|
||||||
cd watt32/util
|
cd watt32/util
|
||||||
make clean && make linux
|
make clean && make linux
|
||||||
cd ../src
|
cd ../src
|
||||||
source ${{ github.workspace }}/djgpp/setenv.sh
|
source ${{ github.workspace }}/djgpp/setenv
|
||||||
./configur.sh djgpp
|
./configur.sh djgpp
|
||||||
make -f djgpp.mak
|
make -f djgpp.mak
|
||||||
ln -s ${{ github.workspace }}/djgpp/watt32/lib/libwatt.a ${{ github.workspace }}/djgpp/lib
|
ln -s ${WATT_ROOT}/lib/libwatt.a ${{ github.workspace }}/djgpp/lib
|
||||||
|
|
||||||
- name: Checkout and Cross Compile OpenSSL 3.1
|
- 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
|
||||||
|
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
|
||||||
git checkout openssl-3.1.1
|
|
||||||
source ${{ github.workspace }}/djgpp/setenv
|
source ${{ github.workspace }}/djgpp/setenv
|
||||||
./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
|
./Configure 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: Checkout Source Tree
|
- name: Save OpenSSL 3.1.2
|
||||||
uses: actions/checkout@v3
|
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: Download stub
|
||||||
|
run: |
|
||||||
|
wget https://web.archive.org/web/20250308092209/https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/util/system/cwsdpmi/csdpmi7b.zip -O CSDPMI7B.ZIP
|
||||||
|
mkdir /home/runner/dpmibin
|
||||||
|
7z e CSDPMI7B.ZIP bin/CWSDSTUB.EXE -o/home/runner/dpmibin
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
uses: threeal/cmake-action@v1.2.0
|
run: |
|
||||||
with:
|
source ${{ github.workspace }}/djgpp/setenv
|
||||||
c-compiler: ${{ github.workspace }}/djgpp/i586-pc-msdosdjgpp/bin/gcc
|
pushd build
|
||||||
cxx-compiler: ${{ github.workspace }}/djgpp/i586-pc-msdosdjgpp/bin/g++
|
cmake ../ -D DJGPP_WATT32=${WATT_ROOT}/lib/libwatt.a -D CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH} -D CWSDSTUB_LOCATION=/home/runner/dpmibin/CWSDSTUB.EXE -D DJGPP_BIN_LOCATION=/home/runner/work/UMSKT/UMSKT/djgpp/i586-pc-msdosdjgpp/bin
|
||||||
options: OPENSSL_ROOT_DIR:string=${{ github.workspace }}/djgpp DJGPP_WATT32=ON
|
make
|
||||||
run-build: true
|
|
||||||
|
|
||||||
- name: Move files to correct directory
|
- 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 > 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]
|
||||||
|
cputype=386
|
||||||
|
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
|
||||||
run: |
|
run: |
|
||||||
mkdir build/actions_upload
|
mkdir build/actions_upload
|
||||||
tar -czf WindowsXPKg_linux_x86_64.tar.gz -C build xpkey keys.json
|
mv build/umskt.exe build/actions_upload/
|
||||||
mv WindowsXPKg_linux_x86_64.tgz 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: Build
|
name: UMSKT-DOS-x86
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
68
.github/workflows/freebsd.yml
vendored
Normal file
68
.github/workflows/freebsd.yml
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# This file is a part of the UMSKT Project
|
||||||
|
#
|
||||||
|
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# @FileCreated by techguy16 on 07/23/2023
|
||||||
|
# @Maintainer techguy16
|
||||||
|
|
||||||
|
name: C/C++ CI (FreeBSD)
|
||||||
|
|
||||||
|
on:
|
||||||
|
#push:
|
||||||
|
# branches: [ "*" ]
|
||||||
|
# paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
|
#pull_request:
|
||||||
|
# branches: [ "*" ]
|
||||||
|
# paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: build-x86_64
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build & Test in FreeBSD
|
||||||
|
id: test
|
||||||
|
uses: vmactions/freebsd-vm@v1
|
||||||
|
with:
|
||||||
|
envs: 'MYTOKEN MYTOKEN2'
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
pkg install -y cmake openssl git bash
|
||||||
|
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
make
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
|
||||||
|
- name: Move files to correct directory
|
||||||
|
run: |
|
||||||
|
mkdir -p build/actions_upload
|
||||||
|
mv build/umskt build/actions_upload/umskt
|
||||||
|
|
||||||
|
- name: Upload build artifact
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: UMSKT-FreeBSD
|
||||||
|
path: build/actions_upload
|
127
.github/workflows/linux.yml
vendored
127
.github/workflows/linux.yml
vendored
@ -22,24 +22,31 @@ name: C/C++ CI (Linux)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: [ "*" ]
|
||||||
pull_request:
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
branches: [ "master" ]
|
workflow_dispatch:
|
||||||
|
|
||||||
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: >
|
||||||
@ -50,23 +57,125 @@ jobs:
|
|||||||
musl-dev
|
musl-dev
|
||||||
openssl-dev
|
openssl-dev
|
||||||
openssl-libs-static
|
openssl-libs-static
|
||||||
|
zlib-dev
|
||||||
arch: ${{ matrix.arch }}
|
arch: ${{ matrix.arch }}
|
||||||
shell-name: alpine-target.sh
|
shell-name: alpine-target.sh
|
||||||
|
|
||||||
- name: 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
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
shell: alpine-target.sh {0}
|
||||||
|
|
||||||
|
- name: Test UMSKT (Ubuntu)
|
||||||
|
if: ${{ !matrix.use_alpine }}
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./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 (Alpine)
|
||||||
|
if: ${{ matrix.use_alpine }}
|
||||||
|
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
|
||||||
|
with:
|
||||||
|
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
|
||||||
|
run-build: true
|
||||||
|
shell: alpine-target.sh {0}
|
||||||
|
|
||||||
|
- name: Configure and build static internal deps UMSKT (Ubuntu)
|
||||||
|
if: ${{ !matrix.use_alpine }}
|
||||||
|
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
|
||||||
|
with:
|
||||||
|
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
|
||||||
|
run-build: true
|
||||||
|
|
||||||
|
- name: Test static internal deps UMSKT (Alpine)
|
||||||
|
if: ${{ matrix.use_alpine }}
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
shell: alpine-target.sh {0}
|
||||||
|
|
||||||
|
- name: Test static internal deps UMSKT (Ubuntu)
|
||||||
|
if: ${{ !matrix.use_alpine }}
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
|
||||||
|
- name: Configure and build shared deps UMSKT (Alpine)
|
||||||
|
if: ${{ matrix.use_alpine }}
|
||||||
|
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
|
||||||
|
with:
|
||||||
|
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
|
||||||
|
run-build: true
|
||||||
|
shell: alpine-target.sh {0}
|
||||||
|
|
||||||
|
- name: Configure and build shared deps UMSKT (Ubuntu)
|
||||||
|
if: ${{ !matrix.use_alpine }}
|
||||||
|
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
|
||||||
|
with:
|
||||||
|
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
|
||||||
|
run-build: true
|
||||||
|
|
||||||
|
- name: Test shared deps UMSKT (Alpine)
|
||||||
|
if: ${{ matrix.use_alpine }}
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
shell: alpine-target.sh {0}
|
||||||
|
|
||||||
|
- name: Test shared deps UMSKT (Ubuntu)
|
||||||
|
if: ${{ !matrix.use_alpine }}
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
123
.github/workflows/macos.yml
vendored
Normal file
123
.github/workflows/macos.yml
vendored
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
# This file is a part of the UMSKT Project
|
||||||
|
#
|
||||||
|
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# @FileCreated by techguy16 on 07/23/2023
|
||||||
|
# @Maintainer techguy16
|
||||||
|
|
||||||
|
name: C/C++ CI (macOS)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "*" ]
|
||||||
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: macos-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x86_64
|
||||||
|
- arch: arm64
|
||||||
|
steps:
|
||||||
|
- name: Checkout Source Tree
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Rosetta
|
||||||
|
if: matrix.arch == 'x86_64'
|
||||||
|
run: |
|
||||||
|
sudo softwareupdate --install-rosetta --agree-to-license || true
|
||||||
|
|
||||||
|
- name: Install Homebrew for x86_64
|
||||||
|
if: matrix.arch == 'x86_64'
|
||||||
|
env: { NONINTERACTIVE: 1 }
|
||||||
|
run: |
|
||||||
|
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
|
|
||||||
|
- name: Install x86_64 OpenSSL
|
||||||
|
if: matrix.arch == 'x86_64'
|
||||||
|
run: |
|
||||||
|
arch -x86_64 /usr/local/bin/brew install openssl@3
|
||||||
|
echo "OPENSSL_ROOT_DIR=/usr/local/opt/openssl@3" >> $GITHUB_ENV
|
||||||
|
echo "OPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@3/include" >> $GITHUB_ENV
|
||||||
|
echo "PKG_CONFIG_PATH=/usr/local/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Install arm64 OpenSSL
|
||||||
|
if: matrix.arch == 'arm64'
|
||||||
|
run: |
|
||||||
|
brew install openssl@3
|
||||||
|
echo "OPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3" >> $GITHUB_ENV
|
||||||
|
echo "OPENSSL_INCLUDE_DIR=/opt/homebrew/opt/openssl@3/include" >> $GITHUB_ENV
|
||||||
|
echo "PKG_CONFIG_PATH=/opt/homebrew/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Configure and build UMSKT
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${{matrix.arch}} \
|
||||||
|
-DOPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR \
|
||||||
|
-DOPENSSL_INCLUDE_DIR=$OPENSSL_INCLUDE_DIR \
|
||||||
|
-DOPENSSL_USE_STATIC_LIBS=TRUE \
|
||||||
|
-DBUILD_SHARED_LIBS=OFF
|
||||||
|
make
|
||||||
|
|
||||||
|
- name: Move files to correct directory
|
||||||
|
run: |
|
||||||
|
ls -a build
|
||||||
|
mkdir -p build/actions_upload
|
||||||
|
mv build/umskt build/actions_upload/umskt
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
cd build/actions_upload
|
||||||
|
echo Test 1 - generating key
|
||||||
|
./umskt -b 2C -c 365 -s 069420 -v
|
||||||
|
echo Test 2 - generating confid
|
||||||
|
./umskt -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
|
||||||
|
- name: Upload platform-specific build
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: UMSKT-macOS-${{ matrix.arch }}
|
||||||
|
path: build/actions_upload
|
||||||
|
|
||||||
|
universal:
|
||||||
|
needs: build
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- name: Download x86_64 slice
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: UMSKT-macOS-x86_64
|
||||||
|
path: x86
|
||||||
|
- name: Download arm64 slice
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: UMSKT-macOS-arm64
|
||||||
|
path: arm
|
||||||
|
- name: Create universal binary
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir fat
|
||||||
|
lipo -create x86/umskt arm/umskt -output fat/umskt
|
||||||
|
lipo -info fat/umskt
|
||||||
|
- name: Upload universal build
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: UMSKT-macOS-universal
|
||||||
|
path: fat
|
182
.github/workflows/windows-arm.yml
vendored
Normal file
182
.github/workflows/windows-arm.yml
vendored
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
# This file is a part of the UMSKT Project
|
||||||
|
#
|
||||||
|
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# @FileCreated by TheTank20 on 07/08/2025
|
||||||
|
# @Maintainer Neo
|
||||||
|
|
||||||
|
name: C/C++ CI (Windows ARM)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "*" ]
|
||||||
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**']
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: windows-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: arm32
|
||||||
|
arch_compilename: amd64_arm
|
||||||
|
vcpkg_arch: arm-windows-static
|
||||||
|
cmake_arch: ARM
|
||||||
|
sdk_version: '10.0.17763.0'
|
||||||
|
- arch: arm64
|
||||||
|
arch_compilename: arm64
|
||||||
|
vcpkg_arch: arm64-windows-static
|
||||||
|
cmake_arch: ARM64
|
||||||
|
sdk_version: '10.0.17763.0'
|
||||||
|
steps:
|
||||||
|
- name: Setup MSVC for ${{ matrix.arch }}
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: ${{ matrix.arch_compilename }}
|
||||||
|
sdk: ${{ matrix.sdk_version }}
|
||||||
|
|
||||||
|
- name: Checkout Source Tree
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup vcpkg
|
||||||
|
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-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}-${{ hashFiles('**/*.cmake') }}
|
||||||
|
restore-keys: |
|
||||||
|
vcpkg-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}-
|
||||||
|
vcpkg-${{ matrix.arch }}-
|
||||||
|
|
||||||
|
- name: Cache OpenSSL Binaries
|
||||||
|
if: matrix.arch == 'arm32'
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/openssl-install
|
||||||
|
key: openssl-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
restore-keys: |
|
||||||
|
|
||||||
|
- name: Install OpenSSL
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
if ("${{ matrix.arch }}" -eq "arm32") {
|
||||||
|
# For ARM32, build OpenSSL from source
|
||||||
|
$opensslVersion = "1.1.1w"
|
||||||
|
$opensslDir = "openssl-src"
|
||||||
|
|
||||||
|
# Download OpenSSL source
|
||||||
|
Invoke-WebRequest -Uri "https://www.openssl.org/source/openssl-$opensslVersion.tar.gz" -OutFile "openssl.tar.gz"
|
||||||
|
tar -xf openssl.tar.gz
|
||||||
|
Rename-Item -Path "openssl-$opensslVersion" -NewName $opensslDir
|
||||||
|
cd $opensslDir
|
||||||
|
|
||||||
|
# Install Perl if needed
|
||||||
|
choco install strawberryperl -y
|
||||||
|
|
||||||
|
# Configure and build OpenSSL for ARM32
|
||||||
|
$env:PATH = "C:\Strawberry\perl\bin;$env:PATH"
|
||||||
|
|
||||||
|
# First set up Visual Studio environment
|
||||||
|
$vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath
|
||||||
|
$vcvarsall = Join-Path $vsPath "VC\Auxiliary\Build\vcvarsall.bat"
|
||||||
|
|
||||||
|
# Configure OpenSSL
|
||||||
|
perl Configure VC-WIN32-ARM no-shared no-asm no-engine --prefix="$env:GITHUB_WORKSPACE/openssl-install"
|
||||||
|
|
||||||
|
# Build using MSVC ARM32 tools
|
||||||
|
cmd /c "call `"$vcvarsall`" amd64_arm && nmake && nmake install_sw"
|
||||||
|
cd ..
|
||||||
|
} else {
|
||||||
|
# For ARM64, use vcpkg as before
|
||||||
|
New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE
|
||||||
|
& "$env:VCPKG_ROOT\vcpkg.exe" install openssl:${{ matrix.vcpkg_arch }} --clean-after-build
|
||||||
|
echo "OPENSSL_ROOT_DIR=$env:VCPKG_ROOT/installed/${{ matrix.vcpkg_arch }}" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Save OpenSSL Binaries
|
||||||
|
if: matrix.arch == 'arm32'
|
||||||
|
uses: actions/cache/save@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/openssl-install
|
||||||
|
key: openssl-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
|
||||||
|
- name: Set OpenSSL Environment
|
||||||
|
if: matrix.arch == 'arm32'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
echo "OPENSSL_ROOT=$env:GITHUB_WORKSPACE/openssl-install" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
echo "OPENSSL_LIBDIR=lib" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
|
||||||
|
- name: Configure UMSKT
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
cmake -G "Visual Studio 17 2022" `
|
||||||
|
-A ${{ matrix.cmake_arch }} `
|
||||||
|
-DWINDOWS_ARM=ON `
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" `
|
||||||
|
-DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_arch }} `
|
||||||
|
.
|
||||||
|
|
||||||
|
- name: Build UMSKT
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
cmake --build . --config Release
|
||||||
|
|
||||||
|
- name: Upload build artifact
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: UMSKT-WinNT-${{ matrix.arch }}
|
||||||
|
path: Release/umskt.exe
|
||||||
|
|
||||||
|
test-arm64:
|
||||||
|
needs: build
|
||||||
|
if: success()
|
||||||
|
runs-on: windows-11-arm
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
arch: [arm64]
|
||||||
|
steps:
|
||||||
|
- name: Download ARM64 artifact
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: UMSKT-WinNT-${{ matrix.arch }}
|
||||||
|
path: .
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Write-Host Test 1 - generating key
|
||||||
|
.\umskt.exe -b 2C -c 365 -s 069420 -v
|
||||||
|
Write-Host Test 2 - generatng confid
|
||||||
|
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574
|
199
.github/workflows/windows-x86-x64.yml
vendored
Normal file
199
.github/workflows/windows-x86-x64.yml
vendored
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
# This file is a part of the UMSKT Project
|
||||||
|
#
|
||||||
|
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# @FileCreated by TheTank20 on 07/08/2025
|
||||||
|
# @Maintainer Neo
|
||||||
|
|
||||||
|
name: C/C++ CI (Windows x86+64)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "*" ]
|
||||||
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**']
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: windows-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
arch: [x64, x86]
|
||||||
|
steps:
|
||||||
|
- name: Setup TDM-GCC
|
||||||
|
run: |
|
||||||
|
Write-Host Downloading TDM-GCC v10.3.0...
|
||||||
|
Invoke-WebRequest -Uri 'https://github.com/jmeubank/tdm-gcc/releases/download/v10.3.0-tdm64-2/tdm64-gcc-10.3.0-2.exe' -OutFile 'C:\Windows\temp\TDM-GCC-64.exe'
|
||||||
|
Write-Host Creating directory...
|
||||||
|
New-Item -ItemType Directory -Path 'C:\TDM-GCC-64'
|
||||||
|
Write-Host Copying files [Set 1/3]...
|
||||||
|
Start-Process '7z' -ArgumentList 'e C:\Windows\temp\TDM-GCC-64.exe -oC:\TDM-GCC-64 -y' -Wait
|
||||||
|
Write-Host Copying files [Set 2/3]...
|
||||||
|
Start-Process '7z' -ArgumentList 'e C:\TDM-GCC-64\*.tar.xz -oC:\TDM-GCC-64 -y' -Wait
|
||||||
|
Write-Host Copying files [Set 3/3]...
|
||||||
|
Start-Process '7z' -ArgumentList 'x C:\TDM-GCC-64\*.tar -oC:\TDM-GCC-64 -y' -Wait
|
||||||
|
Write-Host Adding environment variables...
|
||||||
|
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||||
|
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
|
||||||
|
|
||||||
|
- name: Checkout Source Tree
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Cache OpenSSL 3.1.2 (32-bit)
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
if: matrix.arch == 'x86'
|
||||||
|
id: cache-openssl-32
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/OpenSSL-TDM-32
|
||||||
|
key: openssl-3.1.2-x86-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
|
||||||
|
- name: Cache OpenSSL 3.1.2 (64-bit)
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
if: matrix.arch == 'x64'
|
||||||
|
id: cache-openssl-64
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/OpenSSL-TDM-64
|
||||||
|
key: openssl-3.1.2-x64-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
|
||||||
|
- name: Setup MSYS2
|
||||||
|
if: steps.cache-openssl-32.outputs.cache-hit != 'true' && steps.cache-openssl-64.outputs.cache-hit != 'true'
|
||||||
|
uses: msys2/setup-msys2@v2
|
||||||
|
with:
|
||||||
|
msystem: ${{ matrix.arch == 'x86' && 'MINGW32' || 'MINGW64' }}
|
||||||
|
update: true
|
||||||
|
install: >-
|
||||||
|
mingw-w64-${{ matrix.arch == 'x86' && 'i686' || 'x86_64' }}-gcc
|
||||||
|
mingw-w64-${{ matrix.arch == 'x86' && 'i686' || 'x86_64' }}-make
|
||||||
|
mingw-w64-x86_64-perl
|
||||||
|
perl
|
||||||
|
git
|
||||||
|
|
||||||
|
- name: Checkout and Compile OpenSSL 3.1.2
|
||||||
|
if: steps.cache-openssl-32.outputs.cache-hit != 'true' && steps.cache-openssl-64.outputs.cache-hit != 'true'
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
# Clone UMSKT's OpenSSL fork
|
||||||
|
echo "Cloning UMSKT OpenSSL fork..."
|
||||||
|
git clone https://github.com/UMSKT/openssl.git --depth 1 openssl-3.1.2
|
||||||
|
|
||||||
|
- name: Checkout and Compile OpenSSL 3.1.2 (32-bit)
|
||||||
|
if: matrix.arch == 'x86' && steps.cache-openssl-32.outputs.cache-hit != 'true'
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
# Set up proper MSYS2 environment
|
||||||
|
export MSYS=winsymlinks:nativestrict
|
||||||
|
export MSYS2_PATH_TYPE=strict
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
export PATH="/usr/bin:/mingw64/bin:$PATH"
|
||||||
|
export PATH="/c/TDM-GCC-64/bin:$PATH"
|
||||||
|
export MSYSTEM=MINGW32
|
||||||
|
echo "Compiling 32-bit OpenSSL..."
|
||||||
|
cd openssl-3.1.2
|
||||||
|
/usr/bin/perl Configure mingw --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-32 --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-32 no-tests no-sse2 no-asm no-threads -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i686 -mtune=generic
|
||||||
|
mingw32-make -j
|
||||||
|
mingw32-make install_sw
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
- name: Checkout and Compile OpenSSL 3.1.2 (64-bit)
|
||||||
|
if: matrix.arch == 'x64' && steps.cache-openssl-64.outputs.cache-hit != 'true'
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
# Set up proper MSYS2 environment
|
||||||
|
export MSYS=winsymlinks:nativestrict
|
||||||
|
export MSYS2_PATH_TYPE=strict
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
export PATH="/usr/bin:/mingw64/bin:$PATH"
|
||||||
|
export PATH="/c/TDM-GCC-64/bin:$PATH"
|
||||||
|
export MSYSTEM=MINGW64
|
||||||
|
echo "Compiling 64-bit OpenSSL..."
|
||||||
|
cd openssl-3.1.2
|
||||||
|
/usr/bin/perl Configure mingw64 --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-64 --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-64 no-tests no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx
|
||||||
|
mingw32-make -j
|
||||||
|
mingw32-make install_sw
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
- name: Save OpenSSL 3.1.2 (32-bit)
|
||||||
|
if: matrix.arch == 'x86' && steps.cache-openssl-32.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/cache/save@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/OpenSSL-TDM-32
|
||||||
|
key: openssl-3.1.2-x86-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
|
||||||
|
- name: Save OpenSSL 3.1.2 (64-bit)
|
||||||
|
if: matrix.arch == 'x64' && steps.cache-openssl-64.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/cache/save@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/OpenSSL-TDM-64
|
||||||
|
key: openssl-3.1.2-x64-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
|
||||||
|
- name: Set OpenSSL Environment (32-bit)
|
||||||
|
if: matrix.arch == 'x86'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
echo "OPENSSL_ROOT=$env:GITHUB_WORKSPACE/OpenSSL-TDM-32" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
echo "OPENSSL_LIBDIR=lib" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
echo "CMAKE_FLAGS=-m32" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
|
||||||
|
- name: Set OpenSSL Environment (64-bit)
|
||||||
|
if: matrix.arch == 'x64'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
echo "OPENSSL_ROOT=$env:GITHUB_WORKSPACE/OpenSSL-TDM-64" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
echo "OPENSSL_LIBDIR=lib" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
echo "CMAKE_FLAGS=-m64" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||||
|
|
||||||
|
- name: Configure UMSKT
|
||||||
|
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: Build UMSKT
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||||
|
mingw32-make
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Write-Host Test 1 - generating key
|
||||||
|
.\umskt.exe -b 2C -c 365 -s 069420 -v
|
||||||
|
Write-Host Test 2 - generatng confid
|
||||||
|
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574
|
||||||
|
|
||||||
|
- name: Upload build artifact
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: UMSKT-WinNT-${{ matrix.arch }}
|
||||||
|
path: umskt.exe
|
116
.github/workflows/windows.yml
vendored
116
.github/workflows/windows.yml
vendored
@ -1,116 +0,0 @@
|
|||||||
# This file is a part of the UMSKT Project
|
|
||||||
#
|
|
||||||
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU Affero General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU Affero General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# @FileCreated by TheTank20 on 06/13/2023
|
|
||||||
# @Maintainer Neo
|
|
||||||
|
|
||||||
name: C/C++ CI (Windows)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "master" ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ "master" ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-32bit:
|
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
|
||||||
- name: Install v141_xp
|
|
||||||
uses: thepwrtank18/install-vs-components@v1.0.0
|
|
||||||
with:
|
|
||||||
components: Microsoft.VisualStudio.Component.WinXP
|
|
||||||
|
|
||||||
- name: Download And Install 32-bit OpenSSL 3.1.1
|
|
||||||
run: |
|
|
||||||
$installDir = "$Env:ProgramFiles\OpenSSL"
|
|
||||||
$installerURL = "https://slproweb.com/download/Win32OpenSSL-3_1_1.exe"
|
|
||||||
$installerName = "Win32OpenSSL-3_1_1.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:
|
|
||||||
working-directory: build
|
|
||||||
generator: "Visual Studio 17 2022"
|
|
||||||
options: CMAKE_SYSTEM_VERSION="5.1.2600"
|
|
||||||
args: -A "Win32" -T v141_xp
|
|
||||||
|
|
||||||
- name: Build UMSKT
|
|
||||||
working-directory: build
|
|
||||||
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release /P:XPDeprecationWarning=false
|
|
||||||
|
|
||||||
- name: Upload build artifact
|
|
||||||
uses: actions/upload-artifact@v3.1.2
|
|
||||||
with:
|
|
||||||
name: UMSKT-Win32
|
|
||||||
path: build/Release
|
|
||||||
|
|
||||||
build-64bit:
|
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
|
||||||
- name: Install v141_xp
|
|
||||||
uses: thepwrtank18/install-vs-components@v1.0.0
|
|
||||||
with:
|
|
||||||
components: Microsoft.VisualStudio.Component.WinXP
|
|
||||||
|
|
||||||
- name: Download And Install 64-bit OpenSSL 3.1.1
|
|
||||||
run: |
|
|
||||||
$installDir = "$Env:ProgramFiles\OpenSSL"
|
|
||||||
$installerURL = "https://slproweb.com/download/Win64OpenSSL-3_1_1.exe"
|
|
||||||
$installerName = "Win64OpenSSL-3_1_1.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:
|
|
||||||
generator: "Visual Studio 17 2022"
|
|
||||||
args: -A "x64" -T v141_xp
|
|
||||||
|
|
||||||
- name: Build UMSKT
|
|
||||||
working-directory: build
|
|
||||||
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release /P:XPDeprecationWarning=false
|
|
||||||
|
|
||||||
- name: Upload build artifact
|
|
||||||
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
|
183
CMakeLists.txt
183
CMakeLists.txt
@ -20,48 +20,104 @@
|
|||||||
|
|
||||||
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 --target=pe-i386")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686 -mtune=generic -mno-sse -mno-sse2 -mno-mmx -mno-3dnow")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686 -mtune=generic -mno-sse -mno-sse2 -mno-mmx -mno-3dnow")
|
||||||
|
else()
|
||||||
|
set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -F pe-x86-64 --target=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_POSITION_INDEPENDENT_CODE ON)
|
SET(CMAKE_OSX_SYSROOT "macosx" CACHE PATH "macOS SDK path")
|
||||||
|
|
||||||
|
OPTION(BUILD_SHARED_LIBS "Build internal libraries as dynamic" OFF)
|
||||||
OPTION(UMSKT_USE_SHARED_OPENSSL "Force linking against the system-wide OpenSSL library" OFF)
|
OPTION(UMSKT_USE_SHARED_OPENSSL "Force linking against the system-wide OpenSSL library" OFF)
|
||||||
OPTION(MUSL_STATIC "Enable fully static builds in a muslc environment (i.e. Alpine Linux)" OFF)
|
OPTION(MUSL_STATIC "Enable fully static builds in a muslc environment (i.e. Alpine Linux)" OFF)
|
||||||
OPTION(DJGPP_WATT32 "Enable compilation and linking with DJGPP/WATT32/OpenSSL" OFF)
|
OPTION(DJGPP_WATT32 "Enable compilation and linking with DJGPP/WATT32/OpenSSL" OFF)
|
||||||
OPTION(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilation" OFF)
|
OPTION(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilation" OFF)
|
||||||
|
OPTION(WINDOWS_ARM "Enable compilation for Windows on ARM (requires appropriate toolchain)" OFF)
|
||||||
|
|
||||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
||||||
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
||||||
|
|
||||||
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# neither does dos idk i'm trying random stuff
|
||||||
|
if (DJGPP_WATT32)
|
||||||
|
SET(UMSKT_USE_SHARED_OPENSSL ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(UMSKT_USE_SHARED_OPENSSL)
|
IF(UMSKT_USE_SHARED_OPENSSL)
|
||||||
SET(OPENSSL_USE_STATIC_LIBS FALSE)
|
SET(OPENSSL_USE_STATIC_LIBS FALSE)
|
||||||
SET(OPENSSL_MSVC_STATIC_RT FALSE)
|
SET(OPENSSL_MSVC_STATIC_RT FALSE)
|
||||||
MESSAGE(WARNING "[UMSKT] Forcing shared OpenSSL runtime")
|
MESSAGE(STATUS "[UMSKT] Requesting dynamic version of OpenSSL")
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(OPENSSL_USE_STATIC_LIBS TRUE)
|
SET(OPENSSL_USE_STATIC_LIBS TRUE)
|
||||||
SET(OPENSSL_MSVC_STATIC_RT TRUE)
|
SET(OPENSSL_MSVC_STATIC_RT TRUE)
|
||||||
|
MESSAGE(STATUS "[UMSKT] Requesting static version of OpenSSL")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
# Configure ARM-specific settings if enabled
|
||||||
|
if (WINDOWS_ARM)
|
||||||
|
if (MSVC)
|
||||||
|
# MSVC ARM64 settings
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR ARM64)
|
||||||
|
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE ARM64)
|
||||||
|
else()
|
||||||
|
# MinGW/GCC ARM settings
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||||||
|
if (CMAKE_CROSSCOMPILING)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
message(STATUS "[UMSKT] Configuring for Windows on ARM")
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(DJGPP_WATT32)
|
IF(DJGPP_WATT32)
|
||||||
SET(CMAKE_SYSTEM_NAME MSDOS)
|
SET(CMAKE_SYSTEM_NAME MSDOS)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32})
|
SET(UMSKT_LINK_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 with stub: ${CWSDSTUB_LOCATION}")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
# find the system installed OpenSSL development library
|
##if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
FIND_PACKAGE(OpenSSL REQUIRED)
|
## SET(BUILD_SHARED_LIBS ON)
|
||||||
IF(NOT OPENSSL_FOUND)
|
## MESSAGE(STATUS "[UMSKT] macOS has no static library - Shared library forced on")
|
||||||
MESSAGE(SEND_ERROR "OpenSSL Development Libraries Not Found")
|
##endif()
|
||||||
MESSAGE(SEND_ERROR "Please consult your package manager of choice to install the prerequisite")
|
|
||||||
MESSAGE(SEND_ERROR "The package name is commonly called libssl-dev or openssl-dev depending on distribution")
|
|
||||||
MESSAGE(FATAL_ERROR "Can not continue without OpenSSL")
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# if we found shared libraries - do the following:
|
|
||||||
STRING(REGEX MATCH "(\\.so|\\.dll|\\.dylib)$" OPENSSL_CRYPTO_SHARED "${OPENSSL_CRYPTO_LIBRARY}")
|
|
||||||
IF(OPENSSL_CRYPTO_SHARED)
|
|
||||||
MESSAGE(STATUS "[UMSKT] Detected Shared library version of OpenSSL")
|
|
||||||
SET(BUILD_SHARED_LIBS ON)
|
|
||||||
ELSE()
|
|
||||||
MESSAGE(STATUS "[UMSKT] Detected Static Library version of OpenSSL")
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# if we're compiling with MSVC, respect the DEBUG compile option
|
# if we're compiling with MSVC, respect the DEBUG compile option
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
@ -81,6 +137,9 @@ ENDIF()
|
|||||||
|
|
||||||
IF(MUSL_STATIC)
|
IF(MUSL_STATIC)
|
||||||
MESSAGE(STATUS "[UMSKT] Performing a fully static build using muslc")
|
MESSAGE(STATUS "[UMSKT] Performing a fully static build using muslc")
|
||||||
|
SET(BUILD_SHARED_LIBS OFF)
|
||||||
|
SET(OPENSSL_USE_STATIC_LIBS TRUE)
|
||||||
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
|
SET(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
|
SET(CMAKE_SHARED_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
@ -88,6 +147,46 @@ IF(MUSL_STATIC)
|
|||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
# find the system installed OpenSSL development library
|
||||||
|
FIND_PACKAGE(OpenSSL REQUIRED)
|
||||||
|
IF(NOT OPENSSL_FOUND)
|
||||||
|
MESSAGE(SEND_ERROR "OpenSSL Development Libraries Not Found")
|
||||||
|
MESSAGE(SEND_ERROR "Please consult your package manager of choice to install the prerequisite")
|
||||||
|
MESSAGE(SEND_ERROR "The package name is commonly called libssl-dev or openssl-dev depending on distribution")
|
||||||
|
MESSAGE(FATAL_ERROR "Can not continue without OpenSSL")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(NOT MUSL_STATIC)
|
||||||
|
# if we found shared libraries - do the following:
|
||||||
|
IF (OPENSSL_USE_STATIC_LIBS)
|
||||||
|
MESSAGE(STATUS "[UMSKT] requested static version of OpenSSL")
|
||||||
|
if (NOT UMSKT_USE_SHARED_OPENSSL)
|
||||||
|
MESSAGE(STATUS "[UMSKT] not asked for shared version of OpenSSL")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(MSVC)
|
||||||
|
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} "ws2_32.lib")
|
||||||
|
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} "crypt32.lib")
|
||||||
|
MESSAGE(STATUS "[UMSKT] msvc adding ws2_32.lib crypt32.lib")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
STRING(REGEX MATCH "(\\.so|\\.dll|\\.dylib)$" OPENSSL_CRYPTO_SHARED "${OPENSSL_CRYPTO_LIBRARY}")
|
||||||
|
IF(OPENSSL_CRYPTO_SHARED)
|
||||||
|
MESSAGE(STATUS "[UMSKT] Detected Shared library version of OpenSSL")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS "[UMSKT] Detected Static Library version of OpenSSL")
|
||||||
|
|
||||||
|
# static libcrypto on Fedora needs -lz at link time
|
||||||
|
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
|
FIND_PACKAGE(ZLIB REQUIRED)
|
||||||
|
IF (NOT ZLIB_FOUND)
|
||||||
|
MESSAGE(FATAL_ERROR "[UMSKT] linux static OpenSSL requires zlib")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# initalize cpm.CMake
|
# initalize cpm.CMake
|
||||||
INCLUDE(cmake/CPM.cmake)
|
INCLUDE(cmake/CPM.cmake)
|
||||||
|
|
||||||
@ -105,6 +204,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
|
||||||
@ -147,31 +247,50 @@ IF (EMSCRIPTEN)
|
|||||||
SET_TARGET_PROPERTIES(umskt PROPERTIES COMPILE_FLAGS "-Os -sEXPORTED_RUNTIME_METHODS=ccall,cwrap")
|
SET_TARGET_PROPERTIES(umskt PROPERTIES COMPILE_FLAGS "-Os -sEXPORTED_RUNTIME_METHODS=ccall,cwrap")
|
||||||
SET_TARGET_PROPERTIES(umskt PROPERTIES LINK_FLAGS "-Os -sWASM=1 -sEXPORT_ALL=1 -sEXPORTED_RUNTIME_METHODS=ccall,cwrap --no-entry")
|
SET_TARGET_PROPERTIES(umskt PROPERTIES LINK_FLAGS "-Os -sWASM=1 -sEXPORT_ALL=1 -sEXPORTED_RUNTIME_METHODS=ccall,cwrap --no-entry")
|
||||||
ELSE()
|
ELSE()
|
||||||
IF(NOT UMSKT_USE_SHARED_OPENSSL)
|
ADD_LIBRARY(_umskt ${LIBUMSKT_SRC} ${UMSKT_EXE_WINDOWS_EXTRA} ${UMSKT_EXE_WINDOWS_DLL})
|
||||||
### Static library compilation
|
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
||||||
ADD_LIBRARY(_umskt STATIC ${LIBUMSKT_SRC})
|
TARGET_LINK_DIRECTORIES(_umskt PUBLIC ${UMSKT_LINK_DIRS})
|
||||||
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
TARGET_LINK_LIBRARIES(_umskt ${OPENSSL_CRYPTO_LIBRARIES} fmt ${UMSKT_LINK_LIBS})
|
||||||
TARGET_LINK_LIBRARIES(_umskt -static OpenSSL::Crypto fmt ${UMSKT_LINK_LIBS})
|
|
||||||
ELSE()
|
|
||||||
### Shared library compilation
|
|
||||||
ADD_LIBRARY(_umskt SHARED ${LIBUMSKT_SRC} ${UMSKT_EXE_WINDOWS_EXTRA} ${UMSKT_EXE_WINDOWS_DLL})
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
|
||||||
TARGET_LINK_LIBRARIES(_umskt OpenSSL::Crypto fmt ${UMSKT_LINK_LIBS})
|
|
||||||
TARGET_LINK_DIRECTORIES(_umskt PUBLIC ${UMSKT_LINK_DIRS})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
### UMSKT executable compilation
|
### UMSKT executable compilation
|
||||||
ADD_EXECUTABLE(umskt src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
|
ADD_EXECUTABLE(umskt src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
|
||||||
TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
|
||||||
TARGET_LINK_LIBRARIES(umskt _umskt OpenSSL::Crypto 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()
|
||||||
|
|
||||||
|
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
|
install(TARGETS umskt DESTINATION bin)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
### Copy Shared Libraries and dependency files
|
### Copy Shared Libraries and dependency files
|
||||||
IF (OPENSSL_CRYPTO_SHARED)
|
IF (OPENSSL_CRYPTO_SHARED)
|
||||||
GET_FILENAME_COMPONENT(OPENSSL_CRYPTO_LIBRARY_FILENAME ${OPENSSL_CRYPTO_LIBRARY} NAME)
|
GET_FILENAME_COMPONENT(OPENSSL_CRYPTO_LIBRARY_FILENAME ${OPENSSL_CRYPTO_LIBRARY} NAME)
|
||||||
CONFIGURE_FILE(${OPENSSL_CRYPTO_LIBRARY} "${CMAKE_CURRENT_BINARY_DIR}/${OPENSSL_CRYPTO_LIBRARY_FILENAME}" COPYONLY)
|
CONFIGURE_FILE(${OPENSSL_CRYPTO_LIBRARY} "${CMAKE_CURRENT_BINARY_DIR}/${OPENSSL_CRYPTO_LIBRARY_FILENAME}" COPYONLY)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF (DJGPP_WATT32)
|
||||||
|
message(STATUS "[UMSKT] Configuring DJGPP post-build commands")
|
||||||
|
# Set .exe suffix for DJGPP builds
|
||||||
|
set_target_properties(umskt PROPERTIES SUFFIX ".exe")
|
||||||
|
add_custom_command(TARGET umskt POST_BUILD
|
||||||
|
# Convert exe to coff, removing the default stub
|
||||||
|
COMMAND ${DJGPP_BIN_LOCATION}/exe2coff $<TARGET_FILE:umskt>
|
||||||
|
# Concatenate CWSDSTUB with the COFF file
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E cat ${CWSDSTUB_LOCATION} $<TARGET_FILE_DIR:umskt>/umskt > $<TARGET_FILE:umskt>
|
||||||
|
# Clean up the COFF file
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E rm $<TARGET_FILE_DIR:umskt>/umskt
|
||||||
|
)
|
||||||
|
message(STATUS "[UMSKT] STUBIFY_LOCATION set to: ${STUBIFY_LOCATION}")
|
||||||
|
message(STATUS "[UMSKT] CWSDSTUB_LOCATION set to: ${CWSDSTUB_LOCATION}")
|
||||||
|
message(STATUS "[UMSKT] DJGPP_BIN_LOCATION set to: ${DJGPP_BIN_LOCATION}")
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
90
README.md
90
README.md
@ -1,17 +1,30 @@
|
|||||||
# **Universal MS Key Toolkit (UMSKT)**
|
# Universal MS Key Toolkit (UMSKT)
|
||||||
|
|
||||||
|
**Connect with us**
|
||||||
|
|
||||||
[](https://umskt.zulipchat.com)
|
[](https://umskt.zulipchat.com)
|
||||||
[](https://web.libera.chat/gamja/?nick=Guest?#mspid)
|
[](https://web.libera.chat/gamja/?nick=Guest?#mspid)
|
||||||
[](../../actions/workflows/linux.yml)
|
[](https://discord.gg/PpBSpuphWM)
|
||||||
|
|
||||||
|
**Build status**
|
||||||
|
|
||||||
[](../../actions/workflows/windows.yml)
|
[](../../actions/workflows/windows.yml)
|
||||||
|
|
||||||
|
[](../../actions/workflows/macos.yml)
|
||||||
|
|
||||||
### **Plan of Action / ToDo List**
|
[](../../actions/workflows/linux.yml)
|
||||||
|
|
||||||
|
[](../../actions/workflows/freebsd.yml)
|
||||||
|
|
||||||
|
[](../../actions/workflows/dos-djgpp.yml)
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
### Plan of Action / ToDo List
|
||||||
|
|
||||||
In light of the recent exponential interest in this project I've decided to put updates of this project here:
|
In light of the recent exponential interest in this project I've decided to put updates of this project here:
|
||||||
|
|
||||||
* [Please see ticket #8 for more information](../../issues/8)
|
[Please see ticket #8 for more information](https://github.com/UMSKT/UMSKT/issues/8)
|
||||||
|
|
||||||
|
|
||||||
------
|
------
|
||||||
|
|
||||||
@ -29,27 +42,59 @@ In light of the recent exponential interest in this project I've decided to put
|
|||||||
|
|
||||||
* It all comes down to four simple steps:
|
* It all comes down to four simple steps:
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
### System Requirements
|
||||||
|
#### MS-DOS
|
||||||
|
* i386 processor or better
|
||||||
|
* MS-DOS 6.22 or later
|
||||||
|
* Any DOS-based version of Windows
|
||||||
|
* Windows NT 4.0 or later (via NTVDM)
|
||||||
|
#### Windows (x86/x64)
|
||||||
|
* i686 processor or better
|
||||||
|
* Windows XP or later
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Processors barely meeting the minimum system requirements for XP may not work. Use the MS-DOS version via NTVDM in that case.
|
||||||
|
|
||||||
|
#### Windows (ARM32/64)
|
||||||
|
* Windows 11 21H2 or later
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> This is just all we can test. Try to get it to run on Windows RT, make an issue if it doesn't run and we'll try to fix it.
|
||||||
|
#### macOS
|
||||||
|
* Apple Silicon or x86_64 processor
|
||||||
|
* Latest version of macOS
|
||||||
|
#### Linux
|
||||||
|
* modern ARM, x86, or x86_64 processor
|
||||||
|
* Latest version of your Linux distro
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
### **Usage**
|
### **Usage**
|
||||||
#### 1. Download the latest version of WindowsXPKg
|
#### 1. Download the latest version of UMSKT
|
||||||
|
|
||||||
* *(GitHub account required)*
|
* *(GitHub account required)*
|
||||||
* Download the latest experimental version using the Actions tab ([Windows](../../actions/workflows/windows.yml?query=branch%3Amaster), [Linux](../../actions/workflows/linux.yml?query=branch%3Amaster)).
|
* 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)
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> 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 both the `xpkey` program and the `keys.json` datum extracted and in the same directory
|
#### 2. Run `umskt` to generate a key, or add `--help` or `-h` to see more options.
|
||||||
|
> [!IMPORTANT]
|
||||||
#### 2. Run `xpkey` to generate a key, or add `--help` to see more options.
|
> On macOS, like all unsigned executables, you'll need to hold Ctrl while right clicking and selecting Open to actually open it.
|
||||||
|
|
||||||
#### 3. *(Activation step for `Retail` and `OEM` only)*
|
#### 3. *(Activation step for `Retail` and `OEM` only)*
|
||||||
* After installation, you will be prompted to activate Windows.
|
* After installation, you will be prompted to activate Windows.
|
||||||
|
|
||||||
|
|
||||||
* Select the **telephone activation** method, then, run `xpkey -i <Installation ID>` using the `Installation ID` the activation Wizard provides for you
|
* Select the **telephone activation** method, then, run `umskt -i <Installation ID>` using the `Installation ID` the activation Wizard provides for you
|
||||||
|
* If you're activating a non-Windows product, use `umskt -i <Installation ID> -m <Product>`, where `<Product>` is one of `OFFICEXP`, `OFFICE2K3`, `OFFICE2K7`, or `PLUSDME`
|
||||||
|
* If activating Office 2003/2007, use `umskt -i <Installation ID> -m <Product> -p <Product ID>`
|
||||||
|
|
||||||
#### 4. Profit!
|
#### 4. Profit!
|
||||||
|
|
||||||
@ -61,15 +106,16 @@ In light of the recent exponential interest in this project I've decided to put
|
|||||||
The list of people who have helped to bring the XP generation to where it is now:
|
The list of people who have helped to bring the XP generation to where it is now:
|
||||||
* z22
|
* z22
|
||||||
* MSKey
|
* MSKey
|
||||||
* sk00ter
|
|
||||||
* diamondggg
|
* diamondggg
|
||||||
* pottzman
|
* pottzman
|
||||||
|
* david4599
|
||||||
* Endermanch
|
* Endermanch
|
||||||
* Neo-Desktop
|
* Neo-Desktop
|
||||||
* WitherOrNot
|
* WitherOrNot
|
||||||
* TheTank20
|
* TheTank20
|
||||||
* InvoxiPlayGames
|
* InvoxiPlayGames
|
||||||
* brakmic
|
* brakmic
|
||||||
|
* techguy16
|
||||||
|
|
||||||
(the list will be updated to add more collaborators)
|
(the list will be updated to add more collaborators)
|
||||||
|
|
||||||
@ -77,20 +123,26 @@ The list of people who have helped to bring the XP generation to where it is now
|
|||||||
|
|
||||||
### **Development Requirements:**
|
### **Development Requirements:**
|
||||||
|
|
||||||
* `CMake, make, gcc` (`build-essential`)
|
* `build-essential`
|
||||||
|
* `cmake`
|
||||||
|
* `make`
|
||||||
|
* `gcc`
|
||||||
|
* `g++`
|
||||||
* `git`
|
* `git`
|
||||||
|
|
||||||
#### Build Steps:
|
#### Build Steps:
|
||||||
|
|
||||||
1. `git clone`
|
1. `git clone https://github.com/UMSKT/UMSKT`
|
||||||
2. `cd build/ && cmake ../ && make`
|
2. `cd UMSKT/build`
|
||||||
|
3. `cmake ..`
|
||||||
|
4. `make`
|
||||||
|
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
### **Known Ports**
|
### **Known Ports**
|
||||||
|
|
||||||
| Language | Author | Repo URL |
|
| Language | Author | Repo URL |
|
||||||
|----------|-----------|-------------------------------------------------------|
|
|----------|-----------|-----------------------------------------------------------|
|
||||||
| Rust | Alex Page | [anpage/umskt-rs](https://github.com/anpage/umskt-rs) |
|
| Rust | Alex Page | [anpage/umskt-rs](https://github.com/anpage/umskt-rs) |
|
||||||
|
| Python | techguy16 | [techguy16/umsktpy](https://github.com/techguy16/umsktpy) |
|
||||||
|
109
keys.json
109
keys.json
@ -33,6 +33,9 @@
|
|||||||
"Commerce Server 2002": {
|
"Commerce Server 2002": {
|
||||||
"BINK": ["0E", "0F"]
|
"BINK": ["0E", "0F"]
|
||||||
},
|
},
|
||||||
|
"Passport Manager": {
|
||||||
|
"BINK": ["10"]
|
||||||
|
},
|
||||||
"Windows 2000 Professional": {
|
"Windows 2000 Professional": {
|
||||||
"BINK": ["12", "13"]
|
"BINK": ["12", "13"]
|
||||||
},
|
},
|
||||||
@ -45,6 +48,9 @@
|
|||||||
"Office XP Applications": {
|
"Office XP Applications": {
|
||||||
"BINK": ["20", "21"]
|
"BINK": ["20", "21"]
|
||||||
},
|
},
|
||||||
|
"Works Suite 2003 and 2004": {
|
||||||
|
"BINK": ["20", "21"]
|
||||||
|
},
|
||||||
"Office XP": {
|
"Office XP": {
|
||||||
"BINK": ["22", "23"]
|
"BINK": ["22", "23"]
|
||||||
},
|
},
|
||||||
@ -117,18 +123,27 @@
|
|||||||
"Office 2003 Small Business": {
|
"Office 2003 Small Business": {
|
||||||
"BINK": ["70", "71"]
|
"BINK": ["70", "71"]
|
||||||
},
|
},
|
||||||
|
"Office 2003 Student and Teacher": {
|
||||||
|
"BINK": ["70", "71"]
|
||||||
|
},
|
||||||
"Office 2003 Professional": {
|
"Office 2003 Professional": {
|
||||||
"BINK": ["72", "73"]
|
"BINK": ["72", "73"]
|
||||||
},
|
},
|
||||||
"Windows Longhorn (6.0.4039.0 -> Pre PIDGENX)": {
|
"Windows Longhorn (6.0.4039.0 -> Pre PIDGENX)": {
|
||||||
"BINK": ["74", "75"]
|
"BINK": ["74", "75"]
|
||||||
},
|
},
|
||||||
|
"Expression Web 2007 / Sharepoint Server 2007": {
|
||||||
|
"BINK": ["76", "77"]
|
||||||
|
},
|
||||||
"Identity Lifecycle Manager 2007": {
|
"Identity Lifecycle Manager 2007": {
|
||||||
"BINK": ["78", "79"]
|
"BINK": ["78", "79"]
|
||||||
},
|
},
|
||||||
"Visual Studio 2008": {
|
"Visual Studio 2008": {
|
||||||
"BINK": ["78", "79"]
|
"BINK": ["78", "79"]
|
||||||
},
|
},
|
||||||
|
"Sharepoint Designer 2007": {
|
||||||
|
"BINK": ["7C", "7D"]
|
||||||
|
},
|
||||||
"Office 2007 Applications": {
|
"Office 2007 Applications": {
|
||||||
"BINK": ["7E", "7F"]
|
"BINK": ["7E", "7F"]
|
||||||
},
|
},
|
||||||
@ -138,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"]
|
||||||
}
|
}
|
||||||
@ -312,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": {
|
||||||
@ -383,6 +401,21 @@
|
|||||||
"y": "12300711937755714474221683340048792628817501853269187222732097530965245794898485391792926982501341822327927281168157"
|
"y": "12300711937755714474221683340048792628817501853269187222732097530965245794898485391792926982501341822327927281168157"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"10": {
|
||||||
|
"a": "1",
|
||||||
|
"b": "0",
|
||||||
|
"g": {
|
||||||
|
"x": "18651628392962497698304079461858800038021595035623099589626558411789423821835513779530629747878048328422716050099296",
|
||||||
|
"y": "28457790016119433859033076174489680371110176047623886251847351799861435189214769185332948508935608870611015909181946"
|
||||||
|
},
|
||||||
|
"n": "63517138149940081",
|
||||||
|
"p": "34850883414891516310048088524473091032039735302322749072119923383901524249650054933039485488287948424536010614809529",
|
||||||
|
"priv": "42074657350570560",
|
||||||
|
"pub": {
|
||||||
|
"x": "14897248889444524585539298515527812307525445072093905045143283125792133561464628729391995919418984547359131800953862",
|
||||||
|
"y": "30590224388131521072842776697623219502924625149179219913459005347798492666726177600440842678766281012690402321113086"
|
||||||
|
}
|
||||||
|
},
|
||||||
"12": {
|
"12": {
|
||||||
"a": "1",
|
"a": "1",
|
||||||
"b": "0",
|
"b": "0",
|
||||||
@ -773,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",
|
||||||
@ -1525,7 +1618,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Activation": {
|
"Activation": {
|
||||||
"Windowws XP": {
|
"Windows XP": {
|
||||||
"p": "102011604035381881",
|
"p": "102011604035381881",
|
||||||
"x": {
|
"x": {
|
||||||
"0": "0",
|
"0": "0",
|
||||||
|
138
src/cli.cpp
138
src/cli.cpp
@ -22,6 +22,15 @@
|
|||||||
|
|
||||||
#include "cli.h"
|
#include "cli.h"
|
||||||
|
|
||||||
|
CLI::~CLI()
|
||||||
|
{
|
||||||
|
EC_GROUP_free(eCurve);
|
||||||
|
EC_POINT_free(genPoint);
|
||||||
|
EC_POINT_free(pubPoint);
|
||||||
|
BN_free(privateKey);
|
||||||
|
BN_free(genOrder);
|
||||||
|
}
|
||||||
|
|
||||||
bool CLI::loadJSON(const fs::path& filename, json *output) {
|
bool CLI::loadJSON(const fs::path& filename, json *output) {
|
||||||
if (!filename.empty() && !fs::exists(filename)) {
|
if (!filename.empty() && !fs::exists(filename)) {
|
||||||
fmt::print("ERROR: File {} does not exist\n", filename.string());
|
fmt::print("ERROR: File {} does not exist\n", filename.string());
|
||||||
@ -53,11 +62,17 @@ void CLI::showHelp(char *argv[]) {
|
|||||||
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
|
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
|
||||||
fmt::print("\t-f --file\tspecify which keys file to load\n");
|
fmt::print("\t-f --file\tspecify which keys file to load\n");
|
||||||
fmt::print("\t-i --instid\tinstallation ID used to generate confirmation ID\n");
|
fmt::print("\t-i --instid\tinstallation ID used to generate confirmation ID\n");
|
||||||
|
fmt::print("\t-m --mode\tproduct family to activate.\n\t\t\tvalid options are \"WINDOWS\", \"OFFICEXP\", \"OFFICE2K3\", \"OFFICE2K7\" or \"PLUSDME\"\n\t\t\t(defaults to \"WINDOWS\")\n");
|
||||||
|
fmt::print("\t-p --productid\tthe product ID of the Program to activate. only required for Office 2K3 and Office 2K7 programs\n");
|
||||||
fmt::print("\t-b --binkid\tspecify which BINK identifier to load (defaults to 2E)\n");
|
fmt::print("\t-b --binkid\tspecify which BINK identifier to load (defaults to 2E)\n");
|
||||||
fmt::print("\t-l --list\tshow which products/binks can be loaded\n");
|
fmt::print("\t-l --list\tshow which products/binks can be loaded\n");
|
||||||
fmt::print("\t-c --channelid\tspecify which Channel Identifier to use (defaults to 640)\n");
|
fmt::print("\t-c --channelid\tspecify which Channel Identifier to use (defaults to 640)\n");
|
||||||
fmt::print("\t-s --serial\tspecifies a serial to use in the product ID (defaults to random, BINK1998 only)\n");
|
fmt::print("\t-s --serial\tspecifies a serial to use in the product ID (defaults to random, BINK1998 only)\n");
|
||||||
|
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
||||||
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
||||||
|
fmt::print("\t-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n");
|
||||||
|
fmt::print("\t-o --override\tDisables version check for confirmation IDs, if you need this send an issue on GitHub\n");
|
||||||
|
fmt::print("\t-D --nodashes\tDisables dashes in product keys and confirmation IDs (for easier copy-pasting)");
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +83,7 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
"",
|
||||||
640,
|
640,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@ -76,12 +92,16 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
MODE_BINK1998_GENERATE
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
MODE_BINK1998_GENERATE,
|
||||||
|
WINDOWS
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
std::string arg = argv[i];
|
std::string arg = argv[i];
|
||||||
|
|
||||||
if (arg == "-v" || arg == "--verbose") {
|
if (arg == "-v" || arg == "--verbose") {
|
||||||
options->verbose = true;
|
options->verbose = true;
|
||||||
UMSKT::setDebugOutput(stderr);
|
UMSKT::setDebugOutput(stderr);
|
||||||
@ -137,6 +157,8 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->serial = serial_val;
|
options->serial = serial_val;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
} else if (arg == "-u" || arg == "--upgrade") {
|
||||||
|
options->upgrade = true;
|
||||||
} else if (arg == "-f" || arg == "--file") {
|
} else if (arg == "-f" || arg == "--file") {
|
||||||
if (i == argc - 1) {
|
if (i == argc - 1) {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
@ -154,6 +176,32 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->instid = argv[i+1];
|
options->instid = argv[i+1];
|
||||||
options->applicationMode = MODE_CONFIRMATION_ID;
|
options->applicationMode = MODE_CONFIRMATION_ID;
|
||||||
i++;
|
i++;
|
||||||
|
} else if (arg == "-m" || arg == "--mode") {
|
||||||
|
std::string mode = argv[i+1];
|
||||||
|
char *p = &mode[0];
|
||||||
|
for (; *p; p++) {
|
||||||
|
*p = toupper((unsigned char)*p);
|
||||||
|
}
|
||||||
|
p = &mode[0];
|
||||||
|
if (strcmp(p, "WINDOWS") == 0) {
|
||||||
|
options->activationMode = WINDOWS;
|
||||||
|
} else if (strcmp(p, "OFFICEXP") == 0) {
|
||||||
|
options->activationMode = OFFICE_XP;
|
||||||
|
} else if (strcmp(p, "OFFICE2K3") == 0) {
|
||||||
|
options->activationMode = OFFICE_2K3;
|
||||||
|
} else if (strcmp(p, "OFFICE2K7") == 0) {
|
||||||
|
options->activationMode = OFFICE_2K7;
|
||||||
|
} else if (strcmp(p, "PLUSDME") == 0) {
|
||||||
|
options->activationMode = PLUS_DME;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
} else if (arg == "-p" || arg == "--productid") {
|
||||||
|
if (i == argc -1) {
|
||||||
|
options->error = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
options->productid = argv[i+1];
|
||||||
|
i++;
|
||||||
} else if (arg == "-V" || arg == "--validate") {
|
} else if (arg == "-V" || arg == "--validate") {
|
||||||
if (i == argc - 1) {
|
if (i == argc - 1) {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
@ -163,11 +211,23 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->keyToCheck = argv[i+1];
|
options->keyToCheck = argv[i+1];
|
||||||
options->applicationMode = MODE_BINK1998_VALIDATE;
|
options->applicationMode = MODE_BINK1998_VALIDATE;
|
||||||
i++;
|
i++;
|
||||||
} else {
|
|
||||||
|
} else if (arg == "-N" || arg == "--nonewlines") {
|
||||||
|
options->nonewlines = true;
|
||||||
|
} else if (arg == "-o" || arg == "--override") {
|
||||||
|
options->overrideVersion = true;
|
||||||
|
} else if (arg == "-D" || arg == "--nodashes") {
|
||||||
|
options->nodashes = true;
|
||||||
|
} else {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure that a product id is entered for OFFICE_2K3 or OFFICE_2K7 IIDs
|
||||||
|
if ((options->activationMode == OFFICE_2K3 || options->activationMode == OFFICE_2K7) && (options->productid.empty() || options->instid.empty()) ) {
|
||||||
|
return options->error = true;
|
||||||
|
}
|
||||||
|
|
||||||
return !options->error;
|
return !options->error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,6 +276,12 @@ int CLI::validateCommandLine(Options* options, char *argv[], json *keys) {
|
|||||||
int intBinkID;
|
int intBinkID;
|
||||||
sscanf(options->binkid.c_str(), "%x", &intBinkID);
|
sscanf(options->binkid.c_str(), "%x", &intBinkID);
|
||||||
|
|
||||||
|
// FE and FF are BINK 1998, but do not generate valid keys, so we throw an error
|
||||||
|
if (intBinkID >= 0xFE) {
|
||||||
|
fmt::print("ERROR: Terminal Services BINKs (FE and FF) are unsupported at this time\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (intBinkID >= 0x40) {
|
if (intBinkID >= 0x40) {
|
||||||
// set bink2002 validate mode if in bink1998 validate mode, else set bink2002 generate mode
|
// set bink2002 validate mode if in bink1998 validate mode, else set bink2002 generate mode
|
||||||
options->applicationMode = (options->applicationMode == MODE_BINK1998_VALIDATE) ? MODE_BINK2002_VALIDATE : MODE_BINK2002_GENERATE;
|
options->applicationMode = (options->applicationMode == MODE_BINK1998_VALIDATE) ? MODE_BINK2002_VALIDATE : MODE_BINK2002_GENERATE;
|
||||||
@ -241,7 +307,7 @@ void CLI::printID(DWORD *pid) {
|
|||||||
int i, digit = 0;
|
int i, digit = 0;
|
||||||
|
|
||||||
// Convert PID to ascii-number (=raw)
|
// Convert PID to ascii-number (=raw)
|
||||||
sprintf(raw, "%09u", pid[0]);
|
snprintf(raw, sizeof(raw), "%09u", pid[0]);
|
||||||
|
|
||||||
// Make b-part {640-....}
|
// Make b-part {640-....}
|
||||||
strncpy(b, raw, 3);
|
strncpy(b, raw, 3);
|
||||||
@ -265,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),
|
||||||
@ -361,13 +432,14 @@ 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);
|
||||||
|
|
||||||
sscanf(cRaw, "%d", &oRaw);
|
sscanf(cRaw, "%d", &oRaw);
|
||||||
nRaw += (oRaw % 999999); // ensure our serial is less than 999999
|
nRaw += (oRaw % 999999); // ensure our serial is less than 999999
|
||||||
|
BN_free(bnrand);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
@ -379,11 +451,8 @@ int CLI::BINK1998Generate() {
|
|||||||
// generate a key
|
// generate a key
|
||||||
BN_sub(this->privateKey, this->genOrder, this->privateKey);
|
BN_sub(this->privateKey, this->genOrder, this->privateKey);
|
||||||
|
|
||||||
// Specify whether an upgrade version or not
|
|
||||||
bool bUpgrade = false;
|
|
||||||
|
|
||||||
for (int i = 0; i < this->total; i++) {
|
for (int i = 0; i < this->total; i++) {
|
||||||
PIDGEN3::BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, bUpgrade, this->pKey);
|
PIDGEN3::BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, options.upgrade, this->pKey);
|
||||||
|
|
||||||
bool isValid = PIDGEN3::BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
bool isValid = PIDGEN3::BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
@ -408,10 +477,9 @@ int CLI::BINK1998Generate() {
|
|||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
||||||
}
|
}
|
||||||
#ifndef _WIN32
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
#endif
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,30 +493,28 @@ 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) {
|
||||||
fmt::print("> AuthInfo: {}\n", pAuthInfo);
|
fmt::print("> AuthInfo: {}\n", pAuthInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, false, this->pKey);
|
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, options.upgrade, this->pKey);
|
||||||
CLI::printKey(this->pKey);
|
|
||||||
fmt::print("\n");
|
|
||||||
|
|
||||||
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
CLI::printKey(this->pKey);
|
CLI::printKey(this->pKey);
|
||||||
if (i < this->total - 1 || this->options.verbose) {
|
if (i < this->total - 1 || this->options.verbose) { // check if end of list or verbose
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
this->count += isValid;
|
this->count += isValid; // add to count
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
CLI::printKey(this->pKey);
|
CLI::printKey(this->pKey); // print the key
|
||||||
fmt::print(" [Invalid]");
|
fmt::print(" [Invalid]"); // and add " [Invalid]" to the key
|
||||||
if (i < this->total - 1) {
|
if (i < this->total - 1) { // check if end of list
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -459,9 +525,9 @@ int CLI::BINK2002Generate() {
|
|||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
||||||
}
|
}
|
||||||
#ifndef _WIN32
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
#endif
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -506,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);
|
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:
|
||||||
@ -534,10 +600,20 @@ int CLI::ConfirmationID() {
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
fmt::print(confirmation_id);
|
if (this->options.nodashes == true) {
|
||||||
#ifndef _WIN32
|
int j = 0;
|
||||||
fmt::print("\n");
|
for (int i = 0; confirmation_id[i] != '\0'; ++i) {
|
||||||
#endif
|
if (confirmation_id[i] != '-') {
|
||||||
|
confirmation_id[j++] = confirmation_id[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
confirmation_id[j] = '\0';
|
||||||
|
}
|
||||||
|
fmt::print(confirmation_id);
|
||||||
|
|
||||||
|
if (this->options.nonewlines == false) {
|
||||||
|
fmt::print("\n");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
19
src/cli.h
19
src/cli.h
@ -36,10 +36,18 @@
|
|||||||
|
|
||||||
CMRC_DECLARE(umskt);
|
CMRC_DECLARE(umskt);
|
||||||
|
|
||||||
|
enum ACTIVATION_ALGORITHM {
|
||||||
|
WINDOWS = 0,
|
||||||
|
OFFICE_XP = 1,
|
||||||
|
OFFICE_2K3 = 2,
|
||||||
|
OFFICE_2K7 = 3,
|
||||||
|
PLUS_DME = 4,
|
||||||
|
};
|
||||||
|
|
||||||
enum MODE {
|
enum MODE {
|
||||||
MODE_BINK1998_GENERATE = 0,
|
MODE_BINK1998_GENERATE = 0,
|
||||||
MODE_BINK2002_GENERATE = 1,
|
MODE_BINK2002_GENERATE = 1,
|
||||||
MODE_CONFIRMATION_ID = 2,
|
MODE_CONFIRMATION_ID = 2,
|
||||||
MODE_BINK1998_VALIDATE = 3,
|
MODE_BINK1998_VALIDATE = 3,
|
||||||
MODE_BINK2002_VALIDATE = 4,
|
MODE_BINK2002_VALIDATE = 4,
|
||||||
};
|
};
|
||||||
@ -49,16 +57,22 @@ struct Options {
|
|||||||
std::string keysFilename;
|
std::string keysFilename;
|
||||||
std::string instid;
|
std::string instid;
|
||||||
std::string keyToCheck;
|
std::string keyToCheck;
|
||||||
|
std::string productid;
|
||||||
int channelID;
|
int channelID;
|
||||||
int serial;
|
int serial;
|
||||||
int numKeys;
|
int numKeys;
|
||||||
|
bool upgrade;
|
||||||
bool serialSet;
|
bool serialSet;
|
||||||
bool verbose;
|
bool verbose;
|
||||||
bool help;
|
bool help;
|
||||||
bool error;
|
bool error;
|
||||||
bool list;
|
bool list;
|
||||||
|
bool nonewlines;
|
||||||
|
bool overrideVersion;
|
||||||
|
bool nodashes;
|
||||||
|
|
||||||
MODE applicationMode;
|
MODE applicationMode;
|
||||||
|
ACTIVATION_ALGORITHM activationMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CLI {
|
class CLI {
|
||||||
@ -73,13 +87,14 @@ class CLI {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
CLI(Options options, json keys);
|
CLI(Options options, json keys);
|
||||||
|
~CLI();
|
||||||
|
|
||||||
static bool loadJSON(const fs::path& filename, json *output);
|
static bool loadJSON(const fs::path& filename, json *output);
|
||||||
static void showHelp(char *argv[]);
|
static void showHelp(char *argv[]);
|
||||||
static int parseCommandLine(int argc, char* argv[], Options *options);
|
static int parseCommandLine(int argc, char* argv[], Options *options);
|
||||||
static int validateCommandLine(Options* options, char *argv[], json *keys);
|
static int validateCommandLine(Options* options, char *argv[], json *keys);
|
||||||
static void printID(DWORD *pid);
|
static void printID(DWORD *pid);
|
||||||
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,9 +29,26 @@
|
|||||||
|
|
||||||
#include "confid.h"
|
#include "confid.h"
|
||||||
|
|
||||||
#define MOD 0x16A6B036D7F2A79ULL
|
#if defined(_MSC_VER)
|
||||||
#define NON_RESIDUE 43
|
#include <intrin.h>
|
||||||
static const QWORD f[6] = {0, 0x21840136C85381ULL, 0x44197B83892AD0ULL, 0x1400606322B3B04ULL, 0x1400606322B3B04ULL, 1};
|
#endif
|
||||||
|
|
||||||
|
QWORD MOD = 0;
|
||||||
|
QWORD NON_RESIDUE = 0;
|
||||||
|
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
|
||||||
|
int productID[4];
|
||||||
|
int activationMode;
|
||||||
|
|
||||||
|
int ConfirmationID::calculateCheckDigit(int pid)
|
||||||
|
{
|
||||||
|
unsigned int i = 0, j = 0, k = 0;
|
||||||
|
for (j = pid; j; i += k)
|
||||||
|
{
|
||||||
|
k = j % 10;
|
||||||
|
j /= 10;
|
||||||
|
}
|
||||||
|
return ((10 * pid) - (i % 7)) + 7;
|
||||||
|
}
|
||||||
|
|
||||||
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
|
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
|
||||||
{
|
{
|
||||||
@ -62,7 +79,13 @@ inline QWORD ConfirmationID::__umul128(QWORD a, QWORD b, QWORD* hi)
|
|||||||
#else
|
#else
|
||||||
#define __umul128 _umul128
|
#define __umul128 _umul128
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__i386__) || defined(_M_IX86) || defined(__arm__) || defined(__EMSCRIPTEN__)
|
#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__) || defined(_M_ARM)
|
||||||
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
|
||||||
// multiplicand = cd = c * 2^32 + d
|
// multiplicand = cd = c * 2^32 + d
|
||||||
@ -95,18 +118,65 @@ QWORD ConfirmationID::ui128_quotient_mod(QWORD lo, QWORD hi)
|
|||||||
{
|
{
|
||||||
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
|
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
|
||||||
QWORD prod1;
|
QWORD prod1;
|
||||||
__umul128(lo, 0x604fa6a1c6346a87, &prod1);
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
__umul128(lo, 0x604FA6A1C6346A87, &prod1);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
__umul128(lo, 0x4FA8E4A40CDAE44A, &prod1);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
__umul128(lo, 0x2C5C4D3654A594F0, &prod1);
|
||||||
|
}
|
||||||
QWORD part1hi;
|
QWORD part1hi;
|
||||||
QWORD part1lo = __umul128(lo, 0x2d351c6d04f8b, &part1hi);
|
QWORD part1lo;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
part1lo = __umul128(lo, 0x2D351C6D04F8B, &part1hi);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
part1lo = __umul128(lo, 0x2CBAF12A59BBE, &part1hi);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
part1lo = __umul128(lo, 0x2D36C691A4EA5, &part1hi);
|
||||||
|
}
|
||||||
QWORD part2hi;
|
QWORD part2hi;
|
||||||
QWORD part2lo = __umul128(hi, 0x604fa6a1c6346a87, &part2hi);
|
QWORD part2lo;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
part2lo = __umul128(hi, 0x604FA6A1C6346A87, &part2hi);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
part2lo = __umul128(hi, 0x4FA8E4A40CDAE44A, &part2hi);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
part2lo = __umul128(hi, 0x2C5C4D3654A594F0, &part2hi);
|
||||||
|
}
|
||||||
QWORD sum1 = part1lo + part2lo;
|
QWORD sum1 = part1lo + part2lo;
|
||||||
unsigned sum1carry = (sum1 < part1lo);
|
unsigned sum1carry = (sum1 < part1lo);
|
||||||
sum1 += prod1;
|
sum1 += prod1;
|
||||||
sum1carry += (sum1 < prod1);
|
sum1carry += (sum1 < prod1);
|
||||||
QWORD prod2 = part1hi + part2hi + sum1carry;
|
QWORD prod2 = part1hi + part2hi + sum1carry;
|
||||||
QWORD prod3hi;
|
QWORD prod3hi;
|
||||||
QWORD prod3lo = __umul128(hi, 0x2d351c6d04f8b, &prod3hi);
|
QWORD prod3lo;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
prod3lo = __umul128(hi, 0x2D351C6D04F8B, &prod3hi);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
prod3lo = __umul128(hi, 0x2CBAF12A59BBE, &prod3hi);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
prod3lo = __umul128(hi, 0x2D36C691A4EA5, &prod3hi);
|
||||||
|
}
|
||||||
prod3lo += prod2;
|
prod3lo += prod2;
|
||||||
prod3hi += (prod3lo < prod2);
|
prod3hi += (prod3lo < prod2);
|
||||||
return (prod3lo >> 42) | (prod3hi << 22);
|
return (prod3lo >> 42) | (prod3hi << 22);
|
||||||
@ -619,6 +689,20 @@ void ConfirmationID::sha1_single_block(unsigned char input[64], unsigned char ou
|
|||||||
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
|
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfirmationID::decode_iid_new_version(unsigned char* iid, unsigned char* hwid, int* version)
|
||||||
|
{
|
||||||
|
QWORD buffer[5];
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 5; i++)
|
||||||
|
memcpy(&buffer[i], (iid + (4 * i)), 4);
|
||||||
|
DWORD v1 = (buffer[3] & 0xFFFFFFF8) | 2;
|
||||||
|
DWORD v2 = ((buffer[3] & 7) << 29) | (buffer[2] >> 3);
|
||||||
|
QWORD hardwareIDVal = ((QWORD)v1 << 32) | v2;
|
||||||
|
for (i = 0; i < 8; ++i)
|
||||||
|
hwid[i] = (hardwareIDVal >> (8 * i)) & 0xFF;
|
||||||
|
*version = buffer[0] & 7;
|
||||||
|
}
|
||||||
|
|
||||||
void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize)
|
void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize)
|
||||||
{
|
{
|
||||||
unsigned char sha1_input[64];
|
unsigned char sha1_input[64];
|
||||||
@ -628,12 +712,26 @@ void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned c
|
|||||||
int external_counter;
|
int external_counter;
|
||||||
for (external_counter = 0; external_counter < 4; external_counter++) {
|
for (external_counter = 0; external_counter < 4; external_counter++) {
|
||||||
memset(sha1_input, 0, sizeof(sha1_input));
|
memset(sha1_input, 0, sizeof(sha1_input));
|
||||||
memcpy(sha1_input, buffer + half, half);
|
switch (activationMode) {
|
||||||
memcpy(sha1_input + half, key, keySize);
|
case 0:
|
||||||
sha1_input[half + keySize] = 0x80;
|
case 1:
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
case 4:
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
memcpy(sha1_input, buffer + half, half);
|
||||||
sha1_single_block(sha1_input, sha1_result);
|
memcpy(sha1_input + half, key, keySize);
|
||||||
|
sha1_input[half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
sha1_input[0] = 0x79;
|
||||||
|
memcpy(sha1_input + 1, buffer + half, half);
|
||||||
|
memcpy(sha1_input + 1 + half, key, keySize);
|
||||||
|
sha1_input[1 + half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (1 + half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (1 + half + keySize) * 8 / 0x100;
|
||||||
|
}
|
||||||
|
sha1_single_block(sha1_input, sha1_result);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = half & ~3; i < half; i++)
|
for (i = half & ~3; i < half; i++)
|
||||||
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
||||||
@ -654,12 +752,26 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
|
|||||||
int external_counter;
|
int external_counter;
|
||||||
for (external_counter = 0; external_counter < 4; external_counter++) {
|
for (external_counter = 0; external_counter < 4; external_counter++) {
|
||||||
memset(sha1_input, 0, sizeof(sha1_input));
|
memset(sha1_input, 0, sizeof(sha1_input));
|
||||||
memcpy(sha1_input, buffer, half);
|
switch (activationMode) {
|
||||||
memcpy(sha1_input + half, key, keySize);
|
case 0:
|
||||||
sha1_input[half + keySize] = 0x80;
|
case 1:
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
case 4:
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
memcpy(sha1_input, buffer, half);
|
||||||
sha1_single_block(sha1_input, sha1_result);
|
memcpy(sha1_input + half, key, keySize);
|
||||||
|
sha1_input[half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
sha1_input[0] = 0x79;
|
||||||
|
memcpy(sha1_input + 1, buffer, half);
|
||||||
|
memcpy(sha1_input + 1 + half, key, keySize);
|
||||||
|
sha1_input[1 + half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (1 + half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (1 + half + keySize) * 8 / 0x100;
|
||||||
|
}
|
||||||
|
sha1_single_block(sha1_input, sha1_result);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = half & ~3; i < half; i++)
|
for (i = half & ~3; i < half; i++)
|
||||||
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
||||||
@ -671,8 +783,44 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49])
|
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid, bool overrideVersion)
|
||||||
{
|
{
|
||||||
|
int version;
|
||||||
|
unsigned char hardwareID[8];
|
||||||
|
activationMode = mode;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
MOD = 0x16A6B036D7F2A79;
|
||||||
|
NON_RESIDUE = 43;
|
||||||
|
f[0] = 0x0;
|
||||||
|
f[1] = 0x21840136C85381;
|
||||||
|
f[2] = 0x44197B83892AD0;
|
||||||
|
f[3] = 0x1400606322B3B04;
|
||||||
|
f[4] = 0x1400606322B3B04;
|
||||||
|
f[5] = 0x1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
MOD = 0x16E48DD18451FE9;
|
||||||
|
NON_RESIDUE = 3;
|
||||||
|
f[0] = 0x0;
|
||||||
|
f[1] = 0xE5F5ECD95C8FD2;
|
||||||
|
f[2] = 0xFF28276F11F61;
|
||||||
|
f[3] = 0xFB2BD9132627E6;
|
||||||
|
f[4] = 0xE5F5ECD95C8FD2;
|
||||||
|
f[5] = 0x1;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
MOD = 0x16A5DABA0605983;
|
||||||
|
NON_RESIDUE = 2;
|
||||||
|
f[0] = 0x334F24F75CAA0E;
|
||||||
|
f[1] = 0x1392FF62889BD7B;
|
||||||
|
f[2] = 0x135131863BA2DB8;
|
||||||
|
f[3] = 0x153208E78006010;
|
||||||
|
f[4] = 0x163694F26056DB;
|
||||||
|
f[5] = 0x1;
|
||||||
|
}
|
||||||
unsigned char installation_id[19]; // 10**45 < 256**19
|
unsigned char installation_id[19]; // 10**45 < 256**19
|
||||||
size_t installation_id_len = 0;
|
size_t installation_id_len = 0;
|
||||||
const char* p = installation_id_str;
|
const char* p = installation_id_str;
|
||||||
@ -714,9 +862,25 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
return ERR_TOO_SHORT;
|
return ERR_TOO_SHORT;
|
||||||
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
|
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
|
||||||
installation_id[installation_id_len] = 0;
|
installation_id[installation_id_len] = 0;
|
||||||
static const unsigned char iid_key[4] = {0x6A, 0xC8, 0x5E, 0xD4};
|
unsigned char iid_key[4] = { 0x0, 0x0, 0x0, 0x0 };
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
case 4:
|
||||||
|
iid_key[0] = 0x6A;
|
||||||
|
iid_key[1] = 0xC8;
|
||||||
|
iid_key[2] = 0x5E;
|
||||||
|
iid_key[3] = 0xD4;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
iid_key[0] = 0x5A;
|
||||||
|
iid_key[1] = 0x30;
|
||||||
|
iid_key[2] = 0xB9;
|
||||||
|
iid_key[3] = 0xF3;
|
||||||
|
}
|
||||||
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
||||||
if (installation_id[18] >= 0x10)
|
if (installation_id[18] >= 0x10 && overrideVersion == false)
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
@ -727,19 +891,71 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
unsigned short KeySHA1;
|
unsigned short KeySHA1;
|
||||||
} parsed;
|
} parsed;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
memcpy(&parsed, installation_id, sizeof(parsed));
|
switch (activationMode) {
|
||||||
unsigned productId1 = parsed.ProductIDLow & ((1 << 17) - 1);
|
case 0:
|
||||||
unsigned productId2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
|
case 1:
|
||||||
unsigned productId3 = (parsed.ProductIDLow >> 27) & ((1 << 25) - 1);
|
case 4:
|
||||||
unsigned version = (parsed.ProductIDLow >> 52) & 7;
|
memcpy(&parsed, installation_id, sizeof(parsed));
|
||||||
unsigned productId4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
productID[0] = parsed.ProductIDLow & ((1 << 17) - 1);
|
||||||
if (version != (totalCount == 41 ? 4 : 5))
|
productID[1] = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
|
||||||
return ERR_UNKNOWN_VERSION;
|
productID[2] = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
|
||||||
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
|
version = (parsed.ProductIDLow >> 51) & 15;
|
||||||
|
productID[3] = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
||||||
|
if (overrideVersion == false) {
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
if (version != (totalCount == 41 ? 9 : 10))
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (version != 1)
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (version != 4)
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
decode_iid_new_version(installation_id, hardwareID, &version);
|
||||||
|
if (overrideVersion == false) {
|
||||||
|
switch (activationMode) {
|
||||||
|
case 2:
|
||||||
|
if (version != 3)
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (version != 4)
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memcpy(&parsed, hardwareID, 8);
|
||||||
|
productID[0] = stoi(productid.substr(0,5));
|
||||||
|
std::string channelid = productid.substr(6,3);
|
||||||
|
char *p = &channelid[0];
|
||||||
|
for (; *p; p++) {
|
||||||
|
*p = toupper((unsigned char)*p);
|
||||||
|
}
|
||||||
|
if (strcmp(&channelid[0], "OEM") == 0) {
|
||||||
|
productID[1] = stoi(productid.substr(12,3));
|
||||||
|
productID[2] = (stoi(productid.substr(15,1)) * 100000) + stoi(productid.substr(18,5));
|
||||||
|
productID[2] = calculateCheckDigit(productID[2]);
|
||||||
|
productID[3] = ((stoi(productid.substr(10,2))) * 1000) + productID[3];
|
||||||
|
} else {
|
||||||
|
productID[1] = stoi(productid.substr(6,3));
|
||||||
|
productID[2] = stoi(productid.substr(10,7));
|
||||||
|
productID[3] = stoi(productid.substr(18,5));
|
||||||
|
}
|
||||||
|
//fmt::print("ProductID: {}-{}-{}-{} \n", productID[0], productID[1], productID[2], productID[3]);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char keybuf[16];
|
unsigned char keybuf[16];
|
||||||
memcpy(keybuf, &parsed.HardwareID, 8);
|
memcpy(keybuf, &parsed.HardwareID, 8);
|
||||||
QWORD productIdMixed = (QWORD)productId1 << 41 | (QWORD)productId2 << 58 | (QWORD)productId3 << 17 | productId4;
|
QWORD productIdMixed = (QWORD)productID[0] << 41 | (QWORD)productID[1] << 58 | (QWORD)productID[2] << 17 | productID[3];
|
||||||
memcpy(keybuf + 8, &productIdMixed, 8);
|
memcpy(keybuf + 8, &productIdMixed, 8);
|
||||||
|
|
||||||
TDivisor d;
|
TDivisor d;
|
||||||
@ -754,7 +970,16 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
} u;
|
} u;
|
||||||
u.lo = 0;
|
u.lo = 0;
|
||||||
u.hi = 0;
|
u.hi = 0;
|
||||||
u.buffer[7] = attempt;
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
case 4:
|
||||||
|
u.buffer[7] = attempt;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
u.buffer[6] = attempt;
|
||||||
|
}
|
||||||
Mix(u.buffer, 14, keybuf, 16);
|
Mix(u.buffer, 14, keybuf, 16);
|
||||||
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
|
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
|
||||||
QWORD x1 = u.lo - x2 * MOD;
|
QWORD x1 = u.lo - x2 * MOD;
|
||||||
@ -766,7 +991,18 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
}
|
}
|
||||||
if (attempt > 0x80)
|
if (attempt > 0x80)
|
||||||
return ERR_UNLUCKY;
|
return ERR_UNLUCKY;
|
||||||
divisor_mul128(&d, 0x04e21b9d10f127c1, 0x40da7c36d44c, &d);
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
divisor_mul128(&d, 0x04E21B9D10F127C1, 0x40DA7C36D44C, &d);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
divisor_mul128(&d, 0xEFE0302A1F7A5341, 0x01FB8CF48A70DF, &d);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
divisor_mul128(&d, 0x7C4254C43A5D1181, 0x01C61212ECE610, &d);
|
||||||
|
}
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
QWORD encoded_lo, encoded_hi;
|
QWORD encoded_lo, encoded_hi;
|
||||||
|
@ -41,6 +41,7 @@ typedef struct {
|
|||||||
} TDivisor;
|
} TDivisor;
|
||||||
|
|
||||||
EXPORT class ConfirmationID {
|
EXPORT class ConfirmationID {
|
||||||
|
static int calculateCheckDigit(int pid);
|
||||||
static QWORD residue_add(QWORD x, QWORD y);
|
static QWORD residue_add(QWORD x, QWORD y);
|
||||||
static QWORD residue_sub(QWORD x, QWORD y);
|
static QWORD residue_sub(QWORD x, QWORD y);
|
||||||
static QWORD __umul128(QWORD a, QWORD b, QWORD* hi);
|
static QWORD __umul128(QWORD a, QWORD b, QWORD* hi);
|
||||||
@ -60,11 +61,12 @@ EXPORT class ConfirmationID {
|
|||||||
static void divisor_mul128(const TDivisor* src, QWORD mult_lo, QWORD mult_hi, TDivisor* dst);
|
static void divisor_mul128(const TDivisor* src, QWORD mult_lo, QWORD mult_hi, TDivisor* dst);
|
||||||
static unsigned rol(unsigned x, int shift);
|
static unsigned rol(unsigned x, int shift);
|
||||||
static void sha1_single_block(unsigned char input[64], unsigned char output[20]);
|
static void sha1_single_block(unsigned char input[64], unsigned char output[20]);
|
||||||
|
static void decode_iid_new_version(unsigned char* iid, unsigned char* hwid, int* version);
|
||||||
static void Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int Generate(const char* installation_id_str, char confirmation_id[49]);
|
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]) {
|
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);
|
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,78 @@ 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;
|
||||||
|
#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;
|
||||||
|
#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
|
||||||
@ -59,6 +63,17 @@
|
|||||||
#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 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 +82,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
|
||||||
|
@ -201,7 +201,7 @@ void PIDGEN3::BINK1998::Generate(
|
|||||||
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;
|
||||||
|
@ -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);
|
||||||
|
@ -100,6 +100,13 @@ EC_GROUP* PIDGEN3::initializeEllipticCurve(
|
|||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
BN_CTX_free(context);
|
BN_CTX_free(context);
|
||||||
|
BN_free(p);
|
||||||
|
BN_free(a);
|
||||||
|
BN_free(b);
|
||||||
|
BN_free(generatorX);
|
||||||
|
BN_free(generatorY);
|
||||||
|
BN_free(publicKeyX);
|
||||||
|
BN_free(publicKeyY);
|
||||||
|
|
||||||
return eCurve;
|
return eCurve;
|
||||||
}
|
}
|
||||||
|
12
src/main.cpp
12
src/main.cpp
@ -39,23 +39,23 @@ int main(int argc, char *argv[]) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
CLI* run = new CLI(options, keys);
|
CLI run(options, keys);
|
||||||
|
|
||||||
switch(options.applicationMode) {
|
switch(options.applicationMode) {
|
||||||
case MODE_BINK1998_GENERATE:
|
case MODE_BINK1998_GENERATE:
|
||||||
return run->BINK1998Generate();
|
return run.BINK1998Generate();
|
||||||
|
|
||||||
case MODE_BINK2002_GENERATE:
|
case MODE_BINK2002_GENERATE:
|
||||||
return run->BINK2002Generate();
|
return run.BINK2002Generate();
|
||||||
|
|
||||||
case MODE_BINK1998_VALIDATE:
|
case MODE_BINK1998_VALIDATE:
|
||||||
return run->BINK1998Validate();
|
return run.BINK1998Validate();
|
||||||
|
|
||||||
case MODE_BINK2002_VALIDATE:
|
case MODE_BINK2002_VALIDATE:
|
||||||
return run->BINK2002Validate();
|
return run.BINK2002Validate();
|
||||||
|
|
||||||
case MODE_CONFIRMATION_ID:
|
case MODE_CONFIRMATION_ID:
|
||||||
return run->ConfirmationID();
|
return run.ConfirmationID();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user