Last active
September 16, 2018 15:12
-
-
Save ncatlin/69b55026f2edd78c81728164271e823a to your computer and use it in GitHub Desktop.
poe loginserver crypt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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