mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2025-06-13 09:04:17 +03:00
Compare commits
160 Commits
dos-window
...
8368b6a6c7
Author | SHA1 | Date | |
---|---|---|---|
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 |
50
.github/workflows/dos-djgpp.yml
vendored
50
.github/workflows/dos-djgpp.yml
vendored
@ -20,29 +20,33 @@
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
- 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
|
||||||
@ -50,40 +54,34 @@ jobs:
|
|||||||
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: Checkout and Cross Compile OpenSSL 3.1.2
|
||||||
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 no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
|
||||||
make && make install
|
make && make install
|
||||||
popd
|
popd
|
||||||
|
|
||||||
- name: Checkout Source Tree
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- 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}
|
||||||
options: OPENSSL_ROOT_DIR:string=${{ github.workspace }}/djgpp DJGPP_WATT32=ON
|
make
|
||||||
run-build: true
|
|
||||||
|
|
||||||
- name: Move files to correct directory
|
- 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
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
65
.github/workflows/freebsd.yml
vendored
Normal file
65
.github/workflows/freebsd.yml
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# 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
|
||||||
|
./umskt # Execute the test here
|
||||||
|
|
||||||
|
- 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
|
25
.github/workflows/linux.yml
vendored
25
.github/workflows/linux.yml
vendored
@ -22,9 +22,9 @@ 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:
|
||||||
@ -37,7 +37,7 @@ jobs:
|
|||||||
- arch: aarch64
|
- arch: aarch64
|
||||||
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 for ${{ matrix.arch }}
|
||||||
uses: jirutka/setup-alpine@v1
|
uses: jirutka/setup-alpine@v1
|
||||||
@ -50,6 +50,7 @@ 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
|
||||||
|
|
||||||
@ -66,7 +67,21 @@ jobs:
|
|||||||
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
|
||||||
|
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 shared deps UMSKT
|
||||||
|
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
|
||||||
|
with:
|
||||||
|
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
|
||||||
|
run-build: true
|
||||||
|
shell: alpine-target.sh {0}
|
||||||
|
60
.github/workflows/macos.yml
vendored
Normal file
60
.github/workflows/macos.yml
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# 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-x86:
|
||||||
|
runs-on: macos-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x86_64
|
||||||
|
steps:
|
||||||
|
- name: Checkout Source Tree
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Configure and build UMSKT
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
make
|
||||||
|
|
||||||
|
- name: Move files to correct directory
|
||||||
|
run: |
|
||||||
|
mkdir -p build/actions_upload
|
||||||
|
mv build/umskt build/actions_upload/umskt
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
cd build/actions_upload
|
||||||
|
./umskt
|
||||||
|
|
||||||
|
- name: Upload build artifact
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: UMSKT-macOS-${{ matrix.arch }}
|
||||||
|
path: build/actions_upload
|
134
.github/workflows/windows.yml
vendored
134
.github/workflows/windows.yml
vendored
@ -22,24 +22,66 @@ name: C/C++ CI (Windows)
|
|||||||
|
|
||||||
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-32bit:
|
build-32bit:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Install v141_xp
|
# https://github.com/actions/runner-images/issues/6067#issuecomment-1213069040
|
||||||
uses: thepwrtank18/install-vs-components@v1.0.0
|
- name: Install Windows XP Support for Visual Studio
|
||||||
with:
|
run: |
|
||||||
components: Microsoft.VisualStudio.Component.WinXP
|
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
|
||||||
|
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
|
||||||
|
$componentsToAdd = @(
|
||||||
|
"Microsoft.VisualStudio.Component.WinXP"
|
||||||
|
)
|
||||||
|
[string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_}
|
||||||
|
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
|
||||||
|
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
|
||||||
|
if ($process.ExitCode -eq 0)
|
||||||
|
{
|
||||||
|
Write-Host "components have been successfully added"
|
||||||
|
Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.*
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Host "components were not installed"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
- name: Download And Install 32-bit OpenSSL 3.1.1
|
- name: Download And Install 32-bit OpenSSL
|
||||||
run: |
|
run: |
|
||||||
$installDir = "$Env:ProgramFiles\OpenSSL"
|
$installDir = "$Env:ProgramFiles\OpenSSL"
|
||||||
$installerURL = "https://slproweb.com/download/Win32OpenSSL-3_1_1.exe"
|
# Define the URL for the JSON file containing the hashes
|
||||||
$installerName = "Win32OpenSSL-3_1_1.exe"
|
$jsonUrl = "https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json"
|
||||||
|
|
||||||
|
# Download the JSON data
|
||||||
|
$jsonData = Invoke-RestMethod -Uri $jsonUrl
|
||||||
|
|
||||||
|
# Initialize variables for the latest version and URL
|
||||||
|
$latestVersion = "0.0.0"
|
||||||
|
$latestUrl = ""
|
||||||
|
|
||||||
|
# Iterate through the files to find the latest 3.1.x version
|
||||||
|
foreach ($file in $jsonData.files.PSObject.Properties) {
|
||||||
|
$details = $file.Value
|
||||||
|
if ($details.basever -like "3.1*" -and $file.Name -like "Win32OpenSSL*") {
|
||||||
|
if ([version]$details.basever -gt [version]$latestVersion) {
|
||||||
|
$latestVersion = $details.basever
|
||||||
|
$latestUrl = $details.url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the latest version and URL
|
||||||
|
Write-Output "Latest OpenSSL Win32 3.1.x version: $latestVersion"
|
||||||
|
Write-Output "Download link: $latestUrl"
|
||||||
|
|
||||||
|
$installerURL = $latestURL
|
||||||
|
$installerName = "Win32OpenSSL.exe"
|
||||||
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
|
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
|
||||||
|
|
||||||
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
|
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
|
||||||
@ -49,7 +91,7 @@ jobs:
|
|||||||
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
|
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
|
||||||
|
|
||||||
- name: Checkout Source Tree
|
- name: Checkout Source Tree
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup MSBuild
|
- name: Setup MSBuild
|
||||||
uses: microsoft/setup-msbuild@v1
|
uses: microsoft/setup-msbuild@v1
|
||||||
@ -57,17 +99,16 @@ jobs:
|
|||||||
- name: Configure UMSKT
|
- name: Configure UMSKT
|
||||||
uses: threeal/cmake-action@v1.2.0
|
uses: threeal/cmake-action@v1.2.0
|
||||||
with:
|
with:
|
||||||
working-directory: build
|
|
||||||
generator: "Visual Studio 17 2022"
|
generator: "Visual Studio 17 2022"
|
||||||
options: CMAKE_SYSTEM_VERSION="5.1.2600"
|
options: CMAKE_SYSTEM_VERSION="5.1.2600"
|
||||||
args: -A "Win32" -T v141_xp
|
args: -A "Win32" -T v141_xp
|
||||||
|
|
||||||
- name: Build UMSKT
|
- name: Build UMSKT
|
||||||
working-directory: build
|
working-directory: build
|
||||||
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release /P:XPDeprecationWarning=false
|
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release
|
||||||
|
|
||||||
- name: Upload build artifact
|
- name: Upload build artifact
|
||||||
uses: actions/upload-artifact@v3.1.2
|
uses: actions/upload-artifact@v4.6.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-Win32
|
name: UMSKT-Win32
|
||||||
path: build/Release
|
path: build/Release
|
||||||
@ -75,16 +116,57 @@ jobs:
|
|||||||
build-64bit:
|
build-64bit:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Install v141_xp
|
- name: Install Windows XP Support for Visual Studio
|
||||||
uses: thepwrtank18/install-vs-components@v1.0.0
|
run: |
|
||||||
with:
|
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
|
||||||
components: Microsoft.VisualStudio.Component.WinXP
|
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
|
||||||
|
$componentsToAdd = @(
|
||||||
- name: Download And Install 64-bit OpenSSL 3.1.1
|
"Microsoft.VisualStudio.Component.WinXP"
|
||||||
|
)
|
||||||
|
[string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_}
|
||||||
|
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
|
||||||
|
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
|
||||||
|
if ($process.ExitCode -eq 0)
|
||||||
|
{
|
||||||
|
Write-Host "components have been successfully added"
|
||||||
|
Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.*
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Host "components were not installed"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Download And Install 64-bit OpenSSL
|
||||||
run: |
|
run: |
|
||||||
$installDir = "$Env:ProgramFiles\OpenSSL"
|
$installDir = "$Env:ProgramFiles\OpenSSL"
|
||||||
$installerURL = "https://slproweb.com/download/Win64OpenSSL-3_1_1.exe"
|
# Define the URL for the JSON file containing the hashes
|
||||||
$installerName = "Win64OpenSSL-3_1_1.exe"
|
$jsonUrl = "https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json"
|
||||||
|
|
||||||
|
# Download the JSON data
|
||||||
|
$jsonData = Invoke-RestMethod -Uri $jsonUrl
|
||||||
|
|
||||||
|
# Initialize variables for the latest version and URL
|
||||||
|
$latestVersion = "0.0.0"
|
||||||
|
$latestUrl = ""
|
||||||
|
|
||||||
|
# Iterate through the files to find the latest 3.1.x version
|
||||||
|
foreach ($file in $jsonData.files.PSObject.Properties) {
|
||||||
|
$details = $file.Value
|
||||||
|
if ($details.basever -like "3.1*" -and $file.Name -like "Win64OpenSSL*") {
|
||||||
|
if ([version]$details.basever -gt [version]$latestVersion) {
|
||||||
|
$latestVersion = $details.basever
|
||||||
|
$latestUrl = $details.url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the latest version and URL
|
||||||
|
Write-Output "Latest OpenSSL Win64 3.1.x version: $latestVersion"
|
||||||
|
Write-Output "Download link: $latestUrl"
|
||||||
|
|
||||||
|
$installerURL = $latestURL
|
||||||
|
$installerName = "Win64OpenSSL.exe"
|
||||||
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
|
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
|
||||||
|
|
||||||
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
|
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
|
||||||
@ -94,7 +176,7 @@ jobs:
|
|||||||
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
|
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
|
||||||
|
|
||||||
- name: Checkout Source Tree
|
- name: Checkout Source Tree
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup MSBuild
|
- name: Setup MSBuild
|
||||||
uses: microsoft/setup-msbuild@v1
|
uses: microsoft/setup-msbuild@v1
|
||||||
@ -103,14 +185,14 @@ jobs:
|
|||||||
uses: threeal/cmake-action@v1.2.0
|
uses: threeal/cmake-action@v1.2.0
|
||||||
with:
|
with:
|
||||||
generator: "Visual Studio 17 2022"
|
generator: "Visual Studio 17 2022"
|
||||||
args: -A "x64" -T v141_xp
|
args: -A "x64" -T "v141_xp"
|
||||||
|
|
||||||
- name: Build UMSKT
|
- name: Build UMSKT
|
||||||
working-directory: build
|
working-directory: build
|
||||||
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release /P:XPDeprecationWarning=false
|
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release
|
||||||
|
|
||||||
- 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-Win64
|
name: UMSKT-Win64
|
||||||
path: build/Release
|
path: build/Release
|
||||||
|
110
CMakeLists.txt
110
CMakeLists.txt
@ -20,8 +20,11 @@
|
|||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
|
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
|
||||||
PROJECT(UMSKT)
|
PROJECT(UMSKT)
|
||||||
|
|
||||||
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)
|
||||||
@ -30,38 +33,42 @@ OPTION(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilati
|
|||||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
||||||
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
||||||
|
|
||||||
|
# macOS does not support static build
|
||||||
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
SET(UMSKT_USE_SHARED_OPENSSL ON)
|
||||||
|
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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
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 +88,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 +98,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)
|
||||||
|
|
||||||
@ -147,28 +197,24 @@ 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})
|
||||||
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)
|
||||||
|
64
README.md
64
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,33 @@ In light of the recent exponential interest in this project I've decided to put
|
|||||||
|
|
||||||
* It all comes down to four simple steps:
|
* It all comes down to four simple steps:
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
### **Usage**
|
### **Usage**
|
||||||
#### 1. Download the latest version of 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)
|
||||||
|
|
||||||
|
* **Note:** Before continuing, please ensure you have the `umskt` executable extracted and on UNIX-like systems, have execution permissions (`chmod +x umskt`).
|
||||||
|
|
||||||
* **Note:** Before continuing, please ensure you have both the `xpkey` program and the `keys.json` datum extracted and in the same directory
|
#### 2. Install OpenSSL.
|
||||||
|
For Windows, click [here](https://slproweb.com/products/Win32OpenSSL.html) and choose the right version. For other operating systems, consult your package manager.
|
||||||
|
*Note: This only applies if the build you download has OpenSSL embedded (static library) or not. You can usually tell if the download size is measured in KB or MB. If it's MB, you don't need this.*
|
||||||
|
|
||||||
#### 2. Run `xpkey` to generate a key, or add `--help` to see more options.
|
#### 3. Run `umskt` to generate a key, or add `--help` or `-h` to see more options.
|
||||||
|
|
||||||
#### 3. *(Activation step for `Retail` and `OEM` only)*
|
#### 4. *(Activation step for `Retail` and `OEM` only)*
|
||||||
* After installation, you will be prompted to activate Windows.
|
* After installation, you will be prompted to activate Windows.
|
||||||
|
|
||||||
|
|
||||||
* 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 +80,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 +97,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) |
|
||||||
|
111
keys.json
111
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",
|
||||||
@ -1568,4 +1661,4 @@
|
|||||||
"iid_key": "1513142771"
|
"iid_key": "1513142771"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
111
src/cli.cpp
111
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,16 @@ 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 ID's, if you need this send an issue on GitHub");
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +82,7 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
"",
|
||||||
640,
|
640,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@ -76,12 +91,15 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
MODE_BINK1998_GENERATE
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
MODE_BINK1998_GENERATE,
|
||||||
|
WINDOWS
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
std::string arg = argv[i];
|
std::string arg = argv[i];
|
||||||
|
|
||||||
if (arg == "-v" || arg == "--verbose") {
|
if (arg == "-v" || arg == "--verbose") {
|
||||||
options->verbose = true;
|
options->verbose = true;
|
||||||
UMSKT::setDebugOutput(stderr);
|
UMSKT::setDebugOutput(stderr);
|
||||||
@ -137,6 +155,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 +174,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 +209,21 @@ 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 {
|
||||||
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 +272,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 +303,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);
|
||||||
@ -368,6 +430,7 @@ int CLI::BINK1998Generate() {
|
|||||||
|
|
||||||
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 +442,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 +468,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,23 +491,21 @@ int CLI::BINK2002Generate() {
|
|||||||
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 +516,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 +563,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:
|
||||||
@ -535,9 +592,9 @@ int CLI::ConfirmationID() {
|
|||||||
|
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
fmt::print(confirmation_id);
|
fmt::print(confirmation_id);
|
||||||
#ifndef _WIN32
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
#endif
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
16
src/cli.h
16
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,21 @@ 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;
|
||||||
|
|
||||||
MODE applicationMode;
|
MODE applicationMode;
|
||||||
|
ACTIVATION_ALGORITHM activationMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CLI {
|
class CLI {
|
||||||
@ -73,6 +86,7 @@ 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[]);
|
||||||
|
@ -29,9 +29,22 @@
|
|||||||
|
|
||||||
#include "confid.h"
|
#include "confid.h"
|
||||||
|
|
||||||
#define MOD 0x16A6B036D7F2A79ULL
|
QWORD MOD = 0;
|
||||||
#define NON_RESIDUE 43
|
QWORD NON_RESIDUE = 0;
|
||||||
static const QWORD f[6] = {0, 0x21840136C85381ULL, 0x44197B83892AD0ULL, 0x1400606322B3B04ULL, 0x1400606322B3B04ULL, 1};
|
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)
|
||||||
{
|
{
|
||||||
@ -95,18 +108,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 +679,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 +702,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 +742,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 +773,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 +852,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 +881,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 +960,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 +981,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) {
|
||||||
@ -57,4 +57,4 @@ 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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user