Coverage Report

Created: 2026-09-28 06:36

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/botan/build/include/public/botan/mem_ops.h
Line
Count
Source
1
/*
2
* Memory Operations
3
* (C) 1999-2009,2012,2015 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#ifndef BOTAN_MEMORY_OPS_H_
9
#define BOTAN_MEMORY_OPS_H_
10
11
#include <botan/assert.h>
12
#include <botan/concepts.h>
13
#include <botan/types.h>
14
#include <array>
15
#include <cstring>
16
#include <ranges>
17
#include <span>
18
#include <type_traits>
19
#include <vector>
20
21
BOTAN_FUTURE_INTERNAL_HEADER(mem_ops.h)
22
23
/*
24
The header mem_ops.h previously included the contents of allocator.h
25
26
Library code should always include allocator.h to see these
27
declarations; however when we are not building the library continue to
28
include the header here to avoid breaking application code.
29
*/
30
#if !defined(BOTAN_IS_BEING_BUILT)
31
   #include <botan/allocator.h>
32
#endif
33
34
namespace Botan {
35
36
/**
37
* Scrub memory contents in a way that a compiler should not elide,
38
* using some system specific technique. Note that this function might
39
* not zero the memory (for example, in some hypothetical
40
* implementation it might combine the memory contents with the output
41
* of a system PRNG), but if you can detect any difference in behavior
42
* at runtime then the clearing is side-effecting and you can just
43
* use `clear_mem`.
44
*
45
* Use this function to scrub memory just before deallocating it, or on
46
* a stack buffer before returning from the function.
47
*
48
* @param ptr a pointer to memory to scrub
49
* @param n the number of bytes pointed to by ptr
50
*/
51
BOTAN_PUBLIC_API(2, 0) void secure_scrub_memory(void* ptr, size_t n);
52
53
/**
54
* Scrub memory contents in a way that a compiler should not elide,
55
* using some system specific technique. Note that this function might
56
* not zero the memory.
57
*
58
* @param data  the data region to be scrubbed
59
*/
60
285
void secure_scrub_memory(ranges::contiguous_output_range auto&& data) {
61
285
   secure_scrub_memory(std::ranges::data(data), ranges::size_bytes(data));
62
285
}
_ZN5Botan19secure_scrub_memoryITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm9EEEEEvOT_
Line
Count
Source
60
285
void secure_scrub_memory(ranges::contiguous_output_range auto&& data) {
61
285
   secure_scrub_memory(std::ranges::data(data), ranges::size_bytes(data));
62
285
}
Unexecuted instantiation: _ZN5Botan19secure_scrub_memoryITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEEEEvOT_
63
64
/**
65
* Memory comparison, input insensitive
66
* @param x a pointer to an array
67
* @param y a pointer to another array
68
* @param len the number of Ts in x and y
69
* @return 0xFF iff x[i] == y[i] forall i in [0...n) or 0x00 otherwise
70
*/
71
BOTAN_DEPRECATED("This function is deprecated, use constant_time_compare()")
72
BOTAN_PUBLIC_API(2, 9) uint8_t ct_compare_u8(const uint8_t x[], const uint8_t y[], size_t len);
73
74
/**
75
 * Memory comparison, input insensitive
76
 * @param x a range of bytes
77
 * @param y another range of bytes
78
 * @return true iff x and y have equal lengths and x[i] == y[i] forall i in [0...n)
79
 */
80
BOTAN_PUBLIC_API(3, 3) bool constant_time_compare(std::span<const uint8_t> x, std::span<const uint8_t> y);
81
82
/**
83
* Memory comparison, input insensitive
84
* @param x a pointer to an array
85
* @param y a pointer to another array
86
* @param len the number of Ts in x and y
87
* @return true iff x[i] == y[i] forall i in [0...n)
88
*/
89
0
inline bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len) {
90
0
   // simply assumes that *x and *y point to len allocated bytes at least
91
0
   return constant_time_compare({x, len}, {y, len});
92
0
}
93
94
/**
95
* Zero out some bytes. Warning: use secure_scrub_memory instead if the
96
* memory is about to be freed or otherwise the compiler thinks it can
97
* elide the writes.
98
*
99
* @param ptr a pointer to memory to zero
100
* @param bytes the number of bytes to zero in ptr
101
*/
102
1.35M
inline constexpr void clear_bytes(void* ptr, size_t bytes) {
103
1.35M
   if(bytes > 0) {
104
1.21M
      std::memset(ptr, 0, bytes);
105
1.21M
   }
106
1.35M
}
107
108
/**
109
* Zero memory before use. This simply calls memset and should not be
110
* used in cases where the compiler cannot see the call as a
111
* side-effecting operation (for example, if calling clear_mem before
112
* deallocating memory, the compiler would be allowed to omit the call
113
* to memset entirely under the as-if rule.)
114
*
115
* @param ptr a pointer to an array of Ts to zero
116
* @param n the number of Ts pointed to by ptr
117
*/
118
template <typename T>
119
1.22M
inline constexpr void clear_mem(T* ptr, size_t n) {
120
1.22M
   clear_bytes(ptr, sizeof(T) * n);
121
1.22M
}
void Botan::clear_mem<unsigned char>(unsigned char*, unsigned long)
Line
Count
Source
119
6
inline constexpr void clear_mem(T* ptr, size_t n) {
120
6
   clear_bytes(ptr, sizeof(T) * n);
121
6
}
void Botan::clear_mem<unsigned long>(unsigned long*, unsigned long)
Line
Count
Source
119
1.22M
inline constexpr void clear_mem(T* ptr, size_t n) {
120
1.22M
   clear_bytes(ptr, sizeof(T) * n);
121
1.22M
}
Unexecuted instantiation: void Botan::clear_mem<unsigned int>(unsigned int*, unsigned long)
122
123
/**
124
* Zero memory before use. This simply calls memset and should not be
125
* used in cases where the compiler cannot see the call as a
126
* side-effecting operation.
127
*
128
* @param mem a contiguous range of Ts to zero
129
*/
130
template <ranges::contiguous_output_range R>
131
inline constexpr void clear_mem(R&& mem)  // NOLINT(*-missing-std-forward)
132
   requires std::is_trivially_copyable_v<std::ranges::range_value_t<R>>
133
128k
{
134
128k
   clear_bytes(std::ranges::data(mem), ranges::size_bytes(mem));
135
128k
}
_ZN5Botan9clear_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm18446744073709551615EEEEEvOT_Qsr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRS5_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEE
Line
Count
Source
133
82.5k
{
134
82.5k
   clear_bytes(std::ranges::data(mem), ranges::size_bytes(mem));
135
82.5k
}
_ZN5Botan9clear_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm18EEEEEvOT_Qsr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRS6_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEE
Line
Count
Source
133
45.9k
{
134
45.9k
   clear_bytes(std::ranges::data(mem), ranges::size_bytes(mem));
135
45.9k
}
Unexecuted instantiation: _ZN5Botan9clear_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEEEEvOT_Qsr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRS6_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEE
136
137
/**
138
* Copy memory
139
* @param out the destination array
140
* @param in the source array
141
* @param n the number of elements of in/out
142
*/
143
template <typename T>
144
   requires std::is_trivial_v<std::decay_t<T>>
145
289k
inline constexpr void copy_mem(T* out, const T* in, size_t n) {
146
289k
   BOTAN_ASSERT_IMPLICATION(n > 0, in != nullptr && out != nullptr, "If n > 0 then args are not null");
147
148
289k
   if(in != nullptr && out != nullptr && n > 0) {
149
289k
      std::memmove(out, in, sizeof(T) * n);
150
289k
   }
151
289k
}
Unexecuted instantiation: _ZN5Botan8copy_memIhQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
_ZN5Botan8copy_memImQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
Line
Count
Source
145
289k
inline constexpr void copy_mem(T* out, const T* in, size_t n) {
146
289k
   BOTAN_ASSERT_IMPLICATION(n > 0, in != nullptr && out != nullptr, "If n > 0 then args are not null");
147
148
289k
   if(in != nullptr && out != nullptr && n > 0) {
149
289k
      std::memmove(out, in, sizeof(T) * n);
150
289k
   }
151
289k
}
Unexecuted instantiation: _ZN5Botan8copy_memIjQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
Unexecuted instantiation: _ZN5Botan8copy_memIiQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
152
153
/**
154
* Copy memory
155
* @param out the destination array
156
* @param in the source array
157
*/
158
template <ranges::contiguous_output_range OutR, ranges::contiguous_range InR>
159
   requires std::is_same_v<std::ranges::range_value_t<OutR>, std::ranges::range_value_t<InR>> &&
160
            std::is_trivially_copyable_v<std::ranges::range_value_t<InR>>
161
221k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
221k
   ranges::assert_equal_byte_lengths(out, in);
163
221k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
221k
   } else if(ranges::size_bytes(out) > 0) {
166
221k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
221k
   }
168
221k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Line
Count
Source
161
1.06k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
1.06k
   ranges::assert_equal_byte_lengths(out, in);
163
1.06k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
1.06k
   } else if(ranges::size_bytes(out) > 0) {
166
1.06k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
1.06k
   }
168
1.06k
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeES4_Qaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeENS6_IXsr21__is_primary_templateINS7_Iu14__remove_cvrefIDTclL_ZNS9_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSF_ISN_EESO_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISS_EEEvOSA_RKSK_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS2_6vectorIhNS_16secure_allocatorIhEEEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISH_EESI_E4type10value_typeENSA_IXsr21__is_primary_templateINSB_Iu14__remove_cvrefIDTclL_ZNSD_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSJ_ISR_EESS_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISW_EEEvOSE_RKSO_
Line
Count
Source
161
401
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
401
   ranges::assert_equal_byte_lengths(out, in);
163
401
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
401
   } else if(ranges::size_bytes(out) > 0) {
166
401
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
401
   }
168
401
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEETkNS1_16contiguous_rangeENS2_4spanIKhLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeENS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISV_EEEvOSD_RKSN_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEETkNS1_16contiguous_rangeES4_Qaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeENS6_IXsr21__is_primary_templateINS7_Iu14__remove_cvrefIDTclL_ZNS9_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSF_ISN_EESO_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISS_EEEvOSA_RKSK_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKmLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
9.94k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
9.94k
   ranges::assert_equal_byte_lengths(out, in);
163
9.94k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
9.94k
   } else if(ranges::size_bytes(out) > 0) {
166
9.94k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
9.94k
   }
168
9.94k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__16vectorImNS_16secure_allocatorImEEEETkNS1_16contiguous_rangeENS2_4spanImLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISH_EESI_E4type10value_typeENSA_IXsr21__is_primary_templateINSB_Iu14__remove_cvrefIDTclL_ZNSD_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSJ_ISR_EESS_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISW_EEEvOSE_RKSO_
Line
Count
Source
161
209k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
209k
   ranges::assert_equal_byte_lengths(out, in);
163
209k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
209k
   } else if(ranges::size_bytes(out) > 0) {
166
209k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
209k
   }
168
209k
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm4EEETkNS1_16contiguous_rangeENS2_5arrayImLm4EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm32EEETkNS1_16contiguous_rangeENS3_IKhLm32EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm4EEETkNS1_16contiguous_rangeENS2_4spanImLm4EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm1EEETkNS1_16contiguous_rangeENS2_5arrayImLm1EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm6EEETkNS1_16contiguous_rangeENS2_5arrayImLm6EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
700
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
700
   ranges::assert_equal_byte_lengths(out, in);
163
700
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
700
   } else if(ranges::size_bytes(out) > 0) {
166
700
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
700
   }
168
700
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm48EEETkNS1_16contiguous_rangeENS3_IKhLm48EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm6EEETkNS1_16contiguous_rangeENS2_4spanImLm6EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm8EEETkNS1_16contiguous_rangeENS2_5arrayImLm8EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm64EEETkNS1_16contiguous_rangeENS3_IKhLm64EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm8EEETkNS1_16contiguous_rangeENS2_4spanImLm8EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm9EEETkNS1_16contiguous_rangeENS2_5arrayImLm9EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm3EEETkNS1_16contiguous_rangeENS2_5arrayImLm3EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm24EEETkNS1_16contiguous_rangeENS3_IKhLm24EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm3EEETkNS1_16contiguous_rangeENS2_4spanImLm3EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm28EEETkNS1_16contiguous_rangeENS3_IKhLm28EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm28EEETkNS1_16contiguous_rangeENS3_IKhLm28EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm72EEETkNS1_16contiguous_rangeENS3_IKhLm72EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm66EEETkNS1_16contiguous_rangeENS3_IKhLm66EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm66EEETkNS1_16contiguous_rangeENS3_IKhLm66EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm98EEETkNS1_16contiguous_rangeENS3_IKhLm98EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm9EEETkNS1_16contiguous_rangeENS2_4spanImLm9EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
169
170
/**
171
 * Copy a range of a trivially copyable type into another range of trivially
172
 * copyable type of matching byte length.
173
 */
174
template <ranges::contiguous_output_range ToR, ranges::contiguous_range FromR>
175
   requires std::is_trivially_copyable_v<std::ranges::range_value_t<FromR>> &&
176
            std::is_trivially_copyable_v<std::ranges::range_value_t<ToR>>
177
75.9k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
75.9k
   ranges::assert_equal_byte_lengths(out, in);
179
75.9k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
75.9k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm4EEETkNS1_16contiguous_rangeENS2_4spanIhLm32EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm4EEETkNS1_16contiguous_rangeENS2_4spanIKhLm32EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEEEvOSN_RKSD_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm32EEETkNS1_16contiguous_rangeENS2_5arrayImLm4EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanImLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
415
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
415
   ranges::assert_equal_byte_lengths(out, in);
179
415
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
415
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKmLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm1EEETkNS1_16contiguous_rangeENS3_IKhLm8EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
Line
Count
Source
177
32.2k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
32.2k
   ranges::assert_equal_byte_lengths(out, in);
179
32.2k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
32.2k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm8EEETkNS1_16contiguous_rangeENS3_IKmLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
43.2k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
43.2k
   ranges::assert_equal_byte_lengths(out, in);
179
43.2k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
43.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIjLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKjLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanIjLm1EEETkNS1_16contiguous_rangeENS3_IKhLm4EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm4EEETkNS1_16contiguous_rangeENS3_IKjLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm2EEETkNS1_16contiguous_rangeENS3_IKtLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIjLm16EEETkNS1_16contiguous_rangeENS2_4spanIKhLm64EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEEEvOSN_RKSD_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm1EEETkNS1_16contiguous_rangeENS3_IhLm8EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS6_IXsr21__is_primary_templateINS7_Iu14__remove_cvrefIDTclL_ZNS9_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSF_ISN_EESO_E4type10value_typeEEEEvOSK_RKSA_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanItLm1EEETkNS1_16contiguous_rangeENS3_IKhLm2EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
181
182
/**
183
 * Copy a range of trivially copyable type into an instance of trivially
184
 * copyable type with matching length.
185
 */
186
template <typename ToT, ranges::contiguous_range FromR>
187
   requires std::is_trivially_copyable_v<std::ranges::range_value_t<FromR>> && std::is_trivially_copyable_v<ToT> &&
188
            (!std::ranges::range<ToT>)
189
32.2k
inline constexpr void typecast_copy(ToT& out, const FromR& in) {
190
32.2k
   typecast_copy(std::span<ToT, 1>(&out, 1), in);
191
32.2k
}
_ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm8EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISK_EEEvRSK_RKSA_
Line
Count
Source
189
32.2k
inline constexpr void typecast_copy(ToT& out, const FromR& in) {
190
32.2k
   typecast_copy(std::span<ToT, 1>(&out, 1), in);
191
32.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm4EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISK_EEEvRSK_RKSA_
Unexecuted instantiation: _ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIhLm8EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISC_EESD_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISJ_EEEvRSJ_RKS9_
Unexecuted instantiation: _ZN5Botan13typecast_copyItTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm2EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISK_EEEvRSK_RKSA_
192
193
/**
194
 * Copy an instance of trivially copyable type into a range of trivially
195
 * copyable type with matching length.
196
 */
197
template <ranges::contiguous_output_range ToR, typename FromT>
198
   requires std::is_trivially_copyable_v<FromT> &&
199
            (!std::ranges::range<FromT>) && std::is_trivially_copyable_v<std::ranges::range_value_t<ToR>>
200
43.2k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromT& in) {
201
43.2k
   typecast_copy(out, std::span<const FromT, 1>(&in, 1));
202
43.2k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm8EEEmQaaaasr3stdE23is_trivially_copyable_vIT0_Entsr3std6rangesE5rangeIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEEvOSB_RKS6_
Line
Count
Source
200
43.2k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromT& in) {
201
43.2k
   typecast_copy(out, std::span<const FromT, 1>(&in, 1));
202
43.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm4EEEjQaaaasr3stdE23is_trivially_copyable_vIT0_Entsr3std6rangesE5rangeIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEEvOSB_RKS6_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm2EEEtQaaaasr3stdE23is_trivially_copyable_vIT0_Entsr3std6rangesE5rangeIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEEvOSB_RKS6_
203
204
/**
205
 * Create a trivial type by bit-casting a range of trivially copyable type with
206
 * matching length into it.
207
 */
208
template <typename ToT, ranges::contiguous_range FromR>
209
   requires std::is_default_constructible_v<ToT> && std::is_trivially_copyable_v<ToT> &&
210
            std::is_trivially_copyable_v<std::ranges::range_value_t<FromR>>
211
32.2k
inline constexpr ToT typecast_copy(const FromR& src) {
212
32.2k
   ToT dst;  // NOLINT(*-member-init)
213
32.2k
   typecast_copy(dst, src);
214
32.2k
   return dst;
215
32.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyINSt3__15arrayImLm4EEETkNS_6ranges16contiguous_rangeENS1_4spanIhLm32EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS7_Esr3stdE23is_trivially_copyable_vINS1_11conditionalIXsr21__is_primary_templateINS1_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS1_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS1_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEEES7_RKSC_
Unexecuted instantiation: _ZN5Botan13typecast_copyINSt3__15arrayImLm4EEETkNS_6ranges16contiguous_rangeENS1_4spanIKhLm32EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS8_Esr3stdE23is_trivially_copyable_vINS1_11conditionalIXsr21__is_primary_templateINS1_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS1_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS1_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEEES8_RKSD_
_ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm8EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEES6_RKSB_
Line
Count
Source
211
32.2k
inline constexpr ToT typecast_copy(const FromR& src) {
212
32.2k
   ToT dst;  // NOLINT(*-member-init)
213
32.2k
   typecast_copy(dst, src);
214
32.2k
   return dst;
215
32.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm4EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEES6_RKSB_
Unexecuted instantiation: _ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIhLm8EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS5_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEEES5_RKSA_
Unexecuted instantiation: _ZN5Botan13typecast_copyItTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm2EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEES6_RKSB_
216
217
// TODO: deprecate and replace
218
template <typename T>
219
inline constexpr void typecast_copy(uint8_t out[], T in[], size_t N)
220
   requires std::is_trivially_copyable_v<T>
221
{
222
   // asserts that *in and *out point to the correct amount of memory
223
   typecast_copy(std::span<uint8_t>(out, sizeof(T) * N), std::span<const T>(in, N));
224
}
225
226
// TODO: deprecate and replace
227
template <typename T>
228
inline constexpr void typecast_copy(T out[], const uint8_t in[], size_t N)
229
   requires std::is_trivial_v<T>
230
{
231
   // asserts that *in and *out point to the correct amount of memory
232
   typecast_copy(std::span<T>(out, N), std::span<const uint8_t>(in, N * sizeof(T)));
233
}
234
235
// TODO: deprecate and replace
236
template <typename T>
237
inline constexpr void typecast_copy(uint8_t out[], const T& in) {
238
   // asserts that *out points to the correct amount of memory
239
   typecast_copy(std::span<uint8_t, sizeof(T)>(out, sizeof(T)), in);
240
}
241
242
// TODO: deprecate and replace
243
template <typename T>
244
   requires std::is_trivial_v<std::decay_t<T>>
245
inline constexpr void typecast_copy(T& out, const uint8_t in[]) {
246
   // asserts that *in points to the correct amount of memory
247
   typecast_copy(out, std::span<const uint8_t, sizeof(T)>(in, sizeof(T)));
248
}
249
250
// TODO: deprecate and replace
251
template <typename To>
252
   requires std::is_trivial_v<To>
253
inline constexpr To typecast_copy(const uint8_t src[]) noexcept {
254
   // asserts that *src points to the correct amount of memory
255
   return typecast_copy<To>(std::span<const uint8_t, sizeof(To)>(src, sizeof(To)));
256
}
257
258
#if !defined(BOTAN_IS_BEING_BUILT)
259
/**
260
* Set memory to a fixed value
261
* @param ptr a pointer to an array of bytes
262
* @param n the number of Ts pointed to by ptr
263
* @param val the value to set each byte to
264
*/
265
BOTAN_DEPRECATED("This function is deprecated") inline constexpr void set_mem(uint8_t* ptr, size_t n, uint8_t val) {
266
   if(n > 0) {
267
      std::memset(ptr, val, n);
268
   }
269
}
270
#endif
271
272
#if !defined(BOTAN_IS_BEING_BUILT)
273
inline const uint8_t* cast_char_ptr_to_uint8(const char* s) {
274
   return reinterpret_cast<const uint8_t*>(s);
275
}
276
277
inline uint8_t* cast_char_ptr_to_uint8(char* s) {
278
   return reinterpret_cast<uint8_t*>(s);
279
}
280
#endif
281
282
6
inline const char* cast_uint8_ptr_to_char(const uint8_t* b) {
283
6
   return reinterpret_cast<const char*>(b);
284
6
}
285
286
0
inline char* cast_uint8_ptr_to_char(uint8_t* b) {
287
0
   return reinterpret_cast<char*>(b);
288
0
}
289
290
#if !defined(BOTAN_IS_BEING_BUILT)
291
/**
292
* Memory comparison, input insensitive
293
* @param p1 a pointer to an array
294
* @param p2 a pointer to another array
295
* @param n the number of Ts in p1 and p2
296
* @return true iff p1[i] == p2[i] forall i in [0...n)
297
*/
298
template <typename T>
299
BOTAN_DEPRECATED("This function is deprecated")
300
inline bool same_mem(const T* p1, const T* p2, size_t n) {
301
   volatile T difference = 0;
302
303
   for(size_t i = 0; i != n; ++i) {
304
      difference = difference | (p1[i] ^ p2[i]);
305
   }
306
307
   return difference == 0;
308
}
309
#endif
310
311
#if !defined(BOTAN_IS_BEING_BUILT)
312
313
template <typename T, typename Alloc>
314
BOTAN_DEPRECATED("The buffer_insert functions are deprecated")
315
size_t buffer_insert(std::vector<T, Alloc>& buf, size_t buf_offset, const T input[], size_t input_length) {
316
   BOTAN_ASSERT_NOMSG(buf_offset <= buf.size());
317
   const size_t to_copy = std::min(input_length, buf.size() - buf_offset);
318
   if(to_copy > 0) {
319
      copy_mem(&buf[buf_offset], input, to_copy);
320
   }
321
   return to_copy;
322
}
323
324
template <typename T, typename Alloc, typename Alloc2>
325
BOTAN_DEPRECATED("The buffer_insert functions are deprecated")
326
size_t buffer_insert(std::vector<T, Alloc>& buf, size_t buf_offset, const std::vector<T, Alloc2>& input) {
327
   BOTAN_ASSERT_NOMSG(buf_offset <= buf.size());
328
   const size_t to_copy = std::min(input.size(), buf.size() - buf_offset);
329
   if(to_copy > 0) {
330
      copy_mem(&buf[buf_offset], input.data(), to_copy);
331
   }
332
   return to_copy;
333
}
334
335
#endif
336
337
/**
338
* XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length
339
* @param out the input/output range
340
* @param in the read-only input range
341
*/
342
inline constexpr void xor_buf(ranges::contiguous_output_range<uint8_t> auto&& out,
343
0
                              ranges::contiguous_range<uint8_t> auto&& in) {
344
0
   ranges::assert_equal_byte_lengths(out, in);
345
346
0
   std::span<uint8_t> o(out);
347
0
   std::span<const uint8_t> i(in);
348
349
0
   for(; o.size_bytes() >= 32; o = o.subspan(32), i = i.subspan(32)) {
350
0
      auto x = typecast_copy<std::array<uint64_t, 4>>(o.template first<32>());
351
0
      const auto y = typecast_copy<std::array<uint64_t, 4>>(i.template first<32>());
352
353
0
      x[0] ^= y[0];
354
0
      x[1] ^= y[1];
355
0
      x[2] ^= y[2];
356
0
      x[3] ^= y[3];
357
358
0
      typecast_copy(o.template first<32>(), x);
359
0
   }
360
361
0
   for(size_t off = 0; off != o.size_bytes(); ++off) {
362
0
      o[off] ^= i[off];
363
0
   }
364
0
}
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEENS4_IKhLm18446744073709551615EEEEEvOT_OT0_
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEES5_EEvOT_OT0_
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEERKNS3_6vectorIhNS_16secure_allocatorIhEEEEEEvOT_OT0_
365
366
/**
367
* XOR arrays. Postcondition out[i] = in1[i] ^ in2[i] forall i = 0...length
368
* @param out the output range
369
* @param in1 the first input range
370
* @param in2 the second input range
371
*/
372
inline constexpr void xor_buf(ranges::contiguous_output_range<uint8_t> auto&& out,
373
                              ranges::contiguous_range<uint8_t> auto&& in1,
374
0
                              ranges::contiguous_range<uint8_t> auto&& in2) {
375
0
   ranges::assert_equal_byte_lengths(out, in1, in2);
376
377
0
   std::span o{out};
378
0
   std::span i1{in1};
379
0
   std::span i2{in2};
380
381
0
   for(; o.size_bytes() >= 32; o = o.subspan(32), i1 = i1.subspan(32), i2 = i2.subspan(32)) {
382
0
      auto x = typecast_copy<std::array<uint64_t, 4>>(i1.template first<32>());
383
0
      const auto y = typecast_copy<std::array<uint64_t, 4>>(i2.template first<32>());
384
385
0
      x[0] ^= y[0];
386
0
      x[1] ^= y[1];
387
0
      x[2] ^= y[2];
388
0
      x[3] ^= y[3];
389
390
0
      typecast_copy(o.template first<32>(), x);
391
0
   }
392
393
0
   for(size_t off = 0; off != o.size_bytes(); ++off) {
394
0
      o[off] = i1[off] ^ i2[off];
395
0
   }
396
0
}
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEENS4_IKhLm18446744073709551615EEETkNS6_IhEES8_EEvOT_OT0_OT1_
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEES5_TkNS7_IhEES5_EEvOT_OT0_OT1_
397
398
/**
399
* XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length
400
* @param out the input/output buffer
401
* @param in the read-only input buffer
402
* @param length the length of the buffers
403
*/
404
0
inline void xor_buf(uint8_t out[], const uint8_t in[], size_t length) {
405
   // simply assumes that *out and *in point to "length" allocated bytes at least
406
0
   xor_buf(std::span{out, length}, std::span{in, length});
407
0
}
408
409
/**
410
* XOR arrays. Postcondition out[i] = in[i] ^ in2[i] forall i = 0...length
411
* @param out the output buffer
412
* @param in the first input buffer
413
* @param in2 the second input buffer
414
* @param length the length of the three buffers
415
*/
416
0
inline void xor_buf(uint8_t out[], const uint8_t in[], const uint8_t in2[], size_t length) {
417
   // simply assumes that *out, *in, and *in2 point to "length" allocated bytes at least
418
0
   xor_buf(std::span{out, length}, std::span{in, length}, std::span{in2, length});
419
0
}
420
421
// TODO: deprecate and replace, use .subspan()
422
0
inline void xor_buf(std::span<uint8_t> out, std::span<const uint8_t> in, size_t n) {
423
0
   BOTAN_ARG_CHECK(out.size() >= n, "output span is too small");
424
0
   BOTAN_ARG_CHECK(in.size() >= n, "input span is too small");
425
0
   xor_buf(out.first(n), in.first(n));
426
0
}
427
428
// TODO: deprecate and replace, use .subspan()
429
template <typename Alloc>
430
0
void xor_buf(std::vector<uint8_t, Alloc>& out, const uint8_t* in, size_t n) {
431
0
   BOTAN_ARG_CHECK(out.size() >= n, "output vector is too small");
432
   // simply assumes that *in points to "n" allocated bytes at least
433
0
   xor_buf(std::span{out}.first(n), std::span{in, n});
434
0
}
435
436
// TODO: deprecate and replace
437
template <typename Alloc, typename Alloc2>
438
void xor_buf(std::vector<uint8_t, Alloc>& out, const uint8_t* in, const std::vector<uint8_t, Alloc2>& in2, size_t n) {
439
   BOTAN_ARG_CHECK(out.size() >= n, "output vector is too small");
440
   BOTAN_ARG_CHECK(in2.size() >= n, "input vector is too small");
441
   // simply assumes that *in points to "n" allocated bytes at least
442
   xor_buf(std::span{out}.first(n), std::span{in, n}, std::span{in2}.first(n));
443
}
444
445
template <typename Alloc, typename Alloc2>
446
0
std::vector<uint8_t, Alloc>& operator^=(std::vector<uint8_t, Alloc>& out, const std::vector<uint8_t, Alloc2>& in) {
447
0
   if(out.size() < in.size()) {
448
0
      out.resize(in.size());
449
0
   }
450
451
0
   xor_buf(std::span{out}.first(in.size()), in);
452
0
   return out;
453
0
}
454
455
}  // namespace Botan
456
457
#endif