6 #ifndef CRYPTOPP_MISC_H 7 #define CRYPTOPP_MISC_H 11 #if !defined(CRYPTOPP_DOXYGEN_PROCESSING) 13 #if (CRYPTOPP_MSC_VERSION) 14 # pragma warning(push) 15 # pragma warning(disable: 4146 4514) 16 # if (CRYPTOPP_MSC_VERSION >= 1400) 17 # pragma warning(disable: 6326) 22 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 23 # pragma GCC diagnostic push 24 # pragma GCC diagnostic ignored "-Wconversion" 25 # pragma GCC diagnostic ignored "-Wsign-conversion" 35 #define _interlockedbittestandset CRYPTOPP_DISABLED_INTRINSIC_1 36 #define _interlockedbittestandreset CRYPTOPP_DISABLED_INTRINSIC_2 37 #define _interlockedbittestandset64 CRYPTOPP_DISABLED_INTRINSIC_3 38 #define _interlockedbittestandreset64 CRYPTOPP_DISABLED_INTRINSIC_4 40 #undef _interlockedbittestandset 41 #undef _interlockedbittestandreset 42 #undef _interlockedbittestandset64 43 #undef _interlockedbittestandreset64 44 #define CRYPTOPP_FAST_ROTATE(x) 1 45 #elif _MSC_VER >= 1300 46 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32 | (x) == 64) 48 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32) 50 #elif (defined(__MWERKS__) && TARGET_CPU_PPC) || \ 51 (defined(__GNUC__) && (defined(_ARCH_PWR2) || defined(_ARCH_PWR) || defined(_ARCH_PPC) || defined(_ARCH_PPC64) || defined(_ARCH_COM))) 52 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32) 53 #elif defined(__GNUC__) && (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86) // depend on GCC's peephole optimization to generate rotate instructions 54 #define CRYPTOPP_FAST_ROTATE(x) 1 56 #define CRYPTOPP_FAST_ROTATE(x) 0 64 #if defined(__GNUC__) && defined(__linux__) 65 #define CRYPTOPP_BYTESWAP_AVAILABLE 70 # include <x86intrin.h> 73 #endif // CRYPTOPP_DOXYGEN_PROCESSING 75 #if CRYPTOPP_DOXYGEN_PROCESSING 91 # if defined(__SIZE_MAX__) && (__SIZE_MAX__ > 0) 92 # define SIZE_MAX __SIZE_MAX__ 93 # elif defined(SIZE_T_MAX) && (SIZE_T_MAX > 0) 94 # define SIZE_MAX SIZE_T_MAX 95 # elif defined(__SIZE_TYPE__) 96 # define SIZE_MAX (~(__SIZE_TYPE__)0) 98 # define SIZE_MAX ((std::numeric_limits<size_t>::max)()) 102 #endif // CRYPTOPP_DOXYGEN_PROCESSING 106 ANONYMOUS_NAMESPACE_BEGIN
111 return (std::numeric_limits<T>::min)();
117 return (std::numeric_limits<T>::max)();
119 #if defined(CRYPTOPP_WORD128_AVAILABLE) 121 CryptoPP::word128 NumericLimitsMin()
126 CryptoPP::word128 NumericLimitsMax()
128 return (((CryptoPP::word128)W64LIT(0xffffffffffffffff)) << 64U) | (CryptoPP::word128)W64LIT(0xffffffffffffffff);
131 ANONYMOUS_NAMESPACE_END
140 #if CRYPTOPP_DOXYGEN_PROCESSING 144 #define CRYPTOPP_COMPILE_ASSERT(expr) { ... } 145 #else // CRYPTOPP_DOXYGEN_PROCESSING 149 static char dummy[2*b-1];
152 #define CRYPTOPP_COMPILE_ASSERT(assertion) CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__) 153 #if defined(CRYPTOPP_EXPORTS) || defined(CRYPTOPP_IMPORTS) 154 #define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) 156 # if defined(__GNUC__) 157 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) \ 158 static CompileAssert<(assertion)> \ 159 CRYPTOPP_ASSERT_JOIN(cryptopp_CRYPTOPP_ASSERT_, instance) __attribute__ ((unused)) 161 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) \ 162 static CompileAssert<(assertion)> \ 163 CRYPTOPP_ASSERT_JOIN(cryptopp_CRYPTOPP_ASSERT_, instance) 166 #define CRYPTOPP_ASSERT_JOIN(X, Y) CRYPTOPP_DO_ASSERT_JOIN(X, Y) 167 #define CRYPTOPP_DO_ASSERT_JOIN(X, Y) X##Y 169 #endif // CRYPTOPP_DOXYGEN_PROCESSING 173 #if CRYPTOPP_DOXYGEN_PROCESSING 181 # define COUNTOF(arr) 185 # if defined(_MSC_VER) && (_MSC_VER >= 1400) 186 # define COUNTOF(x) _countof(x) 188 # define COUNTOF(x) (sizeof(x)/sizeof(x[0])) 191 #endif // CRYPTOPP_DOXYGEN_PROCESSING 201 #if !defined(CRYPTOPP_DOXYGEN_PROCESSING) 202 template <
class BASE1,
class BASE2>
203 class CRYPTOPP_NO_VTABLE TwoBases :
public BASE1,
public BASE2
207 template <
class BASE1,
class BASE2,
class BASE3>
208 class CRYPTOPP_NO_VTABLE ThreeBases :
public BASE1,
public BASE2,
public BASE3
211 #endif // CRYPTOPP_DOXYGEN_PROCESSING 243 T* operator()()
const {
return new T;}
246 #if CRYPTOPP_DOXYGEN_PROCESSING 255 #define MEMORY_BARRIER ... 257 #if defined(CRYPTOPP_CXX11_ATOMICS) 258 # define MEMORY_BARRIER() std::atomic_thread_fence(std::memory_order_acq_rel) 259 #elif (_MSC_VER >= 1400) 260 # pragma intrinsic(_ReadWriteBarrier) 261 # define MEMORY_BARRIER() _ReadWriteBarrier() 262 #elif defined(__INTEL_COMPILER) 263 # define MEMORY_BARRIER() __memory_barrier() 264 #elif defined(__GNUC__) || defined(__clang__) 265 # define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory") 267 # define MEMORY_BARRIER() 269 #endif // CRYPTOPP_DOXYGEN_PROCESSING 290 template <
class T,
class F = NewObject<T>,
int instance=0>
294 Singleton(F objectFactory = F()) : m_objectFactory(objectFactory) {}
297 CRYPTOPP_NOINLINE
const T &
Ref(CRYPTOPP_NOINLINE_DOTDOTDOT)
const;
311 template <
class T,
class F,
int instance>
314 #if defined(CRYPTOPP_CXX11_ATOMICS) && defined(CRYPTOPP_CXX11_SYNCHRONIZATION) && defined(CRYPTOPP_CXX11_DYNAMIC_INIT) 315 static std::mutex s_mutex;
316 static std::atomic<T*> s_pObject;
318 T *p = s_pObject.load(std::memory_order_relaxed);
319 std::atomic_thread_fence(std::memory_order_acquire);
324 std::lock_guard<std::mutex> lock(s_mutex);
325 p = s_pObject.load(std::memory_order_relaxed);
326 std::atomic_thread_fence(std::memory_order_acquire);
331 T *newObject = m_objectFactory();
332 s_pObject.store(newObject, std::memory_order_relaxed);
333 std::atomic_thread_fence(std::memory_order_release);
338 T *p = s_pObject.m_p;
344 T *newObject = m_objectFactory();
354 s_pObject.m_p = newObject;
370 template <
typename PTR,
typename OFF>
371 inline PTR
PtrAdd(PTR pointer, OFF offset)
373 return pointer+
static_cast<ptrdiff_t
>(offset);
383 template <
typename PTR,
typename OFF>
384 inline PTR
PtrSub(PTR pointer, OFF offset)
386 return pointer-
static_cast<ptrdiff_t
>(offset);
398 template <
typename PTR>
399 inline ptrdiff_t
PtrDiff(
const PTR pointer1,
const PTR pointer2)
401 return pointer1 - pointer2;
413 template <
typename PTR>
416 return (
size_t)(
reinterpret_cast<uintptr_t
>(pointer1) - reinterpret_cast<uintptr_t>(pointer2));
419 #if (!__STDC_WANT_SECURE_LIB__ && !defined(_MEMORY_S_DEFINED)) || defined(CRYPTOPP_WANT_SECURE_LIB) 439 inline void memcpy_s(
void *dest,
size_t sizeInBytes,
const void *src,
size_t count)
450 if (count > sizeInBytes)
453 #if CRYPTOPP_MSC_VERSION 454 # pragma warning(push) 455 # pragma warning(disable: 4996) 456 # if (CRYPTOPP_MSC_VERSION >= 1400) 457 # pragma warning(disable: 6386) 460 memcpy(dest, src, count);
461 #if CRYPTOPP_MSC_VERSION 462 # pragma warning(pop) 484 inline void memmove_s(
void *dest,
size_t sizeInBytes,
const void *src,
size_t count)
493 if (count > sizeInBytes)
496 #if CRYPTOPP_MSC_VERSION 497 # pragma warning(push) 498 # pragma warning(disable: 4996) 499 # if (CRYPTOPP_MSC_VERSION >= 1400) 500 # pragma warning(disable: 6386) 503 memmove(dest, src, count);
504 #if CRYPTOPP_MSC_VERSION 505 # pragma warning(pop) 509 #if __BORLANDC__ >= 0x620 511 # define memcpy_s CryptoPP::memcpy_s 512 # define memmove_s CryptoPP::memmove_s 515 #endif // __STDC_WANT_SECURE_LIB__ 532 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5120) 546 inline void *
memset_z(
void *ptr,
int value,
size_t num)
549 #if CRYPTOPP_GCC_VERSION >= 30001 550 if (__builtin_constant_p(num) && num==0)
553 volatile void* x = memset(ptr, value, num);
554 return const_cast<void*
>(x);
563 template <
class T>
inline const T&
STDMIN(
const T& a,
const T& b)
565 return b < a ? b : a;
574 template <
class T>
inline const T&
STDMAX(
const T& a,
const T& b)
576 return a < b ? b : a;
579 #if CRYPTOPP_MSC_VERSION 580 # pragma warning(push) 581 # pragma warning(disable: 4389) 584 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 585 # pragma GCC diagnostic push 586 # pragma GCC diagnostic ignored "-Wsign-compare" 587 # pragma GCC diagnostic ignored "-Wstrict-overflow" 588 # if (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 30000) 589 # pragma GCC diagnostic ignored "-Wtautological-compare" 590 # elif (CRYPTOPP_GCC_VERSION >= 40300) 591 # pragma GCC diagnostic ignored "-Wtype-limits" 602 template <
class T1,
class T2>
inline const T1
UnsignedMin(
const T1& a,
const T2& b)
605 if (
sizeof(T1)<=
sizeof(T2))
606 return b < (T2)a ? (T1)b : a;
608 return (T1)b < a ? (T1)b : a;
617 template <
class T1,
class T2>
621 if (from != to || (from > 0) != (to > 0))
635 static const unsigned int HIGH_BIT = (1U << 31);
636 const char CH = !!(base & HIGH_BIT) ?
'A' :
'a';
652 T digit = value % base;
653 result = char((digit < 10 ?
'0' : (CH - 10)) + digit) + result;
657 result =
"-" + result;
667 template <> CRYPTOPP_DLL
689 template <> CRYPTOPP_DLL
692 #if CRYPTOPP_MSC_VERSION 693 # pragma warning(pop) 696 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 697 # pragma GCC diagnostic pop 700 #define RETURN_IF_NONZERO(x) size_t returnedValue = x; if (returnedValue) return returnedValue 703 #define GETBYTE(x, y) (unsigned int)byte((x)>>(8*(y))) 708 #define CRYPTOPP_GET_BYTE_AS_BYTE(x, y) byte((x)>>(8*(y))) 717 for (
unsigned int i=8*
sizeof(value)/2; i>0; i/=2)
719 return (
unsigned int)value&1;
732 unsigned int l=0, h=8*
sizeof(value);
735 unsigned int t = (l+h)/2;
755 unsigned int l=0, h=8*
sizeof(value);
759 unsigned int t = (l+h)/2;
782 return (
unsigned int)_tzcnt_u32(v);
783 #elif defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 30400) 784 return (
unsigned int)__builtin_ctz(v);
785 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) 786 unsigned long result;
787 _BitScanForward(&result, v);
788 return static_cast<unsigned int>(result);
791 static const int MultiplyDeBruijnBitPosition[32] =
793 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
794 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
796 return MultiplyDeBruijnBitPosition[((word32)((v & -v) * 0x077CB531U)) >> 27];
812 #if defined(__BMI__) && defined(__x86_64__) 813 return (
unsigned int)_tzcnt_u64(v);
814 #elif defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 30400) 815 return (
unsigned int)__builtin_ctzll(v);
816 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) && (defined(_M_X64) || defined(_M_IA64)) 817 unsigned long result;
818 _BitScanForward64(&result, v);
819 return static_cast<unsigned int>(result);
834 inline T
Crop(T value,
size_t bits)
836 if (bits < 8*
sizeof(value))
837 return T(value & ((T(1) << bits) - 1));
848 return ((bitCount+7)/(8));
858 return ((byteCount+WORD_SIZE-1)/WORD_SIZE);
868 return ((bitCount+WORD_BITS-1)/(WORD_BITS));
878 return ((bitCount+2*WORD_BITS-1)/(2*WORD_BITS));
887 CRYPTOPP_DLL
void CRYPTOPP_API
xorbuf(byte *buf,
const byte *mask,
size_t count);
896 CRYPTOPP_DLL
void CRYPTOPP_API
xorbuf(byte *output,
const byte *input,
const byte *mask,
size_t count);
907 CRYPTOPP_DLL
bool CRYPTOPP_API
VerifyBufsEqual(
const byte *buf1,
const byte *buf2,
size_t count);
917 return value > 0 && (value & (value-1)) == 0;
922 inline bool IsPowerOf2<word32>(
const word32 &value)
924 return value > 0 && _blsr_u32(value) == 0;
927 # if defined(__x86_64__) 929 inline bool IsPowerOf2<word64>(
const word64 &value)
931 return value > 0 && _blsr_u64(value) == 0;
933 # endif // __x86_64__ 945 template <
class T1,
class T2>
949 return T1((a > b) ? (a - b) : 0);
962 template <
class T1,
class T2>
966 return T1((a > b) ? (a - b) : 1);
977 template <
class T1,
class T2>
996 template <
class T1,
class T2>
1000 #if !defined(CRYPTOPP_APPLE_CLANG_VERSION) || (CRYPTOPP_APPLE_CLANG_VERSION >= 80000) 1026 template <
class T1,
class T2>
1030 #if !defined(CRYPTOPP_APPLE_CLANG_VERSION) || (CRYPTOPP_APPLE_CLANG_VERSION >= 80000) 1038 if (NumericLimitsMax<T1>() - m + 1 < n)
1055 #if defined(CRYPTOPP_CXX11_ALIGNOF) 1057 #elif (_MSC_VER >= 1300) 1058 return __alignof(T);
1059 #elif defined(__GNUC__) 1060 return __alignof__(T);
1061 #elif defined(__SUNPRO_CC) 1062 return __alignof__(T);
1063 #elif defined(__IBM_ALIGNOF__) 1064 return __alignof__(T);
1065 #elif CRYPTOPP_BOOL_SLOW_WORD64 1068 # if __BIGGEST_ALIGNMENT__ 1069 if (__BIGGEST_ALIGNMENT__ <
sizeof(T))
1070 return __BIGGEST_ALIGNMENT__;
1087 const uintptr_t x =
reinterpret_cast<uintptr_t
>(ptr);
1088 return alignment==1 || (
IsPowerOf2(alignment) ?
ModPowerOf2(x, alignment) == 0 : x % alignment == 0);
1104 #if (CRYPTOPP_LITTLE_ENDIAN) 1106 #elif (CRYPTOPP_BIG_ENDIAN) 1109 # error "Unable to determine endian-ness" 1124 return NativeByteOrder::ToEnum();
1170 for (
int i=
int(size-1), carry=1; i>=0 && carry; i--)
1171 carry = !++inout[i];
1186 for (i=
int(size-1), carry=1; i>=0 && carry; i--)
1187 carry = ((output[i] = input[i]+1) == 0);
1188 memcpy_s(output, size, input,
size_t(i)+1);
1212 ptrdiff_t t = size_t(c) * (a - b);
1231 volatile T *p = buf+n;
1236 #if !defined(CRYPTOPP_DISABLE_ASM) && \ 1237 (_MSC_VER >= 1400 || defined(__GNUC__)) && \ 1238 (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86) 1247 volatile byte *p = buf;
1249 asm volatile(
"rep stosb" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1251 __stosb(reinterpret_cast<byte *>(reinterpret_cast<size_t>(p)), 0, n);
1262 volatile word16 *p = buf;
1264 asm volatile(
"rep stosw" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1266 __stosw(reinterpret_cast<word16 *>(reinterpret_cast<size_t>(p)), 0, n);
1277 volatile word32 *p = buf;
1279 asm volatile(
"rep stosl" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1281 __stosd(reinterpret_cast<unsigned long *>(reinterpret_cast<size_t>(p)), 0, n);
1292 #if CRYPTOPP_BOOL_X64 1293 volatile word64 *p = buf;
1295 asm volatile(
"rep stosq" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1297 __stosq(const_cast<word64 *>(p), 0, n);
1304 #endif // CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 1306 #if !defined(CRYPTOPP_DISABLE_ASM) && (_MSC_VER >= 1700) && defined(_M_ARM) 1309 char *p =
reinterpret_cast<char*
>(buf+n);
1311 __iso_volatile_store8(--p, 0);
1316 short *p =
reinterpret_cast<short*
>(buf+n);
1318 __iso_volatile_store16(--p, 0);
1323 int *p =
reinterpret_cast<int*
>(buf+n);
1325 __iso_volatile_store32(--p, 0);
1330 __int64 *p =
reinterpret_cast<__int64*
>(buf+n);
1332 __iso_volatile_store64(--p, 0);
1345 if (
sizeof(T) % 8 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word64>() == 0)
1346 SecureWipeBuffer(reinterpret_cast<word64 *>(static_cast<void *>(buf)), n * (
sizeof(T)/8));
1347 else if (
sizeof(T) % 4 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word32>() == 0)
1348 SecureWipeBuffer(reinterpret_cast<word32 *>(static_cast<void *>(buf)), n * (
sizeof(T)/4));
1349 else if (
sizeof(T) % 2 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word16>() == 0)
1350 SecureWipeBuffer(reinterpret_cast<word16 *>(static_cast<void *>(buf)), n * (
sizeof(T)/2));
1352 SecureWipeBuffer(reinterpret_cast<byte *>(static_cast<void *>(buf)), n *
sizeof(T));
1367 std::string
StringNarrow(
const wchar_t *str,
bool throwOnError =
true);
1381 std::wstring
StringWiden(
const char *str,
bool throwOnError =
true);
1383 #ifdef CRYPTOPP_DOXYGEN_PROCESSING 1401 #endif // CRYPTOPP_DOXYGEN_PROCESSING 1403 #if CRYPTOPP_BOOL_ALIGN16 1406 #endif // CRYPTOPP_BOOL_ALIGN16 1439 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1440 static const unsigned int MASK = THIS_SIZE-1;
1442 return T((x<<R)|(x>>(-R&MASK)));
1465 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1466 static const unsigned int MASK = THIS_SIZE-1;
1468 return T((x >> R)|(x<<(-R&MASK)));
1490 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1491 static const unsigned int MASK = THIS_SIZE-1;
1493 return T((x<<y)|(x>>(-y&MASK)));
1515 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1516 static const unsigned int MASK = THIS_SIZE-1;
1518 return T((x >> y)|(x<<(-y&MASK)));
1535 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1536 static const unsigned int MASK = THIS_SIZE-1;
1538 return T((x<<y)|(x>>(-y&MASK)));
1555 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1556 static const unsigned int MASK = THIS_SIZE-1;
1558 return T((x>>y)|(x<<(-y&MASK)));
1570 template <
class T>
inline T
rotlMod(T x,
unsigned int y)
1572 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1573 static const unsigned int MASK = THIS_SIZE-1;
1574 return T((x<<(y&MASK))|(x>>(-y&MASK)));
1586 template <
class T>
inline T
rotrMod(T x,
unsigned int y)
1588 static const unsigned int THIS_SIZE =
sizeof(T)*8;
1589 static const unsigned int MASK = THIS_SIZE-1;
1590 return T((x>>(y&MASK))|(x<<(-y&MASK)));
1604 template<>
inline word32 rotlFixed<word32>(word32 x,
unsigned int y)
1608 return y ? _lrotl(x, static_cast<byte>(y)) : x;
1620 template<>
inline word32 rotrFixed<word32>(word32 x,
unsigned int y)
1624 return y ? _lrotr(x, static_cast<byte>(y)) : x;
1636 template<>
inline word32 rotlVariable<word32>(word32 x,
unsigned int y)
1639 return _lrotl(x, static_cast<byte>(y));
1651 template<>
inline word32 rotrVariable<word32>(word32 x,
unsigned int y)
1654 return _lrotr(x, static_cast<byte>(y));
1665 template<>
inline word32 rotlMod<word32>(word32 x,
unsigned int y)
1668 return _lrotl(x, static_cast<byte>(y));
1679 template<>
inline word32 rotrMod<word32>(word32 x,
unsigned int y)
1682 return _lrotr(x, static_cast<byte>(y));
1685 #endif // #ifdef _MSC_VER 1687 #if (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1699 template<>
inline word64 rotlFixed<word64>(word64 x,
unsigned int y)
1703 return y ? _rotl64(x, static_cast<byte>(y)) : x;
1715 template<>
inline word64 rotrFixed<word64>(word64 x,
unsigned int y)
1719 return y ? _rotr64(x, static_cast<byte>(y)) : x;
1731 template<>
inline word64 rotlVariable<word64>(word64 x,
unsigned int y)
1734 return _rotl64(x, static_cast<byte>(y));
1746 template<>
inline word64 rotrVariable<word64>(word64 x,
unsigned int y)
1749 return y ? _rotr64(x, static_cast<byte>(y)) : x;
1760 template<>
inline word64 rotlMod<word64>(word64 x,
unsigned int y)
1763 return y ? _rotl64(x, static_cast<byte>(y)) : x;
1774 template<>
inline word64 rotrMod<word64>(word64 x,
unsigned int y)
1777 return y ? _rotr64(x, static_cast<byte>(y)) : x;
1780 #endif // #if _MSC_VER >= 1310 1782 #if _MSC_VER >= 1400 && !defined(__INTEL_COMPILER) 1784 template<>
inline word16 rotlFixed<word16>(word16 x,
unsigned int y)
1787 return _rotl16(x, static_cast<byte>(y));
1790 template<>
inline word16 rotrFixed<word16>(word16 x,
unsigned int y)
1793 return _rotr16(x, static_cast<byte>(y));
1796 template<>
inline word16 rotlVariable<word16>(word16 x,
unsigned int y)
1798 return _rotl16(x, static_cast<byte>(y));
1801 template<>
inline word16 rotrVariable<word16>(word16 x,
unsigned int y)
1803 return _rotr16(x, static_cast<byte>(y));
1806 template<>
inline word16 rotlMod<word16>(word16 x,
unsigned int y)
1808 return _rotl16(x, static_cast<byte>(y));
1811 template<>
inline word16 rotrMod<word16>(word16 x,
unsigned int y)
1813 return _rotr16(x, static_cast<byte>(y));
1816 template<>
inline byte rotlFixed<byte>(byte x,
unsigned int y)
1819 return _rotl8(x, static_cast<byte>(y));
1822 template<>
inline byte rotrFixed<byte>(byte x,
unsigned int y)
1825 return _rotr8(x, static_cast<byte>(y));
1828 template<>
inline byte rotlVariable<byte>(byte x,
unsigned int y)
1830 return _rotl8(x, static_cast<byte>(y));
1833 template<>
inline byte rotrVariable<byte>(byte x,
unsigned int y)
1835 return _rotr8(x, static_cast<byte>(y));
1838 template<>
inline byte rotlMod<byte>(byte x,
unsigned int y)
1840 return _rotl8(x, static_cast<byte>(y));
1843 template<>
inline byte rotrMod<byte>(byte x,
unsigned int y)
1845 return _rotr8(x, static_cast<byte>(y));
1848 #endif // #if _MSC_VER >= 1400 1850 #if (defined(__MWERKS__) && TARGET_CPU_PPC) 1852 template<>
inline word32 rotlFixed<word32>(word32 x,
unsigned int y)
1855 return y ? __rlwinm(x,y,0,31) : x;
1858 template<>
inline word32 rotrFixed<word32>(word32 x,
unsigned int y)
1861 return y ? __rlwinm(x,32-y,0,31) : x;
1864 template<>
inline word32 rotlVariable<word32>(word32 x,
unsigned int y)
1867 return (__rlwnm(x,y,0,31));
1870 template<>
inline word32 rotrVariable<word32>(word32 x,
unsigned int y)
1873 return (__rlwnm(x,32-y,0,31));
1876 template<>
inline word32 rotlMod<word32>(word32 x,
unsigned int y)
1878 return (__rlwnm(x,y,0,31));
1881 template<>
inline word32 rotrMod<word32>(word32 x,
unsigned int y)
1883 return (__rlwnm(x,32-y,0,31));
1886 #endif // __MWERKS__ && TARGET_CPU_PPC 1898 return GETBYTE(value, index);
1900 return GETBYTE(value,
sizeof(T)-index-1);
1916 #if defined(CRYPTOPP_BYTESWAP_AVAILABLE) 1917 return bswap_16(value);
1918 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1919 return _byteswap_ushort(value);
1930 #if defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) 1931 __asm__ (
"bswap %0" :
"=r" (value) :
"0" (value));
1933 #elif defined(CRYPTOPP_BYTESWAP_AVAILABLE) 1934 return bswap_32(value);
1935 #elif defined(__MWERKS__) && TARGET_CPU_PPC 1936 return (word32)__lwbrx(&value,0);
1937 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1938 return _byteswap_ulong(value);
1939 #elif CRYPTOPP_FAST_ROTATE(32) && !defined(__xlC__) 1944 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
1954 #if defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) && defined(__x86_64__) 1955 __asm__ (
"bswap %0" :
"=r" (value) :
"0" (value));
1957 #elif defined(CRYPTOPP_BYTESWAP_AVAILABLE) 1958 return bswap_64(value);
1959 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1960 return _byteswap_uint64(value);
1961 #elif CRYPTOPP_BOOL_SLOW_WORD64 1964 value = ((value & W64LIT(0xFF00FF00FF00FF00)) >> 8) | ((value & W64LIT(0x00FF00FF00FF00FF)) << 8);
1965 value = ((value & W64LIT(0xFFFF0000FFFF0000)) >> 16) | ((value & W64LIT(0x0000FFFF0000FFFF)) << 16);
1975 value = byte((value & 0xAA) >> 1) | byte((value & 0x55) << 1);
1976 value = byte((value & 0xCC) >> 2) | byte((value & 0x33) << 2);
1985 value = word16((value & 0xAAAA) >> 1) | word16((value & 0x5555) << 1);
1986 value = word16((value & 0xCCCC) >> 2) | word16((value & 0x3333) << 2);
1987 value = word16((value & 0xF0F0) >> 4) | word16((value & 0x0F0F) << 4);
1996 value = word32((value & 0xAAAAAAAA) >> 1) | word32((value & 0x55555555) << 1);
1997 value = word32((value & 0xCCCCCCCC) >> 2) | word32((value & 0x33333333) << 2);
1998 value = word32((value & 0xF0F0F0F0) >> 4) | word32((value & 0x0F0F0F0F) << 4);
2007 #if CRYPTOPP_BOOL_SLOW_WORD64 2010 value = word64((value & W64LIT(0xAAAAAAAAAAAAAAAA)) >> 1) | word64((value & W64LIT(0x5555555555555555)) << 1);
2011 value = word64((value & W64LIT(0xCCCCCCCCCCCCCCCC)) >> 2) | word64((value & W64LIT(0x3333333333333333)) << 2);
2012 value = word64((value & W64LIT(0xF0F0F0F0F0F0F0F0)) >> 4) | word64((value & W64LIT(0x0F0F0F0F0F0F0F0F)) << 4);
2028 else if (
sizeof(T) == 2)
2030 else if (
sizeof(T) == 4)
2095 size_t count = byteCount/
sizeof(T);
2096 for (
size_t i=0; i<count; i++)
2119 memcpy_s(out, byteCount, in, byteCount);
2123 inline void GetUserKey(
ByteOrder order, T *out,
size_t outlen,
const byte *in,
size_t inlen)
2125 const size_t U =
sizeof(T);
2127 memcpy_s(out, outlen*U, in, inlen);
2128 memset_z((byte *)out+inlen, 0, outlen*U-inlen);
2132 inline byte UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const byte *)
2134 CRYPTOPP_UNUSED(order);
2138 inline word16 UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const word16 *)
2141 ? block[1] | (block[0] << 8)
2142 : block[0] | (block[1] << 8);
2145 inline word32 UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const word32 *)
2148 ? word32(block[3]) | (word32(block[2]) << 8) | (word32(block[1]) << 16) | (word32(block[0]) << 24)
2149 : word32(block[0]) | (word32(block[1]) << 8) | (word32(block[2]) << 16) | (word32(block[3]) << 24);
2152 inline word64 UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const word64 *)
2157 (word64(block[6]) << 8) |
2158 (word64(block[5]) << 16) |
2159 (word64(block[4]) << 24) |
2160 (word64(block[3]) << 32) |
2161 (word64(block[2]) << 40) |
2162 (word64(block[1]) << 48) |
2163 (word64(block[0]) << 56))
2166 (word64(block[1]) << 8) |
2167 (word64(block[2]) << 16) |
2168 (word64(block[3]) << 24) |
2169 (word64(block[4]) << 32) |
2170 (word64(block[5]) << 40) |
2171 (word64(block[6]) << 48) |
2172 (word64(block[7]) << 56));
2175 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, byte value,
const byte *xorBlock)
2177 CRYPTOPP_UNUSED(order);
2178 block[0] =
static_cast<byte
>(xorBlock ? (value ^ xorBlock[0]) : value);
2181 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, word16 value,
const byte *xorBlock)
2187 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2188 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2192 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2193 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2200 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2201 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2205 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2206 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2211 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, word32 value,
const byte *xorBlock)
2217 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2218 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2219 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2220 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2224 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2225 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2226 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2227 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2234 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2235 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2236 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2237 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2241 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2242 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2243 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2244 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2249 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, word64 value,
const byte *xorBlock)
2255 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2256 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2257 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2258 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2259 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2260 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2261 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2262 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2266 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2267 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2268 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2269 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2270 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2271 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2272 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2273 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2280 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2281 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2282 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2283 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2284 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2285 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2286 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2287 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2291 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2292 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2293 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2294 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2295 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2296 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2297 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2298 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2322 CRYPTOPP_UNUSED(assumeAligned);
2325 memcpy(&temp, block,
sizeof(T));
2348 result = GetWord<T>(assumeAligned, order, block);
2362 inline void PutWord(
bool assumeAligned,
ByteOrder order, byte *block, T value,
const byte *xorBlock = NULLPTR)
2364 CRYPTOPP_UNUSED(assumeAligned);
2368 if (xorBlock) {memcpy(&t2, xorBlock,
sizeof(T)); t1 ^= t2;}
2369 memcpy(block, &t1,
sizeof(T));
2387 template <
class T,
class B,
bool A=false>
2394 : m_block((const byte *)block) {}
2404 x = GetWord<T>(A, B::ToEnum(), m_block);
2405 m_block +=
sizeof(T);
2410 const byte *m_block;
2428 template <
class T,
class B,
bool A=false>
2436 : m_xorBlock((const byte *)xorBlock), m_block((byte *)block) {}
2445 PutWord(A, B::ToEnum(), m_block, (T)x, m_xorBlock);
2446 m_block +=
sizeof(T);
2448 m_xorBlock +=
sizeof(T);
2453 const byte *m_xorBlock;
2465 template <
class T,
class B,
bool GA=false,
bool PA=false>
2484 return std::string((
char *)&value,
sizeof(value));
2523 CRYPTOPP_UNUSED(value); CRYPTOPP_UNUSED(bits);
2535 CRYPTOPP_UNUSED(value); CRYPTOPP_UNUSED(bits);
2553 return value >> bits;
2564 return value << bits;
2576 template <
unsigned int bits,
class T>
2590 template <
unsigned int bits,
class T>
2603 template<
typename InputIt,
typename T>
2604 inline InputIt
FindIfNot(InputIt first, InputIt last,
const T &value) {
2605 #ifdef CRYPTOPP_CXX11_LAMBDA 2606 return std::find_if(first, last, [&value](
const T &o) {
2610 return std::find_if(first, last, std::bind2nd(std::not_equal_to<T>(), value));
2616 #define CRYPTOPP_BLOCK_1(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+0);} size_t SS1() {return sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2617 #define CRYPTOPP_BLOCK_2(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS1());} size_t SS2() {return SS1()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2618 #define CRYPTOPP_BLOCK_3(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS2());} size_t SS3() {return SS2()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2619 #define CRYPTOPP_BLOCK_4(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS3());} size_t SS4() {return SS3()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2620 #define CRYPTOPP_BLOCK_5(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS4());} size_t SS5() {return SS4()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2621 #define CRYPTOPP_BLOCK_6(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS5());} size_t SS6() {return SS5()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2622 #define CRYPTOPP_BLOCK_7(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS6());} size_t SS7() {return SS6()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2623 #define CRYPTOPP_BLOCK_8(n, t, s) t* m_##n() {return (t *)(void *)(m_aggregate+SS7());} size_t SS8() {return SS7()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);} 2624 #define CRYPTOPP_BLOCKS_END(i) size_t SST() {return SS##i();} void AllocateBlocks() {m_aggregate.New(SST());} AlignedSecByteBlock m_aggregate; 2628 #if (CRYPTOPP_MSC_VERSION) 2629 # pragma warning(pop) 2632 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 2633 # pragma GCC diagnostic pop void SecureWipeBuffer(T *buf, size_t n)
Sets each element of an array to 0.
InputIt FindIfNot(InputIt first, InputIt last, const T &value)
Finds first element not in a range.
the cipher is performing decryption
An invalid argument was detected.
std::string StringNarrow(const wchar_t *str, bool throwOnError=true)
Converts a wide character C-string to a multibyte string.
bool NativeByteOrderIs(ByteOrder order)
Determines whether order follows native byte ordering.
void memmove_s(void *dest, size_t sizeInBytes, const void *src, size_t count)
Bounds checking replacement for memmove()
bool SafeConvert(T1 from, T2 &to)
Tests whether a conversion from -> to is safe to perform.
ByteOrder
Provides the byte ordering.
void AlignedDeallocate(void *ptr)
Frees a buffer allocated with AlignedAllocate.
Restricts the instantiation of a class to one static object without locks.
void IncrementCounterByOne(byte *inout, unsigned int size)
Performs an addition with carry on a block of bytes.
T2 ModPowerOf2(const T1 &a, const T2 &b)
Reduces a value to a power of 2.
T SafeRightShift(T value)
Safely right shift values when undefined behavior could occur.
size_t BitsToBytes(size_t bitCount)
Returns the number of 8-bit bytes or octets required for the specified number of bits.
T StringToWord(const std::string &str, ByteOrder order=BIG_ENDIAN_ORDER)
Convert a string to a word.
ptrdiff_t PtrDiff(const PTR pointer1, const PTR pointer2)
Determine pointer difference.
bool IsAligned(const void *ptr)
Determines whether ptr is minimally aligned.
T rotlFixed(T x, unsigned int y)
Performs a left rotate.
size_t BitsToWords(size_t bitCount)
Returns the number of words required for the specified number of bits.
void PutWord(bool assumeAligned, ByteOrder order, byte *block, T value, const byte *xorBlock=NULL)
Access a block of memory.
unsigned int BytePrecision(const T &value)
Returns the number of 8-bit bytes or octets required for a value.
PutBlock(const void *xorBlock, void *block)
Construct a PutBlock.
Converts an enumeration to a type suitable for use as a template parameter.
CipherDir
Specifies a direction for a cipher to operate.
Abstract base classes that provide a uniform interface to this library.
void memcpy_s(void *dest, size_t sizeInBytes, const void *src, size_t count)
Bounds checking replacement for memcpy()
unsigned int GetAlignmentOf()
Returns the minimum alignment requirements of a type.
static T LeftShift(T value, unsigned int bits)
Left shifts a value that does not overflow.
An object factory function.
Classes for automatic resource management.
Library configuration file.
size_t BytesToWords(size_t byteCount)
Returns the number of words required for the specified number of bytes.
std::string IntToString< word64 >(word64 value, unsigned int base)
Converts an unsigned value to a string.
std::string WordToString(T value, ByteOrder order=BIG_ENDIAN_ORDER)
Convert a word to a string.
T rotlVariable(T x, unsigned int y)
Performs a left rotate.
Access a block of memory.
byte BitReverse(byte value)
Reverses bits in a 8-bit value.
byte order is little-endian
the cipher is performing encryption
T GetWord(bool assumeAligned, ByteOrder order, const byte *block)
Access a block of memory.
void SecureWipeArray(T *buf, size_t n)
Sets each element of an array to 0.
bool IsAlignedOn(const void *ptr, unsigned int alignment)
Determines whether ptr is aligned to a minimum value.
Uses encapsulation to hide an object in derived classes.
size_t PtrByteDiff(const PTR pointer1, const PTR pointer2)
Determine pointer difference.
void * UnalignedAllocate(size_t size)
Allocates a buffer.
Manages resources for a single object.
unsigned int TrailingZeros(word32 v)
Determines the number of trailing 0-bits in a value.
T rotlConstant(T x)
Performs a left rotate.
void CallNewHandler()
Attempts to reclaim unused memory.
#define CRYPTOPP_COMPILE_ASSERT(expr)
Compile time assertion.
T Crop(T value, size_t bits)
Truncates the value to the specified number of bits.
T ConditionalByteReverse(ByteOrder order, T value)
Reverses bytes in a value depending upon endianness.
void ConditionalSwapPointers(bool c, T &a, T &b)
Performs a branchless swap of pointers a and b if condition c is true.
Multiple precision integer with arithmetic operations.
T1 SaturatingSubtract(const T1 &a, const T2 &b)
Performs a saturating subtract clamped at 0.
CipherDir GetCipherDir(const T &obj)
Returns the direction the cipher is being operated.
const T1 UnsignedMin(const T1 &a, const T2 &b)
Safe comparison of values that could be neagtive and incorrectly promoted.
bool IsPowerOf2(const T &value)
Tests whether a value is a power of 2.
static T RightShift(T value, unsigned int bits)
Right shifts a value that does not overflow.
#define MEMORY_BARRIER
A memory barrier.
void * memset_z(void *ptr, int value, size_t num)
Memory block initializer and eraser that attempts to survive optimizations.
unsigned int Parity(T value)
Returns the parity of a value.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
std::wstring StringWiden(const char *str, bool throwOnError=true)
Converts a multibyte C-string to a wide character string.
PutBlock< T, B, A > & operator()(U x)
Access a block of memory.
void ConditionalSwap(bool c, T &a, T &b)
Performs a branchless swap of values a and b if condition c is true.
PTR PtrSub(PTR pointer, OFF offset)
Create a pointer with an offset.
T1 SaturatingSubtract1(const T1 &a, const T2 &b)
Performs a saturating subtract clamped at 1.
PTR PtrAdd(PTR pointer, OFF offset)
Create a pointer with an offset.
GetBlock(const void *block)
Construct a GetBlock.
T SafeLeftShift(T value)
Safely left shift values when undefined behavior could occur.
static T RightShift(T value, unsigned int bits)
Right shifts a value that overflows.
void xorbuf(byte *buf, const byte *mask, size_t count)
Performs an XOR of a buffer with a mask.
T rotrConstant(T x)
Performs a right rotate.
Access a block of memory.
std::string IntToString(T value, unsigned int base=10)
Converts a value to a string.
GetBlock< T, B, A > & operator()(U &x)
Access a block of memory.
bool VerifyBufsEqual(const byte *buf1, const byte *buf2, size_t count)
Performs a near constant-time comparison of two equally sized buffers.
ByteOrder GetNativeByteOrder()
Returns NativeByteOrder as an enumerated ByteOrder value.
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
Safely shift values when undefined behavior could occur.
const T & STDMAX(const T &a, const T &b)
Replacement function for std::max.
Access a block of memory.
std::string IntToString< Integer >(Integer value, unsigned int base)
Converts an Integer to a string.
Crypto++ library namespace.
T rotrVariable(T x, unsigned int y)
Performs a right rotate.
T rotlMod(T x, unsigned int y)
Performs a left rotate.
unsigned int GetByte(ByteOrder order, T value, unsigned int index)
Gets a byte from a value.
T rotrMod(T x, unsigned int y)
Performs a right rotate.
T rotrFixed(T x, unsigned int y)
Performs a right rotate.
Ensures an object is not copyable.
byte ByteReverse(byte value)
Reverses bytes in a 8-bit value.
void UnalignedDeallocate(void *ptr)
Frees a buffer allocated with UnalignedAllocate.
unsigned int BitPrecision(const T &value)
Returns the number of bits required for a value.
const T & Ref(...) const
Return a reference to the inner Singleton object.
size_t BitsToDwords(size_t bitCount)
Returns the number of double words required for the specified number of bits.
static T LeftShift(T value, unsigned int bits)
Left shifts a value that overflows.
T1 RoundDownToMultipleOf(const T1 &n, const T2 &m)
Rounds a value down to a multiple of a second value.
void * AlignedAllocate(size_t size)
Allocates a buffer on 16-byte boundary.
void vec_swap(T &a, T &b)
Swaps two variables which are arrays.