#include "licGenELC1.h" #define CID_LENGTH 32 #define CSD_LENGTH 32 namespace Generator { Licence1::Licence1() { } Licence1::~Licence1() { } Licence1::Licence1(string cisArg, string csdArg, string dataFileName) { for (unsigned int i = 0; i < cisArg.length(); i++) this->cid[i] = cisArg[i]; for (unsigned int i = 0; i < csdArg.length(); i++) this->csd[i] = csdArg[i]; this->stationName = ""; this->distributor = ""; this->licType = 2; processConfigFile(dataFileName); this->binaryGeneration = BinaryGenerationType::File; } void Licence1::processConfigFile(string &dataFileName) { string fullFile = getCompletePath(dataFileName); const int fileNameLength = fullFile.length(); char fileName[fileNameLength] = {}; getCharsFromString(fullFile, fileName, fileNameLength); pugi::xml_document doc; #ifdef WINDOWS pugi::xml_parse_result result = doc.load_file("licData.xml"); #else pugi::xml_parse_result result = doc.load_file(fileName); #endif if (result) { const char *dataRootName = doc.child("data") ? "data" : "licence"; // kompatibilita s verzí, která měla ještě root "data" this->stationName = doc.child(dataRootName).child("station").child_value(); this->distributor = doc.child(dataRootName).child("distributor").child_value(); this->dataLicenceType = doc.child(dataRootName).child("licenceType").child_value(); this->dataLicenceVersion = doc.child(dataRootName).child("licenceType").attribute("version").value(); this->dataGenerationType = this->dataLicenceVersion; this->dataCryptoVersion = this->dataLicenceVersion; } else { throw LicenceException((int)51, "Chyba při čtení xml"); } } // bool Licence1::createLicenceOld() // { // if (getSDData() == false) throw LicenceException((int)GeneralError::SDCardReadError, "Chyba při čtení SD karty, cesta: " + cid_cdsPath); // initCrypto(); // // promenne pro praci se soubory a adresari // LicenceDataMainELC dataMainToFileELC1{}; //: tEz_LicenceDataMainELC1; hlavicka urcena pro zapis do souboru - typ ELC1 // LicenceData dataToFile{}; // tEz_LicenceData_10_10; // data urcena pro sifrovani a zapis do soubotu - verze => hlavicka: 1.0, data: 1.0 // // pomocne promenne // string licencePostfix; //: STRING; pomocna promenna pro kontrolu postfixu // string mainLicDescription; //: STRING(79); globalni pojmenovani licence v nesifrovane casti licence // USINT generation = 2; //: USINT; verze SW pro licenceřř // PlcData plcData; // plcData.licenceName = "Licence"; // plcData.licenceType = "1"; // plcData.station = stationName; // plcData.distributor = distributor; // LicenceSourceData licSourceData; // if (plcData.licenceType == "EOV" || plcData.licenceType == to_string((int)PlcLicenceType::LicenceEov)) // { // licSourceData.licType = 0x1AA2; // licSourceData.licPostfix = 0; // getCharsFromString(plcData.station, licSourceData.licDescription1); // getCharsFromString(plcData.station, dataToFile.header.licDescription1); // getCharsFromString(plcData.distributor, licSourceData.licDescription2); // getCharsFromString(plcData.distributor, dataToFile.header.licDescription2); // } // LicenceIdent licIdent{}; // licIdent.licPrefixType = licSourceData.licType >> 12; // licIdent.licHeaderType = licSourceData.licType >> 8 & 0x000F; // licIdent.licDataType = licSourceData.licType >> 4 & 0x000F; // licIdent.licSubType = licIdent.licHeaderType << 8 | licIdent.licHeaderType; // licIdent.licIDType = licSourceData.licType & 0x000F; // if (licSourceData.licPostfix > 9) // licSourceData.licPostfix = 0; // licencePostfix = to_string(licSourceData.licPostfix); // string licenseFileName = getLicenceName(0); // licSourceData.licPostfixIdent = right(licencePostfix, 1); // if (licIdent.licHeaderType == cEzLic_p78ou3_HeaderType_10) // { // if (licIdent.licDataType == cEzLic_p78ou3_DataType_10) // { // dataToFile.id.version = 10; // dataToFile.id.cardSize = this->sdData.cardSize; // switch (licIdent.licIDType) // { // case 1://cEzLic_p78ou3_IDType_DDTS: // mainLicDescription = "ddts "; // break; // case 2: //cEzLic_p78ou3_IDType_EOVOSV: // mainLicDescription = "eov, osv "; // break; // default: // mainLicDescription = "neznama app "; // } // mainLicDescription += licSourceData.licPostfixIdent; // mainLicDescription += " => "; // dataToFile.header.licVersion = 10; // dataToFile.header.licType = licIdent.licIDType; // dataToFile.header.licDate = getLicDate(); // 1692230400; //getLicDate(); //1692144000;// getLicDate(); // mainLicDescription += dataToFile.header.licDescription1; // mainLicDescription += " ["; // mainLicDescription += dataToFile.header.licDescription2; // mainLicDescription += "]"; // if (licIdent.licIDType == cEzLic_p78ou3_IDType_EOVOSV) // { // if (generation == 1) // stará verze // { // dataToFile.header.licCount = 1; // dataToFile.items[0].licCount = 65535; // dataToFile.items[0].protoId = cEzLic_p78ou3_CheckLicNumberId_EOV1; // dataToFile.items[0].data1 = cEzLic_p78ou3_CheckLicNumber_EOV1; // } // else // { // dataToFile.header.licCount = 1; // dataToFile.items[1].licCount = 65535; // 65535; // dataToFile.items[1].protoId = cEzLic_p78ou3_CheckLicNumberId_EOV1; // dataToFile.items[1].data1 = cEzLic_p78ou3_CheckLicNumber_EOV1; // } // } // unsigned char encrypted[10000] = {}; // const int s = sizeof(dataToFile); // unsigned char byteArray[s] = {}; // memcpy(byteArray, &dataToFile, sizeof(dataToFile)); // dataToFile.crc = calculateCRC16(byteArray, s - sizeof(dataToFile.crc)); // 47535 | 884:38382 // memcpy(byteArray, &dataToFile, sizeof(dataToFile)); // int finalEncryptedLength = encrypt(byteArray, sizeof(dataToFile), this->cryptData.aesKey, this->cryptData.aesInitVector, encrypted); // if (licIdent.licPrefixType == cEzLic_p78ou3_LicPrefixType_ELC1) // typ1 = pouze zasifrovani dat // { // dataMainToFileELC1.prefix = 0x31434C45; // getCharsFromString(mainLicDescription, dataMainToFileELC1.licHeader.description); // dataMainToFileELC1.licHeader.sizeData = finalEncryptedLength; // sizeof(dataToFile); // 884; // dataMainToFileELC1.licHeader.licType = licIdent.licIDType; // dataMainToFileELC1.licHeader.licSubType = licIdent.licHeaderType << 8 | licIdent.licDataType; // } // const int dataMainLength = sizeof(dataMainToFileELC1); // const int dataToFileLength = sizeof(dataToFile); // const int totalEncryptedLength = dataMainLength + finalEncryptedLength; // unsigned char bdataMainToFileELC1[dataMainLength] = {}; // memcpy(bdataMainToFileELC1, &dataMainToFileELC1, dataMainLength); // unsigned char bdataToFile[dataToFileLength] = {}; // memcpy(bdataToFile, &dataToFile, dataToFileLength); // unsigned char totalEncryptedArray[totalEncryptedLength] = {}; // for (int i = 0; i < dataMainLength; i++) // totalEncryptedArray[i] = bdataMainToFileELC1[i]; // for (int i = 0; i < finalEncryptedLength; i++) // totalEncryptedArray[i + dataMainLength] = encrypted[i]; // string fullFile = getCompletePath(licenseFileName); // if (binaryGeneration == BinaryGenerationType::File) // { // #ifdef WINDOWS // char licFileNameToSave[licenseFileName.length()] = {}; // getCharsFromString(licenseFileName, licFileNameToSave, licenseFileName.length()); // FILE *fileLicence = fopen(licFileNameToSave, "wb"); // if (fileLicence) // { // fwrite(&totalEncryptedArray, sizeof(totalEncryptedArray), 1, fileLicence); // // printf("License binary saved.\n"); // fclose(fileLicence); // cout << licenseFileName << endl; // return true; // } // #else // std::ofstream outputFile(fullFile); // if (outputFile.is_open()) // { // outputFile.write(reinterpret_cast(totalEncryptedArray), totalEncryptedLength); // outputFile.close(); // std::cout << licenseFileName; // } // else // { // std::cerr << "Unable to open licence file." << std::endl; // } // return true; // #endif // } // else // { // int totalFileSize = sizeof(totalEncryptedArray); // // cout << "data:text/plain;base64,"; // cout << "data:application/octet-stream;base64,"; // char encryptedChars[totalFileSize]; // for (int i = 0; i < totalFileSize; i++) // encryptedChars[i] = static_cast(totalEncryptedArray[i]); // string strToBase = convertToString(encryptedChars, totalFileSize); // string base64Coded = base64_encode_ai(strToBase); // cout << base64Coded << endl; // return true; // } // } // } // return false; // } bool Licence1::createLicence() { if (getSDData() == false) throw LicenceException((int)GeneralError::SDCardReadError, "Chyba při čtení SD karty, cesta: " + cid_cdsPath); initCrypto(); // promenne pro praci se soubory a adresari LicenceDataMainELC dataMainToFileELC1{}; LicenceData dataToFile{}; // pomocne promenne string licencePostfix; //: STRING; pomocna promenna pro kontrolu postfixu string mainLicDescription; //: STRING(79); globalni pojmenovani licence v nesifrovane casti licence USINT generation = 2; //: USINT; verze SW pro licenceřř PlcData plcData; plcData.licenceName = "Licence"; plcData.licenceType = "1"; plcData.station = stationName; plcData.distributor = distributor; LicenceSourceData licSourceData; if (plcData.licenceType == "EOV" || plcData.licenceType == to_string((int)PlcLicenceType::LicenceEov)) { licSourceData.licType = 0x1AA2; licSourceData.licPostfix = 0; getCharsFromString(plcData.station, licSourceData.licDescription1); getCharsFromString(plcData.station, dataToFile.header.licDescription1); getCharsFromString(plcData.distributor, licSourceData.licDescription2); getCharsFromString(plcData.distributor, dataToFile.header.licDescription2); } LicenceIdent licIdent{}; licIdent.licPrefixType = licSourceData.licType >> 12; licIdent.licHeaderType = licSourceData.licType >> 8 & 0x000F; licIdent.licDataType = licSourceData.licType >> 4 & 0x000F; licIdent.licSubType = licIdent.licHeaderType << 8 | licIdent.licHeaderType; licIdent.licIDType = licSourceData.licType & 0x000F; licencePostfix = to_string(licSourceData.licPostfix); string licenseFileName = getLicenceName(0); licSourceData.licPostfixIdent = right(licencePostfix, 1); dataToFile.id.version = 10; dataToFile.id.cardSize = this->sdData.cardSize; switch (licIdent.licIDType) { case 1: // cEzLic_p78ou3_IDType_DDTS: mainLicDescription = "ddts "; break; case 2: // cEzLic_p78ou3_IDType_EOVOSV: mainLicDescription = "eov, osv "; break; default: mainLicDescription = "neznama app "; } mainLicDescription += licSourceData.licPostfixIdent; mainLicDescription += " => "; dataToFile.header.licVersion = 10; dataToFile.header.licType = licIdent.licIDType; dataToFile.header.licDate = getLicDate(); // 1692230400; //getLicDate(); //1692144000;// getLicDate(); mainLicDescription += dataToFile.header.licDescription1; mainLicDescription += " ["; mainLicDescription += dataToFile.header.licDescription2; mainLicDescription += "]"; if (licIdent.licIDType == cEzLic_p78ou3_IDType_EOVOSV) { if (generation == 1) // stará verze { dataToFile.header.licCount = 1; dataToFile.items[0].licCount = 65535; dataToFile.items[0].protoId = cEzLic_p78ou3_CheckLicNumberId_EOV1; dataToFile.items[0].data1 = cEzLic_p78ou3_CheckLicNumber_EOV1; } else { dataToFile.header.licCount = 1; dataToFile.items[1].licCount = 65535; // 65535; dataToFile.items[1].protoId = cEzLic_p78ou3_CheckLicNumberId_EOV1; dataToFile.items[1].data1 = cEzLic_p78ou3_CheckLicNumber_EOV1; } } unsigned char encrypted[10000] = {}; const int s = sizeof(dataToFile); unsigned char byteArray[s] = {}; memcpy(byteArray, &dataToFile, sizeof(dataToFile)); dataToFile.crc = calculateCRC16(byteArray, s - sizeof(dataToFile.crc)); // 47535 | 884:38382 memcpy(byteArray, &dataToFile, sizeof(dataToFile)); int finalEncryptedLength = encrypt(byteArray, sizeof(dataToFile), this->cryptData.aesKey, this->cryptData.aesInitVector, encrypted); if (licIdent.licPrefixType == cEzLic_p78ou3_LicPrefixType_ELC1) // typ1 = pouze zasifrovani dat { dataMainToFileELC1.prefix = 0x31434C45; getCharsFromString(mainLicDescription, dataMainToFileELC1.licHeader.description); dataMainToFileELC1.licHeader.sizeData = finalEncryptedLength; // sizeof(dataToFile); // 884; dataMainToFileELC1.licHeader.licType = licIdent.licIDType; dataMainToFileELC1.licHeader.licSubType = licIdent.licHeaderType << 8 | licIdent.licDataType; } const int dataMainLength = sizeof(dataMainToFileELC1); const int dataToFileLength = sizeof(dataToFile); const int totalEncryptedLength = dataMainLength + finalEncryptedLength; unsigned char bdataMainToFileELC1[dataMainLength] = {}; memcpy(bdataMainToFileELC1, &dataMainToFileELC1, dataMainLength); unsigned char bdataToFile[dataToFileLength] = {}; memcpy(bdataToFile, &dataToFile, dataToFileLength); unsigned char totalEncryptedArray[totalEncryptedLength] = {}; for (int i = 0; i < dataMainLength; i++) totalEncryptedArray[i] = bdataMainToFileELC1[i]; for (int i = 0; i < finalEncryptedLength; i++) totalEncryptedArray[i + dataMainLength] = encrypted[i]; string fullFile = getCompletePath(licenseFileName); if (binaryGeneration == BinaryGenerationType::File) { #ifdef WINDOWS char licFileNameToSave[licenseFileName.length()] = {}; getCharsFromString(licenseFileName, licFileNameToSave, licenseFileName.length()); FILE *fileLicence = fopen(licFileNameToSave, "wb"); if (fileLicence) { fwrite(&totalEncryptedArray, sizeof(totalEncryptedArray), 1, fileLicence); // printf("License binary saved.\n"); fclose(fileLicence); cout << licenseFileName << endl; return true; } #else std::ofstream outputFile(fullFile); if (outputFile.is_open()) { outputFile.write(reinterpret_cast(totalEncryptedArray), totalEncryptedLength); outputFile.close(); std::cout << licenseFileName; } else { std::cerr << "Unable to open licence file." << std::endl; } return true; #endif } else { int totalFileSize = sizeof(totalEncryptedArray); // cout << "data:text/plain;base64,"; cout << "data:application/octet-stream;base64,"; char encryptedChars[totalFileSize]; for (int i = 0; i < totalFileSize; i++) encryptedChars[i] = static_cast(totalEncryptedArray[i]); string strToBase = convertToString(encryptedChars, totalFileSize); string base64Coded = base64_encode_ai(strToBase); cout << base64Coded << endl; return true; } return false; } }