mistserver/lib/encryption.cpp
2015-04-05 21:38:36 +02:00

62 lines
2 KiB
C++

#include "encryption.h"
#include "auth.h"
//#include <openssl/aes.h>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <cstdio>
namespace Encryption {
std::string AES_Crypt(const std::string & data, const std::string & key, std::string & ivec) {
unsigned char * outData = (unsigned char *)malloc(data.size() * sizeof(char));
//unsigned int stateNum = 0;
unsigned char stateEcount[16];
unsigned char stateIvec[16];
memset(stateEcount, 0, 16);
memcpy(stateIvec, ivec.c_str(), 8);
memset(stateIvec + 8, 0, 8);
/// \todo Implement this ^_^
//AES_KEY cryptKey;
//if (AES_set_encrypt_key((unsigned char *)key.c_str(), 128, &cryptKey)) {
// abort();
//}
/// \todo loop per 128 bytes....
//AES_ctr128_encrypt((unsigned char *)data.c_str(), outData, data.size(), &cryptKey, stateIvec, stateEcount, &stateNum);
std::string result = std::string((char *)outData, data.size());
free(outData);
return result;
}
std::string PR_GenerateContentKey(std::string & keyseed, std::string & keyid) {
char contentKey[16];
char dataBlob[92];
char keyA[32], keyB[32], keyC[32];
std::string keyidBytes = PR_GuidToByteArray(keyid);
memcpy(dataBlob, keyseed.c_str(), 30);
memcpy(dataBlob+30, keyidBytes.data(), 16);
memcpy(dataBlob+46, keyseed.c_str(), 30);
memcpy(dataBlob+76, keyidBytes.data(), 16);
Secure::sha256bin(dataBlob, 46, keyA);
Secure::sha256bin(dataBlob, 76, keyB);
Secure::sha256bin(dataBlob, 92, keyC);
for (int i = 0; i < 16; i++) {
contentKey[i] = keyA[i] ^ keyA[i + 16] ^ keyB[i] ^ keyB[i + 16] ^ keyC[i] ^ keyC[i + 16];
}
return std::string(contentKey, 16);
}
std::string PR_GuidToByteArray(std::string & guid) {
std::string result;
result = guid[3];
result += guid[2];
result += guid[1];
result += guid[0];
result += guid[5];
result += guid[4];
result += guid[7];
result += guid[6];
result += guid.substr(8);
return result;
}
}