1 /*
2 * SecureQueue
3 * (C) 1999-2007 Jack Lloyd
4 *     2012 Markus Wanner
5 *
6 * Botan is released under the Simplified BSD License (see license.txt)
7 */
8 
9 #ifndef BOTAN_SECURE_QUEUE_H_
10 #define BOTAN_SECURE_QUEUE_H_
11 
12 #include <botan/data_src.h>
13 #include <botan/filter.h>
14 
15 BOTAN_FUTURE_INTERNAL_HEADER(secqueue.h)
16 
17 namespace Botan {
18 
19 /**
20 * A queue that knows how to zeroize itself
21 */
22 class BOTAN_PUBLIC_API(2,0) SecureQueue final : public Fanout_Filter, public DataSource
23    {
24    public:
name()25       std::string name() const override { return "Queue"; }
26 
27       void write(const uint8_t[], size_t) override;
28 
29       size_t read(uint8_t[], size_t) override;
30       size_t peek(uint8_t[], size_t, size_t = 0) const override;
31       size_t get_bytes_read() const override;
32 
33       bool end_of_data() const override;
34 
35       bool empty() const;
36 
check_available(size_t n)37       bool check_available(size_t n) override { return n <= size(); }
38 
39       /**
40       * @return number of bytes available in the queue
41       */
42       size_t size() const;
43 
attachable()44       bool attachable() override { return false; }
45 
46       /**
47       * SecureQueue assignment
48       * @param other the queue to copy
49       */
50       SecureQueue& operator=(const SecureQueue& other);
51 
52       /**
53       * SecureQueue default constructor (creates empty queue)
54       */
55       SecureQueue();
56 
57       /**
58       * SecureQueue copy constructor
59       * @param other the queue to copy
60       */
61       SecureQueue(const SecureQueue& other);
62 
~SecureQueue()63       ~SecureQueue() { destroy(); }
64 
65    private:
66       void destroy();
67       size_t m_bytes_read;
68       class SecureQueueNode* m_head;
69       class SecureQueueNode* m_tail;
70    };
71 
72 }
73 
74 #endif
75