Botan 3.13.0
Crypto and TLS for C&
compress_utils.h
Go to the documentation of this file.
1/*
2* Compression utility header
3* (C) 2014 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#ifndef BOTAN_COMPRESSION_UTILS_H_
9#define BOTAN_COMPRESSION_UTILS_H_
10
11#include <botan/compression.h>
12
13#include <botan/exceptn.h>
14#include <botan/mem_ops.h>
15#include <limits>
16#include <memory>
17#include <unordered_map>
18
19namespace Botan {
20
21/*
22* Allocation Size Tracking Helper for Zlib/Bzlib/LZMA
23*/
25 public:
26 template <typename T>
27 static void* malloc(void* self, T n, T size) noexcept {
28 return static_cast<Compression_Alloc_Info*>(self)->do_malloc(n, size);
29 }
30
31 static void free(void* self, void* ptr) noexcept { static_cast<Compression_Alloc_Info*>(self)->do_free(ptr); }
32
33 private:
34 void* do_malloc(size_t n, size_t size) noexcept;
35 void do_free(void* ptr) noexcept;
36
37 std::unordered_map<void*, size_t> m_current_allocs;
38};
39
40/**
41* Wrapper for Zlib/Bzlib/LZMA stream types
42*/
43template <typename Stream, typename ByteType, typename StreamLenType = size_t>
45 public:
46 void next_in(uint8_t* b, size_t len) override {
47 if(len > std::numeric_limits<StreamLenType>::max()) {
48 throw Not_Implemented("Compression chunk is too large for this backend's length field");
49 }
50 m_stream.next_in = reinterpret_cast<ByteType*>(b);
51 m_stream.avail_in = static_cast<StreamLenType>(len);
52 }
53
54 void next_out(uint8_t* b, size_t len) override {
55 if(len > std::numeric_limits<StreamLenType>::max()) {
56 throw Not_Implemented("Compression chunk is too large for this backend's length field");
57 }
58 m_stream.next_out = reinterpret_cast<ByteType*>(b);
59 m_stream.avail_out = static_cast<StreamLenType>(len);
60 }
61
62 size_t avail_in() const override { return m_stream.avail_in; }
63
64 size_t avail_out() const override { return m_stream.avail_out; }
65
66 Zlib_Style_Stream() : m_allocs(std::make_unique<Compression_Alloc_Info>()) { clear_mem(&m_stream, 1); }
67
68 Zlib_Style_Stream(const Zlib_Style_Stream& other) = delete;
72
73 ~Zlib_Style_Stream() override { clear_mem(&m_stream, 1); }
74
75 protected:
76 typedef Stream stream_t;
77
78 stream_t* streamp() { return &m_stream; }
79
80 Compression_Alloc_Info* alloc() { return m_allocs.get(); }
81
82 private:
83 stream_t m_stream;
84 std::unique_ptr<Compression_Alloc_Info> m_allocs;
85};
86
87} // namespace Botan
88
89#endif
static void free(void *self, void *ptr) noexcept
static void * malloc(void *self, T n, T size) noexcept
size_t avail_out() const override
Compression_Alloc_Info * alloc()
Zlib_Style_Stream(Zlib_Style_Stream &&other)=delete
size_t avail_in() const override
void next_out(uint8_t *b, size_t len) override
Zlib_Style_Stream & operator=(Zlib_Style_Stream &&other)=delete
Zlib_Style_Stream & operator=(const Zlib_Style_Stream &other)=delete
void next_in(uint8_t *b, size_t len) override
Zlib_Style_Stream(const Zlib_Style_Stream &other)=delete
constexpr void clear_mem(T *ptr, size_t n)
Definition mem_ops.h:118