16 secure_vector(secure_vector<T>
const&) =
default;
17 secure_vector(secure_vector<T>&&) =
default;
18 explicit secure_vector(
unsigned size)
21 explicit secure_vector(
unsigned size, T _item)
24 explicit secure_vector(
const std::vector<T>& c)
27 secure_vector(std::vector<T>&& c)
30 ~secure_vector() { clean(); }
32 static secure_vector<T> getRandom(
size_t size)
34 secure_vector<T> ret(size);
35 std::random_device rdev;
37 std::uniform_int_distribution<int> rand_byte {0, std::numeric_limits<uint8_t>::max()};
39 std::uniform_int_distribution<uint8_t> rand_byte;
41 std::generate_n((uint8_t*) ret.data_.data(), ret.size() *
sizeof(T), std::bind(rand_byte, std::ref(rdev)));
44 secure_vector<T>& operator=(
const secure_vector<T>& c)
52 secure_vector<T>& operator=(secure_vector<T>&& c)
57 data_ = std::move(c.data_);
60 secure_vector<T>& operator=(std::vector<T>&& c)
66 std::vector<T>& writable()
71 const std::vector<T>& makeInsecure()
const {
return data_; }
72 const uint8_t* data()
const {
return data_.data(); }
74 void clean() { clean(data_.begin(), data_.end()); }
82 size_t size()
const {
return data_.size(); }
83 bool empty()
const {
return data_.empty(); }
85 void swap(secure_vector<T>& other) { data_.swap(other.data_); }
88 if (s == data_.size())
90 if (s < data_.size()) {
92 clean(data_.begin() + s, data_.end());
96 auto data = std::move(data_);
99 std::copy(data.begin(), data.end(), data_.begin());
100 clean(data.begin(), data.end());
108 static void clean(
const typename std::vector<T>::iterator& i,
const typename std::vector<T>::iterator& j)
110 volatile uint8_t* b =
reinterpret_cast<uint8_t*
>(&*i);
111 volatile uint8_t* e =
reinterpret_cast<uint8_t*
>(&*j);
115 std::vector<T> data_;