//Send responses to requester bool __fastcall SendToRequester( char *RecvBuffer, const size_t RecvSize, const size_t MaxLen, const uint16_t Protocol, const SOCKET_DATA &LocalSocketData) { //Response check if (RecvSize < DNS_PACKET_MINSIZE || CheckEmptyBuffer(RecvBuffer, RecvSize) || ((pdns_hdr)RecvBuffer)->ID == 0 || ((pdns_hdr)RecvBuffer)->Flags == 0) //DNS header ID and flags must not be set 0. return false; //TCP protocol if (Protocol == IPPROTO_TCP) { if (AddLengthDataToHeader(RecvBuffer, RecvSize, MaxLen) == EXIT_FAILURE) { shutdown(LocalSocketData.Socket, SD_BOTH); closesocket(LocalSocketData.Socket); return false; } else { send(LocalSocketData.Socket, RecvBuffer, (int)(RecvSize + sizeof(uint16_t)), 0); shutdown(LocalSocketData.Socket, SD_BOTH); closesocket(LocalSocketData.Socket); } } //UDP protocol else { sendto(LocalSocketData.Socket, RecvBuffer, (int)RecvSize, 0, (PSOCKADDR)&LocalSocketData.SockAddr, LocalSocketData.AddrLen); } return true; }
//DNSCurve initialization void DNSCurveInit( void) { //DNSCurve signature request TCP Mode if (DNSCurveParameter.DNSCurveProtocol_Transport == REQUEST_MODE_TRANSPORT::FORCE_TCP || DNSCurveParameter.DNSCurveProtocol_Transport == REQUEST_MODE_TRANSPORT::TCP) { //IPv6 Main if (DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV6) && //IPv6 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_TCP(std::bind(DNSCurve_SignatureRequest_TCP, static_cast<const uint16_t>(AF_INET6), false)); Thread_DNSCurve_SignatureRequest_TCP.detach(); } //IPv4 Main if (DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV4) && //IPv4 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_TCP(std::bind(DNSCurve_SignatureRequest_TCP, static_cast<const uint16_t>(AF_INET), false)); Thread_DNSCurve_SignatureRequest_TCP.detach(); } //IPv6 Alternate if (DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV6) && //IPv6 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_TCP(std::bind(DNSCurve_SignatureRequest_TCP, static_cast<const uint16_t>(AF_INET6), true)); Thread_DNSCurve_SignatureRequest_TCP.detach(); } //IPv4 Alternate if (DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV4) && //IPv4 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_TCP(std::bind(DNSCurve_SignatureRequest_TCP, static_cast<const uint16_t>(AF_INET), true)); Thread_DNSCurve_SignatureRequest_TCP.detach(); } } //Force protocol(TCP). if (DNSCurveParameter.DNSCurveProtocol_Transport == REQUEST_MODE_TRANSPORT::FORCE_TCP) return; //DNSCurve signature request UDP Mode //IPv6 Main if (DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV6) && //IPv6 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_UDP(std::bind(DNSCurve_SignatureRequest_UDP, static_cast<const uint16_t>(AF_INET6), false)); Thread_DNSCurve_SignatureRequest_UDP.detach(); } //IPv4 Main if (DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //IPv4 DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV4) && //Auto select ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_UDP(std::bind(DNSCurve_SignatureRequest_UDP, static_cast<const uint16_t>(AF_INET), false)); Thread_DNSCurve_SignatureRequest_UDP.detach(); } //IPv6 Alternate if (DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV6) && //IPv6 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_UDP(std::bind(DNSCurve_SignatureRequest_UDP, static_cast<const uint16_t>(AF_INET6), true)); Thread_DNSCurve_SignatureRequest_UDP.detach(); } //IPv4 Alternate if (DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.AddressData.Storage.ss_family != 0 && (DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::BOTH || //Auto select DNSCurveParameter.DNSCurveProtocol_Network == REQUEST_MODE_NETWORK::IPV4) && //IPv4 ((!DNSCurveParameter.IsClientEphemeralKey && sodium_is_zero(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.PrecomputationKey, crypto_box_BEFORENMBYTES) != 0) || (DNSCurveParameter.IsClientEphemeralKey && CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.ServerFingerprint, crypto_box_PUBLICKEYBYTES)) || CheckEmptyBuffer(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN))) { std::thread Thread_DNSCurve_SignatureRequest_UDP(std::bind(DNSCurve_SignatureRequest_UDP, static_cast<const uint16_t>(AF_INET), true)); Thread_DNSCurve_SignatureRequest_UDP.detach(); } return; }
//Get signature data from server via UDP request bool DNSCurve_SignatureRequest_UDP( const uint16_t Protocol, const bool IsAlternate) { //Initialization const auto SendBuffer = std::make_unique<uint8_t[]>(PACKET_NORMAL_MAXSIZE + MEMORY_RESERVED_BYTES); const auto RecvBuffer = std::make_unique<uint8_t[]>(PACKET_NORMAL_MAXSIZE + MEMORY_RESERVED_BYTES); memset(SendBuffer.get(), 0, PACKET_NORMAL_MAXSIZE + MEMORY_RESERVED_BYTES); memset(RecvBuffer.get(), 0, PACKET_NORMAL_MAXSIZE + MEMORY_RESERVED_BYTES); std::vector<SOCKET_DATA> UDPSocketDataList(1U); memset(&UDPSocketDataList.front(), 0, sizeof(UDPSocketDataList.front())); UDPSocketDataList.front().Socket = INVALID_SOCKET; //Make packet data(Part 1). const auto DNS_Header = reinterpret_cast<dns_hdr *>(SendBuffer.get()); auto DataLength = sizeof(dns_hdr); #if defined(ENABLE_PCAP) DNS_Header->ID = Parameter.DomainTest_ID; #else GenerateRandomBuffer(&DNS_Header->ID, sizeof(DNS_Header->ID), nullptr, 0, 0); #endif DNS_Header->Flags = hton16(DNS_FLAG_REQUEST_STANDARD); DNS_Header->Question = hton16(UINT16_NUM_ONE); if (Protocol == AF_INET6) { if (IsAlternate) DataLength += StringToPacketQuery(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv6.ProviderName, SendBuffer.get() + DataLength, PACKET_NORMAL_MAXSIZE - DataLength); else //Main DataLength += StringToPacketQuery(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv6.ProviderName, SendBuffer.get() + DataLength, PACKET_NORMAL_MAXSIZE - DataLength); } else if (Protocol == AF_INET) { if (IsAlternate) DataLength += StringToPacketQuery(DNSCurveParameter.DNSCurve_Target_Server_Alternate_IPv4.ProviderName, SendBuffer.get() + DataLength, PACKET_NORMAL_MAXSIZE - DataLength); else //Main DataLength += StringToPacketQuery(DNSCurveParameter.DNSCurve_Target_Server_Main_IPv4.ProviderName, SendBuffer.get() + DataLength, PACKET_NORMAL_MAXSIZE - DataLength); } else { return false; } reinterpret_cast<dns_qry *>(SendBuffer.get() + DataLength)->Type = hton16(DNS_TYPE_TEXT); reinterpret_cast<dns_qry *>(SendBuffer.get() + DataLength)->Classes = hton16(DNS_CLASS_INTERNET); DataLength += sizeof(dns_qry); //EDNS Label DataLength = Add_EDNS_LabelToPacket(SendBuffer.get(), DataLength, PACKET_NORMAL_MAXSIZE, nullptr); //Socket initialization(Part 1) std::wstring Message; size_t TotalSleepTime = 0; ssize_t RecvLen = 0; auto FileModifiedTime = GlobalRunningStatus.ConfigFileModifiedTime; auto ServerType = DNSCURVE_SERVER_TYPE::NONE; const auto PacketTarget = DNSCurve_SelectSignatureTargetSocket(Protocol, IsAlternate, ServerType, UDPSocketDataList); if (PacketTarget == nullptr) { SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::CLOSE, false, nullptr); PrintError(LOG_LEVEL_TYPE::LEVEL_2, LOG_ERROR_TYPE::SYSTEM, L"DNSCurve UDP Signature Request module Monitor terminated", 0, nullptr, 0); return false; } //Send request. while (!GlobalRunningStatus.IsNeedExit) { //Sleep time controller if (TotalSleepTime > 0) { //Configuration files have been changed. if (FileModifiedTime != GlobalRunningStatus.ConfigFileModifiedTime) { FileModifiedTime = GlobalRunningStatus.ConfigFileModifiedTime; TotalSleepTime = 0; } //Interval time is not enough. else if (TotalSleepTime < DNSCurveParameter.KeyRecheckTime) { TotalSleepTime += Parameter.FileRefreshTime; //Next loop Sleep(Parameter.FileRefreshTime); continue; } //Interval time is enough, next recheck time. else { TotalSleepTime = 0; } } //Socket initialization(Part 2) if (Protocol == AF_INET6) UDPSocketDataList.front().Socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); else if (Protocol == AF_INET) UDPSocketDataList.front().Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); else goto JumpTo_Restart; if (!SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::INVALID_CHECK, true, nullptr) || !SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::NON_BLOCKING_MODE, true, nullptr) || (Protocol == AF_INET6 && !SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::HOP_LIMITS_IPV6, true, nullptr)) || (Protocol == AF_INET && (!SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::HOP_LIMITS_IPV4, true, nullptr) || !SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::DO_NOT_FRAGMENT, true, nullptr)))) goto JumpTo_Restart; //Socket selecting RecvLen = SocketSelectingOnce(REQUEST_PROCESS_TYPE::DNSCURVE_SIGN, IPPROTO_UDP, UDPSocketDataList, nullptr, SendBuffer.get(), DataLength, RecvBuffer.get(), PACKET_NORMAL_MAXSIZE, nullptr, nullptr); if (RecvLen < static_cast<const ssize_t>(DNS_PACKET_MINSIZE)) { goto JumpTo_Restart; } else { //Check signature. if (!DNSCruve_GetSignatureData(RecvBuffer.get() + DNS_PACKET_RR_LOCATE(RecvBuffer.get(), PACKET_NORMAL_MAXSIZE), ServerType) || CheckEmptyBuffer(PacketTarget->ServerFingerprint, crypto_box_PUBLICKEYBYTES) || CheckEmptyBuffer(PacketTarget->SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) goto JumpTo_Restart; } //Wait for sending again. TotalSleepTime += Parameter.FileRefreshTime; continue; //Jump here to restart. JumpTo_Restart: SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::CLOSE, false, nullptr); //Print error log. PrintLog_DNSCurve(ServerType, Message); if (!Message.empty()) { Message.append(L"UDP get signature data error"); PrintError(LOG_LEVEL_TYPE::LEVEL_3, LOG_ERROR_TYPE::DNSCURVE, Message.c_str(), 0, nullptr, 0); } else { PrintError(LOG_LEVEL_TYPE::LEVEL_3, LOG_ERROR_TYPE::DNSCURVE, L"UDP get signature data error", 0, nullptr, 0); } //Send request again. memset(RecvBuffer.get(), 0, PACKET_NORMAL_MAXSIZE + MEMORY_RESERVED_BYTES); if (!Parameter.AlternateMultipleRequest) { if (ServerType == DNSCURVE_SERVER_TYPE::MAIN_IPV6) ++AlternateSwapList.TimeoutTimes.at(ALTERNATE_SWAP_TYPE_DNSCURVE_UDP_IPV6); else if (ServerType == DNSCURVE_SERVER_TYPE::MAIN_IPV4) ++AlternateSwapList.TimeoutTimes.at(ALTERNATE_SWAP_TYPE_DNSCURVE_UDP_IPV4); } //Next loop Sleep(SENDING_INTERVAL_TIME); } //Loop terminated SocketSetting(UDPSocketDataList.front().Socket, SOCKET_SETTING_TYPE::CLOSE, false, nullptr); if (!GlobalRunningStatus.IsNeedExit) PrintError(LOG_LEVEL_TYPE::LEVEL_2, LOG_ERROR_TYPE::SYSTEM, L"DNSCurve UDP Signature Request module Monitor terminated", 0, nullptr, 0); return true; }
//Print errors to log file bool __fastcall PrintError( _In_ const size_t ErrorType, _In_ const wchar_t *Message, _In_opt_ const SSIZE_T ErrorCode, _In_opt_ const wchar_t *FileName, _In_opt_ const size_t Line) { //Print Error: Enable/Disable, parameter check, message check and file name check if (!Parameter.PrintError || //PrintError Message == nullptr || CheckEmptyBuffer(Message, wcsnlen_s(Message, ORIGINAL_PACKET_MAXSIZE) * sizeof(wchar_t)) || FileName != nullptr && CheckEmptyBuffer(FileName, wcsnlen_s(FileName, ORIGINAL_PACKET_MAXSIZE) * sizeof(wchar_t))) return false; //Convert file name. std::wstring FileNameString, ErrorMessage; if (FileName != nullptr) { FileNameString.append(L" in "); //Add line number. if (Line > 0) FileNameString.append(L"line %d of "); //Delete double backslash. FileNameString.append(FileName); while (FileNameString.find(L"\\\\") != std::wstring::npos) FileNameString.erase(FileNameString.find(L"\\\\"), wcslen(L"\\")); } //Add log error type. switch (ErrorType) { //Message Notice case LOG_MESSAGE_NOTICE: { ErrorMessage.append(L"Notice: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; //System Error //About System Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx. case LOG_ERROR_SYSTEM: { ErrorMessage.append(L"System Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); #if defined(PLATFORM_WIN) else if (ErrorCode == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) ErrorMessage.append(L", ERROR_FAILED_SERVICE_CONTROLLER_CONNECT(The service process could not connect to the service controller).\n"); #endif else ErrorMessage.append(L", error code is %d.\n"); }break; //Parameter Error case LOG_ERROR_PARAMETER: { ErrorMessage.append(L"Parameter Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; //IPFilter Error //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. case LOG_ERROR_IPFILTER: { ErrorMessage.append(L"IPFilter Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; //Hosts Error //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. case LOG_ERROR_HOSTS: { ErrorMessage.append(L"Hosts Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; //Network Error //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. case LOG_ERROR_NETWORK: { ErrorMessage.append(L"Network Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); #if defined(PLATFORM_WIN) else if (ErrorCode == WSAENETUNREACH || //Block error messages when getting Network Unreachable error. ErrorCode == WSAEHOSTUNREACH) //Block error messages when getting Host Unreachable error. return true; #endif else ErrorMessage.append(L", error code is %d.\n"); }break; //WinPcap Error #if defined(ENABLE_PCAP) case LOG_ERROR_PCAP: { ErrorMessage.append(L"Pcap Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); /* There are no any error codes to be reported in LOG_ERROR_PCAP. //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); */ ErrorMessage.append(L"\n"); }break; #endif //DNSCurve Error #if defined(ENABLE_LIBSODIUM) case LOG_ERROR_DNSCURVE: { ErrorMessage.append(L"DNSCurve Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; #endif //SOCKS Error case LOG_ERROR_SOCKS: { ErrorMessage.append(L"SOCKS Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; //HTTP Error case LOG_ERROR_HTTP: { ErrorMessage.append(L"HTTP Error: "); ErrorMessage.append(Message); //Copy file name and its line number to error log. if (!FileNameString.empty()) ErrorMessage.append(FileNameString); //Add error code. if (ErrorCode == 0) ErrorMessage.append(L".\n"); else ErrorMessage.append(L", error code is %d.\n"); }break; default: { return false; } } //Print error log. return PrintScreenAndWriteFile(ErrorMessage, ErrorCode, Line); }
//Print errors to log file bool __fastcall PrintError( const size_t ErrorType, const wchar_t *Message, const SSIZE_T ErrorCode, const wchar_t *FileName, const size_t Line) { //Print Error: Enable/Disable. if (!Parameter.PrintError || //PrintError parameter check Message == nullptr || CheckEmptyBuffer(Message, wcsnlen_s(Message, ORIGINAL_PACKET_MAXSIZE) * sizeof(wchar_t)) || //Message check FileName != nullptr && CheckEmptyBuffer(FileName, wcsnlen_s(FileName, ORIGINAL_PACKET_MAXSIZE) * sizeof(wchar_t))) //FileName check return false; //Get current date and time. std::shared_ptr<tm> TimeStructure(new tm()); memset(TimeStructure.get(), 0, sizeof(tm)); auto TimeValues = time(nullptr); #if defined(PLATFORM_WIN) if (localtime_s(TimeStructure.get(), &TimeValues) > 0) #elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX)) if (localtime_r(&TimeValues, TimeStructure.get()) == nullptr) #endif return false; //Print Start Time at first printing. time_t InnerStartTime = 0; if (StartTime > 0) { InnerStartTime = StartTime; StartTime = 0; } //Print to screen. #if defined(PLATFORM_WIN) if (GlobalRunningStatus.Console) #elif defined(PLATFORM_LINUX) if (!GlobalRunningStatus.Daemon) #endif { //Print start time before print errors. if (InnerStartTime > 0) { std::shared_ptr<tm> TimeStructureTemp(new tm()); memset(TimeStructureTemp.get(), 0, sizeof(tm)); #if defined(PLATFORM_WIN) if (localtime_s(TimeStructureTemp.get(), &InnerStartTime) > 0) #elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX)) if (localtime_r(&InnerStartTime, TimeStructureTemp.get()) == nullptr) #endif return false; wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Log opened at this moment.\n", TimeStructureTemp->tm_year + 1900, TimeStructureTemp->tm_mon + 1, TimeStructureTemp->tm_mday, TimeStructureTemp->tm_hour, TimeStructureTemp->tm_min, TimeStructureTemp->tm_sec); } //Print errors. switch (ErrorType) { //System Error case LOG_ERROR_SYSTEM: { if (ErrorCode == 0) { wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); } else { #if defined(PLATFORM_WIN) //About System Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx. if (ErrorCode == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls, ERROR_FAILED_SERVICE_CONTROLLER_CONNECT(The service process could not connect to the service controller).\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); else #endif wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls, error code is %d.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message, (int)ErrorCode); } }break; //Parameter Error case LOG_ERROR_PARAMETER: { wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Parameter Error: %ls", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); if (FileName != nullptr) { //Delete double backslash. std::wstring sFileName(FileName); while (sFileName.find(L"\\\\") != std::wstring::npos) sFileName.erase(sFileName.find(L"\\\\"), wcslen(L"\\")); //Write to file if (Line > 0) wprintf_s(L" in line %d of %ls", (int)Line, sFileName.c_str()); else wprintf_s(L" in %ls", sFileName.c_str()); } //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. if (ErrorCode > 0) wprintf_s(L", error code is %d", (int)ErrorCode); wprintf_s(L".\n"); }break; //IPFilter Error case LOG_ERROR_IPFILTER: { wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> IPFilter Error: %ls", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); if (FileName != nullptr) { //Delete double backslash. std::wstring sFileName(FileName); while (sFileName.find(L"\\\\") != std::wstring::npos) sFileName.erase(sFileName.find(L"\\\\"), wcslen(L"\\")); //Write to file if (Line > 0) wprintf_s(L" in line %d of %ls", (int)Line, sFileName.c_str()); else wprintf_s(L" in %ls", sFileName.c_str()); } //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. if (ErrorCode > 0) wprintf_s(L", error code is %d", (int)ErrorCode); wprintf_s(L".\n"); }break; //Hosts Error case LOG_ERROR_HOSTS: { wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Hosts Error: %ls", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); if (FileName != nullptr) { //Delete double backslash. std::wstring sFileName(FileName); while (sFileName.find(L"\\\\") != std::wstring::npos) sFileName.erase(sFileName.find(L"\\\\"), wcslen(L"\\")); //Write to file if (Line > 0) wprintf_s(L" in line %d of %ls", (int)Line, sFileName.c_str()); else wprintf_s(L" in %ls", sFileName.c_str()); } //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. if (ErrorCode > 0) wprintf_s(L", error code is %d", (int)ErrorCode); wprintf_s(L".\n"); }break; //Network Error //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. case LOG_ERROR_NETWORK: { if (ErrorCode == 0) wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Network Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); #if defined(PLATFORM_WIN) else if (ErrorCode == WSAENETUNREACH) //Block error messages when network is unreachable. return true; #endif else wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Network Error: %ls, error code is %d.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message, (int)ErrorCode); }break; //WinPcap Error #if defined(ENABLE_PCAP) case LOG_ERROR_PCAP: { wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Pcap Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); }break; #endif //DNSCurve Error #if defined(ENABLE_LIBSODIUM) case LOG_ERROR_DNSCURVE: { #if defined(PLATFORM_WIN) if (ErrorCode == WSAENETUNREACH) //Block error messages when network is unreachable. return true; else #endif wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> DNSCurve Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); }break; #endif //Notice case LOG_MESSAGE_NOTICE: { wprintf_s(L"%d-%02d-%02d %02d:%02d:%02d -> Notice: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); }break; default: { return false; } } } //Check whole file size. std::unique_lock<std::mutex> ErrLogMutex(ErrorLogLock); #if defined(PLATFORM_WIN) std::shared_ptr<WIN32_FILE_ATTRIBUTE_DATA> File_WIN32_FILE_ATTRIBUTE_DATA(new WIN32_FILE_ATTRIBUTE_DATA()); memset(File_WIN32_FILE_ATTRIBUTE_DATA.get(), 0, sizeof(WIN32_FILE_ATTRIBUTE_DATA)); if (GetFileAttributesExW(GlobalRunningStatus.Path_ErrorLog->c_str(), GetFileExInfoStandard, File_WIN32_FILE_ATTRIBUTE_DATA.get()) != FALSE) { std::shared_ptr<LARGE_INTEGER> ErrorFileSize(new LARGE_INTEGER()); memset(ErrorFileSize.get(), 0, sizeof(LARGE_INTEGER)); ErrorFileSize->HighPart = File_WIN32_FILE_ATTRIBUTE_DATA->nFileSizeHigh; ErrorFileSize->LowPart = File_WIN32_FILE_ATTRIBUTE_DATA->nFileSizeLow; if (ErrorFileSize->QuadPart > 0 && (size_t)ErrorFileSize->QuadPart >= Parameter.LogMaxSize && DeleteFileW(GlobalRunningStatus.Path_ErrorLog->c_str()) != 0) PrintError(LOG_ERROR_SYSTEM, L"Old Error Log file was deleted", 0, nullptr, 0); } File_WIN32_FILE_ATTRIBUTE_DATA.reset(); #elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX)) std::shared_ptr<struct stat> FileStat(new struct stat()); memset(FileStat.get(), 0, sizeof(struct stat)); if (stat(GlobalRunningStatus.sPath_ErrorLog->c_str(), FileStat.get()) == EXIT_SUCCESS && FileStat->st_size >= (off_t)Parameter.LogMaxSize && remove(GlobalRunningStatus.sPath_ErrorLog->c_str()) == EXIT_SUCCESS) PrintError(LOG_ERROR_SYSTEM, L"Old Error Log file was deleted", 0, nullptr, 0); FileStat.reset(); #endif //Main print #if defined(PLATFORM_WIN) FILE *Output = nullptr; if (_wfopen_s(&Output, GlobalRunningStatus.Path_ErrorLog->c_str(), L"a,ccs=UTF-8") == EXIT_SUCCESS && Output != nullptr) #elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX)) auto Output = fopen(GlobalRunningStatus.sPath_ErrorLog->c_str(), "a"); if (Output != nullptr) #endif { //Print start time before print errors. if (InnerStartTime > 0) { std::shared_ptr<tm> TimeStructureTemp(new tm()); memset(TimeStructureTemp.get(), 0, sizeof(tm)); #if defined(PLATFORM_WIN) if (localtime_s(TimeStructureTemp.get(), &InnerStartTime) > 0) #elif (defined(PLATFORM_LINUX) || defined(PLATFORM_MACX)) if (localtime_r(&InnerStartTime, TimeStructureTemp.get()) == nullptr) #endif { fclose(Output); return false; } fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Log opened at this moment.\n", TimeStructureTemp->tm_year + 1900, TimeStructureTemp->tm_mon + 1, TimeStructureTemp->tm_mday, TimeStructureTemp->tm_hour, TimeStructureTemp->tm_min, TimeStructureTemp->tm_sec); } //Print errors. switch (ErrorType) { //System Error case LOG_ERROR_SYSTEM: { if (ErrorCode == 0) { fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); } else { #if defined(PLATFORM_WIN) //About System Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx. if (ErrorCode == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls, ERROR_FAILED_SERVICE_CONTROLLER_CONNECT(The service process could not connect to the service controller).\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); else #endif fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> System Error: %ls, error code is %d.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message, (int)ErrorCode); } }break; //Parameter Error case LOG_ERROR_PARAMETER: { fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Parameter Error: %ls", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); if (FileName != nullptr) { //Delete double backslash. std::wstring sFileName(FileName); while (sFileName.find(L"\\\\") != std::wstring::npos) sFileName.erase(sFileName.find(L"\\\\"), wcslen(L"\\")); //Write to file if (Line > 0) fwprintf_s(Output, L" in line %d of %ls", (int)Line, sFileName.c_str()); else fwprintf_s(Output, L" in %ls", sFileName.c_str()); } //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. if (ErrorCode > 0) fwprintf_s(Output, L", error code is %d", (int)ErrorCode); fwprintf_s(Output, L".\n"); }break; //IPFilter Error case LOG_ERROR_IPFILTER: { fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> IPFilter Error: %ls", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); if (FileName != nullptr) { //Delete double backslash. std::wstring sFileName(FileName); while (sFileName.find(L"\\\\") != std::wstring::npos) sFileName.erase(sFileName.find(L"\\\\"), wcslen(L"\\")); //Write to file if (Line > 0) fwprintf_s(Output, L" in line %d of %ls", (int)Line, sFileName.c_str()); else fwprintf_s(Output, L" in %ls", sFileName.c_str()); } //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. if (ErrorCode > 0) fwprintf_s(Output, L", error code is %d", (int)ErrorCode); fwprintf_s(Output, L".\n"); }break; //Hosts Error case LOG_ERROR_HOSTS: { fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Hosts Error: %ls", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); if (FileName != nullptr) { //Delete double backslash. std::wstring sFileName(FileName); while (sFileName.find(L"\\\\") != std::wstring::npos) sFileName.erase(sFileName.find(L"\\\\"), wcslen(L"\\")); //Write to file if (Line > 0) fwprintf_s(Output, L" in line %d of %ls", (int)Line, sFileName.c_str()); else fwprintf_s(Output, L" in %ls", sFileName.c_str()); } //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. if (ErrorCode > 0) fwprintf_s(Output, L", error code is %d", (int)ErrorCode); fwprintf_s(Output, L".\n"); }break; //Network Error //About Windows Sockets Error Codes, see http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx. case LOG_ERROR_NETWORK: { if (ErrorCode == 0) fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Network Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); #if defined(PLATFORM_WIN) else if (ErrorCode == WSAENETUNREACH) //Block error messages when network is unreachable. break; #endif else fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Network Error: %ls, error code is %d.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message, (int)ErrorCode); }break; //WinPcap Error #if defined(ENABLE_PCAP) case LOG_ERROR_PCAP: { fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> WinPcap Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); }break; #endif //DNSCurve Error #if defined(ENABLE_LIBSODIUM) case LOG_ERROR_DNSCURVE: { #if defined(PLATFORM_WIN) if (ErrorCode == WSAENETUNREACH) //Block error messages when network is unreachable. break; else #endif fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> DNSCurve Error: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); }break; #endif //Notice case LOG_MESSAGE_NOTICE: { fwprintf_s(Output, L"%d-%02d-%02d %02d:%02d:%02d -> Notice: %ls.\n", TimeStructure->tm_year + 1900, TimeStructure->tm_mon + 1, TimeStructure->tm_mday, TimeStructure->tm_hour, TimeStructure->tm_min, TimeStructure->tm_sec, Message); }break; default: { fclose(Output); return false; } } //Close file. fclose(Output); return true; } return false; }
//DNSCurveConfigurationTable class MonitorItemToUsing function void DNSCurveConfigurationTable::MonitorItemToUsing( DNSCurveConfigurationTable *DNSCurveConfigurationParameter) { //[DNSCurve] block DNSCurveConfigurationParameter->DNSCurve_SocketTimeout_Reliable = DNSCurve_SocketTimeout_Reliable; DNSCurveConfigurationParameter->DNSCurve_SocketTimeout_Unreliable = DNSCurve_SocketTimeout_Unreliable; DNSCurveConfigurationParameter->KeyRecheckTime = KeyRecheckTime; //DNSCurve Keys if (DNSCurveConfigurationParameter->Client_PublicKey != nullptr && !CheckEmptyBuffer(Client_PublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) && memcmp(DNSCurveConfigurationParameter->Client_PublicKey, Client_PublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) != EXIT_SUCCESS) memcpy_s(DNSCurveConfigurationParameter->Client_PublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, Client_PublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->Client_SecretKey != nullptr && !CheckEmptyBuffer(Client_SecretKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) && memcmp(DNSCurveConfigurationParameter->Client_SecretKey, Client_SecretKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) != EXIT_SUCCESS) memcpy_s(DNSCurveConfigurationParameter->Client_SecretKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, Client_SecretKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.PrecomputationKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv4.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES, DNSCurveTarget.IPv4.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.PrecomputationKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv4.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES, DNSCurveTarget.Alternate_IPv4.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.PrecomputationKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv6.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES, DNSCurveTarget.IPv6.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.PrecomputationKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv6.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES, DNSCurveTarget.Alternate_IPv6.PrecomputationKey, sizeof(uint8_t) * crypto_box_BEFORENMBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ServerPublicKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) && memcmp(DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ServerPublicKey, DNSCurveTarget.IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) != EXIT_SUCCESS) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ServerPublicKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) && memcmp(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ServerPublicKey, DNSCurveTarget.Alternate_IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) != EXIT_SUCCESS) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.Alternate_IPv4.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ServerPublicKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) && memcmp(DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ServerPublicKey, DNSCurveTarget.IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) != EXIT_SUCCESS) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ServerPublicKey != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) && memcmp(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ServerPublicKey, DNSCurveTarget.Alternate_IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES) != EXIT_SUCCESS) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.Alternate_IPv6.ServerPublicKey, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ServerFingerprint != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv4.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.IPv4.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ServerFingerprint != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv4.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.Alternate_IPv4.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ServerFingerprint != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv6.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.IPv6.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ServerFingerprint != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv6.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES, DNSCurveTarget.Alternate_IPv6.ServerFingerprint, sizeof(uint8_t) * crypto_box_PUBLICKEYBYTES); //DNSCurve Magic Numbers if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ReceiveMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv4.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.IPv4.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ReceiveMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv4.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.Alternate_IPv4.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ReceiveMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv6.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.IPv6.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ReceiveMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv6.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.Alternate_IPv6.ReceiveMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.SendMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.SendMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.Alternate_IPv4.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.SendMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); if (DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.SendMagicNumber != nullptr && !CheckEmptyBuffer(DNSCurveTarget.Alternate_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN)) memcpy_s(DNSCurveConfigurationParameter->DNSCurveTarget.Alternate_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN, DNSCurveTarget.Alternate_IPv6.SendMagicNumber, DNSCURVE_MAGIC_QUERY_LEN); return; }