X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/27fd26be047af5ccd9d023cf0134fcbf272f18cd..56b1d97151af8cc1f3f7143450bdf3008e246f55:/stglibs/crypto.lib/bfstream.cpp diff --git a/stglibs/crypto.lib/bfstream.cpp b/stglibs/crypto.lib/bfstream.cpp index 4f376c5d..21a0d55d 100644 --- a/stglibs/crypto.lib/bfstream.cpp +++ b/stglibs/crypto.lib/bfstream.cpp @@ -16,16 +16,18 @@ const size_t BUFFER_SIZE = BFSTREAM_BUF_SIZE; class COMMON { public: - typedef void (* CALLBACK)(const void * block, size_t size, void * data); + typedef bool (* CALLBACK)(const void * block, size_t size, void * data); typedef void (* PROC)(void * dest, const void * source, size_t length, const BLOWFISH_CTX * ctx); COMMON(const std::string & key, CALLBACK callback, void * data, PROC proc) : m_ptr(m_buffer), m_callback(callback), m_data(data), - m_proc(proc) + m_proc(proc), + m_ok(true) { InitContext(key.c_str(), key.length(), &m_ctx); + memset(m_buffer, 0, sizeof(m_buffer)); } void Put(const void * data, size_t size, bool last) @@ -35,16 +37,20 @@ class COMMON { memcpy(m_ptr, data, sizeof(m_buffer) - dataSize); // Fill buffer size -= sizeof(m_buffer) - dataSize; // Adjust size - data += sizeof(m_buffer) - dataSize; // Adjust data pointer + data = static_cast(data) + sizeof(m_buffer) - dataSize; // Adjust data pointer m_proc(m_buffer, m_buffer, sizeof(m_buffer), &m_ctx); // Process - m_callback(m_buffer, sizeof(m_buffer), m_data); // Consume + m_ok = m_ok && m_callback(m_buffer, sizeof(m_buffer), m_data); // Consume m_ptr = m_buffer; } + if (!m_ok) + return; memcpy(m_ptr, data, size); m_ptr += size; m_tryConsume(last); } + bool isOk() const { return m_ok; } + private: char m_buffer[BUFFER_SIZE]; char * m_ptr; @@ -52,6 +58,7 @@ class COMMON void * m_data; BLOWFISH_CTX m_ctx; PROC m_proc; + bool m_ok; void m_tryConsume(bool last) { @@ -65,7 +72,9 @@ class COMMON if (dataSize == 0) return; m_proc(m_buffer, m_buffer, dataSize, &m_ctx); - m_callback(m_buffer, dataSize, m_data); + m_ok = m_ok && m_callback(m_buffer, dataSize, m_data); + if (!m_ok) + return; if (remainder > 0) memmove(m_buffer, m_buffer + dataSize, remainder); m_ptr = m_buffer + remainder; @@ -107,6 +116,11 @@ void ENCRYPT_STREAM::Put(const void * data, size_t size, bool last) m_impl->Put(data, size, last); } +bool ENCRYPT_STREAM::isOk() const +{ +return m_impl->isOk(); +} + DECRYPT_STREAM::DECRYPT_STREAM(const std::string & key, CALLBACK callback, void * data) : m_impl(new IMPL(key, callback, data)) {} @@ -120,3 +134,8 @@ void DECRYPT_STREAM::Put(const void * data, size_t size, bool last) { m_impl->Put(data, size, last); } + +bool DECRYPT_STREAM::isOk() const +{ +return m_impl->isOk(); +}