/* Copyright 2021 Grégory Soutadé This file is part of libgourou. libgourou is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. libgourou is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with libgourou. If not, see . */ #ifndef _DEVICE_H_ #define _DEVICE_H_ namespace gourou { class DRMProcessor; /** * @brief This class is a container for device.xml (device info) and devicesalt (device private key). It should not be used by user. */ class Device { public: static const int DEVICE_KEY_SIZE = 16; static const int DEVICE_SERIAL_LEN = 10; /** * @brief Main Device constructor * * @param processor Instance of DRMProcessor * @param deviceFile Path of device.xml * @param deviceKeyFile Path of devicesalt */ Device(DRMProcessor* processor, const std::string& deviceFile, const std::string& deviceKeyFile); /** * @brief Return value of devicesalt file (DEVICE_KEY_SIZE len) */ const unsigned char* getDeviceKey(); /** * @brief Get one value of device.xml (deviceClass, deviceSerial, deviceName, deviceType, hobbes, clientOS, clientLocale) */ std::string getProperty(const std::string& property, const std::string& _default=std::string("")); std::string operator[](const std::string& property); /** * @brief Create device.xml and devicesalt files when they did not exists * * @param processor Instance of DRMProcessor * @param dirName Directory where to put files (.adept) * @param hobbes Hobbes (client version) to set * @param randomSerial Create a random serial (new device each time) or not (serial computed from machine specs) */ static Device* createDevice(DRMProcessor* processor, const std::string& dirName, const std::string& hobbes, bool randomSerial); private: DRMProcessor* processor; std::string deviceFile; std::string deviceKeyFile; unsigned char deviceKey[DEVICE_KEY_SIZE]; std::map properties; Device(DRMProcessor* processor); std::string makeFingerprint(const std::string& serial); std::string makeSerial(bool random); void parseDeviceFile(); void parseDeviceKeyFile(); void createDeviceFile(const std::string& hobbes, bool randomSerial); void createDeviceKeyFile(); }; } #endif