9#include <botan/internal/secqueue.h>
11#include <botan/mem_ops.h>
19class SecureQueueNode final {
21 SecureQueueNode() : m_next(nullptr), m_buffer(
DefaultBufferSize), m_start(0), m_end(0) {}
28 SecureQueueNode(
const SecureQueueNode& other) =
delete;
29 SecureQueueNode(SecureQueueNode&& other) =
delete;
30 SecureQueueNode& operator=(
const SecureQueueNode& other) =
delete;
31 SecureQueueNode& operator=(SecureQueueNode&& other) =
delete;
33 size_t write(
const uint8_t input[],
size_t length) {
34 size_t copied = std::min<size_t>(length, m_buffer.size() - m_end);
35 copy_mem(m_buffer.data() + m_end, input, copied);
40 size_t read(uint8_t output[],
size_t length) {
41 size_t copied = std::min(length, m_end - m_start);
42 copy_mem(output, m_buffer.data() + m_start, copied);
47 size_t peek(uint8_t output[],
size_t length,
size_t offset = 0) {
48 const size_t left = m_end - m_start;
52 size_t copied = std::min(length, left - offset);
53 copy_mem(output, m_buffer.data() + m_start + offset, copied);
57 size_t size()
const {
return (m_end - m_start); }
60 friend class SecureQueue;
61 SecureQueueNode* m_next;
63 size_t m_start, m_end;
71 m_head = m_tail =
new SecureQueueNode;
80 m_head = m_tail =
new SecureQueueNode;
81 SecureQueueNode* temp = input.m_head;
82 while(temp !=
nullptr) {
83 write(&temp->m_buffer[temp->m_start], temp->m_end - temp->m_start);
91void SecureQueue::destroy() {
92 SecureQueueNode* temp = m_head;
93 while(temp !=
nullptr) {
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;
113 while(temp !=
nullptr) {
114 write(&temp->m_buffer[temp->m_start], temp->m_end - temp->m_start);
124 if(m_head ==
nullptr) {
125 m_head = m_tail =
new SecureQueueNode;
128 const size_t n = m_tail->write(input, length);
132 m_tail->m_next =
new SecureQueueNode;
133 m_tail = m_tail->m_next;
143 while(length > 0 && m_head !=
nullptr) {
144 const size_t n = m_head->read(output, length);
148 if(m_head->size() == 0) {
149 SecureQueueNode* holder = m_head->m_next;
162 SecureQueueNode* current = m_head;
164 while(offset > 0 && current !=
nullptr) {
165 if(offset >= current->size()) {
166 offset -= current->size();
167 current = current->m_next;
174 while(length > 0 && current !=
nullptr) {
175 const size_t n = current->peek(output, length, offset);
180 current = current->m_next;
196 SecureQueueNode* current = m_head;
199 while(current !=
nullptr) {
200 count += current->size();
201 current = current->m_next;
210 return (
size() == 0);
214 return (
size() == 0);
void set_next(Filter *f[], size_t n)
bool end_of_data() const override
SecureQueue & operator=(const SecureQueue &other)
size_t peek(uint8_t output[], size_t length, size_t offset=0) const override
size_t get_bytes_read() const override
SecureQueue(SecureQueue &&other)=delete
size_t read(uint8_t output[], size_t length) override
void write(const uint8_t input[], size_t length) override
constexpr void copy_mem(T *out, const T *in, size_t n)
std::vector< T, secure_allocator< T > > secure_vector
constexpr size_t DefaultBufferSize