8 #include <botan/internal/compress_utils.h>
9 #include <botan/exceptn.h>
13 void* Compression_Alloc_Info::do_malloc(
size_t n,
size_t size)
15 const size_t total_size = n * size;
21 void* ptr = std::malloc(total_size);
33 std::memset(ptr, 0, total_size);
34 m_current_allocs[ptr] = total_size;
40 void Compression_Alloc_Info::do_free(
void* ptr)
44 auto i = m_current_allocs.find(ptr);
46 if(i == m_current_allocs.end())
47 throw Exception(
"Compression_Alloc_Info::free got pointer not allocated by us");
51 m_current_allocs.erase(i);
60 void Stream_Compression::start(
size_t level)
62 m_stream.reset(make_stream(level));
65 void Stream_Compression::process(secure_vector<uint8_t>& buf,
size_t offset, uint32_t
flags)
70 if(m_buffer.size() < buf.size() + offset)
71 m_buffer.resize(buf.size() + offset);
78 if(m_buffer.size() == 0)
81 m_stream->next_in(buf.data() + offset, buf.size() - offset);
82 m_stream->next_out(m_buffer.data() + offset, m_buffer.size() - offset);
88 if(m_stream->avail_out() == 0)
90 const size_t added = 8 + m_buffer.size();
91 m_buffer.resize(m_buffer.size() + added);
92 m_stream->next_out(m_buffer.data() + m_buffer.size() - added, added);
94 else if(m_stream->avail_in() == 0)
96 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
101 copy_mem(m_buffer.data(), buf.data(), offset);
108 process(buf, offset, flush ? m_stream->flush_flag() : m_stream->run_flag());
114 process(buf, offset, m_stream->finish_flag());
123 void Stream_Decompression::start()
125 m_stream.reset(make_stream());
128 void Stream_Decompression::process(secure_vector<uint8_t>& buf,
size_t offset, uint32_t flags)
133 if(m_buffer.size() < buf.size() + offset)
134 m_buffer.resize(buf.size() + offset);
136 m_stream->next_in(buf.data() + offset, buf.size() - offset);
137 m_stream->next_out(m_buffer.data() + offset, m_buffer.size() - offset);
141 const bool stream_end = m_stream->run(flags);
145 if(m_stream->avail_in() == 0)
147 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
153 const size_t read = (buf.size() - offset) - m_stream->avail_in();
155 m_stream->next_in(buf.data() + offset + read, buf.size() - offset - read);
158 if(m_stream->avail_out() == 0)
160 const size_t added = 8 + m_buffer.size();
161 m_buffer.resize(m_buffer.size() + added);
162 m_stream->next_out(m_buffer.data() + m_buffer.size() - added, added);
164 else if(m_stream->avail_in() == 0)
166 m_buffer.resize(m_buffer.size() - m_stream->avail_out());
171 copy_mem(m_buffer.data(), buf.data(), offset);
177 process(buf, offset, m_stream->run_flag());
182 if(buf.size() != offset || m_stream.get())
183 process(buf, offset, m_stream->finish_flag());
void secure_scrub_memory(void *ptr, size_t n)
void finish(secure_vector< uint8_t > &buf, size_t offset) finaloverride
void update(secure_vector< uint8_t > &buf, size_t offset) finaloverride
void update(secure_vector< uint8_t > &buf, size_t offset, bool flush) finaloverride
#define BOTAN_ASSERT(expr, assertion_made)
std::vector< T, secure_allocator< T >> secure_vector
#define BOTAN_ASSERT_EQUAL(expr1, expr2, assertion_made)
void finish(secure_vector< uint8_t > &buf, size_t offset) finaloverride
void copy_mem(T *out, const T *in, size_t n)
void clear() finaloverride
virtual std::string name() const =0
void clear() finaloverride