ELC 3
This commit is contained in:
@@ -1,11 +1,218 @@
|
||||
#ifndef EZ_APPLICATION_LICENCE_DISABLE
|
||||
|
||||
#include "licReaderELC3.h"
|
||||
// #define SHOW 1
|
||||
|
||||
namespace Reader
|
||||
{
|
||||
}
|
||||
|
||||
Licence3::Licence3() {}
|
||||
|
||||
Licence3::~Licence3() {}
|
||||
|
||||
Licence3::Licence3(LicenceIdentification &licIdentification) : LicenceELC3(licIdentification)
|
||||
{
|
||||
}
|
||||
|
||||
/// @brief načte seznam licenčních bodů do obecné struktury
|
||||
/// @param licences
|
||||
/// @return
|
||||
bool Licence3::readLicence(LicenceInfoGeneral *licences)
|
||||
{
|
||||
|
||||
//uid load
|
||||
if (getUID() == false) throw LicenceException((int)GeneralError::UIDReadError, "Nepodařilo se načíst UID: " + uid_path);
|
||||
|
||||
string licFileName = getLicenceName();
|
||||
string licFilePath = this->licenceFilePath + licFileName;
|
||||
|
||||
this->licFileName = licFileName;
|
||||
this->licenceFilePath = licFilePath;
|
||||
|
||||
vector<char> content{};
|
||||
if (readFile(licFilePath, content) == false)
|
||||
{
|
||||
throw LicenceException((int)GeneralError::FileOpenError, "Chyba otevření souboru licence: " + licFilePath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef SHOW
|
||||
cout << "Celý vstup zašifrovaný: \n";
|
||||
for (const auto &x : content)
|
||||
cout << (int)x << "-";
|
||||
cout << "\n";
|
||||
#endif
|
||||
|
||||
this->licBody.licId.licIdent[0] = content[0];
|
||||
this->licBody.licId.licIdent[1] = content[1];
|
||||
this->licBody.licId.licIdent[2] = content[2];
|
||||
this->licBody.licId.licIdent[3] = content[3];
|
||||
this->licBody.licId.licIdent[4] = content[4];
|
||||
|
||||
this->licBody.licenceIdentHeader.licenceType = content[5];
|
||||
this->licBody.licenceIdentHeader.licenceTypeVersion = content[6];
|
||||
this->licBody.licenceIdentHeader.licenceIndex = content[7];
|
||||
this->licBody.licenceIdentHeader.compatibilityVersion = content[8];
|
||||
this->licBody.licenceIdentHeader.licItemCount = content[9];
|
||||
this->licBody.licenceIdentHeader.publicHeaderLength = bytesToWord(content[10], content[11]);
|
||||
|
||||
int elcVersion = (int)licBody.licId.licIdent[3] - 48; // verze je text, musí se odečíst 48
|
||||
|
||||
if (elcVersion != (int)this->lIdentification.licElcType)
|
||||
{
|
||||
throw LicenceException((int)GeneralError::ELCMismatch, "Nesouhlasí ELC.");
|
||||
}
|
||||
|
||||
vector<unsigned char> publicPart(content.begin(), content.begin() + 12 + this->licBody.licenceIdentHeader.publicHeaderLength);
|
||||
|
||||
|
||||
#ifdef CRCCHECK
|
||||
cout << "CRC read public size: " << publicPart.size() << "\n";
|
||||
cout << "CRC read public: " << calculateCRC16(publicPart) << "\n";
|
||||
#endif
|
||||
|
||||
#ifdef SHOW
|
||||
cout << "\n public header length: " << licBody.licenceIdentHeader.publicHeaderLength << "\n";
|
||||
#endif
|
||||
|
||||
vector<unsigned char> encryptedPart{};
|
||||
|
||||
for (unsigned int i = licBody.licenceIdentHeader.publicHeaderLength + 12; i<content.size(); i++)
|
||||
{
|
||||
encryptedPart.push_back(content[i]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
vector<unsigned char> privateContentDecrypted{};
|
||||
privateContentDecrypted = decryptPrivateContent(encryptedPart);
|
||||
|
||||
|
||||
|
||||
#ifdef SHOW
|
||||
cout << "private encryptedsize: " << encryptedPart.size() << "\n";
|
||||
cout << "private decryptedsize: " << privateContentDecrypted.size() << "\n";
|
||||
cout << "private decrypted: \n";
|
||||
for (const auto &x : privateContentDecrypted)
|
||||
cout << (int)x << "-";
|
||||
cout << "\n";
|
||||
#endif
|
||||
|
||||
#ifdef CRCCHECK
|
||||
cout << "CRC read private size: " << privateContentDecrypted.size() << "\n";
|
||||
cout << "CRC read private: " << calculateCRC16(privateContentDecrypted) << "\n";
|
||||
#endif
|
||||
|
||||
LicenceBody licBodyDecrypted;
|
||||
licBodyDecrypted.licenceIdentHeader.licenceType = privateContentDecrypted[0];
|
||||
licBodyDecrypted.licenceIdentHeader.licenceTypeVersion = privateContentDecrypted[1];
|
||||
licBodyDecrypted.licenceIdentHeader.licenceIndex = privateContentDecrypted[2];
|
||||
licBodyDecrypted.licenceIdentHeader.compatibilityVersion = privateContentDecrypted[3];
|
||||
licBodyDecrypted.licenceIdentHeader.licItemCount = privateContentDecrypted[4];
|
||||
licBodyDecrypted.licenceIdentHeader.publicHeaderLength = bytesToWord(privateContentDecrypted[5], privateContentDecrypted[6]);
|
||||
|
||||
if (licBodyDecrypted.licenceIdentHeader.licItemCount != this->licBody.licenceIdentHeader.licItemCount)
|
||||
{
|
||||
throw LicenceException((int)GeneralError::ItemsCountMismatch, "Nesouhlasí počet položek licence.");
|
||||
}
|
||||
|
||||
#ifdef SHOW
|
||||
cout << "velikost: " << sizeof(licBodyDecrypted.licenceIdentHeader) << "\n";
|
||||
#endif
|
||||
|
||||
int index = 10;
|
||||
for (int i = 0; i < this->licBody.licenceIdentHeader.licItemCount; i++)
|
||||
{
|
||||
licDataItem item{};
|
||||
item.protoId = bytesToDword(privateContentDecrypted[index], privateContentDecrypted[index + 1], privateContentDecrypted[index + 2], privateContentDecrypted[index + 3]);
|
||||
item.licCount = bytesToDword(privateContentDecrypted[index + 4], privateContentDecrypted[index + 5], privateContentDecrypted[index + 7], privateContentDecrypted[index + 7]);
|
||||
index += sizeof(licDataItem);
|
||||
this->licBody.privateContent.dataItems.push_back(item);
|
||||
this->licenceInfo.licences.insert(pair<DWORD, DWORD>(item.protoId, item.licCount));
|
||||
licences->licences.insert(pair<DWORD, DWORD>(item.protoId, item.licCount));
|
||||
}
|
||||
|
||||
uint16_t crcComplete = bytesToWord(privateContentDecrypted[index], privateContentDecrypted[index + 1]);
|
||||
vector<unsigned char> completeVector = joinVectors(publicPart, privateContentDecrypted);
|
||||
|
||||
uint16_t crcCalculated = calculateCRC16(completeVector, 2);
|
||||
|
||||
#ifdef SHOW
|
||||
// cout << "content: \n";
|
||||
// for (const auto x : content) cout << (int)x << "-";
|
||||
|
||||
cout << "\nvector: \n";
|
||||
for (const auto x : completeVector)
|
||||
cout << (int)x << "-";
|
||||
cout << "\n";
|
||||
cout << "crcComplete: " << crcComplete << "\n";
|
||||
cout << "crcCalculated: " << crcCalculated << "\n";
|
||||
cout << "vectorsize: " << completeVector.size() << "\n";
|
||||
cout << "public vector size: " << publicPart.size() << "\n";
|
||||
cout << "private vector size: " << privateContentDecrypted.size() << "\n";
|
||||
for (const auto &pair : this->licenceInfo.licences)
|
||||
{
|
||||
cout << "--<" << pair.first << ", " << pair.second << ">--" << endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (crcCalculated != crcComplete) throw LicenceException((int)GeneralError::LicenceCRCMismatch, "Nesouhlasí CRC.");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Licence3::getLicenceInfo(void *returnStructure)
|
||||
{
|
||||
if (returnStructure != nullptr)
|
||||
{
|
||||
LicenceELC2Info *resultPtr = static_cast<LicenceELC2Info *>(returnStructure);
|
||||
for (auto item : this->licBody.privateContent.dataItems)
|
||||
{
|
||||
resultPtr->licences.insert(pair<int, int>(item.protoId, item.licCount));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
errorMessage.code = 1;
|
||||
errorMessage.message = "Error: Null pointer!";
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Licence3::getUID()
|
||||
{
|
||||
vector<char> content;
|
||||
if (readFile(this->uid_path + "machine-id", content) == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
this->uid = string(content.begin(), content.end());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
vector<char> content;
|
||||
if (readFile(this->filePath + "cid", content) == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (content.size() >= CID_LENGTH)
|
||||
{
|
||||
for (int i = 0; i < 32; i++)
|
||||
this->cid[i] = content[i];
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user