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" 26 # pragma GCC diagnostic ignored "-Wunused-function" 36 #define _interlockedbittestandset CRYPTOPP_DISABLED_INTRINSIC_1 37 #define _interlockedbittestandreset CRYPTOPP_DISABLED_INTRINSIC_2 38 #define _interlockedbittestandset64 CRYPTOPP_DISABLED_INTRINSIC_3 39 #define _interlockedbittestandreset64 CRYPTOPP_DISABLED_INTRINSIC_4 41 #undef _interlockedbittestandset 42 #undef _interlockedbittestandreset 43 #undef _interlockedbittestandset64 44 #undef _interlockedbittestandreset64 45 #define CRYPTOPP_FAST_ROTATE(x) 1 46 #elif _MSC_VER >= 1300 47 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32 | (x) == 64) 49 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32) 51 #elif (defined(__MWERKS__) && TARGET_CPU_PPC) || \ 52 (defined(__GNUC__) && (defined(_ARCH_PWR2) || defined(_ARCH_PWR) || defined(_ARCH_PPC) || defined(_ARCH_PPC64) || defined(_ARCH_COM))) 53 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32) 54 #elif defined(__GNUC__) && (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86) // depend on GCC's peephole optimization to generate rotate instructions 55 #define CRYPTOPP_FAST_ROTATE(x) 1 57 #define CRYPTOPP_FAST_ROTATE(x) 0 65 #if defined(__GNUC__) && defined(__linux__) 66 #define CRYPTOPP_BYTESWAP_AVAILABLE 71 # include <x86intrin.h> 74 #endif // CRYPTOPP_DOXYGEN_PROCESSING 76 #if CRYPTOPP_DOXYGEN_PROCESSING 92 # if defined(__SIZE_MAX__) && (__SIZE_MAX__ > 0) 93 # define SIZE_MAX __SIZE_MAX__ 94 # elif defined(SIZE_T_MAX) && (SIZE_T_MAX > 0) 95 # define SIZE_MAX SIZE_T_MAX 96 # elif defined(__SIZE_TYPE__) 97 # define SIZE_MAX (~(__SIZE_TYPE__)0) 99 # define SIZE_MAX ((std::numeric_limits<size_t>::max)()) 103 #endif // CRYPTOPP_DOXYGEN_PROCESSING 112 #if CRYPTOPP_DOXYGEN_PROCESSING 116 #define CRYPTOPP_COMPILE_ASSERT(expr) { ... } 117 #else // CRYPTOPP_DOXYGEN_PROCESSING 121 static char dummy[2*b-1];
124 #define CRYPTOPP_COMPILE_ASSERT(assertion) CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__) 125 #if defined(CRYPTOPP_EXPORTS) || defined(CRYPTOPP_IMPORTS) 126 #define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) 128 # if defined(__GNUC__) 129 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) \ 130 static CompileAssert<(assertion)> \ 131 CRYPTOPP_ASSERT_JOIN(cryptopp_CRYPTOPP_ASSERT_, instance) __attribute__ ((unused)) 133 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) \ 134 static CompileAssert<(assertion)> \ 135 CRYPTOPP_ASSERT_JOIN(cryptopp_CRYPTOPP_ASSERT_, instance) 138 #define CRYPTOPP_ASSERT_JOIN(X, Y) CRYPTOPP_DO_ASSERT_JOIN(X, Y) 139 #define CRYPTOPP_DO_ASSERT_JOIN(X, Y) X##Y 141 #endif // CRYPTOPP_DOXYGEN_PROCESSING 145 #if CRYPTOPP_DOXYGEN_PROCESSING 153 # define COUNTOF(arr) 157 # if defined(_MSC_VER) && (_MSC_VER >= 1400) 158 # define COUNTOF(x) _countof(x) 160 # define COUNTOF(x) (sizeof(x)/sizeof(x[0])) 163 #endif // CRYPTOPP_DOXYGEN_PROCESSING 173 #if !defined(CRYPTOPP_DOXYGEN_PROCESSING) 174 template <
class BASE1,
class BASE2>
175 class CRYPTOPP_NO_VTABLE TwoBases :
public BASE1,
public BASE2
179 template <
class BASE1,
class BASE2,
class BASE3>
180 class CRYPTOPP_NO_VTABLE ThreeBases :
public BASE1,
public BASE2,
public BASE3
183 #endif // CRYPTOPP_DOXYGEN_PROCESSING 215 T* operator()()
const {
return new T;}
218 #if CRYPTOPP_DOXYGEN_PROCESSING 227 #define MEMORY_BARRIER ... 229 #if defined(CRYPTOPP_CXX11_ATOMICS) 230 # define MEMORY_BARRIER() std::atomic_thread_fence(std::memory_order_acq_rel) 231 #elif (_MSC_VER >= 1400) 232 # pragma intrinsic(_ReadWriteBarrier) 233 # define MEMORY_BARRIER() _ReadWriteBarrier() 234 #elif defined(__INTEL_COMPILER) 235 # define MEMORY_BARRIER() __memory_barrier() 236 #elif defined(__GNUC__) || defined(__clang__) 237 # define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory") 239 # define MEMORY_BARRIER() 241 #endif // CRYPTOPP_DOXYGEN_PROCESSING 262 template <
class T,
class F = NewObject<T>,
int instance=0>
266 Singleton(F objectFactory = F()) : m_objectFactory(objectFactory) {}
269 CRYPTOPP_NOINLINE
const T &
Ref(CRYPTOPP_NOINLINE_DOTDOTDOT)
const;
283 template <
class T,
class F,
int instance>
286 #if defined(CRYPTOPP_CXX11_ATOMICS) && defined(CRYPTOPP_CXX11_SYNCHRONIZATION) && defined(CRYPTOPP_CXX11_DYNAMIC_INIT) 287 static std::mutex s_mutex;
288 static std::atomic<T*> s_pObject;
290 T *p = s_pObject.load(std::memory_order_relaxed);
291 std::atomic_thread_fence(std::memory_order_acquire);
296 std::lock_guard<std::mutex> lock(s_mutex);
297 p = s_pObject.load(std::memory_order_relaxed);
298 std::atomic_thread_fence(std::memory_order_acquire);
303 T *newObject = m_objectFactory();
304 s_pObject.store(newObject, std::memory_order_relaxed);
305 std::atomic_thread_fence(std::memory_order_release);
310 T *p = s_pObject.m_p;
316 T *newObject = m_objectFactory();
326 s_pObject.m_p = newObject;
342 template <
typename PTR,
typename OFF>
343 inline PTR
PtrAdd(PTR pointer, OFF offset)
345 return pointer+
static_cast<ptrdiff_t
>(offset);
355 template <
typename PTR,
typename OFF>
356 inline PTR
PtrSub(PTR pointer, OFF offset)
358 return pointer-
static_cast<ptrdiff_t
>(offset);
370 template <
typename PTR>
371 inline ptrdiff_t
PtrDiff(
const PTR pointer1,
const PTR pointer2)
373 return pointer1 - pointer2;
385 template <
typename PTR>
388 return (
size_t)(
reinterpret_cast<uintptr_t
>(pointer1) - reinterpret_cast<uintptr_t>(pointer2));
391 #if (!__STDC_WANT_SECURE_LIB__ && !defined(_MEMORY_S_DEFINED)) || defined(CRYPTOPP_WANT_SECURE_LIB) 411 inline void memcpy_s(
void *dest,
size_t sizeInBytes,
const void *src,
size_t count)
422 if (count > sizeInBytes)
425 #if CRYPTOPP_MSC_VERSION 426 # pragma warning(push) 427 # pragma warning(disable: 4996) 428 # if (CRYPTOPP_MSC_VERSION >= 1400) 429 # pragma warning(disable: 6386) 432 memcpy(dest, src, count);
433 #if CRYPTOPP_MSC_VERSION 434 # pragma warning(pop) 456 inline void memmove_s(
void *dest,
size_t sizeInBytes,
const void *src,
size_t count)
465 if (count > sizeInBytes)
468 #if CRYPTOPP_MSC_VERSION 469 # pragma warning(push) 470 # pragma warning(disable: 4996) 471 # if (CRYPTOPP_MSC_VERSION >= 1400) 472 # pragma warning(disable: 6386) 475 memmove(dest, src, count);
476 #if CRYPTOPP_MSC_VERSION 477 # pragma warning(pop) 481 #if __BORLANDC__ >= 0x620 483 # define memcpy_s CryptoPP::memcpy_s 484 # define memmove_s CryptoPP::memmove_s 487 #endif // __STDC_WANT_SECURE_LIB__ 504 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5120) 518 inline void *
memset_z(
void *ptr,
int value,
size_t num)
521 #if CRYPTOPP_GCC_VERSION >= 30001 522 if (__builtin_constant_p(num) && num==0)
525 volatile void* x = memset(ptr, value, num);
526 return const_cast<void*
>(x);
535 template <
class T>
inline const T&
STDMIN(
const T& a,
const T& b)
537 return b < a ? b : a;
546 template <
class T>
inline const T&
STDMAX(
const T& a,
const T& b)
548 return a < b ? b : a;
551 #if CRYPTOPP_MSC_VERSION 552 # pragma warning(push) 553 # pragma warning(disable: 4389) 556 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 557 # pragma GCC diagnostic push 558 # pragma GCC diagnostic ignored "-Wsign-compare" 559 # pragma GCC diagnostic ignored "-Wstrict-overflow" 560 # if (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 30000) 561 # pragma GCC diagnostic ignored "-Wtautological-compare" 562 # elif (CRYPTOPP_GCC_VERSION >= 40300) 563 # pragma GCC diagnostic ignored "-Wtype-limits" 574 template <
class T1,
class T2>
inline const T1
UnsignedMin(
const T1& a,
const T2& b)
577 if (
sizeof(T1)<=
sizeof(T2))
578 return b < (T2)a ? (T1)b : a;
580 return (T1)b < a ? (T1)b : a;
589 template <
class T1,
class T2>
592 to =
static_cast<T2
>(from);
593 if (from != to || (from > 0) != (to > 0))
607 const unsigned int HIGH_BIT = (1U << 31);
608 const char CH = !!(base & HIGH_BIT) ?
'A' :
'a';
624 T digit = value % base;
625 result = char((digit < 10 ?
'0' : (CH - 10)) + digit) + result;
629 result =
"-" + result;
639 template <> CRYPTOPP_DLL
661 template <> CRYPTOPP_DLL
664 #if CRYPTOPP_MSC_VERSION 665 # pragma warning(pop) 668 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 669 # pragma GCC diagnostic pop 672 #define RETURN_IF_NONZERO(x) size_t returnedValue = x; if (returnedValue) return returnedValue 675 #define GETBYTE(x, y) (unsigned int)byte((x)>>(8*(y))) 680 #define CRYPTOPP_GET_BYTE_AS_BYTE(x, y) byte((x)>>(8*(y))) 689 for (
unsigned int i=8*
sizeof(value)/2; i>0; i/=2)
691 return (
unsigned int)value&1;
704 unsigned int l=0, h=8*
sizeof(value);
707 unsigned int t = (l+h)/2;
727 unsigned int l=0, h=8*
sizeof(value);
731 unsigned int t = (l+h)/2;
754 return (
unsigned int)_tzcnt_u32(v);
755 #elif defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 30400) 756 return (
unsigned int)__builtin_ctz(v);
757 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) 758 unsigned long result;
759 _BitScanForward(&result, v);
760 return static_cast<unsigned int>(result);
763 static const int MultiplyDeBruijnBitPosition[32] =
765 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
766 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
768 return MultiplyDeBruijnBitPosition[((word32)((v & -v) * 0x077CB531U)) >> 27];
784 #if defined(__BMI__) && defined(__x86_64__) 785 return (
unsigned int)_tzcnt_u64(v);
786 #elif defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 30400) 787 return (
unsigned int)__builtin_ctzll(v);
788 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) && (defined(_M_X64) || defined(_M_IA64)) 789 unsigned long result;
790 _BitScanForward64(&result, v);
791 return static_cast<unsigned int>(result);
806 inline T
Crop(T value,
size_t bits)
808 if (bits < 8*
sizeof(value))
809 return T(value & ((T(1) << bits) - 1));
820 return ((bitCount+7)/(8));
830 return ((byteCount+WORD_SIZE-1)/WORD_SIZE);
840 return ((bitCount+WORD_BITS-1)/(WORD_BITS));
850 return ((bitCount+2*WORD_BITS-1)/(2*WORD_BITS));
859 CRYPTOPP_DLL
void CRYPTOPP_API
xorbuf(byte *buf,
const byte *mask,
size_t count);
868 CRYPTOPP_DLL
void CRYPTOPP_API
xorbuf(byte *output,
const byte *input,
const byte *mask,
size_t count);
880 CRYPTOPP_DLL
bool CRYPTOPP_API
VerifyBufsEqual(
const byte *buf1,
const byte *buf2,
size_t count);
891 return value > 0 && (value & (value-1)) == 0;
896 inline bool IsPowerOf2<word32>(
const word32 &value)
898 return value > 0 && _blsr_u32(value) == 0;
901 # if defined(__x86_64__) 903 inline bool IsPowerOf2<word64>(
const word64 &value)
905 return value > 0 && _blsr_u64(value) == 0;
907 # endif // __x86_64__ 925 return (std::numeric_limits<T>::min)();
943 return (std::numeric_limits<T>::max)();
948 #if defined(CRYPTOPP_WORD128_AVAILABLE) 957 return (static_cast<word128>(LWORD_MAX) << 64U) | LWORD_MAX;
971 template <
class T1,
class T2>
975 return T1((a > b) ? (a - b) : 0);
988 template <
class T1,
class T2>
992 return T1((a > b) ? (a - b) : 1);
1003 template <
class T1,
class T2>
1022 template <
class T1,
class T2>
1026 #if !defined(CRYPTOPP_APPLE_CLANG_VERSION) || (CRYPTOPP_APPLE_CLANG_VERSION >= 80000) 1052 template <
class T1,
class T2>
1056 #if !defined(CRYPTOPP_APPLE_CLANG_VERSION) || (CRYPTOPP_APPLE_CLANG_VERSION >= 80000) 1064 if (NumericLimitsMax<T1>() - m + 1 < n)
1081 #if defined(CRYPTOPP_CXX11_ALIGNOF) 1083 #elif (_MSC_VER >= 1300) 1084 return __alignof(T);
1085 #elif defined(__GNUC__) 1086 return __alignof__(T);
1087 #elif defined(__SUNPRO_CC) 1088 return __alignof__(T);
1089 #elif defined(__IBM_ALIGNOF__) 1090 return __alignof__(T);
1091 #elif CRYPTOPP_BOOL_SLOW_WORD64 1094 # if __BIGGEST_ALIGNMENT__ 1095 if (__BIGGEST_ALIGNMENT__ <
sizeof(T))
1096 return __BIGGEST_ALIGNMENT__;
1113 const uintptr_t x =
reinterpret_cast<uintptr_t
>(ptr);
1114 return alignment==1 || (
IsPowerOf2(alignment) ?
ModPowerOf2(x, alignment) == 0 : x % alignment == 0);
1130 #if (CRYPTOPP_LITTLE_ENDIAN) 1132 #elif (CRYPTOPP_BIG_ENDIAN) 1135 # error "Unable to determine endian-ness" 1150 return NativeByteOrder::ToEnum();
1197 for (
int i=
int(size-1), carry=1; i>=0 && carry; i--)
1198 carry = !++inout[i];
1213 for (i=
int(size-1), carry=1; i>=0 && carry; i--)
1214 carry = ((output[i] = input[i]+1) == 0);
1215 memcpy_s(output, size, input,
size_t(i)+1);
1239 ptrdiff_t t = size_t(c) * (a - b);
1258 volatile T *p = buf+n;
1263 #if !defined(CRYPTOPP_DISABLE_ASM) && \ 1264 (_MSC_VER >= 1400 || defined(__GNUC__)) && \ 1265 (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86) 1274 volatile byte *p = buf;
1276 asm volatile(
"rep stosb" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1278 __stosb(reinterpret_cast<byte *>(reinterpret_cast<size_t>(p)), 0, n);
1289 volatile word16 *p = buf;
1291 asm volatile(
"rep stosw" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1293 __stosw(reinterpret_cast<word16 *>(reinterpret_cast<size_t>(p)), 0, n);
1304 volatile word32 *p = buf;
1306 asm volatile(
"rep stosl" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1308 __stosd(reinterpret_cast<unsigned long *>(reinterpret_cast<size_t>(p)), 0, n);
1319 #if CRYPTOPP_BOOL_X64 1320 volatile word64 *p = buf;
1322 asm volatile(
"rep stosq" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1324 __stosq(const_cast<word64 *>(p), 0, n);
1331 #endif // CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 1333 #if !defined(CRYPTOPP_DISABLE_ASM) && (_MSC_VER >= 1700) && defined(_M_ARM) 1336 char *p =
reinterpret_cast<char*
>(buf+n);
1338 __iso_volatile_store8(--p, 0);
1343 short *p =
reinterpret_cast<short*
>(buf+n);
1345 __iso_volatile_store16(--p, 0);
1350 int *p =
reinterpret_cast<int*
>(buf+n);
1352 __iso_volatile_store32(--p, 0);
1357 __int64 *p =
reinterpret_cast<__int64*
>(buf+n);
1359 __iso_volatile_store64(--p, 0);
1372 if (
sizeof(T) % 8 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word64>() == 0)
1373 SecureWipeBuffer(reinterpret_cast<word64 *>(static_cast<void *>(buf)), n * (
sizeof(T)/8));
1374 else if (
sizeof(T) % 4 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word32>() == 0)
1375 SecureWipeBuffer(reinterpret_cast<word32 *>(static_cast<void *>(buf)), n * (
sizeof(T)/4));
1376 else if (
sizeof(T) % 2 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word16>() == 0)
1377 SecureWipeBuffer(reinterpret_cast<word16 *>(static_cast<void *>(buf)), n * (
sizeof(T)/2));
1379 SecureWipeBuffer(reinterpret_cast<byte *>(static_cast<void *>(buf)), n *
sizeof(T));
1394 std::string
StringNarrow(
const wchar_t *str,
bool throwOnError =
true);
1408 std::wstring
StringWiden(
const char *str,
bool throwOnError =
true);
1473 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1474 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1476 return T((x<<R)|(x>>(-R&MASK)));
1499 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1500 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1502 return T((x >> R)|(x<<(-R&MASK)));
1524 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1525 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1527 return T((x<<y)|(x>>(-y&MASK)));
1549 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1550 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1552 return T((x >> y)|(x<<(-y&MASK)));
1569 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1570 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1572 return T((x<<y)|(x>>(-y&MASK)));
1589 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1590 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1592 return T((x>>y)|(x<<(-y&MASK)));
1604 template <
class T>
inline T
rotlMod(T x,
unsigned int y)
1606 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1607 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1608 return T((x<<(y&MASK))|(x>>(-y&MASK)));
1620 template <
class T>
inline T
rotrMod(T x,
unsigned int y)
1622 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8)
1623 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1)
1624 return T((x>>(y&MASK))|(x<<(-y&MASK)));
1638 template<>
inline word32 rotlFixed<word32>(word32 x,
unsigned int y)
1642 return y ? _lrotl(x, static_cast<byte>(y)) : x;
1654 template<>
inline word32 rotrFixed<word32>(word32 x,
unsigned int y)
1658 return y ? _lrotr(x, static_cast<byte>(y)) : x;
1670 template<>
inline word32 rotlVariable<word32>(word32 x,
unsigned int y)
1673 return _lrotl(x, static_cast<byte>(y));
1685 template<>
inline word32 rotrVariable<word32>(word32 x,
unsigned int y)
1688 return _lrotr(x, static_cast<byte>(y));
1699 template<>
inline word32 rotlMod<word32>(word32 x,
unsigned int y)
1702 return _lrotl(x, static_cast<byte>(y));
1713 template<>
inline word32 rotrMod<word32>(word32 x,
unsigned int y)
1716 return _lrotr(x, static_cast<byte>(y));
1719 #endif // #ifdef _MSC_VER 1721 #if (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1733 template<>
inline word64 rotlFixed<word64>(word64 x,
unsigned int y)
1737 return y ? _rotl64(x, static_cast<byte>(y)) : x;
1749 template<>
inline word64 rotrFixed<word64>(word64 x,
unsigned int y)
1753 return y ? _rotr64(x, static_cast<byte>(y)) : x;
1765 template<>
inline word64 rotlVariable<word64>(word64 x,
unsigned int y)
1768 return _rotl64(x, static_cast<byte>(y));
1780 template<>
inline word64 rotrVariable<word64>(word64 x,
unsigned int y)
1783 return y ? _rotr64(x, static_cast<byte>(y)) : x;
1794 template<>
inline word64 rotlMod<word64>(word64 x,
unsigned int y)
1797 return y ? _rotl64(x, static_cast<byte>(y)) : x;
1808 template<>
inline word64 rotrMod<word64>(word64 x,
unsigned int y)
1811 return y ? _rotr64(x, static_cast<byte>(y)) : x;
1814 #endif // #if _MSC_VER >= 1310 1816 #if _MSC_VER >= 1400 && !defined(__INTEL_COMPILER) 1818 template<>
inline word16 rotlFixed<word16>(word16 x,
unsigned int y)
1821 return _rotl16(x, static_cast<byte>(y));
1824 template<>
inline word16 rotrFixed<word16>(word16 x,
unsigned int y)
1827 return _rotr16(x, static_cast<byte>(y));
1830 template<>
inline word16 rotlVariable<word16>(word16 x,
unsigned int y)
1832 return _rotl16(x, static_cast<byte>(y));
1835 template<>
inline word16 rotrVariable<word16>(word16 x,
unsigned int y)
1837 return _rotr16(x, static_cast<byte>(y));
1840 template<>
inline word16 rotlMod<word16>(word16 x,
unsigned int y)
1842 return _rotl16(x, static_cast<byte>(y));
1845 template<>
inline word16 rotrMod<word16>(word16 x,
unsigned int y)
1847 return _rotr16(x, static_cast<byte>(y));
1850 template<>
inline byte rotlFixed<byte>(byte x,
unsigned int y)
1853 return _rotl8(x, static_cast<byte>(y));
1856 template<>
inline byte rotrFixed<byte>(byte x,
unsigned int y)
1859 return _rotr8(x, static_cast<byte>(y));
1862 template<>
inline byte rotlVariable<byte>(byte x,
unsigned int y)
1864 return _rotl8(x, static_cast<byte>(y));
1867 template<>
inline byte rotrVariable<byte>(byte x,
unsigned int y)
1869 return _rotr8(x, static_cast<byte>(y));
1872 template<>
inline byte rotlMod<byte>(byte x,
unsigned int y)
1874 return _rotl8(x, static_cast<byte>(y));
1877 template<>
inline byte rotrMod<byte>(byte x,
unsigned int y)
1879 return _rotr8(x, static_cast<byte>(y));
1882 #endif // #if _MSC_VER >= 1400 1884 #if (defined(__MWERKS__) && TARGET_CPU_PPC) 1886 template<>
inline word32 rotlFixed<word32>(word32 x,
unsigned int y)
1889 return y ? __rlwinm(x,y,0,31) : x;
1892 template<>
inline word32 rotrFixed<word32>(word32 x,
unsigned int y)
1895 return y ? __rlwinm(x,32-y,0,31) : x;
1898 template<>
inline word32 rotlVariable<word32>(word32 x,
unsigned int y)
1901 return (__rlwnm(x,y,0,31));
1904 template<>
inline word32 rotrVariable<word32>(word32 x,
unsigned int y)
1907 return (__rlwnm(x,32-y,0,31));
1910 template<>
inline word32 rotlMod<word32>(word32 x,
unsigned int y)
1912 return (__rlwnm(x,y,0,31));
1915 template<>
inline word32 rotrMod<word32>(word32 x,
unsigned int y)
1917 return (__rlwnm(x,32-y,0,31));
1920 #endif // __MWERKS__ && TARGET_CPU_PPC 1932 return GETBYTE(value, index);
1934 return GETBYTE(value,
sizeof(T)-index-1);
1950 #if defined(CRYPTOPP_BYTESWAP_AVAILABLE) 1951 return bswap_16(value);
1952 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1953 return _byteswap_ushort(value);
1964 #if defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) 1965 __asm__ (
"bswap %0" :
"=r" (value) :
"0" (value));
1967 #elif defined(CRYPTOPP_BYTESWAP_AVAILABLE) 1968 return bswap_32(value);
1969 #elif defined(__MWERKS__) && TARGET_CPU_PPC 1970 return (word32)__lwbrx(&value,0);
1971 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1972 return _byteswap_ulong(value);
1973 #elif CRYPTOPP_FAST_ROTATE(32) && !defined(__xlC__) 1978 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
1988 #if defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) && defined(__x86_64__) 1989 __asm__ (
"bswap %0" :
"=r" (value) :
"0" (value));
1991 #elif defined(CRYPTOPP_BYTESWAP_AVAILABLE) 1992 return bswap_64(value);
1993 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 1994 return _byteswap_uint64(value);
1995 #elif CRYPTOPP_BOOL_SLOW_WORD64 1998 value = ((value & W64LIT(0xFF00FF00FF00FF00)) >> 8) | ((value & W64LIT(0x00FF00FF00FF00FF)) << 8);
1999 value = ((value & W64LIT(0xFFFF0000FFFF0000)) >> 16) | ((value & W64LIT(0x0000FFFF0000FFFF)) << 16);
2009 value = byte((value & 0xAA) >> 1) | byte((value & 0x55) << 1);
2010 value = byte((value & 0xCC) >> 2) | byte((value & 0x33) << 2);
2019 value = word16((value & 0xAAAA) >> 1) | word16((value & 0x5555) << 1);
2020 value = word16((value & 0xCCCC) >> 2) | word16((value & 0x3333) << 2);
2021 value = word16((value & 0xF0F0) >> 4) | word16((value & 0x0F0F) << 4);
2030 value = word32((value & 0xAAAAAAAA) >> 1) | word32((value & 0x55555555) << 1);
2031 value = word32((value & 0xCCCCCCCC) >> 2) | word32((value & 0x33333333) << 2);
2032 value = word32((value & 0xF0F0F0F0) >> 4) | word32((value & 0x0F0F0F0F) << 4);
2041 #if CRYPTOPP_BOOL_SLOW_WORD64 2044 value = word64((value & W64LIT(0xAAAAAAAAAAAAAAAA)) >> 1) | word64((value & W64LIT(0x5555555555555555)) << 1);
2045 value = word64((value & W64LIT(0xCCCCCCCCCCCCCCCC)) >> 2) | word64((value & W64LIT(0x3333333333333333)) << 2);
2046 value = word64((value & W64LIT(0xF0F0F0F0F0F0F0F0)) >> 4) | word64((value & W64LIT(0x0F0F0F0F0F0F0F0F)) << 4);
2062 else if (
sizeof(T) == 2)
2064 else if (
sizeof(T) == 4)
2129 size_t count = byteCount/
sizeof(T);
2130 for (
size_t i=0; i<count; i++)
2153 memcpy_s(out, byteCount, in, byteCount);
2157 inline void GetUserKey(
ByteOrder order, T *out,
size_t outlen,
const byte *in,
size_t inlen)
2159 const size_t U =
sizeof(T);
2161 memcpy_s(out, outlen*U, in, inlen);
2162 memset_z((byte *)out+inlen, 0, outlen*U-inlen);
2166 inline byte UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const byte *)
2168 CRYPTOPP_UNUSED(order);
2172 inline word16 UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const word16 *)
2175 ? block[1] | (block[0] << 8)
2176 : block[0] | (block[1] << 8);
2179 inline word32 UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const word32 *)
2182 ? word32(block[3]) | (word32(block[2]) << 8) | (word32(block[1]) << 16) | (word32(block[0]) << 24)
2183 : word32(block[0]) | (word32(block[1]) << 8) | (word32(block[2]) << 16) | (word32(block[3]) << 24);
2186 inline word64 UnalignedGetWordNonTemplate(
ByteOrder order,
const byte *block,
const word64 *)
2191 (word64(block[6]) << 8) |
2192 (word64(block[5]) << 16) |
2193 (word64(block[4]) << 24) |
2194 (word64(block[3]) << 32) |
2195 (word64(block[2]) << 40) |
2196 (word64(block[1]) << 48) |
2197 (word64(block[0]) << 56))
2200 (word64(block[1]) << 8) |
2201 (word64(block[2]) << 16) |
2202 (word64(block[3]) << 24) |
2203 (word64(block[4]) << 32) |
2204 (word64(block[5]) << 40) |
2205 (word64(block[6]) << 48) |
2206 (word64(block[7]) << 56));
2209 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, byte value,
const byte *xorBlock)
2211 CRYPTOPP_UNUSED(order);
2212 block[0] =
static_cast<byte
>(xorBlock ? (value ^ xorBlock[0]) : value);
2215 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, word16 value,
const byte *xorBlock)
2221 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2222 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2226 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2227 block[1] = 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);
2239 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2240 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2245 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, word32 value,
const byte *xorBlock)
2251 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2252 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2253 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2254 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2258 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2259 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2260 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2261 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2268 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2269 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2270 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2271 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2275 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2276 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2277 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2278 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2283 inline void UnalignedbyteNonTemplate(
ByteOrder order, byte *block, word64 value,
const byte *xorBlock)
2289 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2290 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2291 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2292 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2293 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2294 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2295 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2296 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2300 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2301 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2302 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2303 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2304 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2305 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2306 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2307 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2314 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2315 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2316 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2317 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2318 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2319 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2320 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2321 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2325 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2326 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2327 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2328 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2329 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2330 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2331 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2332 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2356 CRYPTOPP_UNUSED(assumeAligned);
2359 memcpy(&temp, block,
sizeof(T));
2382 result = GetWord<T>(assumeAligned, order, block);
2396 inline void PutWord(
bool assumeAligned,
ByteOrder order, byte *block, T value,
const byte *xorBlock = NULLPTR)
2398 CRYPTOPP_UNUSED(assumeAligned);
2402 if (xorBlock) {memcpy(&t2, xorBlock,
sizeof(T)); t1 ^= t2;}
2403 memcpy(block, &t1,
sizeof(T));
2421 template <
class T,
class B,
bool A=false>
2428 : m_block((const byte *)block) {}
2438 x = GetWord<T>(A, B::ToEnum(), m_block);
2439 m_block +=
sizeof(T);
2444 const byte *m_block;
2462 template <
class T,
class B,
bool A=false>
2470 : m_xorBlock((const byte *)xorBlock), m_block((byte *)block) {}
2479 PutWord(A, B::ToEnum(), m_block, (T)x, m_xorBlock);
2480 m_block +=
sizeof(T);
2482 m_xorBlock +=
sizeof(T);
2487 const byte *m_xorBlock;
2499 template <
class T,
class B,
bool GA=false,
bool PA=false>
2518 return std::string((
char *)&value,
sizeof(value));
2557 CRYPTOPP_UNUSED(value); CRYPTOPP_UNUSED(bits);
2569 CRYPTOPP_UNUSED(value); CRYPTOPP_UNUSED(bits);
2587 return value >> bits;
2598 return value << bits;
2610 template <
unsigned int bits,
class T>
2624 template <
unsigned int bits,
class T>
2637 template<
typename InputIt,
typename T>
2638 inline InputIt
FindIfNot(InputIt first, InputIt last,
const T &value) {
2639 #ifdef CRYPTOPP_CXX11_LAMBDA 2640 return std::find_if(first, last, [&value](
const T &o) {
2644 return std::find_if(first, last, std::bind2nd(std::not_equal_to<T>(), value));
2650 #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);} 2651 #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);} 2652 #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);} 2653 #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);} 2654 #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);} 2655 #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);} 2656 #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);} 2657 #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);} 2658 #define CRYPTOPP_BLOCKS_END(i) size_t SST() {return SS##i();} void AllocateBlocks() {m_aggregate.New(SST());} AlignedSecByteBlock m_aggregate; 2662 #if (CRYPTOPP_MSC_VERSION) 2663 # pragma warning(pop) 2666 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 2667 # 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.
T NumericLimitsMin()
Provide the minimum value for a type.
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.
T NumericLimitsMax()
Provide the maximum value for a type.
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.