160 Commits

Author SHA1 Message Date
8368b6a6c7 Merge pull request #116 from UMSKT/disable-freebsd
Disable automatic FreeBSD GH action
2025-04-13 21:14:58 -04:00
2415d1374f Disable FreeBSD GH action 2025-04-13 19:52:53 -04:00
d1024950da Fix GH actions 2025-04-13 19:09:02 -04:00
1ca5114b21 Update dos-djgpp.yml 2025-04-13 17:50:24 -04:00
da10583fdf Update freebsd.yml 2025-04-13 17:50:14 -04:00
034c00a5b8 Update linux.yml 2025-04-13 17:50:02 -04:00
cd050c65d6 Update macos.yml 2025-04-13 17:49:44 -04:00
02434e935d Update windows.yml 2025-04-13 17:49:00 -04:00
09f1300afc Update windows.yml 2025-04-13 17:47:43 -04:00
a3de0e845f Update keys.json 2025-04-13 17:42:09 -04:00
6287b4c773 Bink Data Update (#113)
* Update keys.json

Added BINK ID10

* Update keys.json

added/updated some missing BINKID data
BINKID 0x0B
BINKID 0x42
BINKID 0x43
BINKID 0x44
BINKID 0x45
2025-03-12 10:35:47 -07:00
a5ce3abe13 the end of updating openssl manually 2024-07-25 23:47:07 -05:00
27344f6d4b begone strikethrough 2024-07-25 23:32:38 -05:00
01b216dbc4 let it end 2024-06-22 00:01:28 -05:00
Neo
c29db1d30a Update keys.json 2024-04-15 08:02:38 -07:00
1c1e26012f add "2007 Microsoft Office system" bink (#91) 2024-04-15 07:38:26 -07:00
75f22215b1 Merge pull request #92 from thepwrtank18/version-check-bypass
Override version check for confirmation ID's
2024-04-13 16:02:18 -04:00
be99f6b8e9 Update cli.cpp 2024-04-13 19:12:57 +00:00
e830f97e7e Update cli.cpp 2024-04-13 19:01:34 +00:00
0251546d0d Update libumskt.cpp 2024-04-13 18:59:34 +00:00
a12afcd601 Update confid.h 2024-04-13 18:46:31 +00:00
c7a555abe4 Update cli.cpp 2024-04-13 18:44:41 +00:00
74ff4bf144 Update cli.h 2024-04-13 18:43:59 +00:00
2b408913c4 Update cli.cpp 2024-04-13 18:43:50 +00:00
c965b88113 Update confid.cpp 2024-04-13 18:43:32 +00:00
2bc3503fd8 Update cli.h 2024-04-13 18:40:03 +00:00
3fbd1cffea Update cli.cpp 2024-04-13 18:39:58 +00:00
4bf3800281 Comment out ERR_UNKNOWN_VERSION checks
Temporary fix for Office 2007 not generating confid's.
2024-04-13 18:00:07 +00:00
8ec60bf396 Update windows.yml 2024-04-13 14:45:46 +00:00
5fbbd5e6eb changing the openssl links every update isn't sustainable 2024-04-13 14:34:13 +00:00
d378c6499e Update README.md 2024-01-05 06:52:47 -05:00
3ea8731271 Merge pull request #80 from Neilpang/patch-1
Upgrade to freebsd-vm@v1
2023-12-19 17:03:52 +00:00
018f9f533c add trigger for pull_request 2023-12-17 20:38:37 +01:00
f1f1e0e6ea Upgrade to freebsd-vm@v1
The v0 is not working.
2023-12-17 20:26:24 +01:00
c4b63c15b2 Update keys.json (#79)
Added BINK ID10
2023-12-15 13:32:09 -08:00
1548e14169 Update OpenSSL to 3.1.4
Please see GIF attached for what we'll eventually do to OpenSSL.
2023-12-14 00:24:33 +00:00
72d48dd38b Merge pull request #74 from whatdoineed2do/build-static-normal-fixes
cleanup CMakeLists.txt
2023-09-30 17:51:45 -04:00
00d4906b28 djgpp: drop forced shared 2023-09-29 22:43:52 +01:00
88f60630c1 gh: window - upgrade from 404'd 3.1.2 resource to openssl 3.1.3 2023-09-29 22:16:33 +01:00
2ac6920e2c cleanup CMakeLists.txt to build normal with statically linked internal lib without need for full static linkage 2023-09-29 22:16:33 +01:00
8f843ad4c3 Merge pull request #72 from whatdoineed2do/usage-validation-memleaks
Usage validation and memleaks fixes
2023-09-27 04:42:08 -04:00
2753bf2a40 Update README.md 2023-09-26 23:05:22 -04:00
d17ada2e64 Merge pull request #73 from techguy16/master
Add Discord Invite
2023-09-26 14:28:13 -04:00
6685b38aac Update README.md 2023-09-27 07:26:10 +13:00
884d8c9703 Update README.md 2023-09-27 07:24:56 +13:00
5ba2dbddd4 EC/BN memleak 2023-09-25 12:13:53 +01:00
bf40bb6402 CLI moved to stack object 2023-09-25 12:13:43 +01:00
12a041c380 BN_free() memleaks 2023-09-25 12:04:52 +01:00
ecd9cd8dd2 office 2k7 enterprise must be given inst id 2023-09-25 11:26:28 +01:00
6989ae6c94 ensure arg for -p 2023-09-25 11:21:42 +01:00
ac510f8253 Update README.md 2023-09-17 19:05:16 -04:00
72c42f66c9 Merge pull request #70 from pottzman/master
Universal ConfirmationID
2023-09-07 13:34:10 -04:00
759c4009ef Merge pull request #16 from UMSKT/master
test merge
2023-09-07 19:21:48 +10:00
78c358c933 Merge pull request #15 from pottzman/ConfirmationID
Universal ConfirmationID
2023-09-07 19:17:53 +10:00
1d5e233c19 Update confid.cpp 2023-09-07 18:44:47 +10:00
6c06732331 Update confid.cpp 2023-09-07 18:05:58 +10:00
f347231362 Update confid.cpp 2023-09-07 17:29:07 +10:00
a7e97e45ee Update confid.cpp 2023-09-07 17:16:00 +10:00
bf57c32eae Merge pull request #12 from pottzman/ConfirmationID
Universal ConfirmationID
2023-09-06 23:16:38 +10:00
25db955b61 Update confid.cpp 2023-09-06 22:56:28 +10:00
1aeceb28f1 Update confid.cpp 2023-09-06 21:56:53 +10:00
b451a04f3c Update confid.cpp 2023-09-06 21:32:12 +10:00
3e5e03df4d Update confid.cpp 2023-09-06 20:54:34 +10:00
e3bdc93249 Update confid.cpp 2023-09-06 20:49:09 +10:00
36b2eb3e7d Update confid.cpp 2023-09-06 20:46:36 +10:00
49fefca596 Fix DOS compilation (Attempt 2) 2023-09-02 13:44:35 -04:00
178c9e0689 Fix DOS compilation (Attempt 1) 2023-09-02 13:43:03 -04:00
214d2d38a5 Merge pull request #68 from UMSKT/newline-fix 2023-09-02 13:16:56 -04:00
3ae078e3c5 update arg from nonewline to nonewlines 2023-09-02 11:53:09 -04:00
12e511b3a5 Update cli.cpp 2023-09-02 11:39:22 -04:00
21bac3b66c Update cli.cpp 2023-09-02 11:37:41 -04:00
09842ace12 Update cli.h 2023-09-02 11:37:38 -04:00
0d016b8872 Update cli.cpp 2023-09-02 11:31:25 -04:00
b1743f4bff fix name for FreeBSD 2023-09-02 11:17:52 -04:00
cc765edb4f Merge pull request #61 from UMSKT/workflow-update 2023-09-02 11:11:47 -04:00
4d1b5d6681 Update README.md 2023-09-02 11:11:16 -04:00
f59d77bdd1 Merge branch 'master' into workflow-update 2023-09-02 10:43:12 -04:00
71cbd19017 Add universal Confirmation ID 2023-09-02 10:42:26 -04:00
974f400cfc Revert "TEMP -- use -v" 2023-09-02 09:56:36 -04:00
a2d521c230 Update CMakeLists.txt 2023-09-02 09:55:20 -04:00
d53409f5bd TEMP -- use -v 2023-09-02 09:51:35 -04:00
2703e17f69 Update cli.cpp 2023-09-02 23:51:08 +10:00
680239bdb7 Merge branch 'cmake-fix' into master 2023-09-02 09:44:57 -04:00
104bdb19e3 Update confid.cpp 2023-09-02 23:33:47 +10:00
f2f859faeb Update confid.h 2023-09-02 23:27:02 +10:00
a2d9c46a4b Update libumskt.cpp 2023-09-02 23:25:14 +10:00
f65533bbb3 macOS build is not static 2023-09-02 09:24:04 -04:00
90e31b667a Update cli.h 2023-09-02 23:23:59 +10:00
492d245f86 Update cli.cpp
added CLI options for confirmation ID generation
2023-09-02 23:22:53 +10:00
361a39e204 Fix macOS compilation (Attempt 1) 2023-09-02 09:20:54 -04:00
31993afb62 Merge pull request #3 from UMSKT/master
FE and FF BINK exclusions
2023-09-02 23:03:17 +10:00
b3f64e6330 fix typo 2023-09-02 00:59:34 -04:00
ccf93a0089 Merge pull request #51 from UMSKT/fe-ff-fix
Add exclusions for FE and FF BINKs
2023-09-01 23:17:58 -04:00
ae391a5e50 Update cli.cpp 2023-09-01 22:43:32 -04:00
3620cf5af6 Update README.md 2023-09-01 19:54:08 -04:00
33774f7ad2 put all the stuff into cmake-fix 2023-09-01 19:12:57 -04:00
06ed5ef240 Update windows.yml 2023-09-01 18:50:59 -04:00
161aa2de4c put the working dir in the right place 2023-09-01 18:37:12 -04:00
a50688657d Fix v141_xp compilation 2023-09-01 18:20:02 -04:00
1679583e64 Update README.md 2023-09-01 18:19:35 -04:00
02c85b50b1 Change build config to v141_xp 2023-09-01 18:08:53 -04:00
93732e152b Add XP support for x64 2023-09-01 18:07:02 -04:00
95803054ba Tidy up Readme
- Order Operating Systems
- Add separators
- Fix build instructions (git clone doesn't just get the code, you need the url)
2023-09-02 09:46:19 +12:00
8619fccb11 Update freebsd.yml 2023-09-02 09:12:52 +12:00
06b9d937b1 Update freebsd.yml 2023-09-01 20:14:46 +12:00
453151f20f Add Tests for FreeBSD 2023-09-01 12:47:39 +12:00
1bb00cf53d Remove unnecessary zipping. 2023-09-01 11:56:37 +12:00
a787fc8e85 Fix Windows Build 2023-09-01 11:55:22 +12:00
582ddf1bb8 Merge pull request #63 from techguy16/master
Add Office 2k3 and Works Suite 2003/2004
2023-08-27 15:54:03 -04:00
13bf69c7e1 Add Office 2k3 and Works Suite 2003/2004 2023-08-28 07:20:10 +12:00
b7965f19e8 Delete test.md 2023-08-14 22:20:59 -04:00
52c9a57ea2 Create test.md 2023-08-14 22:16:07 -04:00
283df1c1fe Update linux.yml 2023-08-14 22:01:07 -04:00
c1eb81490b Update freebsd.yml 2023-08-14 22:01:01 -04:00
2ee6a99acd Update macos.yml 2023-08-14 22:00:58 -04:00
1370a6ecff Update windows.yml 2023-08-14 22:00:56 -04:00
e3a6b78407 Update dos-djgpp.yml 2023-08-14 21:59:25 -04:00
9fec269ad0 Only show successful runs on links 2023-08-14 21:35:42 -04:00
6ae5c9e435 Update windows.yml 2023-08-14 15:12:24 -04:00
a6bfaed6e8 Update macos.yml 2023-08-14 15:12:13 -04:00
f7b41a9810 Update linux.yml 2023-08-14 15:11:53 -04:00
e76eb7ac33 Update freebsd.yml 2023-08-14 15:11:35 -04:00
c91bbad69a Update dos-djgpp.yml 2023-08-14 15:11:17 -04:00
75e81e7049 Update dos-djgpp.yml 2023-08-14 15:09:41 -04:00
e9131e45c8 Update freebsd.yml 2023-08-14 15:09:16 -04:00
c664ea7f9c Update linux.yml 2023-08-14 15:08:52 -04:00
f95501b789 Update macos.yml 2023-08-14 15:08:24 -04:00
444f8c45c7 Allow manual workflows and auto workflows on all branches
This lets workflows work on all branches without changing anything, and allows workflows to be activated manually.
2023-08-14 15:07:24 -04:00
de09feb18f Update dos-djgpp.yml 2023-08-10 17:00:49 -04:00
bde4371cbe Update dos-djgpp.yml 2023-08-10 16:59:23 -04:00
f43a2d5c37 Update CMakeLists.txt 2023-08-10 16:54:33 -04:00
46c39df15d Update CMakeLists.txt 2023-08-10 16:23:01 -04:00
c078247bea Delete _dummy.txt 2023-08-10 14:46:11 -05:00
232be6aba2 trigger GitHub Actions 2023-08-10 14:45:04 -05:00
c0c3149be7 Update OpenSSL to 3.1.2 (to cmake-fix) 2023-08-10 14:42:44 -05:00
8e15a4f5b8 Update OpenSSL to 3.1.2 2023-08-10 12:07:39 -05:00
d411d56d81 Update dos-djgpp.yml 2023-08-10 10:18:55 -04:00
11253c5e2c Revert to old CMakeLists for now 2023-08-10 09:59:20 -04:00
9f7920ca2d Update CMakeLists.txt 2023-08-10 09:51:10 -04:00
9063e32a89 Update CMakeLists.txt 2023-08-10 09:49:04 -04:00
958169ccb5 Merge pull request #55 from pottzman/pottzman-upgrade-flag
Pottzman upgrade flag
2023-08-10 04:43:42 -03:00
63fbbd83ef Update cli.cpp 2023-08-10 17:27:03 +10:00
de659846d4 Update cli.cpp 2023-08-10 17:16:24 +10:00
7c4bcdc847 Update cli.cpp 2023-08-10 16:56:58 +10:00
859a21656c Update cli.cpp 2023-08-10 16:56:05 +10:00
4b2ef7ac72 Update cli.cpp 2023-08-10 16:52:19 +10:00
216c9cdf9d Update cli.cpp 2023-08-10 16:51:53 +10:00
8f685a022c Update cli.cpp 2023-08-10 16:49:57 +10:00
e4058ddf19 Update cli.h 2023-08-10 16:45:50 +10:00
Neo
45004623be Why does the Github web editor commit tabs??? 2023-07-28 16:17:57 -07:00
Neo
a4cb524fed re-add removed comment 2023-07-28 16:16:31 -07:00
Neo
03ae90163a cleaner cli.cpp fix 2023-07-28 16:15:37 -07:00
c1e9a0f021 add exclusions for FE and FF 2023-07-28 18:10:25 -05:00
152c03456c Merge pull request #50 from UMSKT/readme-fix 2023-07-28 17:49:23 -05:00
ea51438766 Update README.md 2023-07-28 17:32:15 -05:00
8ee1acc2be Fix multiple key issue 2023-07-28 16:50:40 -05:00
3134a6f7a3 Update cli.cpp
Attempt to fix "duplicate keys" issue
2023-07-28 16:31:54 -05:00
b75d08b3be Update README.md 2023-07-27 19:01:50 -05:00
20c84661b2 Add macOS and FreeBSD support and fix DJGPP build (#48) 2023-07-24 23:53:42 -07:00
Neo
fefc8552b6 Update README.md (#45)
Closes #44
2023-07-16 05:51:46 -07:00
15 changed files with 880 additions and 189 deletions

View File

@ -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
View 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

View File

@ -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
View 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

View File

@ -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

View File

@ -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)

View File

@ -1,17 +1,30 @@
# **Universal MS Key Toolkit (UMSKT)** # Universal MS Key Toolkit (UMSKT)
**Connect with us**
[![Zulip chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://umskt.zulipchat.com) [![Zulip chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://umskt.zulipchat.com)
[![libera.chat - #mspid](https://img.shields.io/badge/libera.chat-%23mspid-brightgreen)](https://web.libera.chat/gamja/?nick=Guest?#mspid) [![libera.chat - #mspid](https://img.shields.io/badge/libera.chat-%23mspid-brightgreen)](https://web.libera.chat/gamja/?nick=Guest?#mspid)
[![C/C++ CI (Linux)](https://github.com/UMSKT/UMSKT/actions/workflows/linux.yml/badge.svg)](../../actions/workflows/linux.yml) [![Discord](https://dcbadge.vercel.app/api/server/cUZxfNNSdt?style=flat)](https://discord.gg/PpBSpuphWM)
**Build status**
[![C/C++ CI (Windows)](https://github.com/UMSKT/UMSKT/actions/workflows/windows.yml/badge.svg)](../../actions/workflows/windows.yml) [![C/C++ CI (Windows)](https://github.com/UMSKT/UMSKT/actions/workflows/windows.yml/badge.svg)](../../actions/workflows/windows.yml)
[![C/C++ CI (macOS)](https://github.com/UMSKT/UMSKT/actions/workflows/macos.yml/badge.svg)](../../actions/workflows/macos.yml)
### **Plan of Action / ToDo List** [![C/C++ CI (Linux)](https://github.com/UMSKT/UMSKT/actions/workflows/linux.yml/badge.svg)](../../actions/workflows/linux.yml)
[![C/C++ CI (FreeBSD)](https://github.com/UMSKT/UMSKT/actions/workflows/freebsd.yml/badge.svg)](../../actions/workflows/freebsd.yml)
[![C/C++ CI (DOS DJGPP)](https://github.com/UMSKT/UMSKT/actions/workflows/dos-djgpp.yml/badge.svg)](../../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
View File

@ -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"
} }
} }
} }

View File

@ -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:

View File

@ -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[]);

View File

@ -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;

View File

@ -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();
}; };

View File

@ -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);
} }

View File

@ -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;
} }

View File

@ -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;