From d99001d6ebb957272f399dd371bf571c8c16f248 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Sun, 25 Oct 2026 17:48:20 -0500 Subject: [PATCH] Fix NX, add constant time compare --- changelog.md | 2 +- include/TessesFramework/Common.hpp | 59 ------------------- include/TessesFramework/Crypto/Crypto.hpp | 2 +- .../TessesFramework/Streams/NetworkStream.hpp | 10 +--- include/TessesFramework/Streams/Stream.hpp | 16 ----- src/Crypto/MbedTLS/Crypto.cpp | 2 +- src/Filesystem/LocalFS.cpp | 14 ++++- 7 files changed, 16 insertions(+), 89 deletions(-) diff --git a/changelog.md b/changelog.md index fa5cd8e..825b39e 100644 --- a/changelog.md +++ b/changelog.md @@ -1,7 +1,7 @@ # Changelog ## 0.0.10 -Fix NX, add constant time compare, add TF_Span +Fix NX, add constant time compare ## 0.0.9 Make html parser use case insensitive unordered_map for attributes diff --git a/include/TessesFramework/Common.hpp b/include/TessesFramework/Common.hpp index 4e217fe..8051506 100644 --- a/include/TessesFramework/Common.hpp +++ b/include/TessesFramework/Common.hpp @@ -40,66 +40,7 @@ namespace Tesses::Framework { -template -class TF_Span { - public: - using value_type = T; - using pointer = T*; - using const_pointer = const T*; - using reference = T&; - using const_reference = const T&; - using size_type = std::size_t; - constexpr TF_Span(pointer data, size_type size) : data_(data), size_(size) {} - template - constexpr TF_Span(T (&arr)[N]) : data_(arr), size_(N) {} - template - constexpr TF_Span(const Container& container) : data_(container.data()), size_(container.size()) { - static_assert(std::is_same::value,"Container value_type must match Span's type"); - } - reference operator[](size_type index) { - return data_[index]; - } - const_reference operator[](size_type index) const { - return data_[index]; - } - - const_reference at(size_type index) const { - if (index >= size_) { - throw std::out_of_range("Index out of range"); - } - return data_[index]; - } - - // Data and size - pointer data() noexcept { return data_; } - const_pointer data() const noexcept { return data_; } - - size_type size() const noexcept { return size_; } - bool empty() const noexcept { return size_ == 0; } - - // Iterators - pointer begin() noexcept { return data_; } - pointer end() noexcept { return data_ + size_; } - - const_pointer begin() const noexcept { return data_; } - const_pointer end() const noexcept { return data_ + size_; } - TF_Span subspan(size_type offset, size_type count = static_cast(-1)) const { - if (offset > size_) { - throw std::out_of_range("Offset out of range"); - } - count = (count == static_cast(-1)) ? (size_ - offset) : count; - if (count > size_ - offset) { - throw std::out_of_range("Count exceeds remaining elements"); - } - return TF_Span(data_ + offset, count); - } - - - private: - pointer data_; - size_type size_; -}; class TF_Timer_Handle; // Used for internal purposes, don't use unless you want to run timer events on // another thread diff --git a/include/TessesFramework/Crypto/Crypto.hpp b/include/TessesFramework/Crypto/Crypto.hpp index ff74ba3..f3f8315 100644 --- a/include/TessesFramework/Crypto/Crypto.hpp +++ b/include/TessesFramework/Crypto/Crypto.hpp @@ -317,7 +317,7 @@ typedef enum { bool PBKDF2(std::vector &output, std::string pass, std::vector &salt, long itterations, ShaVersion version); -bool ConstantEquals(const TF_Span left, const TF_Span right); +bool ConstantEquals(const std::vector& left, const std::vector& right); /** * @brief Get secure random bytes diff --git a/include/TessesFramework/Streams/NetworkStream.hpp b/include/TessesFramework/Streams/NetworkStream.hpp index 40163ce..f0b949d 100644 --- a/include/TessesFramework/Streams/NetworkStream.hpp +++ b/include/TessesFramework/Streams/NetworkStream.hpp @@ -80,15 +80,7 @@ class NetworkStream : public Stream { size_t ReadFrom(uint8_t *buff, size_t sz, std::string &ip, uint16_t &port); size_t WriteTo(const uint8_t *buff, size_t sz, std::string ip, uint16_t port); - size_t ReadFrom(TF_Span buff, std::string &ip, uint16_t &port) - { - return ReadFrom(buff.data(),buff.size(),ip, port); - } - size_t WriteTo(const TF_Span buff, std::string ip, - uint16_t port) - { - return WriteTo(buff.data(),buff.size(),ip, port); - } + static std::vector> GetIPs(bool ipV6 = false); diff --git a/include/TessesFramework/Streams/Stream.hpp b/include/TessesFramework/Streams/Stream.hpp index a85f401..9bc3d16 100644 --- a/include/TessesFramework/Streams/Stream.hpp +++ b/include/TessesFramework/Streams/Stream.hpp @@ -35,22 +35,6 @@ class Stream { virtual size_t Write(const uint8_t *buff, size_t sz); size_t ReadBlock(uint8_t *buff, size_t sz); void WriteBlock(const uint8_t *buff, size_t sz); - size_t Read(TF_Span buff) { - return Read(buff.data(), buff.size()); - } - size_t Write(const TF_Span buff) - { - return Write(buff.data(), buff.size()); - } - size_t ReadBlock(TF_Span buff) - { - return ReadBlock(buff.data(), buff.size()); - } - void WriteBlock(const TF_Span buff) - { - WriteBlock(buff.data(),buff.size()); - } - virtual bool CanRead(); virtual bool CanWrite(); diff --git a/src/Crypto/MbedTLS/Crypto.cpp b/src/Crypto/MbedTLS/Crypto.cpp index 73ba7e3..ea8f74e 100644 --- a/src/Crypto/MbedTLS/Crypto.cpp +++ b/src/Crypto/MbedTLS/Crypto.cpp @@ -377,7 +377,7 @@ bool RandomBytes(std::vector &output, std::string personal_str) { #endif return false; } -bool ConstantEquals(const TF_Span left, const TF_Span right) +bool ConstantEquals(const std::vector& left, const std::vector& right) { if (left.size() != right.size()) return false; if (left.empty()) return true; diff --git a/src/Filesystem/LocalFS.cpp b/src/Filesystem/LocalFS.cpp index 9594039..ca8eb63 100644 --- a/src/Filesystem/LocalFS.cpp +++ b/src/Filesystem/LocalFS.cpp @@ -282,13 +282,23 @@ FIFOCreationResult LocalFilesystem::CreateFIFO(VFSPath path, uint32_t mod) { void LocalFilesystem::Lock(VFSPath path) { auto p2 = VFSPathToSystem(path); const char *fopenPath = p2.c_str(); - while (true) { + for (int i = 0; i < 10; i++) { FILE *fp = fopen(fopenPath, "wx"); if (fp) { fclose(fp); - break; + return; } + + if (errno != EEXIST) { + std::string error_msg("Failed to acquire lock on "); + error_msg += p2; + error_msg += ": "; + error_msg += strerror(errno); + throw std::runtime_error(error_msg); + } + TF_Sleep(100); } + throw std::runtime_error("Lock acquisition timed out for " + p2); } void LocalFilesystem::Unlock(VFSPath path) { std::error_code error;