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 >:
Botan::MemoryVector< T > Botan::SecureVector< 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
otherthe 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  }
void resize(size_t n)
Definition: secmem.h:217
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

◆ 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

◆ 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
inthe array to copy the contents from
nthe 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  }
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:22
size_t size() const
Definition: secmem.h:29
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
offthe offset position inside this buffer to start inserting the copied bytes
inthe array to copy the contents from
nthe length of in

Definition at line 140 of file secmem.h.

141  {
142  copy_mem(buf + off, in, std::min(n, size() - off));
143  }
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:22
size_t size() const
Definition: secmem.h:29
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()); }
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()); }
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
lockingshould we use a locking allocator
lengththe 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); }
void resize(size_t n)
Definition: secmem.h:217
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  }
size_t size() const
Definition: secmem.h:29
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
otherthe 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  }
void resize(size_t n)
Definition: secmem.h:217
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  }
bool same_mem(const T *p1, const T *p2, size_t n)
Definition: mem_ops.h:57
size_t size() const
Definition: secmem.h:29

◆ push_back()

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

Append a single element.

Parameters
xthe 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  }
void resize(size_t n)
Definition: secmem.h:217
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
nlength 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  }
void clear_mem(T *ptr, size_t n)
Definition: mem_ops.h:32
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:22
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  }
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: