From b2260178f6c4b23a065ab1e5bc7f6947d85bdcd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C5=A0alda?= Date: Fri, 18 Aug 2023 12:21:27 +0200 Subject: [PATCH] =?UTF-8?q?generov=C3=A1n=C3=AD=20s=20cestou?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/utils.h | 4 + src/CreateLicence.cpp | 92 +-------------- src/PlcLicence.cpp | 260 +++++++----------------------------------- src/utils.cpp | 54 +++++---- 4 files changed, 79 insertions(+), 331 deletions(-) diff --git a/include/utils.h b/include/utils.h index 239b49b..c20be33 100644 --- a/include/utils.h +++ b/include/utils.h @@ -3,7 +3,9 @@ #include #include #include +#include +#define LINUX 1 #define PEM_BUFSIZE_TEXT 1024 #define BitVal(data, y) ((data >> y) & 1) /** Return Data.Y value **/ @@ -66,6 +68,8 @@ map mapArguments(int argc, char *argv[]); char* getCharArray(string source); void getCharsFromString1(string source, char *charArray); void getCharsFromString(string& source, char *charArray, int length); +string getCompletePath(string fileName); + diff --git a/src/CreateLicence.cpp b/src/CreateLicence.cpp index 6eef2d9..11e7b93 100644 --- a/src/CreateLicence.cpp +++ b/src/CreateLicence.cpp @@ -1,22 +1,12 @@ #include -#include -#include #include "plcLicence.h" #include "utils.h" -#include +#include + #define FILEBUFFER 300 #define TWO_HOURSE_SECONDS 7200 -void signalHandler(int signum) -{ - if (signum == SIGSEGV) - { - std::cerr << "Caught segmentation fault (SIGSEGV)" << std::endl; - // You can perform some recovery actions here if needed - } -} - /// @brief hlavní funkce /// @param argc /// @param argv parametry pro generování licence @@ -25,86 +15,8 @@ void signalHandler(int signum) int main(int argc, char *argv[]) { - std::signal(SIGSEGV, signalHandler); - - // a segmentation fault - // int* ptr = nullptr; - //*ptr = 42; // This will trigger a segmentation fault - - // map arguments = mapArguments(argc, argv); map argumentsString = getArguments(argc, argv); - // std::cout << "Number of arguments: " << argc << std::endl; - // if (argc > 1) - // { - // for (int i = 1; i < argc; ++i) - // { - // arguments.insert(make_pair(to_string(i), argv[i])); - // } - // } - // else - // cerr << "Invalid arguments count"; - - // for (auto it = argumentsString.begin(); it != argumentsString.end(); ++it) - // { - // std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl; - // std::cout << it->second.length() << std::endl; - // } - - // generatePause(); - // return 1; - - // for (int i = 0; i < argc; ++i) - // { - // std::cout << "Argument " << i << ": " << argv[i] << std::endl; - // cout << "size: " << strlen(argv[i]); - // } - - // generatePause(); - // return 1; - - // if (argc >= 5) - // { - // cid = argv[1]; - // csd = argv[2]; - // stationName = argv[3]; - // switchName = argv[4]; - // licenceType = argv[5]; - // } - // else - // { - // cout << "Par count error" << endl; - // } - - // if (argc <= 1) - // { - // cid = "9f544930303030300000000b47015423"; - // csd = "400e00325b5900003a0d7f800a40008d"; - // stationName = "ceskatrebova"; - // switchName = "RO1"; - // licenceType = "2"; - // binaryType = "2"; - // } - // else - // { - // cid = argv[1]; - // csd = argv[2]; - // } - - // cid = "9f544930303030300000000b47015423"; - // csd = "400e00325b5900003a0d7f800a40008d"; - // stationName = "ceskatrebova"; - // switchName = "RO1"; - // licenceType = "2"; - // binaryType = "2"; - - // cout << "binaryType: " << binaryType; - // cout << "CID:" << argumentsString["-cid"]; - - // cout << "final-cids: " << argumentsString["-cid"].length() << endl; - // cout << "final-cds: " << argumentsString["-csd"].length() << endl; - // cout << "-----------------------------------\n"; - const int csdLength = argumentsString["-csd"].length(); char csdArg[32] = {}; getCharsFromString(argumentsString["-csd"], csdArg, csdLength); diff --git a/src/PlcLicence.cpp b/src/PlcLicence.cpp index a5e4d74..a60aef7 100644 --- a/src/PlcLicence.cpp +++ b/src/PlcLicence.cpp @@ -1,12 +1,12 @@ #include #include +#include #include "plcLicence.h" #include "utils.h" #define CID_LENGTH 32 #define CSD_LENGTH 32 - const std::string cEzLic_p78ou3_sdinfofilepath = "/sys/block/mmcblk0/device/"; const std::string cEzLic_p78ou3_licencfilepath_f21 = "/mnt/mmc/ez_sys/licence/"; const std::string cEzLic_p78ou3_licencfilepath_f17 = "/home/admin/ez/licence/"; @@ -50,23 +50,26 @@ BYTE cHexNibble_to_No[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; std::string cEzLic_p78ou3_CipherAES = "aes-256-cbc"; // konfigurace kriptovaciho algoritmu - - PlcLicence::PlcLicence() { } -/// @brief process config file -/// @param dataFileName +/// @brief process config file +/// @param dataFileName void PlcLicence::processConfigFile(string &dataFileName) { std::string content; + +#ifdef LINUX +// dataFileName = getCompletePath(dataFileName); +#endif std::ifstream inputFile(dataFileName); + if (inputFile.is_open()) { content.assign((std::istreambuf_iterator(inputFile)), (std::istreambuf_iterator())); inputFile.close(); - //std::cout << "File content:\n" << content << std::endl; + // std::cout << "File content:\n" << content << std::endl; } else { @@ -84,22 +87,18 @@ void PlcLicence::processConfigFile(string &dataFileName) // char stationCh[station.length()] = {}; // getCharsFromString(station, stationCh); - + // char distributorCh[distributor.length()] = {}; // getCharsFromString(distributor, distributorCh); // this->stationName = stationCh; // this->distributor = distributorCh; - // cout << this->stationName << "\n"; - // cout << this->distributor << "\n"; - // this->stationName = "ceskatrebova"; // this->distributor = "RO1"; // cout << this->stationName << "\n"; // cout << this->distributor << "\n"; - } PlcLicence::PlcLicence(map &arguments) @@ -117,21 +116,6 @@ PlcLicence::PlcLicence(map &arguments) << "CID 1:" << cid << " delka: " << strlen(cid) << "\n"; } - // this->cid = "9f544930303030300000000b47015423"; - // this->csd = "400e00325b5900003a0d7f800a40008d"; - - cout << "\n" - << "CID 2:" - << " delka: " << strlen(cid) << "\n"; - - // if (arguments.count("-csd") > 0) - // { - // const int csdLength = arguments["-csd"].length(); - // char csdArg[csdLength] = {}; - // getCharsFromString(arguments["-csd"], csdArg); - // this->csd = csdArg; - // } - this->licType = 2; if (arguments.count("-outputType") > 0) @@ -143,7 +127,6 @@ PlcLicence::PlcLicence(map &arguments) } else this->binaryGeneration = BinaryGenerationType::Base64Cout; - } PlcLicence::PlcLicence(string cid, string csd, char *stationName, char *switchName, char *licenceType, char *binaryType, const char *dataFileName) @@ -163,16 +146,13 @@ PlcLicence::PlcLicence(string cid, string csd, char *stationName, char *switchNa } else this->binaryGeneration = BinaryGenerationType::Base64Cout; - - - - } void PlcLicence::getSDData() { - //int length = strlen(cid); // Get the length of the char array - for (int i = 0; i < CID_LENGTH; i++) this->sdData.CID_nibble[i] = (BYTE)cid[i]; + // int length = strlen(cid); // Get the length of the char array + for (int i = 0; i < CID_LENGTH; i++) + this->sdData.CID_nibble[i] = (BYTE)cid[i]; for (int i = 0; i < cnibblescount / 2; i++) { @@ -204,7 +184,8 @@ void PlcLicence::getSDData() this->sdData.manufacturerDate[i] = date[i]; // CSD - for (int i = 0; i < CSD_LENGTH; i++) this->sdData.CSD_nibble[i] = (BYTE)csd[i]; + for (int i = 0; i < CSD_LENGTH; i++) + this->sdData.CSD_nibble[i] = (BYTE)csd[i]; for (int i = 0; i < cnibblescount / 2; i++) { @@ -239,8 +220,6 @@ void PlcLicence::getSDData() this->sdData.CRCOK = ((sdCrc << 1) | 1) == this->sdData.CID[15]; } - - PlcLicence::PlcLicence(char *cid, char *csd, string binaryType, string dataFileName) { this->cid = cid; @@ -251,7 +230,7 @@ PlcLicence::PlcLicence(char *cid, char *csd, string binaryType, string dataFileN this->licType = 2; processConfigFile(dataFileName); - + if (binaryType == "base64") this->binaryGeneration = BinaryGenerationType::Base64Cout; else @@ -277,8 +256,6 @@ PlcLicence::PlcLicence(char *cid, char *csd, char *stationName, char *switchName this->binaryGeneration = BinaryGenerationType::Base64Cout; } - - void PlcLicence::initCrypto() { if (this->licType == cEzLic_p78ou3_IDType_EOVOSV) @@ -307,165 +284,6 @@ void PlcLicence::initCrypto() } } -unsigned char *PlcLicence::getLicenceContent() -{ - getSDData(); - initCrypto(); - - // promenne pro praci se soubory a adresari - DWORD sdFileHandle; - DWORD sdDirHandle; - string dirFileName; - string dirFilePath; //: STRING; - string dirInfo; //: DIRECTORY_INFO; - NAJIT - 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 - BYTE dataWriteToFile[cEzLic_p78ou3_maxDataToFile]; // OF BYTE; data zapisovana do souboru - DWORD retDataCount; //: DWORD; // pocty zapisovanych a ctenych dat - navratova hodnota jednotlivych funkci - string licencePostfix; //: STRING; pomocna promenna pro kontrolu postfixu - string mainLicDescription; //: STRING(79); globalni pojmenovani licence v nesifrovane casti licence - - UINT freeDataSize; //: UINT; velikost volne citelnych dat v souboru licenci - UINT cryptDataSize; //: UINT; velikost volne cryptovanych dat v souboru licenci - UINT fullDataSize; //: UINT; celkova velikost souboru licenci - - USINT generation = 2; //: USINT; verze SW pro licence - - PlcData plcData; // = GetPlcData(dataFileName);// "licData.xml"); - plcData.licenceName = "Licence"; - plcData.licenceType = "1"; - plcData.station = stationName; // "Test"; - plcData.distributor = distributor; //"RO1"; - - LicenceSourceData licSourceData; - - if (plcData.licenceType == "EOV" || plcData.licenceType == to_string((int)LicenceType::LicenceEov)) - { - licSourceData.licType = 0x1AA2; // 6818 ... proč ? - 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); - - int sizeOfData = sizeof(dataToFile); - - 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 cEzLic_p78ou3_IDType_DDTS: - mainLicDescription = "ddts "; - break; - case 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(); - 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; - 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 - { - freeDataSize = sizeof(dataMainToFileELC1); // melo by byt 92 - - if (1) // EzLic_p78ou3_CryptoData.aesRetVal > 0 crypto - { - 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 dataEncryptedLength = finalEncryptedLength; - const int totalLength = dataMainLength + dataToFileLength; - 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]; - - return totalEncryptedArray; - } - } - - return nullptr; -} - string PlcLicence::getLicenceName(BYTE licPostfix) { string result = ""; @@ -603,7 +421,7 @@ bool PlcLicence::CreateLicence() ; // = GetPlcData(dataFileName);// "licData.xml"); plcData.licenceName = "Licence"; plcData.licenceType = "1"; - plcData.station = stationName; // "Test"; + plcData.station = stationName; // "Test"; plcData.distributor = distributor; //"RO1"; LicenceSourceData licSourceData; @@ -668,7 +486,7 @@ bool PlcLicence::CreateLicence() dataToFile.header.licVersion = 10; dataToFile.header.licType = licIdent.licIDType; - dataToFile.header.licDate = getLicDate(); //1692230400; //getLicDate(); //1692144000;// getLicDate(); + dataToFile.header.licDate = getLicDate(); // 1692230400; //getLicDate(); //1692144000;// getLicDate(); mainLicDescription += dataToFile.header.licDescription1; mainLicDescription += " ["; mainLicDescription += dataToFile.header.licDescription2; @@ -726,8 +544,6 @@ bool PlcLicence::CreateLicence() unsigned char bdataMainToFileELC1[dataMainLength] = {}; memcpy(bdataMainToFileELC1, &dataMainToFileELC1, dataMainLength); - - unsigned char bdataToFile[dataToFileLength] = {}; memcpy(bdataToFile, &dataToFile, dataToFileLength); unsigned char totalEncryptedArray[totalEncryptedLength] = {}; @@ -737,29 +553,41 @@ bool PlcLicence::CreateLicence() for (int i = 0; i < finalEncryptedLength; i++) totalEncryptedArray[i + dataMainLength] = encrypted[i]; - // char chFileName[licenseFileName.length()]; - char licFileNameToSave[licenseFileName.length()] = {}; - getCharsFromString(licenseFileName, licFileNameToSave); - - int totalFileSize = sizeof(totalEncryptedArray); + // for (int i=0;i(totalEncryptedArray), totalEncryptedLength); + outputFile.close(); + std::cout << licenseFileName << std::endl; } + else + { + std::cerr << "Unable to open the file." << std::endl; + } + return true; + // FILE *fileLicence = fopen(licFileNameToSave, "wb"); + // if (fileLicence) + // { + // size_t r1 = fwrite(&totalEncryptedArray, sizeof(totalEncryptedArray), 1, fileLicence); + // // printf("License binary saved.\n"); + // fclose(fileLicence); + // cout << licenseFileName << endl; + // return true; + // } } else { - //cout << "data:text/plain;base64,"; + 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++) diff --git a/src/utils.cpp b/src/utils.cpp index 60194d8..78e99d9 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -24,7 +24,6 @@ using namespace std; - const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -73,14 +72,10 @@ void getCharsFromString1(string source, char *charArray) } } -void getCharsFromString(string& source, char *charArray, int length) +void getCharsFromString(string &source, char *charArray, int length) { memset(charArray, 0, length); - // charArray[length]; // Character array to store the string - for (int i = 0; i < length; i++) - { - charArray[i] = source[i]; - } + for (int i = 0; i < length; i++) { charArray[i] = source[i]; } } void getCharsFromString(string source, char *charArray) @@ -386,7 +381,6 @@ DateAndTime getCurrentDateTimeAsCODESYSDateTime() return codesysDateTime; } - DATE getLicDate() { time_t ttime = time(0); @@ -396,16 +390,15 @@ DATE getLicDate() int seconds = 1 * local_time->tm_sec; int totalSeconds = hoursSeconds + minutesSeconds + seconds; - #ifdef WINDOWS - DATE dateOnly = ttime - totalSeconds + 7200;// (pro windows); // 7200 + vteřina za dvě hodiny pro srování - #else +#ifdef WINDOWS + DATE dateOnly = ttime - totalSeconds + 7200; // (pro windows); // 7200 + vteřina za dvě hodiny pro srování +#else DATE dateOnly = ttime - totalSeconds; - #endif +#endif return dateOnly; } - std::vector aes256_cbc_encrypt(const std::vector &plaintext, const std::vector &key, const std::vector &iv) { std::vector ciphertext; @@ -734,9 +727,10 @@ std::string base64_encode_ai(const std::string &input) map getArguments(int argc, char *argv[]) { - const char splitChar='='; + const char splitChar = '='; map result; - if (argc <= 1) return result; + if (argc <= 1) + return result; for (int i = 1; i < argc; ++i) { @@ -745,7 +739,7 @@ map getArguments(int argc, char *argv[]) string argName; string argValue; - for (int j=0;j getArguments(int argc, char *argv[]) return result; } -map mapArguments(int argc, char *argv[]) +map mapArguments(int argc, char *argv[]) { - const char splitChar='='; - map result; - if (argc <= 1) return result; + const char splitChar = '='; + map result; + if (argc <= 1) + return result; for (int i = 1; i < argc; ++i) { @@ -780,9 +775,9 @@ map mapArguments(int argc, char *argv[]) int argLength = strlen(argv[i]); string argName; string argValue; - char* argValueChar; + char *argValueChar; - for (int j=0;j mapArguments(int argc, char *argv[]) } } - //getCharsFromString(argValue, argValueChar); - - const char * chValue = argValue.c_str(); + const char *chValue = argValue.c_str(); result.insert(make_pair(argName, chValue)); } return result; } + +string getCompletePath(string fileName) +{ + //std::filesystem::path executablePath = std::filesystem::canonical(std::filesystem::current_path()); // / std::filesystem::path(argv[0])); + std::filesystem::path exePath = std::filesystem::canonical("/proc/self/exe"); // / std::filesystem::path(argv[0])); + //std::filesystem::path fullPath = executablePath.parent_path() / "licenceData.xml"; + std::filesystem::path fullPathOther = exePath.parent_path() / fileName; + //std::string fullPathStr = fullPath.string(); + std::string fullPathStrOther = fullPathOther.string(); + return fullPathStrOther; +}