//////////////////////////////////////////////////////////////////////////////// // Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved // Unauthorized copying of this file, via any medium is strictly prohibited. // Proprietary and confidential. //////////////////////////////////////////////////////////////////////////////// #include "LicenseLibrary.h" #include "utils/Log.h" #include #include #include #include #include #include //#include //#include #include #include #include namespace zilliz { namespace milvus { namespace server { constexpr int LicenseLibrary::sha256_length_; // Part 0: File check bool LicenseLibrary::IsFileExistent(const std::string &path) { boost::system::error_code error; auto file_status = boost::filesystem::status(path, error); if (error) { return false; } if (!boost::filesystem::exists(file_status)) { return false; } return !boost::filesystem::is_directory(file_status); } // Part 1: Get GPU Info ServerError LicenseLibrary::GetDeviceCount(int &device_count) { nvmlReturn_t result = nvmlInit(); if (NVML_SUCCESS != result) { printf("Failed to initialize NVML: %s\n", nvmlErrorString(result)); return SERVER_UNEXPECTED_ERROR; } cudaError_t error_id = cudaGetDeviceCount(&device_count); if (error_id != cudaSuccess) { printf("cudaGetDeviceCount returned %d\n-> %s\n", (int) error_id, cudaGetErrorString(error_id)); printf("Result = FAIL\n"); return SERVER_UNEXPECTED_ERROR; } return SERVER_SUCCESS; } ServerError LicenseLibrary::GetUUID(int device_count, std::vector &uuid_array) { if (device_count == 0) { printf("There are no available device(s) that support CUDA\n"); return SERVER_UNEXPECTED_ERROR; } for (int dev = 0; dev < device_count; ++dev) { nvmlDevice_t device; nvmlReturn_t result = nvmlDeviceGetHandleByIndex(dev, &device); if (NVML_SUCCESS != result) { printf("Failed to get handle for device %i: %s\n", dev, nvmlErrorString(result)); return SERVER_UNEXPECTED_ERROR; } char uuid[80]; unsigned int length = 80; nvmlReturn_t err = nvmlDeviceGetUUID(device, uuid, length); if (err != NVML_SUCCESS) { printf("nvmlDeviceGetUUID error: %d\n", err); return SERVER_UNEXPECTED_ERROR; } uuid_array.emplace_back(uuid); } return SERVER_SUCCESS; } ServerError LicenseLibrary::GetUUIDMD5(int device_count, std::vector &uuid_array, std::vector &md5_array) { MD5_CTX ctx; unsigned char outmd[16]; char temp[2]; std::string md5; for (int dev = 0; dev < device_count; ++dev) { md5.clear(); memset(outmd, 0, sizeof(outmd)); MD5_Init(&ctx); MD5_Update(&ctx, uuid_array[dev].c_str(), uuid_array[dev].size()); MD5_Final(outmd, &ctx); for (int i = 0; i < 16; ++i) { std::snprintf(temp, 2, "%02X", outmd[i]); md5 += temp; } md5_array.push_back(md5); } return SERVER_SUCCESS; } ServerError LicenseLibrary::GetUUIDSHA256(const int &device_count, std::vector &uuid_array, std::vector &sha_array) { SHA256_CTX ctx; unsigned char outmd[sha256_length_]; char temp[2]; std::string sha; for (int dev = 0; dev < device_count; ++dev) { sha.clear(); memset(outmd, 0, sizeof(outmd)); SHA256_Init(&ctx); SHA256_Update(&ctx, uuid_array[dev].c_str(), uuid_array[dev].size()); SHA256_Final(outmd, &ctx); for (int i = 0; i < sha256_length_; ++i) { std::snprintf(temp, 2, "%02X", outmd[i]); sha += temp; } sha_array.push_back(sha); } return SERVER_SUCCESS; } ServerError LicenseLibrary::GetSystemTime(time_t &system_time) { system_time = time(NULL); return SERVER_SUCCESS; } // Part 2: Handle License File ServerError LicenseLibrary::LicenseFileSerialization(const std::string &path, int device_count, const std::map &uuid_encrption_map, time_t starting_time, time_t end_time) { std::ofstream file(path); boost::archive::binary_oarchive oa(file); oa.register_type(); SerializedLicenseFile serialized_license_file; serialized_license_file.set_license_file(new LicenseFile(device_count, uuid_encrption_map, starting_time, end_time)); oa << serialized_license_file; file.close(); return SERVER_SUCCESS; } ServerError LicenseLibrary::LicenseFileDeserialization(const std::string &path, int &device_count, std::map &uuid_encrption_map, time_t &starting_time, time_t &end_time) { if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; std::ifstream file(path); boost::archive::binary_iarchive ia(file); ia.register_type(); SerializedLicenseFile serialized_license_file; ia >> serialized_license_file; device_count = serialized_license_file.get_license_file()->get_device_count(); uuid_encrption_map = serialized_license_file.get_license_file()->get_uuid_encryption_map(); starting_time = serialized_license_file.get_license_file()->get_starting_time(); end_time = serialized_license_file.get_license_file()->get_end_time(); file.close(); return SERVER_SUCCESS; } //ServerError //LicenseLibrary::SecretFileSerialization(const std::string &path, // const time_t &update_time, // const off_t &file_size, // const time_t &starting_time, // const time_t &end_time, // const std::string &file_md5) { // std::ofstream file(path); // boost::archive::binary_oarchive oa(file); // oa.register_type(); // // SerializedSecretFile serialized_secret_file; // // serialized_secret_file.set_secret_file(new SecretFile(update_time, file_size, starting_time, end_time, file_md5)); // oa << serialized_secret_file; // // file.close(); // return SERVER_SUCCESS; //} // //ServerError //LicenseLibrary::SecretFileDeserialization(const std::string &path, // time_t &update_time, // off_t &file_size, // time_t &starting_time, // time_t &end_time, // std::string &file_md5) { // if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; // // std::ifstream file(path); // boost::archive::binary_iarchive ia(file); // ia.register_type(); // SerializedSecretFile serialized_secret_file; // // ia >> serialized_secret_file; // update_time = serialized_secret_file.get_secret_file()->get_update_time(); // file_size = serialized_secret_file.get_secret_file()->get_file_size(); // starting_time = serialized_secret_file.get_secret_file()->get_starting_time(); // end_time = serialized_secret_file.get_secret_file()->get_end_time(); // file_md5 = serialized_secret_file.get_secret_file()->get_file_md5(); // file.close(); // return SERVER_SUCCESS; //} // Part 3: File attribute: UpdateTime Time/ Size/ MD5 ServerError LicenseLibrary::GetFileUpdateTimeAndSize(const std::string &path, time_t &update_time, off_t &file_size) { if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; struct stat buf; int err_no = stat(path.c_str(), &buf); if (err_no != 0) { std::cout << strerror(err_no) << std::endl; return SERVER_UNEXPECTED_ERROR; } update_time = buf.st_mtime; file_size = buf.st_size; return SERVER_SUCCESS; } ServerError LicenseLibrary::GetFileMD5(const std::string &path, std::string &filemd5) { if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; filemd5.clear(); std::ifstream file(path.c_str(), std::ifstream::binary); if (!file) { return -1; } MD5_CTX md5Context; MD5_Init(&md5Context); char buf[1024 * 16]; while (file.good()) { file.read(buf, sizeof(buf)); MD5_Update(&md5Context, buf, file.gcount()); } unsigned char result[MD5_DIGEST_LENGTH]; MD5_Final(result, &md5Context); char hex[35]; memset(hex, 0, sizeof(hex)); for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) { sprintf(hex + i * 2, "%02X", result[i]); } hex[32] = '\0'; filemd5 = std::string(hex); return SERVER_SUCCESS; } // Part 4: GPU Info File Serialization/Deserialization ServerError LicenseLibrary::GPUinfoFileSerialization(const std::string &path, int device_count, const std::map &uuid_encrption_map) { std::ofstream file(path); boost::archive::binary_oarchive oa(file); oa.register_type(); SerializedGPUInfoFile serialized_gpu_info_file; serialized_gpu_info_file.set_gpu_info_file(new GPUInfoFile(device_count, uuid_encrption_map)); oa << serialized_gpu_info_file; file.close(); return SERVER_SUCCESS; } ServerError LicenseLibrary::GPUinfoFileDeserialization(const std::string &path, int &device_count, std::map &uuid_encrption_map) { if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; std::ifstream file(path); boost::archive::binary_iarchive ia(file); ia.register_type(); SerializedGPUInfoFile serialized_gpu_info_file; ia >> serialized_gpu_info_file; device_count = serialized_gpu_info_file.get_gpu_info_file()->get_device_count(); uuid_encrption_map = serialized_gpu_info_file.get_gpu_info_file()->get_uuid_encryption_map(); file.close(); return SERVER_SUCCESS; } ServerError LicenseLibrary::GetDateTime(const char *cha, time_t &data_time) { tm tm_; int year, month, day; sscanf(cha, "%d-%d-%d", &year, &month, &day); tm_.tm_year = year - 1900; tm_.tm_mon = month - 1; tm_.tm_mday = day; tm_.tm_hour = 0; tm_.tm_min = 0; tm_.tm_sec = 0; tm_.tm_isdst = 0; data_time = mktime(&tm_); return SERVER_SUCCESS; } } } }