]> git.stg.codes - stg.git/commitdiff
Handle callback errors in bfstreams.
authorMaxim Mamontov <faust.madf@gmail.com>
Sat, 13 Sep 2014 21:55:55 +0000 (00:55 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Sat, 13 Sep 2014 21:55:55 +0000 (00:55 +0300)
stglibs/crypto.lib/Makefile
stglibs/crypto.lib/bfstream.cpp
stglibs/crypto.lib/include/stg/bfstream.h

index 6e83e01ee1d568fe808c27fe6e3e0b99479e958a..47e91203569c6e2aafa8d11fc0ec7e34e7b0ba11 100644 (file)
@@ -5,9 +5,11 @@
 LIB_NAME = stgcrypto
 
 SRCS = ag_md5.c \
-       blowfish.c
+       blowfish.c \
+       bfstream.cpp
 
 INCS = ag_md5.h \
-       blowfish.h
+       blowfish.h \
+       bfstream.h
 
 include ../Makefile.in
index 24aa7e1011bf14bcf4b13243bed9e4810daca1a3..21a0d55d88d88416dce8e9c332296edc19b3cf1e 100644 (file)
@@ -16,14 +16,15 @@ 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));
@@ -38,14 +39,18 @@ class COMMON
             size -= sizeof(m_buffer) - dataSize; // Adjust size
             data = static_cast<const char *>(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;
@@ -53,6 +58,7 @@ class COMMON
         void * m_data;
         BLOWFISH_CTX m_ctx;
         PROC m_proc;
+        bool m_ok;
 
         void m_tryConsume(bool last)
         {
@@ -66,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;
@@ -108,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))
 {}
@@ -121,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();
+}
index 41b443305dfb79965559e6472a86cd84f5d8ca5c..bead8d00ad26f30b25ec69b2c80cc936f6ff2e73 100644 (file)
@@ -10,12 +10,14 @@ namespace STG
 class ENCRYPT_STREAM
 {
     public:
-        typedef void (* CALLBACK)(const void * block, size_t size, void * data);
+        typedef bool (* CALLBACK)(const void * block, size_t size, void * data);
 
         ENCRYPT_STREAM(const std::string & key, CALLBACK callback, void * data);
         ~ENCRYPT_STREAM();
         void Put(const void * data, size_t size, bool last = false);
 
+        bool isOk() const;
+
     private:
         class IMPL;
 
@@ -25,12 +27,14 @@ class ENCRYPT_STREAM
 class DECRYPT_STREAM
 {
     public:
-        typedef void (* CALLBACK)(const void * block, size_t size, void * data);
+        typedef bool (* CALLBACK)(const void * block, size_t size, void * data);
 
         DECRYPT_STREAM(const std::string & key, CALLBACK callback, void * data);
         ~DECRYPT_STREAM();
         void Put(const void * data, size_t size, bool last = false);
 
+        bool isOk() const;
+
     private:
         class IMPL;