9#include <botan/secqueue.h>
17class SecureQueueNode
final
20 SecureQueueNode() : m_buffer(BOTAN_DEFAULT_BUFFER_SIZE)
21 { m_next =
nullptr; m_start = m_end = 0; }
23 ~SecureQueueNode() { m_next =
nullptr; m_start = m_end = 0; }
25 size_t write(
const uint8_t input[],
size_t length)
27 size_t copied = std::min<size_t>(length, m_buffer.size() - m_end);
28 copy_mem(m_buffer.data() + m_end, input, copied);
33 size_t read(uint8_t output[],
size_t length)
35 size_t copied = std::min(length, m_end - m_start);
36 copy_mem(output, m_buffer.data() + m_start, copied);
41 size_t peek(uint8_t output[],
size_t length,
size_t offset = 0)
43 const size_t left = m_end - m_start;
44 if(offset >= left)
return 0;
45 size_t copied = std::min(length, left - offset);
46 copy_mem(output, m_buffer.data() + m_start + offset, copied);
50 size_t size()
const {
return (m_end - m_start); }
52 friend class SecureQueue;
53 SecureQueueNode* m_next;
54 secure_vector<uint8_t> m_buffer;
55 size_t m_start, m_end;
65 m_head = m_tail =
new SecureQueueNode;
77 m_head = m_tail =
new SecureQueueNode;
78 SecureQueueNode* temp = input.m_head;
81 write(&temp->m_buffer[temp->m_start], temp->m_end - temp->m_start);
89void SecureQueue::destroy()
91 SecureQueueNode* temp = m_head;
94 SecureQueueNode* holder = temp->m_next;
98 m_head = m_tail =
nullptr;
111 m_head = m_tail =
new SecureQueueNode;
112 SecureQueueNode* temp = input.m_head;
115 write(&temp->m_buffer[temp->m_start], temp->m_end - temp->m_start);
127 m_head = m_tail =
new SecureQueueNode;
130 const size_t n = m_tail->write(input, length);
135 m_tail->m_next =
new SecureQueueNode;
136 m_tail = m_tail->m_next;
147 while(length && m_head)
149 const size_t n = m_head->read(output, length);
153 if(m_head->size() == 0)
155 SecureQueueNode* holder = m_head->m_next;
169 SecureQueueNode* current = m_head;
171 while(offset && current)
173 if(offset >= current->size())
175 offset -= current->size();
176 current = current->m_next;
183 while(length && current)
185 const size_t n = current->peek(output, length, offset);
190 current = current->m_next;
208 SecureQueueNode* current = m_head;
213 count += current->size();
214 current = current->m_next;
224 return (
size() == 0);
229 return (
size() == 0);
void set_next(Filter *f[], size_t n)
bool end_of_data() const override
SecureQueue & operator=(const SecureQueue &other)
size_t read(uint8_t[], size_t) override
void write(const uint8_t[], size_t) override
size_t get_bytes_read() const override
size_t peek(uint8_t[], size_t, size_t=0) const override
int(* final)(unsigned char *, CTX *)
void copy_mem(T *out, const T *in, size_t n)