Skip to content

Instantly share code, notes, and snippets.

@ncatlin
Last active September 16, 2018 15:12
Show Gist options
  • Save ncatlin/69b55026f2edd78c81728164271e823a to your computer and use it in GitHub Desktop.
Save ncatlin/69b55026f2edd78c81728164271e823a to your computer and use it in GitHub Desktop.
poe loginserver crypt
#define PUBLIC_KEYSIZE 128
#define DH2_AGREED_KEY_SIZE 512
byte customStaticServerPrivKey[384] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0d,0x18,0xd5,0x18,0x84,0xa1,0x5f,0x14,0x9d,0x3b,0xa7,0x17,0x69,0x5e,0x27,0x89,0x6d,0xa0,0x82,0x6c,0x57,0x31,
0x40,0xb4,0x39,0xfa,0x37,0x5c,0x1d,0x8c,0xe7,0xaf,0xbb };
//0x140f37700-0x140f37860
byte customStaticServerPubKey[384] = {
0x97,0xe1,0xf9,0x83,0xa3,0xf7,0xf5,0xde,0xcd,0xed,0x01,0x85,0xe9,0xe3,0x61,0x95,0xdc,0x8a,0xc3,0x61,0x51,0x88,0x48,0xef,0xbc,0x70,0xac,0xba,0xcc,0x1b,0xbb,
0x8f,0xc9,0xfd,0x67,0x3a,0x14,0x69,0x3a,0x7f,0x36,0x9f,0xf2,0x6f,0x1c,0x7e,0x8e,0x2b,0x3d,0x80,0x96,0x26,0x64,0x68,0x2e,0x31,0xec,0x43, 0x39,0x94,0x76,0x9c,
0x87,0xb4,0x34,0x97,0x4a,0x1f,0x90,0xf3,0x2d,0x21,0xda,0x53,0x97,0x7b,0x16,0x3e,0xf5,0x3b,0x9a,0x1c,0x4d,0x9c,0x36, 0xee,0x17,0x85,0xa8,0x20,0xd5,0x9c,0x16,
0x1d,0xd4,0x96,0x12,0x2a,0x11,0xbb,0x0c,0xf3,0x19,0x8f,0xa3,0x97,0xa8,0x47,0x58,0xfe,0xf6,0xfd, 0xe7,0xe3,0x7d,0xee,0x41,0xf8,0x56,0xb6,0xdc,0xf0,0x8e,0x4d,
0x24,0xc8,0x5f,0xd5,0x02,0xcd,0xb0,0x7a,0x72,0x41,0x35,0x80,0x4e,0x37,0x06,0x2a,0xd4,0xa7,0x76,0x64,0x2b,0x05,0xa0,0x70,0x16,0x6e,0x32,0x38,0x67,0xe8,0x1a,0xd4,
0x5e,0xcf,0xac,0x04,0xc4,0xcd,0x5b,0x11,0x31,0x82,0x34,0xd4,0xef,0xa1,0x5c,0xa3,0x43,0x29,0x3c,0xa9,0x34,0xc0,0xb4,0x95,0xf0,0xfa,0x3f,0x05,0x26,0xf2,0x14,0xff,0x7a,0x6c,0xce,0xcc,0x8c,
0xd8,0xa3,0x8d,0x58,0x62,0xa7,0xd5,0xfc,0x5c,0xd1,0x82,0xca,0x28,0x3e,0x69,0xfc,0xb0,0x0f,0x68,0xc6,0x4d,0xcc,0xdf,0x02,0x77,0x8f,0xc7,
0x4f,0x08,0x9f,0x9a,0x16,0x27,0x8e,0x1c,0x79,0x49,0xdb,0x81,0x4d,0x6b,0x51,0xf3,0x73,0x44,0x1e,0xcb,0xc9,0x2c,0xe5,0x8f,0x3e,0x2f,0xbb,
0xfa,0x58,0xff,0x3c,0x17,0xa3,0xcf,0x00,0x98,0x83,0x8f,0x22,0x0d,0x82,0xeb,0x48,0xf6,0xe8,0x56,0xfb,0x7a,0xe0,0x4b,0xb6,0x28,0x09,0x17,0x95,
0x02,0xaa,0x0c,0x79,0xf5,0x19,0xd3,0x36,0xc7,0x8b,0x4e,0xbd,0x4c,0x2b,0xb2,0x1f,0x3c,0xb2,0x8c,0xf2,0xb6,0x0a,0x48,0xaa,0xfb,0xc1,
0x5c,0xb7,0x17,0x92,0xf8,0x75,0xe2,0xe7,0xc2,0x1f,0x7c,0x4c,0x27,0xb5,0x89,0x12,0xee,0xc3,0x22,0xe3,0x23,0xbd,0x64,0x2b,0x2a,0x3a,0x2b,
0xf5,0x0d,0x8a,0xa7,0xc1,0x11,0x88,0x31,0x64,0x27,0xfe,0x48,0xf7,0x45,0xb2,0xde,0x5c,0x71,0x5b,0x24,0x1e,0x7c,0xa0,0xc7,0x9b,0x0e,0x19,0xaf,0x30,0x24,0x5d,
0x60,0xca,0x23,0x92,0x3a,0x30,0x57,0x99,0x1b,0x75,0x1e,0xf4,0x3a,0x6d,0xc1,0xe4,0xf1,0x15,0x69,0xd8,0xf3,0x43,0xc0,0xf3,0x65
};
void loginServer::init_crypt()
{
p1 = new CryptoPP::Integer("0xcd8fd4b7415dee60366c437dc8b43cfb01e35540cdd79b22f60b6c6ad4c77571efc441a88c33e8bacaa6bcca3e5099d58a8415b35217a5119b4eb3893f1472b9ed168230c3ca982f32202658f88959881c1bdd98423af79caca5d517544f09214e4ff3d2e6108fa21776749af68282771799575269507bc69b20b66eb74d075e57a5b96c13180262b2a96ea3c42e128bcc064f5b4e7a451f12f074bd2e64d433ab380494ed53d1c45db97cc4b3da288bf3533499a5f607b55175cc1d7ef917459e8f77658638d918e23753cf29429b846dcd410e541a855ebb4d04d065627b0025bb37a2a75733c65bf9d0a9e4aeabcb07eea223e6aa9c084b86e1c100c83af11bdba33ac34e80afaee202ff8511f4451b48e91490d773816eff332e8db21bbe3e8bf30d0b4408bbe32b5db2695b413e1f87101ebc547446f01ec77105de81db454ad676e3401add8471a432da342518e0497df6db7e59cb09bf3accb685617695d07cff6a875de4bec17368509d02ade555a92dd4abdaf6c44300536cadddab");
q1 = new CryptoPP::Integer("0x66c7ea5ba0aef7301b3621bee45a1e7d80f1aaa066ebcd917b05b6356a63bab8f7e220d44619f45d65535e651f284ceac5420ad9a90bd288cda759c49f8a395cf68b411861e54c179910132c7c44acc40e0deecc211d7bce5652ea8baa278490a727f9e9730847d10bbb3a4d7b41413b8bccaba934a83de34d905b375ba683af2bd2dcb6098c01315954b751e2170945e60327ada73d228f89783a5e97326a19d59c024a76a9e8e22edcbe6259ed1445f9a99a4cd2fb03daa8bae60ebf7c8ba2cf47bbb2c31c6c8c711ba9e794a14dc236e6a0872a0d42af5da6826832b13d8012dd9bd153ab99e32dfce854f25755e583f75111f3554e0425c370e080641d788dedd19d61a74057d771017fc288fa228da4748a486bb9c0b77f999746d90ddf1f45f98685a2045df195aed934ada09f0fc3880f5e2a3a23780f63b882ef40eda2a56b3b71a00d6ec238d2196d1a128c7024befb6dbf2ce584df9d665b42b0bb4ae83e7fb543aef25f60b9b4284e8156f2aad496ea55ed7b62218029b656eed5");
g1 = new CryptoPP::Integer("0x3");
p2 = new CryptoPP::Integer("0xc5d1fff6e1e0b5b5a4220a369a4f504d59c7482724053c0d4b05426328031633bc79249c1c58c91b32e6802f20a1e7626859da201e7faad8406c702796cbdf3208a6cccb77baa29bec763a9a1fb868d79182f00957e890d762806b443e7fd2f75ef2eed5f56e92e5939ec15533a642b2212504b62ba72ca8e6c7fe28bbc8f687");
q2 = new CryptoPP::Integer("0x62e8fffb70f05adad211051b4d27a826ace3a41392029e06a582a13194018b19de3c924e0e2c648d997340179050f3b1342ced100f3fd56c20363813cb65ef9904536665bbdd514df63b1d4d0fdc346bc8c17804abf4486bb14035a21f3fe97baf79776afab74972c9cf60aa99d321591092825b15d396547363ff145de47b43");
g2 = new CryptoPP::Integer("0x2");
//static
dh1.AccessGroupParameters().Initialize(*p1, *q1, *g1);
serverPrivStatic = CryptoPP::SecByteBlock(dh1.PrivateKeyLength());
serverPrivStatic.Assign((const byte *)customStaticServerPrivKey, dh1.PublicKeyLength());
serverPubStatic = CryptoPP::SecByteBlock(dh1.PublicKeyLength()); //implanted in client
serverPubStatic.Assign((const byte *)customStaticServerPubKey, dh1.PublicKeyLength());
//ephemeral
dh2.AccessGroupParameters().Initialize(*p2, *q2, *g2);
serverPrivEphermal = CryptoPP::SecByteBlock(dh2.PrivateKeyLength());
serverPubEphermal = CryptoPP::SecByteBlock(dh2.PublicKeyLength());
dh2.GenerateKeyPair(arngA, serverPrivEphermal, serverPubEphermal);
}
bool loginServer::agree_keys()
{
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int recvdsize = recv(ClientSocket, buffer, sizeof(buffer) - 1, 0);
CryptoPP::SecByteBlock clientPubEphermal = CryptoPP::SecByteBlock(dh2.PublicKeyLength());
clientPubEphermal.Assign((byte *)(buffer + 4), 128);
memset(buffer, 'K', sizeof(buffer));
buffer[0] = 0;
buffer[1] = 2;
buffer[2] = 0;
buffer[3] = 0x80;
int ephkeySize = serverPubEphermal.size();
memcpy(buffer + 4, serverPubEphermal.data(), serverPubEphermal.size());
int index = serverPubEphermal.size() + 4;
buffer[index++] = 0;
buffer[index++] = 0x38; //length
memset(buffer + index, 'S', 0x38);
int sentamt = send(ClientSocket, buffer, 190, NULL);
std::cout << "Sent (PKT:0x2)" << sentamt << " bytes to client (our eph pubkey)" << std::endl;
//i have implanted our private key in the client as its private key
byte *clientPubStatic = serverPubStatic;
byte agreedVal[DH2_AGREED_KEY_SIZE];
memset(agreedVal, 0, DH2_AGREED_KEY_SIZE);
dhA = new CryptoPP::DH2(dh1, dh2);
bool result = dhA->Agree(agreedVal, //rdx/rbx
serverPrivStatic, serverPrivEphermal,
clientPubStatic, clientPubEphermal.data(), //rsi
1);
if (!result)
{
std::cout << "Failed to agree key" << std::endl;
std::cout << dh1.PublicKeyLength() << " byte static pubkey:" << std::endl;
for (size_t i = 0; i < dh1.PublicKeyLength(); ++i)
std::cout << std::setfill('0') << std::hex << std::setw(2) << (int)serverPubStatic[i];
std::cout << std::endl;
std::cout << dh1.PrivateKeyLength() << " byte server static privkey:" << std::endl;
for (size_t i = 0; i < dh1.PrivateKeyLength(); ++i)
std::cout << std::setfill('0') << std::hex << std::setw(2) << (int)serverPrivStatic[i];
std::cout << std::endl;
std::cout << std::endl;
std::cout << dh2.PublicKeyLength() << " byte server ephermal pubkey:" << std::endl;
for (size_t i = 0; i < dh2.PublicKeyLength(); ++i)
std::cout << std::setfill('0') << std::hex << std::setw(2) << (int)serverPubEphermal[i];
std::cout << std::endl;
std::cout << dh2.PrivateKeyLength() << " byte server ephermal privkey:" << std::endl;
for (size_t i = 0; i < dh2.PrivateKeyLength(); ++i)
std::cout << std::setfill('0') << std::hex << std::setw(2) << (int)serverPrivEphermal[i];
std::cout << std::endl;
std::cout << std::endl;
//bool test1 = dh1.Agree(agreedVal, clientPrivStatic, serverPubStatic, 1);
//bool test2 = dh1.Agree(agreedVal, clientPrivEphermal, serverPubStatic, 1);
bool test3 = dh1.Agree(agreedVal, serverPrivStatic, clientPubEphermal.data(), 1);
bool test4 = dh1.Agree(agreedVal, serverPrivEphermal, clientPubEphermal.data(), 1);
std::cout << "Static domain test results: " //<< test1 << ", " << test2
<< ", " << test3 << ", " << test4 << std::endl;
//bool test5 = dh2.Agree(agreedVal, serverPrivStatic, serverPubStatic, 1);
//bool test6 = dh2.Agree(agreedVal, serverPrivEphermal, serverPubStatic, 1);
bool test7 = dh2.Agree(agreedVal, serverPrivStatic, clientPubEphermal.data(), 1);
bool test8 = dh2.Agree(agreedVal, serverPrivEphermal, clientPubEphermal.data(), 1);
std::cout << "Ephermal domain test results: " //<< test5 << ", " << test6
<< ", " << test7 << ", " << test8 << std::endl;
return false;
}
else
{
byte digestResult[64];
CryptoPP::SHA512 hashobj;
hashobj.CalculateTruncatedDigest(digestResult, 0x40, agreedVal, 0x200);
//std::cout << "Truncated sha512 hash0 is: " << std::endl;
//printHex((char *)digestResult, 0x40);
//std::cout << std::endl;
byte IV1[SALSA_IV_SIZE];
byte IV2[SALSA_IV_SIZE];
memcpy(salsaKey, digestResult, SALSA_KEY_SIZE);
memcpy(IV1, digestResult + SALSA_KEY_SIZE, 8);
salsaObjRecv.SetKeyWithIV(digestResult, SALSA_KEY_SIZE, IV1);
memcpy(IV2, digestResult + SALSA_KEY_SIZE + 16, 8);
salsaObjSend.SetKeyWithIV(digestResult, SALSA_KEY_SIZE, IV2);
std::cout << "Sucessfully agreed shared secret with client. Key:" << std::endl;
printHex((char *)digestResult, SALSA_KEY_SIZE);
std::cout << "IV1:" << std::endl;
printHex((char *)IV1, SALSA_IV_SIZE);
std::cout << "IV2:" << std::endl;
printHex((char *)IV2, SALSA_IV_SIZE);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment