Botan: Botan::MemoryRegion< T > Class Template Reference

Botan 1.10.17

Public Member Functions | Protected Member Functions | List of all members
Botan::MemoryRegion< T > Class Template Reference

`#include <secmem.h>`

Inheritance diagram for Botan::MemoryRegion< T >:

## Public Member Functions
T * | begin ()
const T * | begin () const
void | clear ()
void | copy (const T in[], size_t n)
void | copy (size_t off, const T in[], size_t n)
T * | data ()
bool | empty () const
T * | end ()
const T * | end () const
| operator const T * () const
| operator T* ()
bool | operator!= (const MemoryRegion< T > &other) const
bool | operator< (const MemoryRegion< T > &other) const
MemoryRegion< T > & | operator= (const MemoryRegion< T > &other)
bool | operator== (const MemoryRegion< T > &other) const
void | push_back (T x)
void | resize (size_t n)
size_t | size () const
void | swap (MemoryRegion< T > &other)
| ~MemoryRegion ()

## Protected Member Functions
void | init (bool locking, size_t length=0)
| MemoryRegion ()
| MemoryRegion (const MemoryRegion< T > &other)

## Detailed Description

### template<typename T>
class Botan::MemoryRegion< T >

This class represents variable length memory buffers.

Definition at line 21 of file secmem.h.

## Constructor & Destructor Documentation

## ◆ ~MemoryRegion()

template<typename T>

Botan::MemoryRegion< T >::~MemoryRegion | ( |  | ) |
| inline

Definition at line 173 of file secmem.h.

173 { deallocate(buf, allocated); }

## ◆ MemoryRegion() [1/2]

template<typename T>

Botan::MemoryRegion< T >::MemoryRegion | ( |  | ) |
| inlineprotected

Definition at line 175 of file secmem.h.

175 : buf(0), used(0), allocated(0), alloc(0) {}

## ◆ MemoryRegion() [2/2]

template<typename T>

Botan::MemoryRegion< T >::MemoryRegion | ( | const MemoryRegion< T > & | other | ) |
| inlineprotected

Copy constructor

Parameters

  other | the other region to copy

Definition at line 181 of file secmem.h.

181 :
182 buf(0),
183 used(0),
184 allocated(0),
185 alloc(other.alloc)
186 {
187 resize(other.size());
188 copy(&other[0], other.size());
189 }
Botan::MemoryRegion::resize
void resize(size_t n)
Definition: secmem.h:217
Botan::MemoryRegion::copy
void copy(const T in[], size_t n)
Definition: secmem.h:126

## Member Function Documentation

## ◆ begin() [1/2]

template<typename T>

T* Botan::MemoryRegion< T >::begin | ( |  | ) |
| inline

Get a pointer to the first element in the buffer.

Returns
  pointer to the first element in the buffer

Definition at line 59 of file secmem.h.

Referenced by Botan::Blowfish::clear(), Botan::Zlib_Compression::end_msg(), Botan::Bzip_Compression::end_msg(), Botan::Bzip_Decompression::end_msg(), Botan::Zlib_Decompression::end_msg(), Botan::Bzip_Compression::flush(), Botan::Zlib_Compression::flush(), Botan::Zlib_Compression::write(), Botan::Bzip_Compression::write(), Botan::Bzip_Decompression::write(), and Botan::Zlib_Decompression::write().

59 { return buf; }

## ◆ begin() [2/2]

template<typename T>

const T* Botan::MemoryRegion< T >::begin | ( |  | ) | const
| inline

Get a constant pointer to the first element in the buffer.

Returns
  constant pointer to the first element in the buffer

Definition at line 65 of file secmem.h.

65 { return buf; }

## ◆ clear()

template<typename T>

void Botan::MemoryRegion< T >::clear | ( |  | ) |
| inline

Reset this buffer to an empty buffer with size zero.

Definition at line 158 of file secmem.h.

Referenced by Botan::X509_DN::add_attribute(), Botan::ANSI_X931_RNG::clear(), Botan::BER_Decoder::decode_optional_string(), Botan::PK_Encryptor_Filter::end_msg(), Botan::PK_Decryptor_Filter::end_msg(), Botan::CMS_Encoder::get_contents(), Botan::BER_Decoder::raw_bytes(), and Botan::Filter::send().

158 { resize(0); }
Botan::MemoryRegion::resize
void resize(size_t n)
Definition: secmem.h:217

## ◆ copy() [1/2]

template<typename T>

void Botan::MemoryRegion< T >::copy | ( | const T | in[],
|  | size_t | n
| ) |  |
| inline

Copy the contents of an array of objects of type T into this buffer. The former contents of *this are discarded. The length of *this must be at least n, otherwise memory errors occur.

Parameters

  in | the array to copy the contents from
  n | the length of in

Definition at line 126 of file secmem.h.

Referenced by Botan::MDx_HashFunction::add_data(), Botan::BigInt::BigInt(), Botan::MemoryRegion< word >::MemoryRegion(), Botan::MemoryVector< byte >::MemoryVector(), Botan::MemoryRegion< word >::operator=(), Botan::MemoryVector< byte >::operator=(), Botan::SecureVector< word >::operator=(), Botan::operator^(), Botan::SecureVector< word >::SecureVector(), Botan::Record_Writer::send(), Botan::CTR_BE::set_iv(), Botan::OFB::set_iv(), Botan::Base64_Encoder::write(), and Botan::Hex_Encoder::write().

127 {
128 copy_mem(buf, in, std::min(n, size()));
129 }
Botan::copy_mem
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:22
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29
Botan::CT::min
T min(T a, T b)
Definition: ct_utils.h:127

## ◆ copy() [2/2]

template<typename T>

void Botan::MemoryRegion< T >::copy | ( | size_t | off,
|  | const T | in[],
|  | size_t | n
| ) |  |
| inline

Copy the contents of an array of objects of type T into this buffer. The former contents of *this are discarded. The length of *this must be at least n, otherwise memory errors occur.

Parameters

  off | the offset position inside this buffer to start inserting the copied bytes
  in | the array to copy the contents from
  n | the length of in

Definition at line 140 of file secmem.h.

141 {
142 copy_mem(buf + off, in, std::min(n, size() - off));
143 }
Botan::copy_mem
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:22
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29
Botan::CT::min
T min(T a, T b)
Definition: ct_utils.h:127

## ◆ data()

template<typename T>

T* Botan::MemoryRegion< T >::data | ( |  | ) |
| inline

Get a pointer to the first element in the buffer.

Returns
  pointer to the first element in the buffer

Definition at line 53 of file secmem.h.

Referenced by Botan::BigInt::const_time_lookup(), and Botan::Montgomery_Exponentiator::execute().

53 { return buf; }

## ◆ empty()

template<typename T>

bool Botan::MemoryRegion< T >::empty | ( |  | ) | const
| inline

Find out whether this buffer is empty.

Returns
  true if the buffer is empty, false otherwise

Definition at line 35 of file secmem.h.

Referenced by Botan::BER_Decoder::decode(), Botan::X509_DN::encode_into(), Botan::PK_Verifier_Filter::end_msg(), Botan::X509::load_key(), and Botan::CMS_Encoder::set_data().

35 { return (used == 0); }

## ◆ end() [1/2]

template<typename T>

T* Botan::MemoryRegion< T >::end | ( |  | ) |
| inline

Get a pointer to one past the last element in the buffer.

Returns
  pointer to one past the last element in the buffer

Definition at line 71 of file secmem.h.

71 { return (buf + size()); }
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29

## ◆ end() [2/2]

template<typename T>

const T* Botan::MemoryRegion< T >::end | ( |  | ) | const
| inline

Get a const pointer to one past the last element in the buffer.

Returns
  const pointer to one past the last element in the buffer

Definition at line 77 of file secmem.h.

77 { return (buf + size()); }
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29

## ◆ init()

template<typename T>

void Botan::MemoryRegion< T >::init | ( | bool | locking,
|  | size_t | length = `0`
| ) |  |
| inlineprotected

Parameters

  locking | should we use a locking allocator
  length | the initial length to use

Definition at line 195 of file secmem.h.

Referenced by Botan::MemoryVector< byte >::MemoryVector(), and Botan::SecureVector< word >::SecureVector().

196 { alloc = Allocator::get(locking); resize(length); }
Botan::MemoryRegion::resize
void resize(size_t n)
Definition: secmem.h:217
Botan::Allocator::get
static Allocator * get(bool locking)
Definition: defalloc.cpp:90

## ◆ operator const T *()

template<typename T>

Botan::MemoryRegion< T >::operator const T * | ( |  | ) | const
| inline

Get a constant pointer to the first element in the buffer.

Returns
  constant pointer to the first element in the buffer

Definition at line 47 of file secmem.h.

47 { return buf; }

## ◆ operator T*()

template<typename T>

Botan::MemoryRegion< T >::operator T* | ( |  | ) |
| inline

Get a pointer to the first element in the buffer.

Returns
  pointer to the first element in the buffer

Definition at line 41 of file secmem.h.

41 { return buf; }

## ◆ operator!=()

template<typename T>

bool Botan::MemoryRegion< T >::operator!= | ( | const MemoryRegion< T > & | other | ) | const
| inline

Check two buffers for inequality.

Returns
  false if the content of both buffers is byte-wise equal, true otherwise.

Definition at line 100 of file secmem.h.

101 { return (!(*this == other)); }

## ◆ operator<()

template<typename T>

bool Botan::MemoryRegion< T >::operator< | ( | const MemoryRegion< T > & | other | ) | const

Compare two buffers

Returns
  true iff this is ordered before other

Definition at line 239 of file secmem.h.

240 {
241 const size_t min_size = std::min(size(), other.size());
242
243 // This should probably be rewritten to run in constant time
244 for(size_t i = 0; i != min_size; ++i)
245 {
246 if(buf[i] < other[i])
247 return true;
248 if(buf[i] > other[i])
249 return false;
250 }
251
252 // First min_size bytes are equal, shorter is first
253 return (size() < other.size());
254 }
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29
Botan::CT::min
T min(T a, T b)
Definition: ct_utils.h:127

## ◆ operator=()

template<typename T>

MemoryRegion<T>& Botan::MemoryRegion< T >::operator= | ( | const MemoryRegion< T > & | other | ) |
| inline

Copy the contents of another buffer into this buffer. The former contents of *this are discarded.

Parameters

  other | the buffer to copy the contents from.

Returns
  reference to *this

Definition at line 109 of file secmem.h.

110 {
111 if(this != &other)
112 {
113 this->resize(other.size());
114 this->copy(&other[0], other.size());
115 }
116 return (*this);
117 }
Botan::MemoryRegion::resize
void resize(size_t n)
Definition: secmem.h:217
Botan::MemoryRegion::copy
void copy(const T in[], size_t n)
Definition: secmem.h:126

## ◆ operator==()

template<typename T>

bool Botan::MemoryRegion< T >::operator== | ( | const MemoryRegion< T > & | other | ) | const
| inline

Check two buffers for equality.

Returns
  true iff the content of both buffers is byte-wise equal

Definition at line 83 of file secmem.h.

84 {
85 return (size() == other.size() &&
86 same_mem(buf, other.buf, size()));
87 }
Botan::same_mem
bool same_mem(const T *p1, const T *p2, size_t n)
Definition: mem_ops.h:57
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29

## ◆ push_back()

template<typename T>

void Botan::MemoryRegion< T >::push_back | ( | T | x | ) |
| inline

Append a single element.

Parameters

  x | the element to append

Definition at line 149 of file secmem.h.

Referenced by Botan::append_tls_length_value(), Botan::EC2OSP(), Botan::DER_Encoder::encode(), Botan::OID::encode_into(), Botan::operator+=(), Botan::BER_Decoder::raw_bytes(), and Botan::HandshakeHash::update().

150 {
151 resize(size() + 1);
152 buf[size()-1] = x;
153 }
Botan::MemoryRegion::resize
void resize(size_t n)
Definition: secmem.h:217
Botan::MemoryRegion::size
size_t size() const
Definition: secmem.h:29

## ◆ resize()

template<typename T >

void Botan::MemoryRegion< T >::resize | ( | size_t | n | ) |

Inserts or erases elements at the end such that the size becomes n, leaving elements in the range 0...n unmodified if set or otherwise zero-initialized

Parameters

  n | length of the new buffer

Definition at line 217 of file secmem.h.

Referenced by Botan::ANSI_X931_RNG::ANSI_X931_RNG(), Botan::base64_decode(), Botan::BigInt::BigInt(), Botan::BigInt::binary_decode(), Botan::Buffered_Filter::Buffered_Filter(), Botan::CFB_Decryption::CFB_Decryption(), Botan::CFB_Encryption::CFB_Encryption(), Botan::OctetString::change(), Botan::MemoryRegion< word >::clear(), Botan::CMAC::CMAC(), Botan::CTS_Decryption::CTS_Decryption(), Botan::CTS_Encryption::CTS_Encryption(), Botan::BER_Decoder::decode(), Botan::EAX_Decryption::EAX_Decryption(), Botan::ECB_Decryption::ECB_Decryption(), Botan::ECB_Encryption::ECB_Encryption(), Botan::Montgomery_Exponentiator::execute(), Botan::Entropy_Accumulator::get_io_buffer(), Botan::BER_Decoder::get_next_object(), Botan::Record_Reader::get_record(), Botan::hex_decode(), Botan::Hex_Decoder::Hex_Decoder(), Botan::Hex_Encoder::Hex_Encoder(), Botan::HMAC::HMAC(), Botan::MemoryRegion< word >::init(), Botan::Lion::Lion(), Botan::MemoryRegion< word >::MemoryRegion(), Botan::MemoryVector< byte >::MemoryVector(), Botan::OFB::OFB(), Botan::operator+=(), Botan::MemoryRegion< word >::operator=(), Botan::MemoryVector< byte >::operator=(), Botan::SecureVector< word >::operator=(), Botan::MemoryRegion< word >::push_back(), Botan::Pipe::read_all(), Botan::SAFER_SK::SAFER_SK(), Botan::SecureVector< word >::SecureVector(), Botan::CMS_Encoder::set_data(), Botan::PK_Verifier_Filter::set_signature(), Botan::BigInt::shrink_to_fit(), Botan::SSL3_MAC::SSL3_MAC(), and Botan::Base64_Decoder::write().

218 {
219 if(n <= allocated)
220 {
221 size_t zap = std::min(used, n);
222 clear_mem(buf + zap, allocated - zap);
223 used = n;
224 }
225 else
226 {
227 T* new_buf = allocate(n);
228 copy_mem(new_buf, buf, used);
229 deallocate(buf, allocated);
230 buf = new_buf;
231 allocated = used = n;
232 }
233 }
Botan::clear_mem
void clear_mem(T *ptr, size_t n)
Definition: mem_ops.h:32
Botan::copy_mem
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:22
Botan::CT::min
T min(T a, T b)
Definition: ct_utils.h:127

## ◆ size()

template<typename T>

size_t Botan::MemoryRegion< T >::size | ( |  | ) | const
| inline

Find out the size of the buffer, i.e. how many objects of type T it contains.

Returns
  size of the buffer

Definition at line 29 of file secmem.h.

Referenced by Botan::Data_Store::add(), Botan::MDx_HashFunction::add_data(), Botan::Randpool::add_entropy(), Botan::DER_Encoder::add_object(), Botan::Alert::Alert(), Botan::append_tls_length_value(), Botan::OctetString::as_string(), Botan::base64_encode(), Botan::BigInt::binary_decode(), Botan::check_passhash9(), Botan::PK_Verifier::check_signature(), Botan::Turing::cipher(), Botan::Salsa20::cipher(), Botan::ARC4::cipher(), Botan::CTR_BE::cipher(), Botan::OFB::cipher(), Botan::WiderWake_41_BE::cipher(), Botan::MD4::compress_n(), Botan::MD5::compress_n(), Botan::BigInt::const_time_lookup(), Botan::BER::decode(), Botan::BER_Decoder::decode(), Botan::EME::decode(), Botan::decode_concatenation(), Botan::OID::decode_from(), Botan::EAC_Time::decode_from(), Botan::AlternativeName::decode_from(), Botan::BER_Decoder::decode_null(), Botan::BER_Decoder::decode_octet_string_bigint(), Botan::CryptoBox::decrypt(), Botan::PK_Decryptor::decrypt(), Botan::X942_PRF::derive(), Botan::KDF2::derive(), Botan::KDF::derive_key(), Botan::OpenPGP_S2K::derive_key(), Botan::PKCS5_PBKDF1::derive_key(), Botan::PK_Key_Agreement::derive_key(), Botan::PEM_Code::encode(), Botan::DER_Encoder::encode(), Botan::EMSA3::encoding_of(), Botan::MemoryRegion< word >::end(), Botan::Zlib_Compression::end_msg(), Botan::Bzip_Compression::end_msg(), Botan::Bzip_Decompression::end_msg(), Botan::Zlib_Decompression::end_msg(), Botan::Hash_Filter::end_msg(), Botan::MAC_Filter::end_msg(), Botan::DataSource_Memory::end_of_data(), Botan::Montgomery_Exponentiator::execute(), Botan::MDx_HashFunction::final_result(), Botan::Certificate_Store_Memory::find_cert_by_subject_and_key_id(), Botan::Certificate_Store_Memory::find_crl_by_subject_and_key_id(), Botan::Bzip_Compression::flush(), Botan::Zlib_Compression::flush(), Botan::CMS_Decoder::get_data(), Botan::Record_Reader::get_record(), Botan::Hex_Decoder::Hex_Decoder(), Botan::hex_encode(), Botan::Hex_Encoder::Hex_Encoder(), Botan::ANSI_X931_RNG::is_seeded(), Botan::MGF1::mask(), Botan::PEM_Code::matches(), Botan::EME1::maximum_input_size(), Botan::MemoryRegion< word >::MemoryRegion(), Botan::MemoryVector< byte >::MemoryVector(), Botan::BigInt::operator*=(), Botan::BigInt::operator+=(), Botan::operator+=(), Botan::MemoryRegion< word >::operator<(), Botan::operator<<(), Botan::MemoryRegion< word >::operator=(), Botan::MemoryVector< byte >::operator=(), Botan::SecureVector< word >::operator=(), Botan::MemoryRegion< word >::operator==(), Botan::operator>>(), Botan::OS2ECP(), Botan::OSSL_BN::OSSL_BN(), Botan::DataSource_Memory::peek(), Botan::DataSource_Stream::peek(), Botan::FTW_EntropySource::poll(), Botan::Win32_CAPI_EntropySource::poll(), Botan::Device_EntropySource::poll(), Botan::CMAC::poly_double(), Botan::Buffered_Computation::process(), Botan::Pipe::process_msg(), Botan::MemoryRegion< word >::push_back(), Botan::RandomNumberGenerator::random_vec(), Botan::ANSI_X931_RNG::randomize(), Botan::Randpool::randomize(), Botan::DER_Encoder::raw_bytes(), Botan::DataSource_Memory::read(), Botan::Pipe::read_all(), Botan::Pipe::read_all_as_string(), Botan::TLS_Data_Reader::remaining_bytes(), Botan::Randpool::reseed(), Botan::rfc3394_keyunwrap(), Botan::rfc3394_keywrap(), Botan::SecureVector< word >::SecureVector(), Botan::HandshakeMessage::send(), Botan::Record_Writer::send(), Botan::Filter::send(), Botan::Turing::set_iv(), Botan::EAX_Base::set_iv(), Botan::WiderWake_41_BE::set_iv(), Botan::OctetString::set_odd_parity(), Botan::BER_Decoder::start_cons(), Botan::ASN1::to_string(), Botan::RTSS_Share::to_string(), Botan::Buffered_Computation::update(), Botan::PK_Signer::update(), Botan::PK_Verifier::update(), Botan::EMSA3::verify(), Botan::PK_Verifier::verify_message(), Botan::Zlib_Compression::write(), Botan::Bzip_Compression::write(), Botan::Buffered_Filter::write(), Botan::Base64_Encoder::write(), Botan::Hex_Encoder::write(), Botan::StreamCipher_Filter::write(), Botan::Bzip_Decompression::write(), Botan::Zlib_Decompression::write(), Botan::Hex_Decoder::write(), Botan::Base64_Decoder::write(), Botan::Pipe::write(), and Botan::zeroise().

29 { return used; }

## ◆ swap()

template<typename T>

void Botan::MemoryRegion< T >::swap | ( | MemoryRegion< T > & | other | ) |

Swap this buffer with another object.

Definition at line 260 of file secmem.h.

Referenced by Botan::PointGFp::swap(), std::swap(), and Botan::BigInt::swap().

261 {
262 std::swap(buf, x.buf);
263 std::swap(used, x.used);
264 std::swap(allocated, x.allocated);
265 std::swap(alloc, x.alloc);
266 }
std::swap
void swap(Botan::MemoryRegion< T > &x, Botan::MemoryRegion< T > &y)
Definition: secmem.h:438

The documentation for this class was generated from the following file:

- src/alloc/secmem.h