oddělení generatoru od readeru
This commit is contained in:
70
include/common/SDCard.h
Normal file
70
include/common/SDCard.h
Normal file
@@ -0,0 +1,70 @@
|
||||
#ifndef SDCARD_H_
|
||||
#define SDCARD_H_
|
||||
|
||||
#define CID_LENGTH 32
|
||||
#define CSD_LENGTH 32
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef uint32_t DWORD;
|
||||
typedef uint16_t WORD;
|
||||
typedef uint8_t BYTE;
|
||||
typedef uint32_t UDINT;
|
||||
typedef uint32_t DATE;
|
||||
typedef uint8_t USINT;
|
||||
typedef int32_t DINT;
|
||||
typedef uint16_t UINT;
|
||||
typedef int16_t INT;
|
||||
|
||||
const BYTE cnibblescount = 32;
|
||||
|
||||
const string cidFilePath = "";
|
||||
|
||||
class SDCard
|
||||
{
|
||||
|
||||
struct SDCardData
|
||||
{
|
||||
uint8_t isCorrectLoad = 0; // SD karta je korektne nactena //bool vs byte ?
|
||||
uint8_t CID_nibble[32] = {0}; // surova data CID ze souboru
|
||||
uint8_t CID[16] = {0}; // prekodovane CID informace
|
||||
uint8_t manufacturerID = 0; // ID vyrobce 1B -> Byte 15
|
||||
char oemID[2] = {}; // ID aplikace/oem 2B -> Byte 13-14 // oemID: !!STRING(3);
|
||||
char name[5] = {}; // jmeno produktu 5B -> Byte 8-12 !!STRING(6);
|
||||
uint8_t productRevision_hw = 0;
|
||||
uint8_t productRevision_sw = 0;
|
||||
float productRevision = 0; // revize produktu 1B [bcd sh] -> Byte 7, bity 0-3 = revize HW, bity 4-7 = revize SW
|
||||
uint32_t serialNumber = 0; // seriove cislo karty 4B -> Byte 3-6
|
||||
uint16_t manufacturerDate_year = 0;
|
||||
uint8_t manufacturerDate_month = 0;
|
||||
char manufacturerDate[10] = {}; //: STRING(10); // datum vyroby 2B [bcd -yym] -> Byte 1-2, bity 0-3 = mesic, bity 4-11 = posledni cislice roku or roku 2000, bity 12-15 nepouzito
|
||||
uint8_t CRCOK = 0; // CRC 1B -> Byte 0, bity 1-7, bit 0 je vzdy = 1
|
||||
uint8_t CSD_nibble[32] = {}; //: ARRAY [0..31] OF BYTE; // surova data CSD ze souboru
|
||||
uint8_t CSD[16] = {}; //: ARRAY [0..15] OF BYTE; // prekodovane CSD informace
|
||||
uint32_t cardSize = 0; //: UDINT; // velikost SD karty
|
||||
uint8_t cardGSize = 0; // prepocitana velikost na GB
|
||||
bool crcCorrect = false;
|
||||
};
|
||||
|
||||
bool readSDCard();
|
||||
bool getCIDFromFile();
|
||||
bool getCSDFromFile();
|
||||
|
||||
public:
|
||||
|
||||
SDCardData cardData;
|
||||
bool isLoaded = false;
|
||||
char cid[32] = {};
|
||||
char csd[32] = {};
|
||||
string filePath = "";
|
||||
string cidString = ""; //pro předání pro starý generátor
|
||||
string csdString = ""; //pro předání pro starý generátor
|
||||
|
||||
SDCard();
|
||||
SDCard(string cid, string csd);
|
||||
SDCard(const string filesPath);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
207
include/common/licenceCommon.h
Normal file
207
include/common/licenceCommon.h
Normal file
@@ -0,0 +1,207 @@
|
||||
#ifndef LICENCE_COMMON_H_
|
||||
#define LICENCE_COMMON_H_
|
||||
|
||||
//---------------- společná hlavička pro všechny licence ----------------
|
||||
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <stdint.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define XML_VERSION 1
|
||||
#define SOFTWARE_VERSION 1
|
||||
#define SUCCES 0;
|
||||
|
||||
const int cidSize = 32;
|
||||
const int csdSize = 32;
|
||||
const int generatorVersion = 1;
|
||||
|
||||
typedef uint8_t BYTE;
|
||||
typedef uint16_t WORD;
|
||||
typedef uint32_t DWORD;
|
||||
typedef uint32_t DATE;
|
||||
|
||||
enum class GeneralError
|
||||
{
|
||||
GeneralError = 1,
|
||||
FileOpenError = 2,
|
||||
FileReadError = 3,
|
||||
FileWriteError = 4,
|
||||
ELCNotImplemented = 5,
|
||||
LicenceTypeNotImplemented = 6,
|
||||
CompatibilityTypeNotImplemented = 7,
|
||||
ELCMismatch = 8,
|
||||
CRCMismatch = 9,
|
||||
EncryptError = 10,
|
||||
DecryptError = 11,
|
||||
ParamMissing = 12,
|
||||
IvanlidParam = 13
|
||||
};
|
||||
|
||||
enum class ELCType
|
||||
{
|
||||
ELC1 = 1,
|
||||
ELC2 = 2,
|
||||
ELC3 = 3
|
||||
};
|
||||
enum class ELCSubType
|
||||
{
|
||||
DEFAULT = 1
|
||||
}; // subtype = dataVersion
|
||||
enum class LicenceType
|
||||
{
|
||||
EOS_EOV,
|
||||
DDTS,
|
||||
DRT
|
||||
}; //
|
||||
enum class HeaderType
|
||||
{
|
||||
DEFAULT = 0
|
||||
}; ////subtype = version
|
||||
|
||||
enum class EncryptionType
|
||||
{
|
||||
CID_AES256 = 10,
|
||||
FIX_AES256 = 20
|
||||
};
|
||||
enum class BinaryType
|
||||
{
|
||||
FILE = 1,
|
||||
BASE64 = 2
|
||||
};
|
||||
enum class PlcType
|
||||
{
|
||||
WAGO = 1,
|
||||
TECO = 2
|
||||
};
|
||||
enum class FileNameGenerationType
|
||||
{
|
||||
DEFAULT = 1
|
||||
};
|
||||
|
||||
struct Mapping
|
||||
{
|
||||
std::map<string, LicenceType> licMapTypes = {{"EOV_OSV", LicenceType::EOS_EOV}, {"DDTS", LicenceType::DDTS}, {"DRT", LicenceType::DRT}};
|
||||
std::map<string, EncryptionType> licMapEncryption = {{"CID_AES256", EncryptionType::CID_AES256}, {"FIX_AES256", EncryptionType::FIX_AES256}};
|
||||
std::map<string, PlcType> licMapPlcType = {{"WAGO", PlcType::WAGO}, {"TECO", PlcType::TECO}};
|
||||
};
|
||||
|
||||
struct ErrorMessage
|
||||
{
|
||||
int code = 0;
|
||||
string message = "";
|
||||
};
|
||||
|
||||
struct LicenceIdentification
|
||||
{
|
||||
ELCType licElcType = ELCType::ELC2;
|
||||
LicenceType licLicenceType;
|
||||
string licTypeName = "";
|
||||
PlcType licPlcType;
|
||||
|
||||
uint8_t licenceVersion = 1; // verze licence, určuje kodování, pojmenování souborů
|
||||
uint8_t licenceIndex = 0;
|
||||
uint8_t revision;
|
||||
uint8_t licCompatibility = 1; // identikator hlavního ELC
|
||||
|
||||
uint16_t licItemsCount = 0;
|
||||
|
||||
string cid_cds_path = "";
|
||||
string licenceFilePath = "";
|
||||
};
|
||||
|
||||
// struct LicData
|
||||
// {
|
||||
// string station = "";
|
||||
// string distributor = "";
|
||||
// string licenceName = "";
|
||||
// string projectDescription = "";
|
||||
// string cid = ""; // CID z SD karty
|
||||
// string csd = ""; // CSD z SD karty
|
||||
// string uid = ""; // jedinečný identifikátor z jiného systému
|
||||
// pugi::xml_document *doc;
|
||||
// };
|
||||
|
||||
struct LicenceItem
|
||||
{
|
||||
int protocolId = -1;
|
||||
int dataPointsCount = 0;
|
||||
};
|
||||
|
||||
struct LicenceItem11
|
||||
{
|
||||
int protocolId = -1;
|
||||
int dataPointsCount = 0;
|
||||
};
|
||||
|
||||
struct LicenceItem21
|
||||
{
|
||||
int protocolId = -1;
|
||||
int dataPointsCount = 0;
|
||||
};
|
||||
|
||||
struct LicenceItem31
|
||||
{
|
||||
int protocolId = -1;
|
||||
int dataPointsCount = 0;
|
||||
};
|
||||
|
||||
struct LicenceInfo
|
||||
{
|
||||
int reqDataPointsCount = 0;
|
||||
map<int, int> licences = {};
|
||||
};
|
||||
|
||||
struct LicenceInfo11
|
||||
{
|
||||
int reqDataPointsCount = 0;
|
||||
map<int, int> licences = {};
|
||||
};
|
||||
|
||||
struct LicenceInfo21
|
||||
{
|
||||
int reqDataPointsCount = 0;
|
||||
map<int, int> licences = {};
|
||||
};
|
||||
|
||||
struct LicenceInfo31
|
||||
{
|
||||
int reqDataPointsCount = 0;
|
||||
map<int, int> licences = {};
|
||||
};
|
||||
|
||||
struct LicenceInfoGeneral
|
||||
{
|
||||
int reqDataPointsCount = 0;
|
||||
map<int, int> licences = {};
|
||||
};
|
||||
|
||||
class LicenceException : public std::exception
|
||||
{
|
||||
public:
|
||||
LicenceException(int errorCode, const std::string &errorMessage)
|
||||
: errorCode_(errorCode), errorMessage_(errorMessage) {}
|
||||
|
||||
const char *what() const noexcept override
|
||||
{
|
||||
return errorMessage_.c_str();
|
||||
}
|
||||
|
||||
int getErrorCode() const
|
||||
{
|
||||
return errorCode_;
|
||||
}
|
||||
|
||||
const std::string &getErrorMessage() const
|
||||
{
|
||||
return errorMessage_;
|
||||
}
|
||||
|
||||
private:
|
||||
int errorCode_;
|
||||
std::string errorMessage_;
|
||||
};
|
||||
|
||||
#endif
|
||||
107
include/common/licenceELC2.h
Normal file
107
include/common/licenceELC2.h
Normal file
@@ -0,0 +1,107 @@
|
||||
#ifndef PLC_LICENCE2_COMMON_H
|
||||
#define PLC_LICENCE2_COMMON_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include "licenceCommon.h"
|
||||
#include "SDCard.h"
|
||||
|
||||
/// @brief společná třída pro pro reader i generator licence typu ELC2
|
||||
class LicenceELC2
|
||||
{
|
||||
public:
|
||||
LicenceELC2();
|
||||
LicenceELC2(LicenceIdentification &licIdentification);
|
||||
~LicenceELC2();
|
||||
|
||||
string getLicenceName();
|
||||
string cid_cdsPath = "";
|
||||
string licenceFilePath = "";
|
||||
|
||||
|
||||
ErrorMessage errorMessage;
|
||||
|
||||
|
||||
enum class Error
|
||||
{
|
||||
SDCardReadError = 50,
|
||||
LicenceReadError = 51,
|
||||
LicenceSizeMismatch = 52,
|
||||
LicenceSizeCardMismatch = 53,
|
||||
LicenceMismatch = 54,
|
||||
ItemsCountMismatch = 61
|
||||
};
|
||||
|
||||
unordered_map<Error, string> mapErrors = {
|
||||
{Error::SDCardReadError, "Nepodařilo se načíst SD kartu."},
|
||||
{Error::ItemsCountMismatch, "Nesouhlasí počet položek licence."},
|
||||
{Error::LicenceSizeMismatch, "Nesouhlasí velikost souboru licence."},
|
||||
{Error::LicenceSizeCardMismatch, "Nesouhlasí velikost SD karty."},
|
||||
{Error::LicenceMismatch, "Nesouhlasí licence."},
|
||||
{Error::ItemsCountMismatch, "Nesouhlasí počet položek licence."},
|
||||
};
|
||||
|
||||
struct LicenceId
|
||||
{
|
||||
char licIdent[5] = {'E', 'L', 'C', '0', '_'};
|
||||
};
|
||||
|
||||
// struct __attribute__((__packed__)) LicencePublicHeader
|
||||
struct LicenceIdentDataHeader
|
||||
{
|
||||
BYTE licenceType = 0; // EOSEOV, DRT ...
|
||||
BYTE licenceTypeVersion = 1; // verze licence, urcuje nuance sifrování a pojmenování souborů
|
||||
BYTE licenceIndex = 0; // puvodní post fix, identifikátor pro více licencí
|
||||
BYTE compatibilityVersion = 1; // udava verzi komplet PrivateContent
|
||||
BYTE licItemCount = 0; // počet licenčních bodů
|
||||
WORD publicHeaderLength = 0; // délka veřejné hlavičy
|
||||
WORD cardSize = 0; // velikost SD karty
|
||||
DWORD serialNumber = 0; // seriove cislo karty
|
||||
};
|
||||
|
||||
///
|
||||
struct licDataItem
|
||||
{
|
||||
WORD protoId = 0; // id protokolu pro ktery je licence
|
||||
WORD licCount = 0; // pocet datovych bodu licence
|
||||
char dummy[64] = {}; // dummy pro větší velikost licence v případě méně licenčních bodů
|
||||
};
|
||||
|
||||
struct PublicHeader
|
||||
{
|
||||
string version = "";
|
||||
string projectDescription = "";
|
||||
string date = "";
|
||||
string licenceType = "";
|
||||
int crc = 0;
|
||||
};
|
||||
|
||||
struct PrivateContent // privátní šifrovaná část
|
||||
{
|
||||
LicenceIdentDataHeader licenceIdentHeader;
|
||||
vector<licDataItem> dataItems;
|
||||
WORD crc = 0;
|
||||
};
|
||||
|
||||
struct LicenceBody
|
||||
{
|
||||
LicenceId licId;
|
||||
LicenceIdentDataHeader licenceIdentHeader;
|
||||
string publicHeader = ""; // JSON
|
||||
PrivateContent privateContent;
|
||||
};
|
||||
|
||||
LicenceBody licBody;
|
||||
SDCard sdCard;
|
||||
LicenceIdentification lIdentification;
|
||||
vector<unsigned char> cryptPrivateContent(const std::vector<unsigned char> &content);
|
||||
vector<unsigned char> decryptPrivateContent(const std::vector<unsigned char> &content);
|
||||
void initVector(BYTE (&iVector)[], BYTE (&key)[]);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
78
include/common/utils.h
Normal file
78
include/common/utils.h
Normal file
@@ -0,0 +1,78 @@
|
||||
//#define LINUX 1
|
||||
#define WINDOWS 1
|
||||
|
||||
#ifndef UTILS_H_
|
||||
#define UTILS_H_
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <chrono>
|
||||
#include <format>
|
||||
#include <libgen.h> // dirname
|
||||
#include <climits>
|
||||
|
||||
typedef uint8_t BYTE;
|
||||
typedef uint16_t WORD;
|
||||
typedef uint32_t DWORD;
|
||||
typedef uint32_t DATE;
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct DateAndTime {
|
||||
uint16_t date; // DATE data type in CODESYS
|
||||
uint16_t time; // TIME data type in CODESYS
|
||||
};
|
||||
|
||||
void generatePause();
|
||||
std::string right(const std::string& sourceString, size_t numChars);
|
||||
void getCharsFromString(const string source, char *charArray);
|
||||
uint16_t calculateCRC16(const uint8_t* data, size_t length);
|
||||
WORD getCurrentDateAsCODESYSDate();
|
||||
DWORD getCurrentDateAsCODESYSDateDword();
|
||||
DateAndTime getCurrentDateTimeAsCODESYSDateTime();
|
||||
DATE getLicDate();
|
||||
string getDate();
|
||||
int encrypt(const unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext);
|
||||
unsigned short crc16(const unsigned char* data_p, unsigned char length);
|
||||
int decrypt(const unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext);
|
||||
string convertToString(char* a, int size);
|
||||
string base64_encode_ai(const std::string &input);
|
||||
unordered_map<string, string> getArguments(int argc, char *argv[]);
|
||||
unordered_map<string, const char*> mapArguments(int argc, char *argv[]);
|
||||
char* getCharArray(string source);
|
||||
void getCharsFromString1(string source, char *charArray);
|
||||
void getCharsFromString(string& source, char *charArray, size_t length);
|
||||
string getCompletePath(string fileName);
|
||||
char* getFileContent(string fileName);
|
||||
void appendStringToVector(const std::string& str, std::vector<unsigned char>& charVector);
|
||||
uint16_t calculateCRC16(std::vector<unsigned char>& charVector);
|
||||
uint32_t bytesToDword(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4);
|
||||
uint32_t bytesToWord(uint8_t byte1, uint8_t byte2);
|
||||
vector<unsigned char> joinVectors(const std::vector<unsigned char>& vector1, const std::vector<unsigned char>& vector2);
|
||||
bool readFile(string fileName, vector<char> &output);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user