8#include <botan/internal/compress_utils.h>
9#include <botan/exceptn.h>
14void* Compression_Alloc_Info::do_malloc(
size_t n,
size_t size)
17 void* ptr = std::calloc(n, size);
29 m_current_allocs[ptr] = n * size;
35void Compression_Alloc_Info::do_free(
void* ptr)
39 auto i = m_current_allocs.find(ptr);
41 if(i == m_current_allocs.end())
42 throw Internal_Error(
"Compression_Alloc_Info::free got pointer not allocated by us");
46 m_current_allocs.erase(i);
55void Stream_Compression::start(
size_t level)
57 m_stream = make_stream(level);
60void Stream_Compression::process(secure_vector<uint8_t>& buf,
size_t offset, uint32_t
flags)
66 if(buf.size() == offset &&
flags == m_stream->run_flag())
71 if(m_buffer.size() < buf.size() + offset)
72 m_buffer.resize(buf.size() + offset);
79 if(m_buffer.size() == 0)
82 m_stream->next_in(buf.data() + offset, buf.size() - offset);
83 m_stream->next_out(m_buffer.data() + offset, m_buffer.size() - offset);
87 const bool stream_end = m_stream->run(
flags);
91 BOTAN_ASSERT(m_stream->avail_in() == 0,
"After stream is done, no input remains to be processed");
92 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
95 else if(m_stream->avail_out() == 0)
97 const size_t added = 8 + m_buffer.size();
98 m_buffer.resize(m_buffer.size() + added);
99 m_stream->next_out(m_buffer.data() + m_buffer.size() - added, added);
101 else if(m_stream->avail_in() == 0)
103 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
108 copy_mem(m_buffer.data(), buf.data(), offset);
115 process(buf, offset, flush ? m_stream->flush_flag() : m_stream->run_flag());
121 process(buf, offset, m_stream->finish_flag());
130void Stream_Decompression::start()
132 m_stream = make_stream();
135void Stream_Decompression::process(secure_vector<uint8_t>& buf,
size_t offset, uint32_t
flags)
140 if(m_buffer.size() < buf.size() + offset)
141 m_buffer.resize(buf.size() + offset);
143 m_stream->next_in(buf.data() + offset, buf.size() - offset);
144 m_stream->next_out(m_buffer.data() + offset, m_buffer.size() - offset);
148 const bool stream_end = m_stream->run(
flags);
152 if(m_stream->avail_in() == 0)
154 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
160 const size_t read = (buf.size() - offset) - m_stream->avail_in();
162 m_stream->next_in(buf.data() + offset + read, buf.size() - offset - read);
165 if(m_stream->avail_out() == 0)
167 const size_t added = 8 + m_buffer.size();
168 m_buffer.resize(m_buffer.size() + added);
169 m_stream->next_out(m_buffer.data() + m_buffer.size() - added, added);
171 else if(m_stream->avail_in() == 0)
173 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
178 copy_mem(m_buffer.data(), buf.data(), offset);
184 process(buf, offset, m_stream->run_flag());
189 if(buf.size() != offset || m_stream.get())
190 process(buf, offset, m_stream->finish_flag());
#define BOTAN_ASSERT(expr, assertion_made)
virtual std::string name() const =0
void finish(secure_vector< uint8_t > &buf, size_t offset) final override
void clear() final override
void update(secure_vector< uint8_t > &buf, size_t offset, bool flush) final override
void finish(secure_vector< uint8_t > &buf, size_t offset) final override
void clear() final override
void update(secure_vector< uint8_t > &buf, size_t offset) final override
constexpr void copy_mem(T *out, const T *in, size_t n)
void secure_scrub_memory(void *ptr, size_t n)
std::vector< T, secure_allocator< T > > secure_vector