| @@ -157,17 +157,20 @@ protected: | |||
| /** @cond internal */ | |||
| unsigned char *data_; | |||
| size_t size_; | |||
| const bool zero_on_destroy_; | |||
| /** @endcond */ | |||
| public: | |||
| /** Null initialization */ | |||
| inline Block() : data_(NULL), size_(0) {} | |||
| inline Block() : data_(NULL), size_(0), zero_on_destroy_(false) {} | |||
| /** Init from C string */ | |||
| inline Block(const char *data) NOEXCEPT : data_((unsigned char *)data), size_(strlen(data)) {} | |||
| inline Block(const char *data) NOEXCEPT : data_((unsigned char *)data), | |||
| size_(strlen(data)), zero_on_destroy_(false) {} | |||
| /** Unowned init */ | |||
| inline Block(const unsigned char *data, size_t size) NOEXCEPT : data_((unsigned char *)data), size_(size) {} | |||
| inline Block(const unsigned char *data, size_t size, bool zero_on_destroy=false) NOEXCEPT : data_((unsigned char *)data), | |||
| size_(size), zero_on_destroy_(zero_on_destroy) {} | |||
| /** Block from std::string */ | |||
| inline Block(const std::string &s) : data_( | |||
| @@ -176,11 +179,11 @@ public: | |||
| #else | |||
| ((unsigned char *)(s.data())) | |||
| #endif | |||
| ), size_(s.size()) {} | |||
| ), size_(s.size()), zero_on_destroy_(false) {} | |||
| /** Block from std::vector */ | |||
| template<class alloc> inline Block(const std::vector<unsigned char,alloc> &s) | |||
| : data_(((unsigned char *)&(s)[0])), size_(s.size()) {} | |||
| : data_(((unsigned char *)&(s)[0])), size_(s.size()), zero_on_destroy_(false) {} | |||
| /** Get const data */ | |||
| inline const unsigned char *data() const NOEXCEPT { return data_; } | |||
| @@ -216,8 +219,8 @@ public: | |||
| return SecureBuffer(data_,data_+size_); | |||
| } | |||
| /** Virtual destructor for SecureBlock. TODO: probably means vtable? Make bool? */ | |||
| inline virtual ~Block() {}; | |||
| /** Securely set the buffer to 0. */ | |||
| inline void zeroize() NOEXCEPT { really_bzero(data_,size()); } | |||
| /** Debugging print in hex */ | |||
| inline void debug_print_hex(const char *name = NULL) { | |||
| @@ -260,7 +263,7 @@ public: | |||
| inline Buffer() NOEXCEPT : Block() {} | |||
| /** Unowned init */ | |||
| inline Buffer(unsigned char *data, size_t size) NOEXCEPT : Block(data,size) {} | |||
| inline Buffer(unsigned char *data, size_t size, bool zero_on_destroy=false) NOEXCEPT : Block(data,size,zero_on_destroy) {} | |||
| /** Block from std::vector */ | |||
| template<class alloc> inline Buffer(std::vector<unsigned char,alloc> &s) : Block(s) {} | |||
| @@ -286,9 +289,6 @@ public: | |||
| memmove(data(),b.data(),size()); | |||
| } | |||
| /** Securely set the buffer to 0. */ | |||
| inline void zeroize() NOEXCEPT { really_bzero(data(),size()); } | |||
| private: | |||
| /** @cond internal */ | |||
| inline void operator= (const Block &b) const NOEXCEPT DELETE; | |||
| @@ -310,7 +310,7 @@ public: | |||
| } | |||
| /** Explicitly pass a C buffer. */ | |||
| inline explicit FixedBuffer(uint8_t dat[Size]) NOEXCEPT : Buffer(dat,Size) {} | |||
| inline explicit FixedBuffer(uint8_t dat[Size],bool zero_on_destroy = false) NOEXCEPT : Buffer(dat,Size,zero_on_destroy) {} | |||
| /** Cast to a FixedBlock. */ | |||
| inline operator FixedBlock<Size>() const NOEXCEPT { | |||
| @@ -331,16 +331,16 @@ public: | |||
| using Buffer::zeroize; | |||
| /** New buffer initialized to zero. */ | |||
| inline explicit FixedArrayBuffer() NOEXCEPT : FixedBuffer<Size>(storage) { memset(storage,0,Size); } | |||
| inline explicit FixedArrayBuffer() NOEXCEPT : FixedBuffer<Size>(storage,true) { memset(storage,0,Size); } | |||
| /** New uninitialized buffer. */ | |||
| inline explicit FixedArrayBuffer(const NOINIT &) NOEXCEPT : FixedBuffer<Size>(storage) { } | |||
| inline explicit FixedArrayBuffer(const NOINIT &) NOEXCEPT : FixedBuffer<Size>(storage,true) { } | |||
| /** New random buffer */ | |||
| inline explicit FixedArrayBuffer(Rng &r) NOEXCEPT : FixedBuffer<Size>(storage) { r.read(*this); } | |||
| inline explicit FixedArrayBuffer(Rng &r) NOEXCEPT : FixedBuffer<Size>(storage,true) { r.read(*this); } | |||
| /** Copy constructor */ | |||
| inline explicit FixedArrayBuffer(const FixedBlock<Size> &b) NOEXCEPT : FixedBuffer<Size>(storage) { | |||
| inline explicit FixedArrayBuffer(const FixedBlock<Size> &b) NOEXCEPT : FixedBuffer<Size>(storage,true) { | |||
| memcpy(storage,b.data(),Size); | |||
| } | |||
| @@ -360,13 +360,13 @@ public: | |||
| } | |||
| /** Copy constructor */ | |||
| inline explicit FixedArrayBuffer(const Block &b) throw(LengthException) : FixedBuffer<Size>(storage) { | |||
| inline explicit FixedArrayBuffer(const Block &b) throw(LengthException) : FixedBuffer<Size>(storage,true) { | |||
| if (b.size() != Size) throw LengthException(); | |||
| memcpy(storage,b.data(),Size); | |||
| } | |||
| /** Copy constructor */ | |||
| inline explicit FixedArrayBuffer(const FixedArrayBuffer<Size> &b) NOEXCEPT : FixedBuffer<Size>(storage) { | |||
| inline explicit FixedArrayBuffer(const FixedArrayBuffer<Size> &b) NOEXCEPT : FixedBuffer<Size>(storage,true) { | |||
| memcpy(storage,b.data(),Size); | |||
| } | |||