226 Commits

Author SHA1 Message Date
ed19cf2148 Update windows-arm.yml 2025-07-09 12:55:38 -05:00
4de84b6439 lower sdk target 2025-07-09 12:22:52 -05:00
827c26bc45 ARM32 support for Windows RT (#135) 2025-07-09 12:17:15 -05:00
a0e7a2561f move msys 2025-07-07 15:28:52 -05:00
8d92cc123d Update README.md 2025-07-07 14:37:44 -05:00
7af4a1fbcf Update README.md 2025-07-07 14:37:33 -05:00
2796923983 Update README.md 2025-07-07 14:36:04 -05:00
6fda0c9ab8 lets see 2025-07-07 14:18:57 -05:00
5e9ebe10cd i686 2025-07-07 14:07:37 -05:00
f216019046 what the fuck is this naming scheme 2025-07-07 13:57:44 -05:00
9663669c0c i486 2025-07-07 13:48:01 -05:00
af35f41c3f add the atomic lib (2) 2025-07-07 13:30:44 -05:00
0a4561b1cd add the atomic lib 2025-07-07 13:15:47 -05:00
fe8e7c72e0 no atomics 2025-07-07 13:00:58 -05:00
f630ed1e53 compatibility fixes 2025-07-07 12:53:00 -05:00
7c8a7dd54c Compile OpenSSL in-action (#134) 2025-07-07 11:27:04 -05:00
befe149285 let's actually check that 2025-07-06 16:31:21 -05:00
5eb3ed11f8 use CWSDSTUB to avoid needing CWSDPMI (#131) 2025-07-06 15:08:03 -05:00
f3be9fb950 Update dos-djgpp.yml 2025-07-04 09:35:48 -05:00
761ba76081 Update linux.yml 2025-07-04 09:35:34 -05:00
c072d096f3 Update windows.yml 2025-07-04 09:34:58 -05:00
1002e0a6d5 Windows on ARM support + icon fixes (#129)
* Support for Windows on ARM (uses MSVC, but it's Windows 11 exclusive anyway so `¯\_(ツ)_/¯`)
* Adds the icon back for x86/x64 TDM-GCC builds
* Makes Linux compilation on ARM much faster
* added tests to every workflow
2025-07-04 09:29:23 -05:00
6b85771db1 Static OpenSSL for macOS (#127) 2025-07-03 13:03:11 -05:00
8db1fe25d7 Make UMSKT (mostly) static on macOS (#126) 2025-07-03 12:11:00 -05:00
0db5d7f982 Universal binary compilation for macOS (#124) 2025-07-03 10:31:15 -05:00
25ed8d4f43 Merge pull request #120 from UMSKT/nodashes-cmd
Command line argument to remove dashes from product key
2025-06-18 21:50:16 -05:00
324688e9ef Update cli.cpp 2025-06-18 21:33:07 -05:00
6ae46d6aa2 duh 2025-06-18 21:24:37 -05:00
e07c080ee8 Update cli.h 2025-06-18 21:18:11 -05:00
ce9ff7e624 Revert "Update cli.h"
This reverts commit 714895c61b.
2025-06-18 21:17:08 -05:00
714895c61b Update cli.h 2025-06-18 21:13:50 -05:00
6ecf9c5309 Update cli.h 2025-06-18 21:09:15 -05:00
9f7d53dab3 Update cli.cpp 2025-06-18 21:08:02 -05:00
a66e579377 remove everything in a 2 mile radius 2025-06-10 23:43:31 -05:00
e30a4713b6 Update CMakeLists.txt 2025-06-10 23:34:14 -05:00
e9228045d3 Update dos-djgpp.yml 2025-06-10 22:38:03 -05:00
36de07ecdf Update dos-djgpp.yml 2025-06-10 22:33:18 -05:00
a28f4b5ca3 Update dos-djgpp.yml 2025-06-10 22:28:02 -05:00
a0cb9e9869 Update dos-djgpp.yml 2025-06-10 22:26:20 -05:00
6d30abba98 Update dos-djgpp.yml 2025-06-10 22:23:14 -05:00
8b6c3b252b Update dos-djgpp.yml 2025-06-10 22:20:39 -05:00
1fd7550f85 Merge pull request #119 from thepwrtank18/djgpp-rng
RNG bugfix for DOS (DJGPP)
2025-06-09 23:20:45 -05:00
1f85bf954e RNG bugfix for DOS (DJGPP) 2025-06-09 23:15:34 -05:00
74ff1ea08c https://www.youtube.com/watch?v=y3M3xpKV7wA
Replace MSVC with TDM-GCC
2025-06-07 21:11:48 -04:00
0a63055e91 32-bit 2025-06-05 01:05:45 -04:00
94da628e48 Update windows.yml 2025-06-05 01:00:39 -04:00
8e58232803 ops 2025-06-05 00:58:06 -04:00
78ec40f4e3 sdfjkwwhqd 2025-06-05 00:57:13 -04:00
9d36fb2f66 this is stupid 2025-06-05 00:41:27 -04:00
2166ee6e2f PICK ONE ARE YOU WINDOWS OR UNIX 2025-06-05 00:14:58 -04:00
e85add2a54 5 HOURS DEBUGGING THIS CRAP 2025-06-05 00:10:01 -04:00
f459316865 Satya Nadella this is your fault 2025-06-04 23:59:59 -04:00
60a9b0ea70 i'm going to kms
https://learn.microsoft.com/en-us/windows-server/get-started/kms-client-activation-key
2025-06-04 23:49:36 -04:00
0ebce49cf0 final theory 2025-06-04 23:34:50 -04:00
caa37365d4 theory of everything 3 2025-06-04 23:32:32 -04:00
8fe0fc06b2 theory of everything 2 2025-06-04 23:24:02 -04:00
fc4b83d1e8 theory of everything 2025-06-04 23:13:06 -04:00
aa331ad6e4 broken glass theory 2025-06-04 23:03:30 -04:00
9b06fcf162 ice soup theory 2025-06-04 22:52:06 -04:00
a4d810b030 tree method 2025-06-04 22:43:58 -04:00
c209070a66 progress 2025-06-04 20:24:27 -04:00
9c01c93e77 ctrl shift l moment 2025-06-04 20:09:07 -04:00
b41b596e54 ??? 2025-06-04 20:04:51 -04:00
8723928e48 Update windows.yml 2025-06-04 19:59:50 -04:00
8b603c96f1 Update windows.yml 2025-06-04 19:51:59 -04:00
403bcb9dd5 initial TDM-GCC switchover 2025-06-04 19:43:22 -04:00
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
25 changed files with 1671 additions and 290 deletions

View File

@ -21,7 +21,10 @@
name: C/C++ CI (DOS DJGPP)
on:
workflow_call:
push:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
env:
CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
@ -34,12 +37,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Source Tree
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup build environment
run: |
sudo apt -y update
sudo apt -y install build-essential cmake wget 7zip git flex libfl-dev nasm libslang2-dev pkg-config libslang2-modules gcc-multilib
sudo apt -y install build-essential cmake wget 7zip git flex libfl-dev nasm libslang2-dev pkg-config libslang2-modules gcc-multilib dosbox tree
- name: Download and Setup DJGPP Toolchain
run: |
@ -47,6 +50,7 @@ jobs:
wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/djgpp-linux64-gcc1220.tar.bz2
tar xjf djgpp-linux64-gcc1220.tar.bz2
cd ${{ github.workspace }}/djgpp
tree . -S
git clone https://github.com/UMSKT/Watt-32.git watt32
cd watt32/util
make clean && make linux
@ -56,29 +60,131 @@ jobs:
make -f djgpp.mak
ln -s ${WATT_ROOT}/lib/libwatt.a ${{ github.workspace }}/djgpp/lib
- name: Cache OpenSSL 3.1.2
uses: actions/cache/restore@v4
id: cache-openssl
with:
path: |
${{ github.workspace }}/djgpp
key: openssl-3.1.2-${{ hashFiles('**/CMakeLists.txt') }}
- name: Checkout and Cross Compile OpenSSL 3.1.2
if: steps.cache-openssl.outputs.cache-hit != 'true'
run: |
git clone https://github.com/UMSKT/openssl.git openssl
pushd openssl
source ${{ github.workspace }}/djgpp/setenv
./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
make && make install
./Configure 386 no-threads no-tests no-sse2 no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i386 --prefix=${{ github.workspace }}/djgpp DJGPP
make && make install_sw
popd
- name: Save OpenSSL 3.1.2
if: steps.cache-openssl.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
${{ github.workspace }}/djgpp
key: openssl-3.1.2-${{ hashFiles('**/CMakeLists.txt') }}
- name: Download stub
run: |
wget https://web.archive.org/web/20250308092209/https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/util/system/cwsdpmi/csdpmi7b.zip -O CSDPMI7B.ZIP
mkdir /home/runner/dpmibin
7z e CSDPMI7B.ZIP bin/CWSDSTUB.EXE -o/home/runner/dpmibin
- name: Build
run: |
source ${{ github.workspace }}/djgpp/setenv
pushd build
cmake ../ -D DJGPP_WATT32=${WATT_ROOT}/lib/libwatt.a -D CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
cmake ../ -D DJGPP_WATT32=${WATT_ROOT}/lib/libwatt.a -D CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH} -D CWSDSTUB_LOCATION=/home/runner/dpmibin/CWSDSTUB.EXE -D DJGPP_BIN_LOCATION=/home/runner/work/UMSKT/UMSKT/djgpp/i586-pc-msdosdjgpp/bin
make
- name: Setup DOSBox test environment
run: |
mkdir -p dosbox_test
cp build/umskt.exe dosbox_test/
# Download DPMI server directly
# wget https://github.com/UMSKT/winactiontest/raw/refs/heads/main/CWSDPMI.EXE -O dosbox_test/CWSDPMI.EXE
# Create test batch file
cat > dosbox_test/test.bat << EOL
@echo off
echo Running test 1...
umskt.exe -b 2C -c 365 -s 069420 > TEST1.TXT
if errorlevel 1 goto error
echo Running test 2...
umskt.exe -i 253286028742154311079061239762245184619981623171292574 > TEST2.TXT
if errorlevel 1 goto error
echo Tests completed > DONE.TXT
goto end
:error
echo Test failed > ERROR.TXT
:end
exit
EOL
# Create DOSBox configuration
cat > dosbox_test/dosbox.conf << EOL
[sdl]
nosound=true
[cpu]
cputype=386
core=dynamic
cycles=max
[autoexec]
mount c .
c:
test.bat
exit
EOL
- name: Run tests in DOSBox
run: |
cd dosbox_test
timeout 30s dosbox -conf dosbox.conf -nogui -exit
# Check if the test completed successfully
if [ ! -f DONE.TXT ]; then
echo "Tests did not complete successfully"
if [ -f ERROR.TXT ]; then
echo "Test execution failed"
fi
if [ -f TEST1.TXT ]; then
echo "Test 1 output:"
cat TEST1.TXT
fi
if [ -f TEST2.TXT ]; then
echo "Test 2 output:"
cat TEST2.TXT
fi
exit 1
fi
# Verify test outputs
if [ ! -f TEST1.TXT ] || [ ! -f TEST2.TXT ]; then
echo "Test output files missing"
exit 1
fi
# Check test results - looking for key format patterns
if ! grep -qE '[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}' TEST1.TXT || \
! grep -qE '[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}' TEST2.TXT; then
echo "Tests failed - unexpected output format"
echo "Test 1 output:"
cat TEST1.TXT
echo "Test 2 output:"
cat TEST2.TXT
exit 1
else
echo "All tests passed successfully"
echo "Test 1 output:"
cat TEST1.TXT
echo "Test 2 output:"
cat TEST2.TXT
fi
- name: Move executable to upload directory
run: |
mkdir build/actions_upload
mv build/umskt.exe build/actions_upload/
- name: Upload build artifact
uses: actions/upload-artifact@v3.1.2
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-DOS
name: UMSKT-DOS-x86
path: build/actions_upload

68
.github/workflows/freebsd.yml vendored Normal file
View File

@ -0,0 +1,68 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by techguy16 on 07/23/2023
# @Maintainer techguy16
name: C/C++ CI (FreeBSD)
on:
#push:
# branches: [ "*" ]
# paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
#pull_request:
# branches: [ "*" ]
# paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
name: build-x86_64
steps:
- uses: actions/checkout@v4
- name: Build & Test in FreeBSD
id: test
uses: vmactions/freebsd-vm@v1
with:
envs: 'MYTOKEN MYTOKEN2'
usesh: true
prepare: |
pkg install -y cmake openssl git bash
run: |
mkdir build
cd build
cmake ..
make
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Move files to correct directory
run: |
mkdir -p build/actions_upload
mv build/umskt build/actions_upload/umskt
- name: Upload build artifact
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-FreeBSD
path: build/actions_upload

View File

@ -22,24 +22,31 @@ name: C/C++ CI (Linux)
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- arch: x86
runner: ubuntu-latest
use_alpine: true
- arch: x86_64
runner: ubuntu-latest
use_alpine: true
- arch: aarch64
runner: ubuntu-24.04-arm
use_alpine: false
runs-on: ${{ matrix.runner }}
steps:
- name: Checkout Source Tree
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup latest Alpine Linux for ${{ matrix.arch }}
- name: Setup latest Alpine Linux
if: ${{ matrix.use_alpine }}
uses: jirutka/setup-alpine@v1
with:
packages: >
@ -50,23 +57,125 @@ jobs:
musl-dev
openssl-dev
openssl-libs-static
zlib-dev
arch: ${{ matrix.arch }}
shell-name: alpine-target.sh
- name: Configure and build UMSKT
- name: Install Dependencies (Ubuntu ARM64)
if: ${{ !matrix.use_alpine }}
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake git libssl-dev zlib1g-dev
- name: Configure and build UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=ON
run-build: true
shell: alpine-target.sh {0}
- name: Move executable to upload directory
- name: Configure and build UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=ON
run-build: true
- name: Test UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
run: |
cd build
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
shell: alpine-target.sh {0}
- name: Test UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
run: |
cd build
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Move files to correct directory
run: |
mkdir -p build/actions_upload
mv build/umskt build/actions_upload/umskt
- name: Upload build artifact
uses: actions/upload-artifact@v3.1.2
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-linux-${{ matrix.arch }}-static
name: UMSKT-Linux-${{ matrix.arch }}-static
path: build/actions_upload
- name: Configure and build static internal deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
run-build: true
shell: alpine-target.sh {0}
- name: Configure and build static internal deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=OFF
run-build: true
- name: Test static internal deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
run: |
cd build
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
shell: alpine-target.sh {0}
- name: Test static internal deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
run: |
cd build
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Configure and build shared deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
run-build: true
shell: alpine-target.sh {0}
- name: Configure and build shared deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
uses: threeal/cmake-action@7ef2eb8da6e5ec0a6de6b1ddc96987080bed06e8
with:
options: MUSL_STATIC=OFF BUILD_SHARED_LIBS=ON
run-build: true
- name: Test shared deps UMSKT (Alpine)
if: ${{ matrix.use_alpine }}
run: |
cd build
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
shell: alpine-target.sh {0}
- name: Test shared deps UMSKT (Ubuntu)
if: ${{ !matrix.use_alpine }}
run: |
cd build
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574

123
.github/workflows/macos.yml vendored Normal file
View File

@ -0,0 +1,123 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by techguy16 on 07/23/2023
# @Maintainer techguy16
name: C/C++ CI (macOS)
on:
push:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
workflow_dispatch:
jobs:
build:
runs-on: macos-latest
strategy:
matrix:
include:
- arch: x86_64
- arch: arm64
steps:
- name: Checkout Source Tree
uses: actions/checkout@v4
- name: Install Rosetta
if: matrix.arch == 'x86_64'
run: |
sudo softwareupdate --install-rosetta --agree-to-license || true
- name: Install Homebrew for x86_64
if: matrix.arch == 'x86_64'
env: { NONINTERACTIVE: 1 }
run: |
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- name: Install x86_64 OpenSSL
if: matrix.arch == 'x86_64'
run: |
arch -x86_64 /usr/local/bin/brew install openssl@3
echo "OPENSSL_ROOT_DIR=/usr/local/opt/openssl@3" >> $GITHUB_ENV
echo "OPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@3/include" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=/usr/local/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
- name: Install arm64 OpenSSL
if: matrix.arch == 'arm64'
run: |
brew install openssl@3
echo "OPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3" >> $GITHUB_ENV
echo "OPENSSL_INCLUDE_DIR=/opt/homebrew/opt/openssl@3/include" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=/opt/homebrew/opt/openssl@3/lib/pkgconfig" >> $GITHUB_ENV
- name: Configure and build UMSKT
run: |
cd build
cmake -DCMAKE_BUILD_TYPE=Release .. \
-DCMAKE_OSX_ARCHITECTURES=${{matrix.arch}} \
-DOPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR \
-DOPENSSL_INCLUDE_DIR=$OPENSSL_INCLUDE_DIR \
-DOPENSSL_USE_STATIC_LIBS=TRUE \
-DBUILD_SHARED_LIBS=OFF
make
- name: Move files to correct directory
run: |
ls -a build
mkdir -p build/actions_upload
mv build/umskt build/actions_upload/umskt
- name: Run tests
run: |
cd build/actions_upload
echo Test 1 - generating key
./umskt -b 2C -c 365 -s 069420 -v
echo Test 2 - generating confid
./umskt -i 253286028742154311079061239762245184619981623171292574
- name: Upload platform-specific build
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-macOS-${{ matrix.arch }}
path: build/actions_upload
universal:
needs: build
runs-on: macos-latest
steps:
- name: Download x86_64 slice
uses: actions/download-artifact@v4
with:
name: UMSKT-macOS-x86_64
path: x86
- name: Download arm64 slice
uses: actions/download-artifact@v4
with:
name: UMSKT-macOS-arm64
path: arm
- name: Create universal binary
shell: bash
run: |
mkdir fat
lipo -create x86/umskt arm/umskt -output fat/umskt
lipo -info fat/umskt
- name: Upload universal build
uses: actions/upload-artifact@v4
with:
name: UMSKT-macOS-universal
path: fat

182
.github/workflows/windows-arm.yml vendored Normal file
View File

@ -0,0 +1,182 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by TheTank20 on 07/08/2025
# @Maintainer Neo
name: C/C++ CI (Windows ARM)
on:
push:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**']
workflow_dispatch:
jobs:
build:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
include:
- arch: arm32
arch_compilename: amd64_arm
vcpkg_arch: arm-windows-static
cmake_arch: ARM
sdk_version: '10.0.17763.0'
- arch: arm64
arch_compilename: arm64
vcpkg_arch: arm64-windows-static
cmake_arch: ARM64
sdk_version: '10.0.17763.0'
steps:
- name: Setup MSVC for ${{ matrix.arch }}
uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.arch_compilename }}
sdk: ${{ matrix.sdk_version }}
- name: Checkout Source Tree
uses: actions/checkout@v4
- name: Setup vcpkg
if: matrix.arch == 'arm64'
shell: pwsh
run: |
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
echo "VCPKG_ROOT=$env:GITHUB_WORKSPACE/vcpkg" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "VCPKG_DEFAULT_BINARY_CACHE=$env:GITHUB_WORKSPACE/vcpkg/bincache" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "VCPKG_BINARY_SOURCES=clear;default,readwrite" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Cache vcpkg packages
if: matrix.arch == 'arm64'
uses: actions/cache@v4
with:
path: |
${{ github.workspace }}/vcpkg/bincache
${{ github.workspace }}/vcpkg/installed
${{ github.workspace }}/vcpkg/packages
key: vcpkg-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}-${{ hashFiles('**/*.cmake') }}
restore-keys: |
vcpkg-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}-
vcpkg-${{ matrix.arch }}-
- name: Cache OpenSSL Binaries
if: matrix.arch == 'arm32'
uses: actions/cache@v4
with:
path: |
${{ github.workspace }}/openssl-install
key: openssl-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}
restore-keys: |
- name: Install OpenSSL
shell: pwsh
run: |
if ("${{ matrix.arch }}" -eq "arm32") {
# For ARM32, build OpenSSL from source
$opensslVersion = "1.1.1w"
$opensslDir = "openssl-src"
# Download OpenSSL source
Invoke-WebRequest -Uri "https://www.openssl.org/source/openssl-$opensslVersion.tar.gz" -OutFile "openssl.tar.gz"
tar -xf openssl.tar.gz
Rename-Item -Path "openssl-$opensslVersion" -NewName $opensslDir
cd $opensslDir
# Install Perl if needed
choco install strawberryperl -y
# Configure and build OpenSSL for ARM32
$env:PATH = "C:\Strawberry\perl\bin;$env:PATH"
# First set up Visual Studio environment
$vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath
$vcvarsall = Join-Path $vsPath "VC\Auxiliary\Build\vcvarsall.bat"
# Configure OpenSSL
perl Configure VC-WIN32-ARM no-shared no-asm no-engine --prefix="$env:GITHUB_WORKSPACE/openssl-install"
# Build using MSVC ARM32 tools
cmd /c "call `"$vcvarsall`" amd64_arm && nmake && nmake install_sw"
cd ..
} else {
# For ARM64, use vcpkg as before
New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE
& "$env:VCPKG_ROOT\vcpkg.exe" install openssl:${{ matrix.vcpkg_arch }} --clean-after-build
echo "OPENSSL_ROOT_DIR=$env:VCPKG_ROOT/installed/${{ matrix.vcpkg_arch }}" | Out-File -FilePath $env:GITHUB_ENV -Append
}
- name: Save OpenSSL Binaries
if: matrix.arch == 'arm32'
uses: actions/cache/save@v4
with:
path: |
${{ github.workspace }}/openssl-install
key: openssl-${{ matrix.arch }}-${{ hashFiles('**/CMakeLists.txt') }}
- name: Set OpenSSL Environment
if: matrix.arch == 'arm32'
shell: pwsh
run: |
echo "OPENSSL_ROOT=$env:GITHUB_WORKSPACE/openssl-install" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "OPENSSL_LIBDIR=lib" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Configure UMSKT
shell: pwsh
run: |
cmake -G "Visual Studio 17 2022" `
-A ${{ matrix.cmake_arch }} `
-DWINDOWS_ARM=ON `
-DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" `
-DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_arch }} `
.
- name: Build UMSKT
shell: pwsh
run: |
cmake --build . --config Release
- name: Upload build artifact
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-WinNT-${{ matrix.arch }}
path: Release/umskt.exe
test-arm64:
needs: build
if: success()
runs-on: windows-11-arm
strategy:
matrix:
arch: [arm64]
steps:
- name: Download ARM64 artifact
uses: actions/download-artifact@v4
with:
name: UMSKT-WinNT-${{ matrix.arch }}
path: .
- name: Run tests
shell: pwsh
run: |
Write-Host Test 1 - generating key
.\umskt.exe -b 2C -c 365 -s 069420 -v
Write-Host Test 2 - generatng confid
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574

199
.github/workflows/windows-x86-x64.yml vendored Normal file
View File

@ -0,0 +1,199 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by TheTank20 on 07/08/2025
# @Maintainer Neo
name: C/C++ CI (Windows x86+64)
on:
push:
branches: [ "*" ]
paths-ignore: [ '**.md', 'doc/**', '.idea/**']
workflow_dispatch:
jobs:
build:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [x64, x86]
steps:
- name: Setup TDM-GCC
run: |
Write-Host Downloading TDM-GCC v10.3.0...
Invoke-WebRequest -Uri 'https://github.com/jmeubank/tdm-gcc/releases/download/v10.3.0-tdm64-2/tdm64-gcc-10.3.0-2.exe' -OutFile 'C:\Windows\temp\TDM-GCC-64.exe'
Write-Host Creating directory...
New-Item -ItemType Directory -Path 'C:\TDM-GCC-64'
Write-Host Copying files [Set 1/3]...
Start-Process '7z' -ArgumentList 'e C:\Windows\temp\TDM-GCC-64.exe -oC:\TDM-GCC-64 -y' -Wait
Write-Host Copying files [Set 2/3]...
Start-Process '7z' -ArgumentList 'e C:\TDM-GCC-64\*.tar.xz -oC:\TDM-GCC-64 -y' -Wait
Write-Host Copying files [Set 3/3]...
Start-Process '7z' -ArgumentList 'x C:\TDM-GCC-64\*.tar -oC:\TDM-GCC-64 -y' -Wait
Write-Host Adding environment variables...
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
- name: Checkout Source Tree
uses: actions/checkout@v4
- name: Cache OpenSSL 3.1.2 (32-bit)
uses: actions/cache/restore@v4
if: matrix.arch == 'x86'
id: cache-openssl-32
with:
path: |
${{ github.workspace }}/OpenSSL-TDM-32
key: openssl-3.1.2-x86-${{ hashFiles('**/CMakeLists.txt') }}
- name: Cache OpenSSL 3.1.2 (64-bit)
uses: actions/cache/restore@v4
if: matrix.arch == 'x64'
id: cache-openssl-64
with:
path: |
${{ github.workspace }}/OpenSSL-TDM-64
key: openssl-3.1.2-x64-${{ hashFiles('**/CMakeLists.txt') }}
- name: Setup MSYS2
if: steps.cache-openssl-32.outputs.cache-hit != 'true' && steps.cache-openssl-64.outputs.cache-hit != 'true'
uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.arch == 'x86' && 'MINGW32' || 'MINGW64' }}
update: true
install: >-
mingw-w64-${{ matrix.arch == 'x86' && 'i686' || 'x86_64' }}-gcc
mingw-w64-${{ matrix.arch == 'x86' && 'i686' || 'x86_64' }}-make
mingw-w64-x86_64-perl
perl
git
- name: Checkout and Compile OpenSSL 3.1.2
if: steps.cache-openssl-32.outputs.cache-hit != 'true' && steps.cache-openssl-64.outputs.cache-hit != 'true'
shell: msys2 {0}
run: |
# Clone UMSKT's OpenSSL fork
echo "Cloning UMSKT OpenSSL fork..."
git clone https://github.com/UMSKT/openssl.git --depth 1 openssl-3.1.2
- name: Checkout and Compile OpenSSL 3.1.2 (32-bit)
if: matrix.arch == 'x86' && steps.cache-openssl-32.outputs.cache-hit != 'true'
shell: msys2 {0}
run: |
# Set up proper MSYS2 environment
export MSYS=winsymlinks:nativestrict
export MSYS2_PATH_TYPE=strict
export LANG=en_US.UTF-8
export PATH="/usr/bin:/mingw64/bin:$PATH"
export PATH="/c/TDM-GCC-64/bin:$PATH"
export MSYSTEM=MINGW32
echo "Compiling 32-bit OpenSSL..."
cd openssl-3.1.2
/usr/bin/perl Configure mingw --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-32 --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-32 no-tests no-sse2 no-asm no-threads -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i686 -mtune=generic
mingw32-make -j
mingw32-make install_sw
cd ..
- name: Checkout and Compile OpenSSL 3.1.2 (64-bit)
if: matrix.arch == 'x64' && steps.cache-openssl-64.outputs.cache-hit != 'true'
shell: msys2 {0}
run: |
# Set up proper MSYS2 environment
export MSYS=winsymlinks:nativestrict
export MSYS2_PATH_TYPE=strict
export LANG=en_US.UTF-8
export PATH="/usr/bin:/mingw64/bin:$PATH"
export PATH="/c/TDM-GCC-64/bin:$PATH"
export MSYSTEM=MINGW64
echo "Compiling 64-bit OpenSSL..."
cd openssl-3.1.2
/usr/bin/perl Configure mingw64 --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-64 --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-64 no-tests no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx
mingw32-make -j
mingw32-make install_sw
cd ..
- name: Save OpenSSL 3.1.2 (32-bit)
if: matrix.arch == 'x86' && steps.cache-openssl-32.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
${{ github.workspace }}/OpenSSL-TDM-32
key: openssl-3.1.2-x86-${{ hashFiles('**/CMakeLists.txt') }}
- name: Save OpenSSL 3.1.2 (64-bit)
if: matrix.arch == 'x64' && steps.cache-openssl-64.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
${{ github.workspace }}/OpenSSL-TDM-64
key: openssl-3.1.2-x64-${{ hashFiles('**/CMakeLists.txt') }}
- name: Set OpenSSL Environment (32-bit)
if: matrix.arch == 'x86'
shell: pwsh
run: |
echo "OPENSSL_ROOT=$env:GITHUB_WORKSPACE/OpenSSL-TDM-32" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "OPENSSL_LIBDIR=lib" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "CMAKE_FLAGS=-m32" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Set OpenSSL Environment (64-bit)
if: matrix.arch == 'x64'
shell: pwsh
run: |
echo "OPENSSL_ROOT=$env:GITHUB_WORKSPACE/OpenSSL-TDM-64" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "OPENSSL_LIBDIR=lib" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "CMAKE_FLAGS=-m64" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Configure UMSKT
shell: pwsh
run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
$OPENSSL_ROOT = "$env:OPENSSL_ROOT"
$OPENSSL_LIB = "$OPENSSL_ROOT/$env:OPENSSL_LIBDIR"
$OPENSSL_INC = "$OPENSSL_ROOT/include"
cmake -G "MinGW Makefiles" `
-DCMAKE_C_COMPILER="gcc" `
-DCMAKE_CXX_COMPILER="g++" `
-DOPENSSL_ROOT_DIR="$OPENSSL_ROOT" `
-DOPENSSL_INCLUDE_DIR="$OPENSSL_INC" `
-DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_LIB/libcrypto.a" `
-DOPENSSL_SSL_LIBRARY="$OPENSSL_LIB/libssl.a" `
-DCMAKE_C_FLAGS="$env:CMAKE_FLAGS" `
-DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" `
.
- name: Build UMSKT
shell: pwsh
run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
mingw32-make
- name: Run tests
shell: pwsh
run: |
Write-Host Test 1 - generating key
.\umskt.exe -b 2C -c 365 -s 069420 -v
Write-Host Test 2 - generatng confid
.\umskt.exe -i 253286028742154311079061239762245184619981623171292574
- name: Upload build artifact
uses: actions/upload-artifact@v4.6.2
with:
name: UMSKT-WinNT-${{ matrix.arch }}
path: umskt.exe

View File

@ -1,117 +0,0 @@
# This file is a part of the UMSKT Project
#
# Copyleft (C) 2019-2023 UMSKT Contributors (et.al.)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @FileCreated by TheTank20 on 06/13/2023
# @Maintainer Neo
name: C/C++ CI (Windows)
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build-djgpp:
uses: ./.github/workflows/dos-djgpp.yml
build:
runs-on: windows-latest
needs: build-djgpp
strategy:
matrix:
include:
- arch: Win32
OpenSSL-File: Win32OpenSSL-3_1_1.exe
msbuild-arch: Win32
cmake-args: -D MSVC_MSDOS_STUB=..\umskt.exe
- arch: Win64
OpenSSL-File: Win64OpenSSL-3_1_1.exe
msbuild-arch: x64
cmake-args: ""
steps:
- name: Checkout Source Tree
uses: actions/checkout@v3
- name: Install Windows XP Support for Visual Studio
uses: thepwrtank18/install-vs-components@v1.0.0
with:
components: Microsoft.VisualStudio.Component.WinXP
- name: Download And Install ${{ matrix.OpenSSL-File }}
run: |
$installDir = "$Env:ProgramFiles\OpenSSL"
$installerURL = "https://slproweb.com/download/${{ matrix.OpenSSL-File }}"
$installerName = "${{ matrix.OpenSSL-File }}"
$installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName"
(New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath)
Remove-Item "$installDir" -Force -Recurse
$installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`""
Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru
- name: Setup MSBuild
uses: microsoft/setup-msbuild@v1
- name: Download UMSKT-DJGPP compiled artifact
if: matrix.arch == 'Win32'
uses: actions/download-artifact@v3
with:
name: UMSKT-DOS
- name: List build directory contents
if: matrix.arch == 'Win32'
run: |
Get-ChildItem
- name: Configure UMSKT
uses: threeal/cmake-action@v1.2.0
with:
generator: "Visual Studio 17 2022"
options: CMAKE_SYSTEM_VERSION="5.1.2600"
args: -A ${{ matrix.msbuild-arch }} -T v141_xp ${{ matrix.cmake-args }}
- name: Build UMSKT
working-directory: build
run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release /P:XPDeprecationWarning=false
- name: Move executable to upload directory
run: |
mkdir build/actions_upload
Move-Item build/Release/umskt.exe build/actions_upload
- name: Upload build artifact
uses: actions/upload-artifact@v3.1.2
with:
name: UMSKT-${{ matrix.arch }}
path: build/actions_upload
- name: Move Win32+DOS executable to upload directory
if: matrix.arch == 'Win32'
run: |
Remove-Item "build/actions_upload" -Force -Recurse
mkdir build/actions_upload
Move-Item build/Release/umskt_win32_dos.exe build/actions_upload/umskt.exe
- name: Upload build artifact
if: matrix.arch == 'Win32'
uses: actions/upload-artifact@v3.1.2
with:
name: UMSKT-Win32+DOS
path: build/actions_upload

8
.gitignore vendored
View File

@ -252,4 +252,10 @@ _deps
CMakeSettings.json
# Visual Studio
.vs/
.vs/
CPM_modules
CPM_*.cmake
cpm-package-lock.cmake
*.a
*_cmrc*

10
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,10 @@
# Stub so pre-commit can shut up until the refactor
repos:
- repo: local
hooks:
- id: no-op
name: Noop hook (always passes)
entry: "true" # `/usr/bin/true` returns 0 and does nothing
language: system
pass_filenames: false # dont bother passing any file paths

View File

@ -20,25 +20,84 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
PROJECT(UMSKT)
# Force TDM-GCC on Windows if not using MSVC
if (WIN32 AND NOT MSVC)
set(CMAKE_C_COMPILER "C:/TDM-GCC-64/bin/gcc.exe" CACHE FILEPATH "C Compiler" FORCE)
set(CMAKE_CXX_COMPILER "C:/TDM-GCC-64/bin/g++.exe" CACHE FILEPATH "C++ Compiler" FORCE)
message(STATUS "[UMSKT] Forcing use of TDM-GCC in C:/TDM-GCC-64")
# Configure windres for resource compilation
set(CMAKE_RC_COMPILER "C:/TDM-GCC-64/bin/windres.exe")
set(CMAKE_RC_COMPILER_INIT windres)
enable_language(RC)
set(CMAKE_RC_FLAGS "--use-temp-file -c65001")
# Match resource architecture with target architecture
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -F pe-i386 --target=pe-i386")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686 -mtune=generic -mno-sse -mno-sse2 -mno-mmx -mno-3dnow")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686 -mtune=generic -mno-sse -mno-sse2 -mno-mmx -mno-3dnow")
else()
set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -F pe-x86-64 --target=pe-x86-64")
endif()
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff -I${CMAKE_CURRENT_SOURCE_DIR}/src/windows <DEFINES> -i <SOURCE> -o <OBJECT>")
# Set the Windows resource file for GCC builds
set(UMSKT_EXE_WINDOWS_EXTRA src/windows/umskt.rc)
endif()
SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_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(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(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilation" OFF)
OPTION(WINDOWS_ARM "Enable compilation for Windows on ARM (requires appropriate toolchain)" OFF)
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
endif()
# neither does dos idk i'm trying random stuff
if (DJGPP_WATT32)
SET(UMSKT_USE_SHARED_OPENSSL ON)
endif()
IF(UMSKT_USE_SHARED_OPENSSL)
SET(OPENSSL_USE_STATIC_LIBS FALSE)
SET(OPENSSL_MSVC_STATIC_RT FALSE)
MESSAGE(WARNING "[UMSKT] Forcing shared OpenSSL runtime")
MESSAGE(STATUS "[UMSKT] Requesting dynamic version of OpenSSL")
ELSE()
SET(OPENSSL_USE_STATIC_LIBS TRUE)
SET(OPENSSL_MSVC_STATIC_RT TRUE)
MESSAGE(STATUS "[UMSKT] Requesting static version of OpenSSL")
ENDIF()
# Configure ARM-specific settings if enabled
if (WINDOWS_ARM)
if (MSVC)
# MSVC ARM64 settings
set(CMAKE_SYSTEM_PROCESSOR ARM64)
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE ARM64)
else()
# MinGW/GCC ARM settings
set(CMAKE_SYSTEM_PROCESSOR arm)
if (CMAKE_CROSSCOMPILING)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a")
endif()
endif()
message(STATUS "[UMSKT] Configuring for Windows on ARM")
endif()
IF(DJGPP_WATT32)
SET(CMAKE_SYSTEM_NAME MSDOS)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
@ -47,25 +106,18 @@ IF(DJGPP_WATT32)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32})
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS} ${WATT_ROOT}/lib)
# Maximum compatibility flags for DOS/NTVDM
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i386 -mtune=i386 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -mno-ssse3 -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-fma -mno-fma4")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i386 -mtune=i386 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -mno-ssse3 -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-fma -mno-fma4")
MESSAGE(STATUS "[UMSKT] Using i386 target for DOS DGJPP with stub: ${CWSDSTUB_LOCATION}")
ENDIF()
# 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 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 (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
## SET(BUILD_SHARED_LIBS ON)
## MESSAGE(STATUS "[UMSKT] macOS has no static library - Shared library forced on")
##endif()
# if we're compiling with MSVC, respect the DEBUG compile option
IF(MSVC)
@ -85,6 +137,9 @@ ENDIF()
IF(MUSL_STATIC)
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_SHARED_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
@ -92,6 +147,46 @@ IF(MUSL_STATIC)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
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
INCLUDE(cmake/CPM.cmake)
@ -109,6 +204,7 @@ CPMAddPackage(
GITHUB_REPOSITORY fmtlib/fmt
GIT_TAG 10.0.0
VERSION 10.0.0
#OPTIONS "FMT_INSTALL YES" "BUILD_SHARED_LIBS OFF"
)
# Include cmrc resource compiler
@ -145,38 +241,34 @@ SET(LIBUMSKT_SRC src/libumskt/libumskt.cpp src/libumskt/pidgen3/BINK1998.cpp src
IF (EMSCRIPTEN)
ADD_EXECUTABLE(umskt ${LIBUMSKT_SRC})
TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(umskt -static OpenSSL::Crypto fmt)
TARGET_LINK_LIBRARIES(umskt -static OpenSSL::Crypto cryptopp::cryptopp fmt)
SET(CMAKE_EXECUTABLE_SUFFIX ".html")
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")
ELSE()
IF(NOT UMSKT_USE_SHARED_OPENSSL)
### Static library compilation
ADD_LIBRARY(_umskt STATIC ${LIBUMSKT_SRC})
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
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()
ADD_LIBRARY(_umskt ${LIBUMSKT_SRC} ${UMSKT_EXE_WINDOWS_EXTRA} ${UMSKT_EXE_WINDOWS_DLL})
TARGET_INCLUDE_DIRECTORIES(_umskt PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_DIRECTORIES(_umskt PUBLIC ${UMSKT_LINK_DIRS})
TARGET_LINK_LIBRARIES(_umskt ${OPENSSL_CRYPTO_LIBRARIES} fmt ${UMSKT_LINK_LIBS})
### UMSKT executable compilation
ADD_EXECUTABLE(umskt src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
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})
### UMSKT with specified DOS Stub compilation
# Link required Windows system libraries for OpenSSL
if (WIN32)
target_link_libraries(umskt crypt32 ws2_32)
endif()
IF(MSVC AND MSVC_MSDOS_STUB)
ADD_EXECUTABLE(umskt_win32_dos src/main.cpp src/cli.cpp ${UMSKT_EXE_WINDOWS_EXTRA})
TARGET_INCLUDE_DIRECTORIES(umskt_win32_dos PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(umskt_win32_dos _umskt OpenSSL::Crypto fmt nlohmann_json::nlohmann_json umskt::rc ${UMSKT_LINK_LIBS})
TARGET_LINK_DIRECTORIES(umskt_win32_dos PUBLIC ${UMSKT_LINK_DIRS})
SET_PROPERTY(TARGET umskt_win32_dos APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB})
SET_PROPERTY(TARGET umskt APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB})
ENDIF()
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
install(TARGETS umskt DESTINATION bin)
ENDIF()
### Copy Shared Libraries and dependency files
@ -184,4 +276,21 @@ ELSE()
GET_FILENAME_COMPONENT(OPENSSL_CRYPTO_LIBRARY_FILENAME ${OPENSSL_CRYPTO_LIBRARY} NAME)
CONFIGURE_FILE(${OPENSSL_CRYPTO_LIBRARY} "${CMAKE_CURRENT_BINARY_DIR}/${OPENSSL_CRYPTO_LIBRARY_FILENAME}" COPYONLY)
ENDIF()
IF (DJGPP_WATT32)
message(STATUS "[UMSKT] Configuring DJGPP post-build commands")
# Set .exe suffix for DJGPP builds
set_target_properties(umskt PROPERTIES SUFFIX ".exe")
add_custom_command(TARGET umskt POST_BUILD
# Convert exe to coff, removing the default stub
COMMAND ${DJGPP_BIN_LOCATION}/exe2coff $<TARGET_FILE:umskt>
# Concatenate CWSDSTUB with the COFF file
COMMAND ${CMAKE_COMMAND} -E cat ${CWSDSTUB_LOCATION} $<TARGET_FILE_DIR:umskt>/umskt > $<TARGET_FILE:umskt>
# Clean up the COFF file
COMMAND ${CMAKE_COMMAND} -E rm $<TARGET_FILE_DIR:umskt>/umskt
)
message(STATUS "[UMSKT] STUBIFY_LOCATION set to: ${STUBIFY_LOCATION}")
message(STATUS "[UMSKT] CWSDSTUB_LOCATION set to: ${CWSDSTUB_LOCATION}")
message(STATUS "[UMSKT] DJGPP_BIN_LOCATION set to: ${DJGPP_BIN_LOCATION}")
ENDIF()
ENDIF()

View File

@ -54,9 +54,16 @@ WORKDIR /tmp
# Stage 2: compile djgpp for muslc
ENV DJGPP_PREFIX=/djgpp BUILD_VER=12.2.0-i386
RUN git clone https://github.com/UMSKT/build-djgpp.git djgpp \
RUN git clone https://github.com/andrewwutw/build-djgpp.git djgpp \
&& cd djgpp \
&& chmod +x script/$BUILD_VER \
&& cd script \
&& wget https://gist.github.com/Neo-Desktop/4cfd708f61f5847a7bf457d38db3b59f/raw/25d24cf509b0fc486d5d18ecb6656f120c3d0e51/12.2.0-i386 -O 12.2.0-i386 \
&& chmod +x 12.2.0-i386 \
&& cd ../patch \
&& wget https://gist.github.com/Neo-Desktop/4cfd708f61f5847a7bf457d38db3b59f/raw/25d24cf509b0fc486d5d18ecb6656f120c3d0e51/patch-alpine-Fix-attempt-to-use-poisoned-calloc-error-in-libgccji.patch -O patch-alpine-Fix-attempt-to-use-poisoned-calloc-error-in-libgccji.patch \
&& cd .. \
&& sed -i 's/i586/i386/g' setenv/setenv \
&& sed -i 's/i586/i386/g' setenv/setenv.bat \
&& ./build-djgpp.sh $BUILD_VER \
&& rm -rf /tmp/djgpp
@ -65,12 +72,15 @@ FROM djgpp as watt32
WORKDIR /djgpp
ENV WATT_ROOT=/djgpp/watt32 DJGPP_PREFIX=i386-pc-msdosdjgpp
SHELL ["/bin/bash", "-c"]
RUN git clone https://github.com/UMSKT/Watt-32.git watt32 \
RUN git clone https://github.com/gvanem/Watt-32.git watt32 \
&& cd watt32/util \
&& make clean && make linux \
&& cd ../src \
&& source /djgpp/setenv \
&& ./configur.sh djgpp \
&& sed -i 's/i586/i386/g' djgpp.mak \
&& wget https://gist.github.com/Neo-Desktop/ad26e888d64b22a59c743ab4e21ac186/raw/c9a73e1eb75ba8857883ac5c08691d2fe5b82594/djgpp.err -O ../inc/sys/djgpp.err \
&& wget https://gist.github.com/Neo-Desktop/ad26e888d64b22a59c743ab4e21ac186/raw/c9a73e1eb75ba8857883ac5c08691d2fe5b82594/syserr.c -O build/djgpp/syserr.c \
&& make -f djgpp.mak \
&& ln -s /djgpp/watt32/lib/libwatt.a /djgpp/lib
@ -78,9 +88,12 @@ RUN git clone https://github.com/UMSKT/Watt-32.git watt32 \
FROM watt32 as openssl
WORKDIR /tmp
SHELL ["/bin/bash", "-c"]
RUN git clone https://github.com/umskt/openssl.git openssl \
RUN git clone https://github.com/openssl/openssl.git openssl \
&& cd openssl \
&& git checkout openssl-3.1.1 \
&& source /djgpp/setenv \
&& wget https://gist.github.com/Neo-Desktop/ad26e888d64b22a59c743ab4e21ac186/raw/c9a73e1eb75ba8857883ac5c08691d2fe5b82594/50-djgpp.conf.patch -O Configurations/50-djgpp.conf.patch \
&& git apply Configurations/50-djgpp.conf.patch \
&& ./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=/djgpp DJGPP \
&& make && make install

View File

@ -78,7 +78,6 @@ RUN C:\BuildTools\Common7\Tools\VsDevCmd.bat && `
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8.1 as output
COPY --from=Build32 C:\umskt\build\Release\umskt.exe C:\umskt\umskt.exe
COPY --from=Build32 C:\umskt\build\Release\umskt_win32_dos.exe C:\umskt\umskt_win32_dos.exe
COPY --from=Build64 C:\umskt\build\Release\umskt.exe C:\umskt\umskt64.exe
#invoke via

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)
[![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 (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:
* [Please see ticket #8 for more information](../../issues/8)
[Please see ticket #8 for more information](https://github.com/UMSKT/UMSKT/issues/8)
------
@ -29,27 +42,59 @@ In light of the recent exponential interest in this project I've decided to put
* It all comes down to four simple steps:
------
### System Requirements
#### MS-DOS
* i386 processor or better
* MS-DOS 6.22 or later
* Any DOS-based version of Windows
* Windows NT 4.0 or later (via NTVDM)
#### Windows (x86/x64)
* i686 processor or better
* Windows XP or later
> [!WARNING]
> Processors barely meeting the minimum system requirements for XP may not work. Use the MS-DOS version via NTVDM in that case.
#### Windows (ARM32/64)
* Windows 11 21H2 or later
> [!NOTE]
> This is just all we can test. Try to get it to run on Windows RT, make an issue if it doesn't run and we'll try to fix it.
#### macOS
* Apple Silicon or x86_64 processor
* Latest version of macOS
#### Linux
* modern ARM, x86, or x86_64 processor
* Latest version of your Linux distro
------
### **Usage**
#### 1. Download the latest version of WindowsXPKg
#### 1. Download the latest version of UMSKT
* *(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)*
* Download the latest release for your operating system and architecture from [the releases page](../../releases)
> [!IMPORTANT]
> Before continuing, please ensure you have the `umskt` executable extracted and on UNIX-like systems, have execution permissions (`chmod +x umskt`).
* **Note:** Before continuing, please ensure you have both the `xpkey` program and the `keys.json` datum extracted and in the same directory
#### 2. Run `xpkey` to generate a key, or add `--help` to see more options.
#### 2. Run `umskt` to generate a key, or add `--help` or `-h` to see more options.
> [!IMPORTANT]
> On macOS, like all unsigned executables, you'll need to hold Ctrl while right clicking and selecting Open to actually open it.
#### 3. *(Activation step for `Retail` and `OEM` only)*
* 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!
@ -61,15 +106,16 @@ In light of the recent exponential interest in this project I've decided to put
The list of people who have helped to bring the XP generation to where it is now:
* z22
* MSKey
* sk00ter
* diamondggg
* pottzman
* david4599
* Endermanch
* Neo-Desktop
* WitherOrNot
* TheTank20
* InvoxiPlayGames
* brakmic
* techguy16
(the list will be updated to add more collaborators)
@ -77,20 +123,26 @@ The list of people who have helped to bring the XP generation to where it is now
### **Development Requirements:**
* `CMake, make, gcc` (`build-essential`)
* `build-essential`
* `cmake`
* `make`
* `gcc`
* `g++`
* `git`
#### Build Steps:
1. `git clone`
2. `cd build/ && cmake ../ && make`
1. `git clone https://github.com/UMSKT/UMSKT`
2. `cd UMSKT/build`
3. `cmake ..`
4. `make`
-----
### **Known Ports**
| Language | Author | Repo URL |
|----------|-----------|-------------------------------------------------------|
| Rust | Alex Page | [anpage/umskt-rs](https://github.com/anpage/umskt-rs) |
| Language | Author | Repo URL |
|----------|-----------|-----------------------------------------------------------|
| 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": {
"BINK": ["0E", "0F"]
},
"Passport Manager": {
"BINK": ["10"]
},
"Windows 2000 Professional": {
"BINK": ["12", "13"]
},
@ -45,6 +48,9 @@
"Office XP Applications": {
"BINK": ["20", "21"]
},
"Works Suite 2003 and 2004": {
"BINK": ["20", "21"]
},
"Office XP": {
"BINK": ["22", "23"]
},
@ -117,18 +123,27 @@
"Office 2003 Small Business": {
"BINK": ["70", "71"]
},
"Office 2003 Student and Teacher": {
"BINK": ["70", "71"]
},
"Office 2003 Professional": {
"BINK": ["72", "73"]
},
"Windows Longhorn (6.0.4039.0 -> Pre PIDGENX)": {
"BINK": ["74", "75"]
},
"Expression Web 2007 / Sharepoint Server 2007": {
"BINK": ["76", "77"]
},
"Identity Lifecycle Manager 2007": {
"BINK": ["78", "79"]
},
"Visual Studio 2008": {
"BINK": ["78", "79"]
},
"Sharepoint Designer 2007": {
"BINK": ["7C", "7D"]
},
"Office 2007 Applications": {
"BINK": ["7E", "7F"]
},
@ -138,6 +153,9 @@
"Office 2007 Standard / Professional / Ultimate / Enterprise": {
"BINK": ["82", "83"]
},
"Office 2007 Hybrid": {
"BINK": ["84", "85"]
},
"Office 2007 Home & Student": {
"BINK": ["88", "89"]
}
@ -312,15 +330,15 @@
"a": "1",
"b": "0",
"g": {
"x": "17272533675023793624680016937607161394427776688401278127884215858369066406365237833207419170117031265147050748737186",
"y": "10897684556651576571671151674586120690608236542740270859915076272932083320838022698730208293779451126638581586588925"
"x": "2424861453756882196229359499252409442096928108454123044238107428456451053748664006504056679987776648547354283230029",
"y": "7324425970176151969116486392910180591819760394015255323965851504893617199075285355320677185484219270306349221725496"
},
"n": "44682719955829289",
"p": "31123778862031392435299439090755153401162704597024288571183830527113563344679315725116915983118187065183839828632113",
"priv": "30177475288172038",
"n": "42173753096150573",
"p": "23576896825148261563986794905854575022252138407149635186332207102431578828005131860154350053063599250972940889198609",
"priv": "21644128200478272",
"pub": {
"x": "10584120526089473026246191383792758367144927589909587205278073830223938861208553884400816982485323081066790399437204",
"y": "19710761542152200618172612283139324015316083022563473705358032993141026289202915973780473937312193485361804450068338"
"x": "22559965909720054111451558679234685221190121968477792217083519033370405738218408301652020048970098652944061723131120",
"y": "4867649293914467066273247931825593002116583959412689222356329515920397531410942846741846700237094219959206105155903"
}
},
"0C": {
@ -383,6 +401,21 @@
"y": "12300711937755714474221683340048792628817501853269187222732097530965245794898485391792926982501341822327927281168157"
}
},
"10": {
"a": "1",
"b": "0",
"g": {
"x": "18651628392962497698304079461858800038021595035623099589626558411789423821835513779530629747878048328422716050099296",
"y": "28457790016119433859033076174489680371110176047623886251847351799861435189214769185332948508935608870611015909181946"
},
"n": "63517138149940081",
"p": "34850883414891516310048088524473091032039735302322749072119923383901524249650054933039485488287948424536010614809529",
"priv": "42074657350570560",
"pub": {
"x": "14897248889444524585539298515527812307525445072093905045143283125792133561464628729391995919418984547359131800953862",
"y": "30590224388131521072842776697623219502924625149179219913459005347798492666726177600440842678766281012690402321113086"
}
},
"12": {
"a": "1",
"b": "0",
@ -773,6 +806,66 @@
"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": {
"a": "1",
"b": "0",
@ -1525,7 +1618,7 @@
}
},
"Activation": {
"Windowws XP": {
"Windows XP": {
"p": "102011604035381881",
"x": {
"0": "0",
@ -1568,4 +1661,4 @@
"iid_key": "1513142771"
}
}
}
}

View File

@ -22,6 +22,15 @@
#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) {
if (!filename.empty() && !fs::exists(filename)) {
fmt::print("ERROR: File {} does not exist\n", filename.string());
@ -53,11 +62,17 @@ void CLI::showHelp(char *argv[]) {
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
fmt::print("\t-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-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-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-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-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n");
fmt::print("\t-o --override\tDisables version check for confirmation IDs, if you need this send an issue on GitHub\n");
fmt::print("\t-D --nodashes\tDisables dashes in product keys and confirmation IDs (for easier copy-pasting)");
fmt::print("\n");
}
@ -68,6 +83,7 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
"",
"",
"",
"",
640,
0,
1,
@ -76,12 +92,16 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
false,
false,
false,
MODE_BINK1998_GENERATE
false,
false,
false,
false,
MODE_BINK1998_GENERATE,
WINDOWS
};
for (int i = 1; i < argc; i++) {
std::string arg = argv[i];
if (arg == "-v" || arg == "--verbose") {
options->verbose = true;
UMSKT::setDebugOutput(stderr);
@ -137,6 +157,8 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
options->serial = serial_val;
}
i++;
} else if (arg == "-u" || arg == "--upgrade") {
options->upgrade = true;
} else if (arg == "-f" || arg == "--file") {
if (i == argc - 1) {
options->error = true;
@ -154,6 +176,32 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
options->instid = argv[i+1];
options->applicationMode = MODE_CONFIRMATION_ID;
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") {
if (i == argc - 1) {
options->error = true;
@ -163,11 +211,23 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
options->keyToCheck = argv[i+1];
options->applicationMode = MODE_BINK1998_VALIDATE;
i++;
} else {
} else if (arg == "-N" || arg == "--nonewlines") {
options->nonewlines = true;
} else if (arg == "-o" || arg == "--override") {
options->overrideVersion = true;
} else if (arg == "-D" || arg == "--nodashes") {
options->nodashes = true;
} else {
options->error = true;
}
}
// 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;
}
@ -216,6 +276,12 @@ int CLI::validateCommandLine(Options* options, char *argv[], json *keys) {
int 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) {
// 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;
@ -241,7 +307,7 @@ void CLI::printID(DWORD *pid) {
int i, digit = 0;
// Convert PID to ascii-number (=raw)
sprintf(raw, "%09u", pid[0]);
snprintf(raw, sizeof(raw), "%09u", pid[0]);
// Make b-part {640-....}
strncpy(b, raw, 3);
@ -265,9 +331,14 @@ void CLI::printID(DWORD *pid) {
void CLI::printKey(char *pk) {
assert(strlen(pk) >= PK_LENGTH);
std::string keyFormat = "{}-{}-{}-{}-{}";
if (this->options.nodashes == true) {
keyFormat = "{}{}{}{}{}";
}
std::string spk = pk;
fmt::print("{}-{}-{}-{}-{}",
fmt::print(keyFormat,
spk.substr(0,5),
spk.substr(5,5),
spk.substr(10,5),
@ -361,13 +432,14 @@ int CLI::BINK1998Generate() {
} else {
// generate a random number to use as a serial
BIGNUM *bnrand = BN_new();
BN_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
UMSKT::umskt_bn_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
int oRaw;
char *cRaw = BN_bn2dec(bnrand);
sscanf(cRaw, "%d", &oRaw);
nRaw += (oRaw % 999999); // ensure our serial is less than 999999
BN_free(bnrand);
}
if (this->options.verbose) {
@ -379,11 +451,8 @@ int CLI::BINK1998Generate() {
// generate a key
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++) {
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);
if (isValid) {
@ -408,10 +477,9 @@ int CLI::BINK1998Generate() {
if (this->options.verbose) {
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
}
#ifndef _WIN32
fmt::print("\n");
#endif
if (this->options.nonewlines == false) {
fmt::print("\n");
}
return 0;
}
@ -425,30 +493,28 @@ int CLI::BINK2002Generate() {
// generate a key
for (int i = 0; i < this->total; i++) {
DWORD pAuthInfo;
RAND_bytes((BYTE *)&pAuthInfo, 4);
UMSKT::umskt_rand_bytes((BYTE *)&pAuthInfo, 4);
pAuthInfo &= BITMASK(10);
if (this->options.verbose) {
fmt::print("> AuthInfo: {}\n", pAuthInfo);
}
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, false, this->pKey);
CLI::printKey(this->pKey);
fmt::print("\n");
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, options.upgrade, this->pKey);
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
if (isValid) {
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");
}
this->count += isValid;
this->count += isValid; // add to count
}
else {
if (this->options.verbose) {
CLI::printKey(this->pKey);
fmt::print(" [Invalid]");
if (i < this->total - 1) {
CLI::printKey(this->pKey); // print the key
fmt::print(" [Invalid]"); // and add " [Invalid]" to the key
if (i < this->total - 1) { // check if end of list
fmt::print("\n");
}
}
@ -459,9 +525,9 @@ int CLI::BINK2002Generate() {
if (this->options.verbose) {
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
}
#ifndef _WIN32
fmt::print("\n");
#endif
if (this->options.nonewlines == false) {
fmt::print("\n");
}
return 0;
}
@ -506,7 +572,7 @@ int CLI::BINK2002Validate() {
int CLI::ConfirmationID() {
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) {
case ERR_TOO_SHORT:
@ -534,10 +600,20 @@ int CLI::ConfirmationID() {
return 1;
case SUCCESS:
fmt::print(confirmation_id);
#ifndef _WIN32
fmt::print("\n");
#endif
if (this->options.nodashes == true) {
int j = 0;
for (int i = 0; confirmation_id[i] != '\0'; ++i) {
if (confirmation_id[i] != '-') {
confirmation_id[j++] = confirmation_id[i];
}
}
confirmation_id[j] = '\0';
}
fmt::print(confirmation_id);
if (this->options.nonewlines == false) {
fmt::print("\n");
}
return 0;
default:

View File

@ -36,10 +36,18 @@
CMRC_DECLARE(umskt);
enum ACTIVATION_ALGORITHM {
WINDOWS = 0,
OFFICE_XP = 1,
OFFICE_2K3 = 2,
OFFICE_2K7 = 3,
PLUS_DME = 4,
};
enum MODE {
MODE_BINK1998_GENERATE = 0,
MODE_BINK2002_GENERATE = 1,
MODE_CONFIRMATION_ID = 2,
MODE_CONFIRMATION_ID = 2,
MODE_BINK1998_VALIDATE = 3,
MODE_BINK2002_VALIDATE = 4,
};
@ -49,16 +57,22 @@ struct Options {
std::string keysFilename;
std::string instid;
std::string keyToCheck;
std::string productid;
int channelID;
int serial;
int numKeys;
bool upgrade;
bool serialSet;
bool verbose;
bool help;
bool error;
bool list;
bool nonewlines;
bool overrideVersion;
bool nodashes;
MODE applicationMode;
ACTIVATION_ALGORITHM activationMode;
};
class CLI {
@ -73,13 +87,14 @@ class CLI {
public:
CLI(Options options, json keys);
~CLI();
static bool loadJSON(const fs::path& filename, json *output);
static void showHelp(char *argv[]);
static int parseCommandLine(int argc, char* argv[], Options *options);
static int validateCommandLine(Options* options, char *argv[], json *keys);
static void printID(DWORD *pid);
static void printKey(char *pk);
void printKey(char *pk);
static bool stripKey(const char *in_key, char out_key[PK_LENGTH]);
int BINK1998Generate();

View File

@ -29,9 +29,26 @@
#include "confid.h"
#define MOD 0x16A6B036D7F2A79ULL
#define NON_RESIDUE 43
static const QWORD f[6] = {0, 0x21840136C85381ULL, 0x44197B83892AD0ULL, 0x1400606322B3B04ULL, 0x1400606322B3B04ULL, 1};
#if defined(_MSC_VER)
#include <intrin.h>
#endif
QWORD MOD = 0;
QWORD NON_RESIDUE = 0;
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
int productID[4];
int activationMode;
int ConfirmationID::calculateCheckDigit(int pid)
{
unsigned int i = 0, j = 0, k = 0;
for (j = pid; j; i += k)
{
k = j % 10;
j /= 10;
}
return ((10 * pid) - (i % 7)) + 7;
}
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
{
@ -62,7 +79,13 @@ inline QWORD ConfirmationID::__umul128(QWORD a, QWORD b, QWORD* hi)
#else
#define __umul128 _umul128
#endif
#elif defined(__i386__) || defined(_M_IX86) || defined(__arm__) || defined(__EMSCRIPTEN__)
#elif defined(_M_ARM64) // Microsoft implementation of ARM64
inline QWORD ConfirmationID::__umul128(QWORD a, QWORD b, QWORD* hi)
{
*hi = __umulh(a, b);
return a * b;
}
#elif defined(__i386__) || defined(_M_IX86) || defined(__arm__) || defined(__EMSCRIPTEN__) || defined(_M_ARM)
inline QWORD ConfirmationID::__umul128(QWORD multiplier, QWORD multiplicand, QWORD *product_hi) {
// multiplier = ab = a * 2^32 + b
// multiplicand = cd = c * 2^32 + d
@ -95,18 +118,65 @@ QWORD ConfirmationID::ui128_quotient_mod(QWORD lo, QWORD hi)
{
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
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 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 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;
unsigned sum1carry = (sum1 < part1lo);
sum1 += prod1;
sum1carry += (sum1 < prod1);
QWORD prod2 = part1hi + part2hi + sum1carry;
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;
prod3hi += (prod3lo < prod2);
return (prod3lo >> 42) | (prod3hi << 22);
@ -619,6 +689,20 @@ void ConfirmationID::sha1_single_block(unsigned char input[64], unsigned char ou
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
}
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)
{
unsigned char sha1_input[64];
@ -628,12 +712,26 @@ void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned c
int external_counter;
for (external_counter = 0; external_counter < 4; external_counter++) {
memset(sha1_input, 0, sizeof(sha1_input));
memcpy(sha1_input, buffer + half, half);
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;
sha1_single_block(sha1_input, sha1_result);
switch (activationMode) {
case 0:
case 1:
case 4:
memcpy(sha1_input, buffer + half, half);
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;
for (i = half & ~3; i < half; i++)
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
@ -654,12 +752,26 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
int external_counter;
for (external_counter = 0; external_counter < 4; external_counter++) {
memset(sha1_input, 0, sizeof(sha1_input));
memcpy(sha1_input, buffer, half);
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;
sha1_single_block(sha1_input, sha1_result);
switch (activationMode) {
case 0:
case 1:
case 4:
memcpy(sha1_input, buffer, half);
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;
for (i = half & ~3; i < half; i++)
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
@ -671,8 +783,44 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
}
}
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49])
int ConfirmationID::Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid, bool overrideVersion)
{
int version;
unsigned char hardwareID[8];
activationMode = mode;
switch (activationMode) {
case 0:
MOD = 0x16A6B036D7F2A79;
NON_RESIDUE = 43;
f[0] = 0x0;
f[1] = 0x21840136C85381;
f[2] = 0x44197B83892AD0;
f[3] = 0x1400606322B3B04;
f[4] = 0x1400606322B3B04;
f[5] = 0x1;
break;
case 1:
case 2:
case 3:
MOD = 0x16E48DD18451FE9;
NON_RESIDUE = 3;
f[0] = 0x0;
f[1] = 0xE5F5ECD95C8FD2;
f[2] = 0xFF28276F11F61;
f[3] = 0xFB2BD9132627E6;
f[4] = 0xE5F5ECD95C8FD2;
f[5] = 0x1;
break;
case 4:
MOD = 0x16A5DABA0605983;
NON_RESIDUE = 2;
f[0] = 0x334F24F75CAA0E;
f[1] = 0x1392FF62889BD7B;
f[2] = 0x135131863BA2DB8;
f[3] = 0x153208E78006010;
f[4] = 0x163694F26056DB;
f[5] = 0x1;
}
unsigned char installation_id[19]; // 10**45 < 256**19
size_t installation_id_len = 0;
const char* p = installation_id_str;
@ -714,9 +862,25 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
return ERR_TOO_SHORT;
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
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);
if (installation_id[18] >= 0x10)
if (installation_id[18] >= 0x10 && overrideVersion == false)
return ERR_UNKNOWN_VERSION;
#pragma pack(push, 1)
@ -727,19 +891,71 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
unsigned short KeySHA1;
} parsed;
#pragma pack(pop)
memcpy(&parsed, installation_id, sizeof(parsed));
unsigned productId1 = parsed.ProductIDLow & ((1 << 17) - 1);
unsigned productId2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
unsigned productId3 = (parsed.ProductIDLow >> 27) & ((1 << 25) - 1);
unsigned version = (parsed.ProductIDLow >> 52) & 7;
unsigned productId4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
if (version != (totalCount == 41 ? 4 : 5))
return ERR_UNKNOWN_VERSION;
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
switch (activationMode) {
case 0:
case 1:
case 4:
memcpy(&parsed, installation_id, sizeof(parsed));
productID[0] = parsed.ProductIDLow & ((1 << 17) - 1);
productID[1] = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
productID[2] = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
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];
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);
TDivisor d;
@ -754,7 +970,16 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
} u;
u.lo = 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);
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
QWORD x1 = u.lo - x2 * MOD;
@ -766,7 +991,18 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
}
if (attempt > 0x80)
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 {
struct {
QWORD encoded_lo, encoded_hi;

View File

@ -41,6 +41,7 @@ typedef struct {
} TDivisor;
EXPORT class ConfirmationID {
static int calculateCheckDigit(int pid);
static QWORD residue_add(QWORD x, QWORD y);
static QWORD residue_sub(QWORD x, QWORD y);
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 unsigned rol(unsigned x, int shift);
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 Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
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();
};

View File

@ -27,8 +27,8 @@
#include "pidgen3/BINK2002.h"
#include "pidgen2/PIDGEN2.h"
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49]) {
return ConfirmationID::Generate(installation_id_str, confirmation_id);
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid, bool bypassVersion) {
return ConfirmationID::Generate(installation_id_str, confirmation_id, mode, productid, 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) {
@ -57,4 +57,79 @@ FNEXPORT int PIDGEN2_GenerateRetail(char* channelID, char* &keyout) {
FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) {
return PIDGEN2::GenerateOEM(year, day, oem, keyout);
}
}
// RNG utility functions
int UMSKT::umskt_rand_bytes(unsigned char *buf, int num) {
#if UMSKT_RNG_DJGPP
// DOS-compatible RNG using DJGPP's random() function
static bool initialized = false;
if (!initialized) {
// Get initial seed from multiple sources for better entropy
struct timeval tv;
gettimeofday(&tv, NULL);
// Combine microseconds with BIOS timer ticks
unsigned long ticks = *(volatile unsigned long *)0x0040001CL;
int seed = (int)((tv.tv_sec ^ tv.tv_usec) ^ (ticks * 100000));
// Initialize both random() and rand() with different seeds
srandom(seed);
srand(seed ^ 0x1234ABCD); // Use a different seed for rand
initialized = true;
}
for (int i = 0; i < num; i++) {
// Use random() for better randomness, especially in lower bits
buf[i] = (unsigned char)(random() & 0xFF);
// Mix in rand() as an additional source
buf[i] ^= (unsigned char)(rand() & 0xFF);
}
return 1;
#else
// Use OpenSSL's RAND_bytes for non-DOS systems
return RAND_bytes(buf, num);
#endif
}
int UMSKT::umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom) {
#if UMSKT_RNG_DJGPP
// DOS-compatible RNG implementation for BIGNUMs
unsigned char *buf = (unsigned char *)malloc((bits + 7) / 8);
if (!buf) return 0;
// Generate random bytes
umskt_rand_bytes(buf, (bits + 7) / 8);
// Convert to BIGNUM
if (!BN_bin2bn(buf, (bits + 7) / 8, rnd)) {
free(buf);
return 0;
}
free(buf);
// Apply top/bottom constraints like BN_rand does
if (top != -1) {
if (top) {
if (bits == 0) {
BN_zero(rnd);
return 1;
}
BN_set_bit(rnd, bits - 1);
}
BN_mask_bits(rnd, bits);
}
if (bottom) {
BN_set_bit(rnd, 0);
}
return 1;
#else
// Use OpenSSL's BN_rand for non-DOS systems
return BN_rand(rnd, bits, top, bottom);
#endif
}

View File

@ -38,6 +38,10 @@
#include <fmt/core.h>
#include <fmt/format.h>
#ifdef __DJGPP__
#include <sys/time.h>
#endif
// Algorithm macros
#define PK_LENGTH 25
#define NULL_TERMINATOR 1
@ -59,6 +63,17 @@
#define BYDWORD(n) (DWORD)(*((n) + 0) | *((n) + 1) << 8 | *((n) + 2) << 16 | *((n) + 3) << 24)
#define BITMASK(n) ((1ULL << (n)) - 1)
// RNG utility functions
#ifdef __DJGPP__
#define UMSKT_RNG_DJGPP 1
extern "C" {
long int random(void);
int srandom(int seed);
}
#else
#define UMSKT_RNG_DJGPP 0
#endif
class UMSKT {
public:
static std::FILE* debug;
@ -67,7 +82,10 @@ public:
class ConfigurationID;
static void setDebugOutput(std::FILE* input);
// RNG utility functions
static int umskt_rand_bytes(unsigned char *buf, int num);
static int umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom);
};
#endif //UMSKT_LIBUMSKT_H

View File

@ -201,7 +201,7 @@ void PIDGEN3::BINK1998::Generate(
EC_POINT *r = EC_POINT_new(eCurve);
// Generate a random number c consisting of 384 bits without any constraints.
BN_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
UMSKT::umskt_bn_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
// Pick a random derivative of the base point on the elliptic curve.
// R = cG;

View File

@ -236,7 +236,7 @@ void PIDGEN3::BINK2002::Generate(
EC_POINT *r = EC_POINT_new(eCurve);
// Generate a random number c consisting of 512 bits without any constraints.
BN_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
UMSKT::umskt_bn_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
// R = cG
EC_POINT_mul(eCurve, r, nullptr, basePoint, c, numContext);

View File

@ -100,6 +100,13 @@ EC_GROUP* PIDGEN3::initializeEllipticCurve(
// Cleanup
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;
}

View File

@ -39,23 +39,23 @@ int main(int argc, char *argv[]) {
return status;
}
CLI* run = new CLI(options, keys);
CLI run(options, keys);
switch(options.applicationMode) {
case MODE_BINK1998_GENERATE:
return run->BINK1998Generate();
return run.BINK1998Generate();
case MODE_BINK2002_GENERATE:
return run->BINK2002Generate();
return run.BINK2002Generate();
case MODE_BINK1998_VALIDATE:
return run->BINK1998Validate();
return run.BINK1998Validate();
case MODE_BINK2002_VALIDATE:
return run->BINK2002Validate();
return run.BINK2002Validate();
case MODE_CONFIRMATION_ID:
return run->ConfirmationID();
return run.ConfirmationID();
default:
return 1;

Binary file not shown.