mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2024-11-18 03:41:00 +02:00
83 lines
2.0 KiB
C++
83 lines
2.0 KiB
C++
//
|
|
// Created by Andrew on 01/06/2023.
|
|
//
|
|
|
|
#include "header.h"
|
|
|
|
char charset[] = "BCDFGHJKMPQRTVWXY2346789";
|
|
|
|
int main()
|
|
{
|
|
initBink();
|
|
|
|
rand();
|
|
srand(time(nullptr));
|
|
rand();
|
|
|
|
// Init
|
|
BIGNUM *a, *b, *p, *gx, *gy, *pubx, *puby, *n, *priv;
|
|
BN_CTX *ctx = BN_CTX_new();
|
|
|
|
// make BigNumbers
|
|
a = BN_new();
|
|
b = BN_new();
|
|
p = BN_new();
|
|
gx = BN_new();
|
|
gy = BN_new();
|
|
pubx = BN_new();
|
|
puby = BN_new();
|
|
n = BN_new();
|
|
priv = BN_new();
|
|
|
|
char* BINKID = "2E";
|
|
|
|
// Data from pidgen-Bink-resources
|
|
/* Elliptic curve parameters: y^2 = x^3 + ax + b mod p */
|
|
BN_dec2bn(&p, std::get<0>(BINKData[BINKID].E).c_str());
|
|
BN_dec2bn(&a, std::get<1>(BINKData[BINKID].E).c_str());
|
|
BN_dec2bn(&b, std::get<2>(BINKData[BINKID].E).c_str());
|
|
|
|
|
|
/* base point (generator) G */
|
|
BN_dec2bn(&gx, std::get<0>(BINKData[BINKID].G).c_str());
|
|
BN_dec2bn(&gy, std::get<1>(BINKData[BINKID].G).c_str());
|
|
|
|
/* inverse of public key */
|
|
BN_dec2bn(&pubx, std::get<0>(BINKData[BINKID].K).c_str());
|
|
BN_dec2bn(&puby, std::get<1>(BINKData[BINKID].K).c_str());
|
|
|
|
// Computed data
|
|
/* order of G - computed in 18 hours using a P3-450 */
|
|
BN_dec2bn(&n, BINKData[BINKID].n.c_str());
|
|
|
|
/* THE private key - computed in 10 hours using a P3-450 */
|
|
BN_dec2bn(&priv, BINKData[BINKID].k.c_str());
|
|
|
|
// Calculation
|
|
EC_GROUP *ec = EC_GROUP_new_curve_GFp(p, a, b, ctx);
|
|
EC_POINT *g = EC_POINT_new(ec);
|
|
EC_POINT_set_affine_coordinates_GFp(ec, g, gx, gy, ctx);
|
|
EC_POINT *pub = EC_POINT_new(ec);
|
|
EC_POINT_set_affine_coordinates_GFp(ec, pub, pubx, puby, ctx);
|
|
|
|
char pkey[26];
|
|
ul32 pid[1];
|
|
pid[0] = 640 * 1000000 ; /* <- change */
|
|
pid[0] += rand() & 999999;
|
|
|
|
printf("> PID: %lu\n", pid[0]);
|
|
|
|
// generate a key
|
|
BN_sub(priv, n, priv);
|
|
generateXPKey(pkey, ec, g, n, priv, pid);
|
|
print_product_key(pkey);
|
|
printf("\n\n");
|
|
|
|
// verify the key
|
|
verifyXPKey(ec, g, pub, (char*)pkey);
|
|
|
|
// Cleanup
|
|
BN_CTX_free(ctx);
|
|
|
|
return 0;
|
|
} |