mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2025-07-05 20:00:23 +03:00
Compare commits
51 Commits
cmake-fix
...
49fefca596
Author | SHA1 | Date | |
---|---|---|---|
49fefca596 | |||
178c9e0689 | |||
214d2d38a5 | |||
3ae078e3c5 | |||
12e511b3a5 | |||
21bac3b66c | |||
09842ace12 | |||
0d016b8872 | |||
b1743f4bff | |||
cc765edb4f | |||
4d1b5d6681 | |||
f59d77bdd1 | |||
71cbd19017 | |||
974f400cfc | |||
a2d521c230 | |||
d53409f5bd | |||
2703e17f69 | |||
680239bdb7 | |||
104bdb19e3 | |||
f2f859faeb | |||
a2d9c46a4b | |||
f65533bbb3 | |||
90e31b667a | |||
492d245f86 | |||
361a39e204 | |||
31993afb62 | |||
b3f64e6330 | |||
ccf93a0089 | |||
ae391a5e50 | |||
3620cf5af6 | |||
b7965f19e8 | |||
52c9a57ea2 | |||
283df1c1fe | |||
c1eb81490b | |||
2ee6a99acd | |||
1370a6ecff | |||
e3a6b78407 | |||
6ae5c9e435 | |||
a6bfaed6e8 | |||
f7b41a9810 | |||
e76eb7ac33 | |||
c91bbad69a | |||
75e81e7049 | |||
e9131e45c8 | |||
c664ea7f9c | |||
f95501b789 | |||
444f8c45c7 | |||
45004623be | |||
a4cb524fed | |||
03ae90163a | |||
c1e9a0f021 |
6
.github/workflows/dos-djgpp.yml
vendored
6
.github/workflows/dos-djgpp.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (DOS DJGPP)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: [ "*" ]
|
||||||
pull_request:
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
branches: [ "master" ]
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
|
CC: ${{ github.workspace }}/djgpp/bin/i586-pc-msdosdjgpp-gcc
|
||||||
|
8
.github/workflows/freebsd.yml
vendored
8
.github/workflows/freebsd.yml
vendored
@ -21,10 +21,10 @@
|
|||||||
name: C/C++ CI (FreeBSD)
|
name: C/C++ CI (FreeBSD)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: [ "*" ]
|
||||||
pull_request:
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
branches: [ "master" ]
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
6
.github/workflows/linux.yml
vendored
6
.github/workflows/linux.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (Linux)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: [ "*" ]
|
||||||
pull_request:
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
branches: [ "master" ]
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
8
.github/workflows/macos.yml
vendored
8
.github/workflows/macos.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (macOS)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: [ "*" ]
|
||||||
pull_request:
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
branches: [ "master" ]
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-x86:
|
build-x86:
|
||||||
@ -56,5 +56,5 @@ jobs:
|
|||||||
- name: Upload build artifact
|
- name: Upload build artifact
|
||||||
uses: actions/upload-artifact@v3.1.2
|
uses: actions/upload-artifact@v3.1.2
|
||||||
with:
|
with:
|
||||||
name: UMSKT-macOS-${{ matrix.arch }}-static
|
name: UMSKT-macOS-${{ matrix.arch }}
|
||||||
path: build/actions_upload
|
path: build/actions_upload
|
||||||
|
6
.github/workflows/windows.yml
vendored
6
.github/workflows/windows.yml
vendored
@ -22,9 +22,9 @@ name: C/C++ CI (Windows)
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: [ "*" ]
|
||||||
pull_request:
|
paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip
|
||||||
branches: [ "master" ]
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-32bit:
|
build-32bit:
|
||||||
|
@ -31,6 +31,16 @@ OPTION(MSVC_MSDOS_STUB "Specify a custom MS-DOS stub for a 32-bit MSVC compilati
|
|||||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS})
|
||||||
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS})
|
||||||
|
|
||||||
|
# macOS does not support static build
|
||||||
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
SET(UMSKT_USE_SHARED_OPENSSL ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# neither does dos idk i'm trying random stuff
|
||||||
|
if (DJGPP_WATT32)
|
||||||
|
SET(UMSKT_USE_SHARED_OPENSSL ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(UMSKT_USE_SHARED_OPENSSL)
|
IF(UMSKT_USE_SHARED_OPENSSL)
|
||||||
SET(OPENSSL_USE_STATIC_LIBS FALSE)
|
SET(OPENSSL_USE_STATIC_LIBS FALSE)
|
||||||
SET(OPENSSL_MSVC_STATIC_RT FALSE)
|
SET(OPENSSL_MSVC_STATIC_RT FALSE)
|
||||||
@ -40,6 +50,8 @@ ELSE()
|
|||||||
SET(OPENSSL_MSVC_STATIC_RT TRUE)
|
SET(OPENSSL_MSVC_STATIC_RT TRUE)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IF(DJGPP_WATT32)
|
IF(DJGPP_WATT32)
|
||||||
SET(CMAKE_SYSTEM_NAME MSDOS)
|
SET(CMAKE_SYSTEM_NAME MSDOS)
|
||||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
@ -68,6 +80,16 @@ ELSE()
|
|||||||
MESSAGE(STATUS "[UMSKT] Detected Static Library version of OpenSSL")
|
MESSAGE(STATUS "[UMSKT] Detected Static Library version of OpenSSL")
|
||||||
ENDIF()
|
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 (DJGPP_WATT32)
|
||||||
|
SET(BUILD_SHARED_LIBS ON)
|
||||||
|
MESSAGE(STATUS "[UMSKT] DOS has no static library - Shared library forced on")
|
||||||
|
endif()
|
||||||
|
|
||||||
# if we're compiling with MSVC, respect the DEBUG compile option
|
# if we're compiling with MSVC, respect the DEBUG compile option
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
SET(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||||
|
12
README.md
12
README.md
@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
[](../../actions/workflows/linux.yml)
|
[](../../actions/workflows/linux.yml)
|
||||||
|
|
||||||
[](../../actions/workflows/dos-djgpp.yml)
|
[](../../actions/workflows/freebsd.yml)
|
||||||
|
|
||||||
[](../../actions/workflows/freebsd.yml)
|
[](../../actions/workflows/dos-djgpp.yml)
|
||||||
|
|
||||||
------
|
------
|
||||||
|
|
||||||
@ -56,9 +56,13 @@ In light of the recent exponential interest in this project I've decided to put
|
|||||||
|
|
||||||
* **Note:** Before continuing, please ensure you have the `umskt` executable extracted and on UNIX-like systems, have execution permissions (`chmod +x umskt`).
|
* **Note:** Before continuing, please ensure you have the `umskt` executable extracted and on UNIX-like systems, have execution permissions (`chmod +x umskt`).
|
||||||
|
|
||||||
#### 2. Run `umskt` to generate a key, or add `--help` or `-h` to see more options.
|
#### 2. Install OpenSSL 3.1.2.
|
||||||
|
For Windows, click [here](https://slproweb.com/products/Win32OpenSSL.html) and choose the right version. For other operating systems, consult your package manager.
|
||||||
|
*Note: This only applies if the build you download has OpenSSL embedded (static library) or not. You can usually tell if the download size is measured in KB or MB. If it's MB, you don't need this.*
|
||||||
|
|
||||||
#### 3. *(Activation step for `Retail` and `OEM` only)*
|
#### 3. Run `umskt` to generate a key, or add `--help` or `-h` to see more options.
|
||||||
|
|
||||||
|
#### 4. *(Activation step for `Retail` and `OEM` only)*
|
||||||
* After installation, you will be prompted to activate Windows.
|
* After installation, you will be prompted to activate Windows.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1531,7 +1531,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Activation": {
|
"Activation": {
|
||||||
"Windowws XP": {
|
"Windows XP": {
|
||||||
"p": "102011604035381881",
|
"p": "102011604035381881",
|
||||||
"x": {
|
"x": {
|
||||||
"0": "0",
|
"0": "0",
|
||||||
|
92
src/cli.cpp
92
src/cli.cpp
@ -53,12 +53,15 @@ void CLI::showHelp(char *argv[]) {
|
|||||||
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
|
fmt::print("\t-n --number\tnumber of keys to generate (defaults to 1)\n");
|
||||||
fmt::print("\t-f --file\tspecify which keys file to load\n");
|
fmt::print("\t-f --file\tspecify which keys file to load\n");
|
||||||
fmt::print("\t-i --instid\tinstallation ID used to generate confirmation ID\n");
|
fmt::print("\t-i --instid\tinstallation ID used to generate confirmation ID\n");
|
||||||
|
fmt::print("\t-m --mode\tproduct family to activate.\n\t\t\tvalid options are \"WINDOWS\", \"OFFICEXP\", \"OFFICE2K3\", \"OFFICE2K7\" or \"PLUSDME\"\n\t\t\t(defaults to \"WINDOWS\")\n");
|
||||||
|
fmt::print("\t-p --productid\tthe product ID of the Program to activate. only required for Office 2K3 and Office 2K7 programs\n");
|
||||||
fmt::print("\t-b --binkid\tspecify which BINK identifier to load (defaults to 2E)\n");
|
fmt::print("\t-b --binkid\tspecify which BINK identifier to load (defaults to 2E)\n");
|
||||||
fmt::print("\t-l --list\tshow which products/binks can be loaded\n");
|
fmt::print("\t-l --list\tshow which products/binks can be loaded\n");
|
||||||
fmt::print("\t-c --channelid\tspecify which Channel Identifier to use (defaults to 640)\n");
|
fmt::print("\t-c --channelid\tspecify which Channel Identifier to use (defaults to 640)\n");
|
||||||
fmt::print("\t-s --serial\tspecifies a serial to use in the product ID (defaults to random, BINK1998 only)\n");
|
fmt::print("\t-s --serial\tspecifies a serial to use in the product ID (defaults to random, BINK1998 only)\n");
|
||||||
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
|
||||||
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
fmt::print("\t-V --validate\tproduct key to validate signature\n");
|
||||||
|
fmt::print("\t-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n");
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,21 +72,23 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
"",
|
||||||
640,
|
640,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
false,
|
false,
|
||||||
false,
|
MODE_BINK1998_GENERATE,
|
||||||
false,
|
WINDOWS
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
MODE_BINK1998_GENERATE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
std::string arg = argv[i];
|
std::string arg = argv[i];
|
||||||
|
|
||||||
if (arg == "-v" || arg == "--verbose") {
|
if (arg == "-v" || arg == "--verbose") {
|
||||||
options->verbose = true;
|
options->verbose = true;
|
||||||
UMSKT::setDebugOutput(stderr);
|
UMSKT::setDebugOutput(stderr);
|
||||||
@ -158,6 +163,28 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->instid = argv[i+1];
|
options->instid = argv[i+1];
|
||||||
options->applicationMode = MODE_CONFIRMATION_ID;
|
options->applicationMode = MODE_CONFIRMATION_ID;
|
||||||
i++;
|
i++;
|
||||||
|
} else if (arg == "-m" || arg == "--mode") {
|
||||||
|
std::string mode = argv[i+1];
|
||||||
|
char *p = &mode[0];
|
||||||
|
for (; *p; p++) {
|
||||||
|
*p = toupper((unsigned char)*p);
|
||||||
|
}
|
||||||
|
p = &mode[0];
|
||||||
|
if (strcmp(p, "WINDOWS") == 0) {
|
||||||
|
options->activationMode = WINDOWS;
|
||||||
|
} else if (strcmp(p, "OFFICEXP") == 0) {
|
||||||
|
options->activationMode = OFFICE_XP;
|
||||||
|
} else if (strcmp(p, "OFFICE2K3") == 0) {
|
||||||
|
options->activationMode = OFFICE_2K3;
|
||||||
|
} else if (strcmp(p, "OFFICE2K7") == 0) {
|
||||||
|
options->activationMode = OFFICE_2K7;
|
||||||
|
} else if (strcmp(p, "PLUSDME") == 0) {
|
||||||
|
options->activationMode = PLUS_DME;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
} else if (arg == "-p" || arg == "--productid") {
|
||||||
|
options->productid = argv[i+1];
|
||||||
|
i++;
|
||||||
} else if (arg == "-V" || arg == "--validate") {
|
} else if (arg == "-V" || arg == "--validate") {
|
||||||
if (i == argc - 1) {
|
if (i == argc - 1) {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
@ -167,11 +194,19 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
|||||||
options->keyToCheck = argv[i+1];
|
options->keyToCheck = argv[i+1];
|
||||||
options->applicationMode = MODE_BINK1998_VALIDATE;
|
options->applicationMode = MODE_BINK1998_VALIDATE;
|
||||||
i++;
|
i++;
|
||||||
} else {
|
|
||||||
|
} else if (arg == "-N" || arg == "--nonewlines") {
|
||||||
|
options->nonewlines = true;
|
||||||
|
} else {
|
||||||
options->error = true;
|
options->error = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure that a product id is entered for OFFICE_2K3 or OFFICE_2K7 IIDs
|
||||||
|
if ((options->activationMode == OFFICE_2K3 || options->activationMode == OFFICE_2K7) && options->productid == "") {
|
||||||
|
return options->error = true;
|
||||||
|
}
|
||||||
|
|
||||||
return !options->error;
|
return !options->error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,6 +255,12 @@ int CLI::validateCommandLine(Options* options, char *argv[], json *keys) {
|
|||||||
int intBinkID;
|
int intBinkID;
|
||||||
sscanf(options->binkid.c_str(), "%x", &intBinkID);
|
sscanf(options->binkid.c_str(), "%x", &intBinkID);
|
||||||
|
|
||||||
|
// FE and FF are BINK 1998, but do not generate valid keys, so we throw an error
|
||||||
|
if (intBinkID >= 0xFE) {
|
||||||
|
fmt::print("ERROR: Terminal Services BINKs (FE and FF) are unsupported at this time\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (intBinkID >= 0x40) {
|
if (intBinkID >= 0x40) {
|
||||||
// set bink2002 validate mode if in bink1998 validate mode, else set bink2002 generate mode
|
// set bink2002 validate mode if in bink1998 validate mode, else set bink2002 generate mode
|
||||||
options->applicationMode = (options->applicationMode == MODE_BINK1998_VALIDATE) ? MODE_BINK2002_VALIDATE : MODE_BINK2002_GENERATE;
|
options->applicationMode = (options->applicationMode == MODE_BINK1998_VALIDATE) ? MODE_BINK2002_VALIDATE : MODE_BINK2002_GENERATE;
|
||||||
@ -383,13 +424,8 @@ int CLI::BINK1998Generate() {
|
|||||||
// generate a key
|
// generate a key
|
||||||
BN_sub(this->privateKey, this->genOrder, this->privateKey);
|
BN_sub(this->privateKey, this->genOrder, this->privateKey);
|
||||||
|
|
||||||
// Specify whether an upgrade version or not
|
|
||||||
bool bUpgrade = false;
|
|
||||||
if (options.upgrade == true)
|
|
||||||
bUpgrade = true;
|
|
||||||
|
|
||||||
for (int i = 0; i < this->total; i++) {
|
for (int i = 0; i < this->total; i++) {
|
||||||
PIDGEN3::BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, bUpgrade, this->pKey);
|
PIDGEN3::BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, options.upgrade, this->pKey);
|
||||||
|
|
||||||
bool isValid = PIDGEN3::BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
bool isValid = PIDGEN3::BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
@ -414,10 +450,9 @@ int CLI::BINK1998Generate() {
|
|||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
||||||
}
|
}
|
||||||
#ifndef _WIN32
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
#endif
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,12 +473,7 @@ int CLI::BINK2002Generate() {
|
|||||||
fmt::print("> AuthInfo: {}\n", pAuthInfo);
|
fmt::print("> AuthInfo: {}\n", pAuthInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Specify whether an upgrade version or not
|
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, options.upgrade, this->pKey);
|
||||||
bool bUpgrade = false;
|
|
||||||
if (options.upgrade == true)
|
|
||||||
bUpgrade = true;
|
|
||||||
|
|
||||||
PIDGEN3::BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, bUpgrade, this->pKey);
|
|
||||||
|
|
||||||
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
bool isValid = PIDGEN3::BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
@ -468,9 +498,9 @@ int CLI::BINK2002Generate() {
|
|||||||
if (this->options.verbose) {
|
if (this->options.verbose) {
|
||||||
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
fmt::print("\nSuccess count: {}/{}", this->count, this->total);
|
||||||
}
|
}
|
||||||
#ifndef _WIN32
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
#endif
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -515,7 +545,7 @@ int CLI::BINK2002Validate() {
|
|||||||
|
|
||||||
int CLI::ConfirmationID() {
|
int CLI::ConfirmationID() {
|
||||||
char confirmation_id[49];
|
char confirmation_id[49];
|
||||||
int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id);
|
int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id, options.activationMode, options.productid);
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case ERR_TOO_SHORT:
|
case ERR_TOO_SHORT:
|
||||||
@ -544,9 +574,9 @@ int CLI::ConfirmationID() {
|
|||||||
|
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
fmt::print(confirmation_id);
|
fmt::print(confirmation_id);
|
||||||
#ifndef _WIN32
|
if (this->options.nonewlines == false) {
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
#endif
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
13
src/cli.h
13
src/cli.h
@ -36,10 +36,18 @@
|
|||||||
|
|
||||||
CMRC_DECLARE(umskt);
|
CMRC_DECLARE(umskt);
|
||||||
|
|
||||||
|
enum ACTIVATION_ALGORITHM {
|
||||||
|
WINDOWS = 0,
|
||||||
|
OFFICE_XP = 1,
|
||||||
|
OFFICE_2K3 = 2,
|
||||||
|
OFFICE_2K7 = 3,
|
||||||
|
PLUS_DME = 4,
|
||||||
|
};
|
||||||
|
|
||||||
enum MODE {
|
enum MODE {
|
||||||
MODE_BINK1998_GENERATE = 0,
|
MODE_BINK1998_GENERATE = 0,
|
||||||
MODE_BINK2002_GENERATE = 1,
|
MODE_BINK2002_GENERATE = 1,
|
||||||
MODE_CONFIRMATION_ID = 2,
|
MODE_CONFIRMATION_ID = 2,
|
||||||
MODE_BINK1998_VALIDATE = 3,
|
MODE_BINK1998_VALIDATE = 3,
|
||||||
MODE_BINK2002_VALIDATE = 4,
|
MODE_BINK2002_VALIDATE = 4,
|
||||||
};
|
};
|
||||||
@ -49,6 +57,7 @@ struct Options {
|
|||||||
std::string keysFilename;
|
std::string keysFilename;
|
||||||
std::string instid;
|
std::string instid;
|
||||||
std::string keyToCheck;
|
std::string keyToCheck;
|
||||||
|
std::string productid;
|
||||||
int channelID;
|
int channelID;
|
||||||
int serial;
|
int serial;
|
||||||
int numKeys;
|
int numKeys;
|
||||||
@ -58,8 +67,10 @@ struct Options {
|
|||||||
bool help;
|
bool help;
|
||||||
bool error;
|
bool error;
|
||||||
bool list;
|
bool list;
|
||||||
|
bool nonewlines;
|
||||||
|
|
||||||
MODE applicationMode;
|
MODE applicationMode;
|
||||||
|
ACTIVATION_ALGORITHM activationMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CLI {
|
class CLI {
|
||||||
|
@ -29,9 +29,25 @@
|
|||||||
|
|
||||||
#include "confid.h"
|
#include "confid.h"
|
||||||
|
|
||||||
#define MOD 0x16A6B036D7F2A79ULL
|
QWORD MOD = 0;
|
||||||
#define NON_RESIDUE 43
|
QWORD NON_RESIDUE = 0;
|
||||||
static const QWORD f[6] = {0, 0x21840136C85381ULL, 0x44197B83892AD0ULL, 0x1400606322B3B04ULL, 0x1400606322B3B04ULL, 1};
|
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
|
||||||
|
int productID1;
|
||||||
|
int productID2;
|
||||||
|
int productID3;
|
||||||
|
int productID4;
|
||||||
|
int activationMode;
|
||||||
|
|
||||||
|
int ConfirmationID::calculateCheckDigit(int pid)
|
||||||
|
{
|
||||||
|
unsigned int i = 0, j = 0, k = 0;
|
||||||
|
for (j = pid; j; i += k)
|
||||||
|
{
|
||||||
|
k = j % 10;
|
||||||
|
j /= 10;
|
||||||
|
}
|
||||||
|
return ((10 * pid) - (i % 7)) + 7;
|
||||||
|
}
|
||||||
|
|
||||||
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
|
QWORD ConfirmationID::residue_add(QWORD x, QWORD y)
|
||||||
{
|
{
|
||||||
@ -95,18 +111,65 @@ QWORD ConfirmationID::ui128_quotient_mod(QWORD lo, QWORD hi)
|
|||||||
{
|
{
|
||||||
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
|
// hi:lo * ceil(2**170/MOD) >> (64 + 64 + 42)
|
||||||
QWORD prod1;
|
QWORD prod1;
|
||||||
__umul128(lo, 0x604fa6a1c6346a87, &prod1);
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
__umul128(lo, 0x604FA6A1C6346A87, &prod1);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
__umul128(lo, 0x4FA8E4A40CDAE44A, &prod1);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
__umul128(lo, 0x2C5C4D3654A594F0, &prod1);
|
||||||
|
}
|
||||||
QWORD part1hi;
|
QWORD part1hi;
|
||||||
QWORD part1lo = __umul128(lo, 0x2d351c6d04f8b, &part1hi);
|
QWORD part1lo;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
part1lo = __umul128(lo, 0x2D351C6D04F8B, &part1hi);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
part1lo = __umul128(lo, 0x2CBAF12A59BBE, &part1hi);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
part1lo = __umul128(lo, 0x2D36C691A4EA5, &part1hi);
|
||||||
|
}
|
||||||
QWORD part2hi;
|
QWORD part2hi;
|
||||||
QWORD part2lo = __umul128(hi, 0x604fa6a1c6346a87, &part2hi);
|
QWORD part2lo;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
part2lo = __umul128(hi, 0x604FA6A1C6346A87, &part2hi);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
part2lo = __umul128(hi, 0x4FA8E4A40CDAE44A, &part2hi);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
part2lo = __umul128(hi, 0x2C5C4D3654A594F0, &part2hi);
|
||||||
|
}
|
||||||
QWORD sum1 = part1lo + part2lo;
|
QWORD sum1 = part1lo + part2lo;
|
||||||
unsigned sum1carry = (sum1 < part1lo);
|
unsigned sum1carry = (sum1 < part1lo);
|
||||||
sum1 += prod1;
|
sum1 += prod1;
|
||||||
sum1carry += (sum1 < prod1);
|
sum1carry += (sum1 < prod1);
|
||||||
QWORD prod2 = part1hi + part2hi + sum1carry;
|
QWORD prod2 = part1hi + part2hi + sum1carry;
|
||||||
QWORD prod3hi;
|
QWORD prod3hi;
|
||||||
QWORD prod3lo = __umul128(hi, 0x2d351c6d04f8b, &prod3hi);
|
QWORD prod3lo;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
prod3lo = __umul128(hi, 0x2D351C6D04F8B, &prod3hi);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
prod3lo = __umul128(hi, 0x2CBAF12A59BBE, &prod3hi);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
prod3lo = __umul128(hi, 0x2D36C691A4EA5, &prod3hi);
|
||||||
|
}
|
||||||
prod3lo += prod2;
|
prod3lo += prod2;
|
||||||
prod3hi += (prod3lo < prod2);
|
prod3hi += (prod3lo < prod2);
|
||||||
return (prod3lo >> 42) | (prod3hi << 22);
|
return (prod3lo >> 42) | (prod3hi << 22);
|
||||||
@ -619,6 +682,20 @@ void ConfirmationID::sha1_single_block(unsigned char input[64], unsigned char ou
|
|||||||
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
|
output[16] = e >> 24; output[17] = e >> 16; output[18] = e >> 8; output[19] = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfirmationID::decode_iid_new_version(unsigned char* iid, unsigned char* hwid, int* version)
|
||||||
|
{
|
||||||
|
QWORD buffer[5];
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 5; i++)
|
||||||
|
memcpy(&buffer[i], (iid + (4 * i)), 4);
|
||||||
|
DWORD v1 = (buffer[3] & 0xFFFFFFF8) | 2;
|
||||||
|
DWORD v2 = ((buffer[3] & 7) << 29) | (buffer[2] >> 3);
|
||||||
|
QWORD hardwareIDVal = ((QWORD)v1 << 32) | v2;
|
||||||
|
for (i = 0; i < 8; ++i)
|
||||||
|
hwid[i] = (hardwareIDVal >> (8 * i)) & 0xFF;
|
||||||
|
*version = buffer[0] & 7;
|
||||||
|
}
|
||||||
|
|
||||||
void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize)
|
void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize)
|
||||||
{
|
{
|
||||||
unsigned char sha1_input[64];
|
unsigned char sha1_input[64];
|
||||||
@ -628,12 +705,26 @@ void ConfirmationID::Mix(unsigned char* buffer, size_t bufSize, const unsigned c
|
|||||||
int external_counter;
|
int external_counter;
|
||||||
for (external_counter = 0; external_counter < 4; external_counter++) {
|
for (external_counter = 0; external_counter < 4; external_counter++) {
|
||||||
memset(sha1_input, 0, sizeof(sha1_input));
|
memset(sha1_input, 0, sizeof(sha1_input));
|
||||||
memcpy(sha1_input, buffer + half, half);
|
switch (activationMode) {
|
||||||
memcpy(sha1_input + half, key, keySize);
|
case 0:
|
||||||
sha1_input[half + keySize] = 0x80;
|
case 1:
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
case 4:
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
memcpy(sha1_input, buffer + half, half);
|
||||||
sha1_single_block(sha1_input, sha1_result);
|
memcpy(sha1_input + half, key, keySize);
|
||||||
|
sha1_input[half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
sha1_input[0] = 0x79;
|
||||||
|
memcpy(sha1_input + 1, buffer + half, half);
|
||||||
|
memcpy(sha1_input + 1 + half, key, keySize);
|
||||||
|
sha1_input[1 + half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (1 + half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (1 + half + keySize) * 8 / 0x100;
|
||||||
|
}
|
||||||
|
sha1_single_block(sha1_input, sha1_result);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = half & ~3; i < half; i++)
|
for (i = half & ~3; i < half; i++)
|
||||||
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
||||||
@ -654,12 +745,26 @@ void ConfirmationID::Unmix(unsigned char* buffer, size_t bufSize, const unsigned
|
|||||||
int external_counter;
|
int external_counter;
|
||||||
for (external_counter = 0; external_counter < 4; external_counter++) {
|
for (external_counter = 0; external_counter < 4; external_counter++) {
|
||||||
memset(sha1_input, 0, sizeof(sha1_input));
|
memset(sha1_input, 0, sizeof(sha1_input));
|
||||||
memcpy(sha1_input, buffer, half);
|
switch (activationMode) {
|
||||||
memcpy(sha1_input + half, key, keySize);
|
case 0:
|
||||||
sha1_input[half + keySize] = 0x80;
|
case 1:
|
||||||
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
case 4:
|
||||||
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
memcpy(sha1_input, buffer, half);
|
||||||
sha1_single_block(sha1_input, sha1_result);
|
memcpy(sha1_input + half, key, keySize);
|
||||||
|
sha1_input[half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (half + keySize) * 8 / 0x100;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
sha1_input[0] = 0x79;
|
||||||
|
memcpy(sha1_input + 1, buffer, half);
|
||||||
|
memcpy(sha1_input + 1 + half, key, keySize);
|
||||||
|
sha1_input[1 + half + keySize] = 0x80;
|
||||||
|
sha1_input[sizeof(sha1_input) - 1] = (1 + half + keySize) * 8;
|
||||||
|
sha1_input[sizeof(sha1_input) - 2] = (1 + half + keySize) * 8 / 0x100;
|
||||||
|
}
|
||||||
|
sha1_single_block(sha1_input, sha1_result);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = half & ~3; i < half; i++)
|
for (i = half & ~3; i < half; i++)
|
||||||
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
sha1_result[i] = sha1_result[i + 4 - (half & 3)];
|
||||||
@ -671,8 +776,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)
|
||||||
{
|
{
|
||||||
|
int version;
|
||||||
|
unsigned char hardwareID[8];
|
||||||
|
activationMode = mode;
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
MOD = 0x16A6B036D7F2A79;
|
||||||
|
NON_RESIDUE = 43;
|
||||||
|
f[0] = 0x0;
|
||||||
|
f[1] = 0x21840136C85381;
|
||||||
|
f[2] = 0x44197B83892AD0;
|
||||||
|
f[3] = 0x1400606322B3B04;
|
||||||
|
f[4] = 0x1400606322B3B04;
|
||||||
|
f[5] = 0x1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
MOD = 0x16E48DD18451FE9;
|
||||||
|
NON_RESIDUE = 3;
|
||||||
|
f[0] = 0x0;
|
||||||
|
f[1] = 0xE5F5ECD95C8FD2;
|
||||||
|
f[2] = 0xFF28276F11F61;
|
||||||
|
f[3] = 0xFB2BD9132627E6;
|
||||||
|
f[4] = 0xE5F5ECD95C8FD2;
|
||||||
|
f[5] = 0x1;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
MOD = 0x16A5DABA0605983;
|
||||||
|
NON_RESIDUE = 2;
|
||||||
|
f[0] = 0x334F24F75CAA0E;
|
||||||
|
f[1] = 0x1392FF62889BD7B;
|
||||||
|
f[2] = 0x135131863BA2DB8;
|
||||||
|
f[3] = 0x153208E78006010;
|
||||||
|
f[4] = 0x163694F26056DB;
|
||||||
|
f[5] = 0x1;
|
||||||
|
}
|
||||||
unsigned char installation_id[19]; // 10**45 < 256**19
|
unsigned char installation_id[19]; // 10**45 < 256**19
|
||||||
size_t installation_id_len = 0;
|
size_t installation_id_len = 0;
|
||||||
const char* p = installation_id_str;
|
const char* p = installation_id_str;
|
||||||
@ -714,7 +855,23 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
return ERR_TOO_SHORT;
|
return ERR_TOO_SHORT;
|
||||||
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
|
for (; installation_id_len < sizeof(installation_id); installation_id_len++)
|
||||||
installation_id[installation_id_len] = 0;
|
installation_id[installation_id_len] = 0;
|
||||||
static const unsigned char iid_key[4] = {0x6A, 0xC8, 0x5E, 0xD4};
|
unsigned char iid_key[4] = { 0x0, 0x0, 0x0, 0x0 };
|
||||||
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
case 4:
|
||||||
|
iid_key[0] = 0x6A;
|
||||||
|
iid_key[1] = 0xC8;
|
||||||
|
iid_key[2] = 0x5E;
|
||||||
|
iid_key[3] = 0xD4;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
iid_key[0] = 0x5A;
|
||||||
|
iid_key[1] = 0x30;
|
||||||
|
iid_key[2] = 0xB9;
|
||||||
|
iid_key[3] = 0xF3;
|
||||||
|
}
|
||||||
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
Unmix(installation_id, totalCount == 41 ? 17 : 19, iid_key, 4);
|
||||||
if (installation_id[18] >= 0x10)
|
if (installation_id[18] >= 0x10)
|
||||||
return ERR_UNKNOWN_VERSION;
|
return ERR_UNKNOWN_VERSION;
|
||||||
@ -727,19 +884,65 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
unsigned short KeySHA1;
|
unsigned short KeySHA1;
|
||||||
} parsed;
|
} parsed;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
memcpy(&parsed, installation_id, sizeof(parsed));
|
switch (activationMode) {
|
||||||
unsigned productId1 = parsed.ProductIDLow & ((1 << 17) - 1);
|
case 0:
|
||||||
unsigned productId2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
|
case 1:
|
||||||
unsigned productId3 = (parsed.ProductIDLow >> 27) & ((1 << 25) - 1);
|
case 4:
|
||||||
unsigned version = (parsed.ProductIDLow >> 52) & 7;
|
memcpy(&parsed, installation_id, sizeof(parsed));
|
||||||
unsigned productId4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
productID1 = parsed.ProductIDLow & ((1 << 17) - 1);
|
||||||
if (version != (totalCount == 41 ? 4 : 5))
|
productID2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
|
||||||
return ERR_UNKNOWN_VERSION;
|
productID3 = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
|
||||||
|
version = (parsed.ProductIDLow >> 51) & 15;
|
||||||
|
productID4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
|
||||||
|
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);
|
||||||
|
productID1 = 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) {
|
||||||
|
productID2 = stoi(productid.substr(12,3));
|
||||||
|
productID3 = calculateCheckDigit((stoi(productid.substr(15,1)) * 100000) + (stoi(productid.substr(18,5))));
|
||||||
|
productID4 = (stoi((productid.substr(10,2))) / 100000) * 1000;
|
||||||
|
} else {
|
||||||
|
productID2 = stoi(productid.substr(6,3));
|
||||||
|
productID3 = stoi(productid.substr(10,7));
|
||||||
|
productID4 = stoi(productid.substr(18,5));
|
||||||
|
}
|
||||||
|
switch (activationMode) {
|
||||||
|
case 2:
|
||||||
|
if (version != 3)
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (version != 4)
|
||||||
|
return ERR_UNKNOWN_VERSION;
|
||||||
|
}
|
||||||
|
memcpy(&parsed, hardwareID, 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
|
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
|
||||||
|
|
||||||
unsigned char keybuf[16];
|
unsigned char keybuf[16];
|
||||||
memcpy(keybuf, &parsed.HardwareID, 8);
|
memcpy(keybuf, &parsed.HardwareID, 8);
|
||||||
QWORD productIdMixed = (QWORD)productId1 << 41 | (QWORD)productId2 << 58 | (QWORD)productId3 << 17 | productId4;
|
QWORD productIdMixed = (QWORD)productID1 << 41 | (QWORD)productID2 << 58 | (QWORD)productID3 << 17 | productID4;
|
||||||
memcpy(keybuf + 8, &productIdMixed, 8);
|
memcpy(keybuf + 8, &productIdMixed, 8);
|
||||||
|
|
||||||
TDivisor d;
|
TDivisor d;
|
||||||
@ -754,7 +957,16 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
} u;
|
} u;
|
||||||
u.lo = 0;
|
u.lo = 0;
|
||||||
u.hi = 0;
|
u.hi = 0;
|
||||||
u.buffer[7] = attempt;
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
case 4:
|
||||||
|
u.buffer[7] = attempt;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
u.buffer[6] = attempt;
|
||||||
|
}
|
||||||
Mix(u.buffer, 14, keybuf, 16);
|
Mix(u.buffer, 14, keybuf, 16);
|
||||||
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
|
QWORD x2 = ui128_quotient_mod(u.lo, u.hi);
|
||||||
QWORD x1 = u.lo - x2 * MOD;
|
QWORD x1 = u.lo - x2 * MOD;
|
||||||
@ -766,7 +978,18 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
|
|||||||
}
|
}
|
||||||
if (attempt > 0x80)
|
if (attempt > 0x80)
|
||||||
return ERR_UNLUCKY;
|
return ERR_UNLUCKY;
|
||||||
divisor_mul128(&d, 0x04e21b9d10f127c1, 0x40da7c36d44c, &d);
|
switch (activationMode) {
|
||||||
|
case 0:
|
||||||
|
divisor_mul128(&d, 0x04E21B9D10F127C1, 0x40DA7C36D44C, &d);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
divisor_mul128(&d, 0xEFE0302A1F7A5341, 0x01FB8CF48A70DF, &d);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
divisor_mul128(&d, 0x7C4254C43A5D1181, 0x01C61212ECE610, &d);
|
||||||
|
}
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
QWORD encoded_lo, encoded_hi;
|
QWORD encoded_lo, encoded_hi;
|
||||||
|
@ -41,6 +41,7 @@ typedef struct {
|
|||||||
} TDivisor;
|
} TDivisor;
|
||||||
|
|
||||||
EXPORT class ConfirmationID {
|
EXPORT class ConfirmationID {
|
||||||
|
static int calculateCheckDigit(int pid);
|
||||||
static QWORD residue_add(QWORD x, QWORD y);
|
static QWORD residue_add(QWORD x, QWORD y);
|
||||||
static QWORD residue_sub(QWORD x, QWORD y);
|
static QWORD residue_sub(QWORD x, QWORD y);
|
||||||
static QWORD __umul128(QWORD a, QWORD b, QWORD* hi);
|
static QWORD __umul128(QWORD a, QWORD b, QWORD* hi);
|
||||||
@ -60,11 +61,12 @@ EXPORT class ConfirmationID {
|
|||||||
static void divisor_mul128(const TDivisor* src, QWORD mult_lo, QWORD mult_hi, TDivisor* dst);
|
static void divisor_mul128(const TDivisor* src, QWORD mult_lo, QWORD mult_hi, TDivisor* dst);
|
||||||
static unsigned rol(unsigned x, int shift);
|
static unsigned rol(unsigned x, int shift);
|
||||||
static void sha1_single_block(unsigned char input[64], unsigned char output[20]);
|
static void sha1_single_block(unsigned char input[64], unsigned char output[20]);
|
||||||
|
static void decode_iid_new_version(unsigned char* iid, unsigned char* hwid, int* version);
|
||||||
static void Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Mix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
static void Unmix(unsigned char* buffer, size_t bufSize, const unsigned char* key, size_t keySize);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int Generate(const char* installation_id_str, char confirmation_id[49]);
|
static int Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid);
|
||||||
//EXPORT static int CLIRun();
|
//EXPORT static int CLIRun();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
#include "pidgen3/BINK2002.h"
|
#include "pidgen3/BINK2002.h"
|
||||||
#include "pidgen2/PIDGEN2.h"
|
#include "pidgen2/PIDGEN2.h"
|
||||||
|
|
||||||
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49]) {
|
FNEXPORT int ConfirmationID_Generate(const char* installation_id_str, char confirmation_id[49], int mode, std::string productid) {
|
||||||
return ConfirmationID::Generate(installation_id_str, confirmation_id);
|
return ConfirmationID::Generate(installation_id_str, confirmation_id, mode, productid);
|
||||||
}
|
}
|
||||||
|
|
||||||
FNEXPORT EC_GROUP* PIDGEN3_initializeEllipticCurve(char* pSel, char* aSel, char* bSel, char* generatorXSel, char* generatorYSel, char* publicKeyXSel, char* publicKeyYSel, EC_POINT *&genPoint, EC_POINT *&pubPoint) {
|
FNEXPORT EC_GROUP* PIDGEN3_initializeEllipticCurve(char* pSel, char* aSel, char* bSel, char* generatorXSel, char* generatorYSel, char* publicKeyXSel, char* publicKeyYSel, EC_POINT *&genPoint, EC_POINT *&pubPoint) {
|
||||||
@ -57,4 +57,4 @@ FNEXPORT int PIDGEN2_GenerateRetail(char* channelID, char* &keyout) {
|
|||||||
|
|
||||||
FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) {
|
FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) {
|
||||||
return PIDGEN2::GenerateOEM(year, day, oem, keyout);
|
return PIDGEN2::GenerateOEM(year, day, oem, keyout);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user