Coverage Report

Created: 2024-02-25 06:16

/src/botan/build/include/public/botan/secmem.h
Line
Count
Source
1
/*
2
* Secure Memory Buffers
3
* (C) 1999-2007,2012 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#ifndef BOTAN_SECURE_MEMORY_BUFFERS_H_
9
#define BOTAN_SECURE_MEMORY_BUFFERS_H_
10
11
#include <botan/allocator.h>
12
#include <botan/types.h>  // IWYU pragma: export
13
#include <algorithm>
14
#include <deque>
15
#include <type_traits>
16
#include <vector>  // IWYU pragma: export
17
18
namespace Botan {
19
20
template <typename T>
21
#if !defined(_ITERATOR_DEBUG_LEVEL) || _ITERATOR_DEBUG_LEVEL == 0
22
/*
23
  * Assert exists to prevent someone from doing something that will
24
  * probably crash anyway (like secure_vector<non_POD_t> where ~non_POD_t
25
  * deletes a member pointer which was zeroed before it ran).
26
  * MSVC in debug mode uses non-integral proxy types in container types
27
  * like std::vector, thus we disable the check there.
28
 */
29
   requires std::is_integral<T>::value
30
#endif
31
class secure_allocator {
32
33
   public:
34
      typedef T value_type;
35
      typedef std::size_t size_type;
36
37
      secure_allocator() noexcept = default;
38
      secure_allocator(const secure_allocator&) noexcept = default;
39
      secure_allocator& operator=(const secure_allocator&) noexcept = default;
40
      ~secure_allocator() noexcept = default;
41
42
      template <typename U>
43
      secure_allocator(const secure_allocator<U>&) noexcept {}
44
45
29.6M
      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
Botan::secure_allocator<unsigned char>::allocate(unsigned long)
Line
Count
Source
45
750k
      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
Botan::secure_allocator<unsigned long>::allocate(unsigned long)
Line
Count
Source
45
28.6M
      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
Botan::secure_allocator<unsigned int>::allocate(unsigned long)
Line
Count
Source
45
273k
      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
Botan::secure_allocator<unsigned short>::allocate(unsigned long)
Line
Count
Source
45
580
      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
46
47
29.6M
      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
Botan::secure_allocator<unsigned long>::deallocate(unsigned long*, unsigned long)
Line
Count
Source
47
28.6M
      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
Botan::secure_allocator<unsigned char>::deallocate(unsigned char*, unsigned long)
Line
Count
Source
47
750k
      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
Botan::secure_allocator<unsigned int>::deallocate(unsigned int*, unsigned long)
Line
Count
Source
47
273k
      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
Botan::secure_allocator<unsigned short>::deallocate(unsigned short*, unsigned long)
Line
Count
Source
47
580
      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
48
};
49
50
template <typename T, typename U>
51
inline bool operator==(const secure_allocator<T>&, const secure_allocator<U>&) {
52
   return true;
53
}
54
55
template <typename T, typename U>
56
4.51k
inline bool operator!=(const secure_allocator<T>&, const secure_allocator<U>&) {
57
4.51k
   return false;
58
4.51k
}
59
60
template <typename T>
61
using secure_vector = std::vector<T, secure_allocator<T>>;
62
template <typename T>
63
using secure_deque = std::deque<T, secure_allocator<T>>;
64
65
// For better compatibility with 1.10 API
66
template <typename T>
67
using SecureVector = secure_vector<T>;
68
69
template <typename T>
70
secure_vector<T> lock(const std::vector<T>& in) {
71
   return secure_vector<T>(in.begin(), in.end());
72
}
73
74
template <typename T>
75
783
std::vector<T> unlock(const secure_vector<T>& in) {
76
783
   return std::vector<T>(in.begin(), in.end());
77
783
}
78
79
template <typename T, typename Alloc, typename Alloc2>
80
2.13k
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::vector<T, Alloc2>& in) {
81
2.13k
   out.insert(out.end(), in.begin(), in.end());
82
2.13k
   return out;
83
2.13k
}
std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >& Botan::operator+=<unsigned char, Botan::secure_allocator<unsigned char>, Botan::secure_allocator<unsigned char> >(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&)
Line
Count
Source
80
2.13k
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::vector<T, Alloc2>& in) {
81
2.13k
   out.insert(out.end(), in.begin(), in.end());
82
2.13k
   return out;
83
2.13k
}
Unexecuted instantiation: std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >& Botan::operator+=<unsigned char, std::__1::allocator<unsigned char>, Botan::secure_allocator<unsigned char> >(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&)
Unexecuted instantiation: std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >& Botan::operator+=<unsigned char, Botan::secure_allocator<unsigned char>, std::__1::allocator<unsigned char> >(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, std::__1::allocator<unsigned char> > const&)
84
85
template <typename T, typename Alloc>
86
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, T in) {
87
   out.push_back(in);
88
   return out;
89
}
90
91
template <typename T, typename Alloc, typename L>
92
2.29k
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::pair<const T*, L>& in) {
93
2.29k
   out.insert(out.end(), in.first, in.first + in.second);
94
2.29k
   return out;
95
2.29k
}
std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >& Botan::operator+=<unsigned char, Botan::secure_allocator<unsigned char>, unsigned long>(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::pair<unsigned char const*, unsigned long> const&)
Line
Count
Source
92
1.38k
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::pair<const T*, L>& in) {
93
1.38k
   out.insert(out.end(), in.first, in.first + in.second);
94
1.38k
   return out;
95
1.38k
}
std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >& Botan::operator+=<unsigned char, std::__1::allocator<unsigned char>, unsigned long>(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&, std::__1::pair<unsigned char const*, unsigned long> const&)
Line
Count
Source
92
911
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::pair<const T*, L>& in) {
93
911
   out.insert(out.end(), in.first, in.first + in.second);
94
911
   return out;
95
911
}
96
97
template <typename T, typename Alloc, typename L>
98
1.17k
std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::pair<T*, L>& in) {
99
1.17k
   out.insert(out.end(), in.first, in.first + in.second);
100
1.17k
   return out;
101
1.17k
}
102
103
/**
104
* Zeroise the values; length remains unchanged
105
* @param vec the vector to zeroise
106
*/
107
template <typename T, typename Alloc>
108
1.45M
void zeroise(std::vector<T, Alloc>& vec) {
109
1.45M
   std::fill(vec.begin(), vec.end(), static_cast<T>(0));
110
1.45M
}
void Botan::zeroise<unsigned char, Botan::secure_allocator<unsigned char> >(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&)
Line
Count
Source
108
514k
void zeroise(std::vector<T, Alloc>& vec) {
109
514k
   std::fill(vec.begin(), vec.end(), static_cast<T>(0));
110
514k
}
void Botan::zeroise<unsigned long, Botan::secure_allocator<unsigned long> >(std::__1::vector<unsigned long, Botan::secure_allocator<unsigned long> >&)
Line
Count
Source
108
693k
void zeroise(std::vector<T, Alloc>& vec) {
109
693k
   std::fill(vec.begin(), vec.end(), static_cast<T>(0));
110
693k
}
void Botan::zeroise<unsigned char, std::__1::allocator<unsigned char> >(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&)
Line
Count
Source
108
5.50k
void zeroise(std::vector<T, Alloc>& vec) {
109
5.50k
   std::fill(vec.begin(), vec.end(), static_cast<T>(0));
110
5.50k
}
void Botan::zeroise<unsigned int, Botan::secure_allocator<unsigned int> >(std::__1::vector<unsigned int, Botan::secure_allocator<unsigned int> >&)
Line
Count
Source
108
245k
void zeroise(std::vector<T, Alloc>& vec) {
109
245k
   std::fill(vec.begin(), vec.end(), static_cast<T>(0));
110
245k
}
void Botan::zeroise<unsigned short, Botan::secure_allocator<unsigned short> >(std::__1::vector<unsigned short, Botan::secure_allocator<unsigned short> >&)
Line
Count
Source
108
444
void zeroise(std::vector<T, Alloc>& vec) {
109
444
   std::fill(vec.begin(), vec.end(), static_cast<T>(0));
110
444
}
111
112
/**
113
* Zeroise the values then free the memory
114
* @param vec the vector to zeroise and free
115
*/
116
template <typename T, typename Alloc>
117
246k
void zap(std::vector<T, Alloc>& vec) {
118
246k
   zeroise(vec);
119
246k
   vec.clear();
120
246k
   vec.shrink_to_fit();
121
246k
}
void Botan::zap<unsigned char, Botan::secure_allocator<unsigned char> >(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&)
Line
Count
Source
117
70
void zap(std::vector<T, Alloc>& vec) {
118
70
   zeroise(vec);
119
70
   vec.clear();
120
70
   vec.shrink_to_fit();
121
70
}
void Botan::zap<unsigned long, Botan::secure_allocator<unsigned long> >(std::__1::vector<unsigned long, Botan::secure_allocator<unsigned long> >&)
Line
Count
Source
117
614
void zap(std::vector<T, Alloc>& vec) {
118
614
   zeroise(vec);
119
614
   vec.clear();
120
614
   vec.shrink_to_fit();
121
614
}
Unexecuted instantiation: void Botan::zap<unsigned char, std::__1::allocator<unsigned char> >(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >&)
void Botan::zap<unsigned int, Botan::secure_allocator<unsigned int> >(std::__1::vector<unsigned int, Botan::secure_allocator<unsigned int> >&)
Line
Count
Source
117
245k
void zap(std::vector<T, Alloc>& vec) {
118
245k
   zeroise(vec);
119
245k
   vec.clear();
120
245k
   vec.shrink_to_fit();
121
245k
}
void Botan::zap<unsigned short, Botan::secure_allocator<unsigned short> >(std::__1::vector<unsigned short, Botan::secure_allocator<unsigned short> >&)
Line
Count
Source
117
444
void zap(std::vector<T, Alloc>& vec) {
118
444
   zeroise(vec);
119
444
   vec.clear();
120
444
   vec.shrink_to_fit();
121
444
}
122
123
}  // namespace Botan
124
125
#endif