Coverage Report

Created: 2023-01-25 06:35

/src/botan/build/include/botan/data_src.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
* DataSource
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_DATA_SRC_H_
10
#define BOTAN_DATA_SRC_H_
11
12
#include <botan/secmem.h>
13
#include <string>
14
#include <iosfwd>
15
16
namespace Botan {
17
18
/**
19
* This class represents an abstract data source object.
20
*/
21
class BOTAN_PUBLIC_API(2,0) DataSource
22
   {
23
   public:
24
      /**
25
      * Read from the source. Moves the internal offset so that every
26
      * call to read will return a new portion of the source.
27
      *
28
      * @param out the byte array to write the result to
29
      * @param length the length of the byte array out
30
      * @return length in bytes that was actually read and put
31
      * into out
32
      */
33
      [[nodiscard]] virtual size_t read(uint8_t out[], size_t length) = 0;
34
35
      virtual bool check_available(size_t n) = 0;
36
37
      /**
38
      * Read from the source but do not modify the internal
39
      * offset. Consecutive calls to peek() will return portions of
40
      * the source starting at the same position.
41
      *
42
      * @param out the byte array to write the output to
43
      * @param length the length of the byte array out
44
      * @param peek_offset the offset into the stream to read at
45
      * @return length in bytes that was actually read and put
46
      * into out
47
      */
48
      [[nodiscard]] virtual size_t peek(uint8_t out[], size_t length, size_t peek_offset) const = 0;
49
50
      /**
51
      * Test whether the source still has data that can be read.
52
      * @return true if there is no more data to read, false otherwise
53
      */
54
      virtual bool end_of_data() const = 0;
55
      /**
56
      * return the id of this data source
57
      * @return std::string representing the id of this data source
58
      */
59
0
      virtual std::string id() const { return ""; }
60
61
      /**
62
      * Read one byte.
63
      * @param out the byte to read to
64
      * @return length in bytes that was actually read and put
65
      * into out
66
      */
67
      size_t read_byte(uint8_t& out);
68
69
      /**
70
      * Peek at one byte.
71
      * @param out an output byte
72
      * @return length in bytes that was actually read and put
73
      * into out
74
      */
75
      size_t peek_byte(uint8_t& out) const;
76
77
      /**
78
      * Discard the next N bytes of the data
79
      * @param N the number of bytes to discard
80
      * @return number of bytes actually discarded
81
      */
82
      size_t discard_next(size_t N);
83
84
      /**
85
      * @return number of bytes read so far.
86
      */
87
      virtual size_t get_bytes_read() const = 0;
88
89
1.32M
      DataSource() = default;
90
1.32M
      virtual ~DataSource() = default;
91
      DataSource& operator=(const DataSource&) = delete;
92
      DataSource(const DataSource&) = delete;
93
   };
94
95
/**
96
* This class represents a Memory-Based DataSource
97
*/
98
class BOTAN_PUBLIC_API(2,0) DataSource_Memory final : public DataSource
99
   {
100
   public:
101
      size_t read(uint8_t[], size_t) override;
102
      size_t peek(uint8_t[], size_t, size_t) const override;
103
      bool check_available(size_t n) override;
104
      bool end_of_data() const override;
105
106
      /**
107
      * Construct a memory source that reads from a string
108
      * @param in the string to read from
109
      */
110
      explicit DataSource_Memory(const std::string& in);
111
112
      /**
113
      * Construct a memory source that reads from a byte array
114
      * @param in the byte array to read from
115
      * @param length the length of the byte array
116
      */
117
      DataSource_Memory(const uint8_t in[], size_t length) :
118
323k
         m_source(in, in + length), m_offset(0) {}
119
120
      /**
121
      * Construct a memory source that reads from a secure_vector
122
      * @param in the MemoryRegion to read from
123
      */
124
      explicit DataSource_Memory(const secure_vector<uint8_t>& in) :
125
382k
         m_source(in), m_offset(0) {}
126
127
      /**
128
      * Construct a memory source that reads from a std::vector
129
      * @param in the MemoryRegion to read from
130
      */
131
      explicit DataSource_Memory(const std::vector<uint8_t>& in) :
132
12.3k
         m_source(in.begin(), in.end()), m_offset(0) {}
133
134
0
      size_t get_bytes_read() const override { return m_offset; }
135
   private:
136
      secure_vector<uint8_t> m_source;
137
      size_t m_offset;
138
   };
139
140
/**
141
* This class represents a Stream-Based DataSource.
142
*/
143
class BOTAN_PUBLIC_API(2,0) DataSource_Stream final : public DataSource
144
   {
145
   public:
146
      size_t read(uint8_t[], size_t) override;
147
      size_t peek(uint8_t[], size_t, size_t) const override;
148
      bool check_available(size_t n) override;
149
      bool end_of_data() const override;
150
      std::string id() const override;
151
152
      DataSource_Stream(std::istream&,
153
                        const std::string& id = "<std::istream>");
154
155
#if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
156
      /**
157
      * Construct a Stream-Based DataSource from filesystem path
158
      * @param file the path to the file
159
      * @param use_binary whether to treat the file as binary or not
160
      */
161
      DataSource_Stream(const std::string& file, bool use_binary = false);
162
#endif
163
164
      DataSource_Stream(const DataSource_Stream&) = delete;
165
166
      DataSource_Stream& operator=(const DataSource_Stream&) = delete;
167
168
      ~DataSource_Stream();
169
170
0
      size_t get_bytes_read() const override { return m_total_read; }
171
   private:
172
      const std::string m_identifier;
173
174
      std::unique_ptr<std::istream> m_source_memory;
175
      std::istream& m_source;
176
      size_t m_total_read;
177
   };
178
179
}
180
181
#endif