6 #ifndef CRYPTOPP_MISC_H 7 #define CRYPTOPP_MISC_H 17 #if !defined(CRYPTOPP_DOXYGEN_PROCESSING) 19 #if (CRYPTOPP_MSC_VERSION) 20 # pragma warning(push) 21 # pragma warning(disable: 4146 4514) 22 # if (CRYPTOPP_MSC_VERSION >= 1400) 23 # pragma warning(disable: 6326) 28 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 29 # pragma GCC diagnostic push 30 # pragma GCC diagnostic ignored "-Wconversion" 31 # pragma GCC diagnostic ignored "-Wsign-conversion" 32 # pragma GCC diagnostic ignored "-Wunused-function" 38 #define _interlockedbittestandset CRYPTOPP_DISABLED_INTRINSIC_1 39 #define _interlockedbittestandreset CRYPTOPP_DISABLED_INTRINSIC_2 40 #define _interlockedbittestandset64 CRYPTOPP_DISABLED_INTRINSIC_3 41 #define _interlockedbittestandreset64 CRYPTOPP_DISABLED_INTRINSIC_4 43 #undef _interlockedbittestandset 44 #undef _interlockedbittestandreset 45 #undef _interlockedbittestandset64 46 #undef _interlockedbittestandreset64 47 #define CRYPTOPP_FAST_ROTATE(x) 1 48 #elif _MSC_VER >= 1300 49 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32 | (x) == 64) 51 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32) 53 #elif (defined(__MWERKS__) && TARGET_CPU_PPC) || \ 54 (defined(__GNUC__) && (defined(_ARCH_PWR2) || defined(_ARCH_PWR) || defined(_ARCH_PPC) || defined(_ARCH_PPC64) || defined(_ARCH_COM))) 55 #define CRYPTOPP_FAST_ROTATE(x) ((x) == 32) 56 #elif defined(__GNUC__) && (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86) // depend on GCC's peephole optimization to generate rotate instructions 57 #define CRYPTOPP_FAST_ROTATE(x) 1 59 #define CRYPTOPP_FAST_ROTATE(x) 0 67 #if (defined(__GNUC__) || defined(__clang__)) && defined(__linux__) 68 #define CRYPTOPP_BYTESWAP_AVAILABLE 1 73 #if defined(__arm__) && (defined(__GNUC__) || defined(__clang__)) && (__ARM_ARCH >= 6) 74 #define CRYPTOPP_ARM_BYTEREV_AVAILABLE 1 78 #if defined(__arm__) && (defined(__GNUC__) || defined(__clang__)) && (__ARM_ARCH >= 7) 79 #define CRYPTOPP_ARM_BITREV_AVAILABLE 1 83 # if defined(CRYPTOPP_GCC_COMPATIBLE) 84 # include <x86intrin.h> 86 # include <immintrin.h> 91 #if defined(__clang__) 93 # define _blsr_u32 __blsr_u32 96 # define _blsr_u64 __blsr_u64 99 # define _tzcnt_u32 __tzcnt_u32 102 # define _tzcnt_u64 __tzcnt_u64 106 #endif // CRYPTOPP_DOXYGEN_PROCESSING 108 #if CRYPTOPP_DOXYGEN_PROCESSING 120 # define SIZE_MAX ... 126 # if defined(__SIZE_MAX__) 127 # define SIZE_MAX __SIZE_MAX__ 128 # elif defined(SIZE_T_MAX) 129 # define SIZE_MAX SIZE_T_MAX 130 # elif defined(__SIZE_TYPE__) 131 # define SIZE_MAX (~(__SIZE_TYPE__)0) 133 # define SIZE_MAX ((std::numeric_limits<size_t>::max)()) 137 #endif // CRYPTOPP_DOXYGEN_PROCESSING 146 #if CRYPTOPP_DOXYGEN_PROCESSING 153 # define CRYPTOPP_COMPILE_ASSERT(expr) { ... } 154 #elif defined(CRYPTOPP_CXX17_STATIC_ASSERT) 155 # define CRYPTOPP_COMPILE_ASSERT(expr) static_assert(expr) 156 #else // CRYPTOPP_DOXYGEN_PROCESSING 160 static char dummy[2*b-1];
163 #define CRYPTOPP_COMPILE_ASSERT(assertion) CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__) 164 #define CRYPTOPP_ASSERT_JOIN(X, Y) CRYPTOPP_DO_ASSERT_JOIN(X, Y) 165 #define CRYPTOPP_DO_ASSERT_JOIN(X, Y) X##Y 167 #if defined(CRYPTOPP_EXPORTS) || defined(CRYPTOPP_IMPORTS) 168 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) 170 # if defined(__GNUC__) || defined(__clang__) 171 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) \ 172 static CompileAssert<(assertion)> \ 173 CRYPTOPP_ASSERT_JOIN(cryptopp_CRYPTOPP_ASSERT_, instance) __attribute__ ((unused)) 175 # define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) \ 176 static CompileAssert<(assertion)> \ 177 CRYPTOPP_ASSERT_JOIN(cryptopp_CRYPTOPP_ASSERT_, instance) 178 # endif // GCC or Clang 181 #endif // CRYPTOPP_DOXYGEN_PROCESSING 185 #if CRYPTOPP_DOXYGEN_PROCESSING 193 # define COUNTOF(arr) 197 # if defined(_MSC_VER) && (_MSC_VER >= 1400) 198 # define COUNTOF(x) _countof(x) 200 # define COUNTOF(x) (sizeof(x)/sizeof(x[0])) 203 #endif // CRYPTOPP_DOXYGEN_PROCESSING 213 #if !defined(CRYPTOPP_DOXYGEN_PROCESSING) 214 template <
class BASE1,
class BASE2>
215 class CRYPTOPP_NO_VTABLE TwoBases :
public BASE1,
public BASE2
219 template <
class BASE1,
class BASE2,
class BASE3>
220 class CRYPTOPP_NO_VTABLE ThreeBases :
public BASE1,
public BASE2,
public BASE3
223 #endif // CRYPTOPP_DOXYGEN_PROCESSING 244 #if CRYPTOPP_CXX11_DELETED_FUNCTIONS 260 T* operator()()
const {
return new T;}
263 #if CRYPTOPP_DOXYGEN_PROCESSING 272 #define MEMORY_BARRIER ... 274 #if defined(CRYPTOPP_CXX11_ATOMIC) 275 # define MEMORY_BARRIER() std::atomic_thread_fence(std::memory_order_acq_rel) 276 #elif (_MSC_VER >= 1400) 277 # pragma intrinsic(_ReadWriteBarrier) 278 # define MEMORY_BARRIER() _ReadWriteBarrier() 279 #elif defined(__INTEL_COMPILER) 280 # define MEMORY_BARRIER() __memory_barrier() 281 #elif defined(__GNUC__) || defined(__clang__) 282 # define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory") 284 # define MEMORY_BARRIER() 286 #endif // CRYPTOPP_DOXYGEN_PROCESSING 307 template <
class T,
class F = NewObject<T>,
int instance=0>
311 Singleton(F objectFactory = F()) : m_objectFactory(objectFactory) {}
314 CRYPTOPP_NOINLINE
const T &
Ref(CRYPTOPP_NOINLINE_DOTDOTDOT)
const;
328 template <
class T,
class F,
int instance>
331 #if defined(CRYPTOPP_CXX11_ATOMIC) && defined(CRYPTOPP_CXX11_SYNCHRONIZATION) && defined(CRYPTOPP_CXX11_STATIC_INIT) 332 static std::mutex s_mutex;
333 static std::atomic<T*> s_pObject;
335 T *p = s_pObject.load(std::memory_order_relaxed);
336 std::atomic_thread_fence(std::memory_order_acquire);
341 std::lock_guard<std::mutex> lock(s_mutex);
342 p = s_pObject.load(std::memory_order_relaxed);
343 std::atomic_thread_fence(std::memory_order_acquire);
348 T *newObject = m_objectFactory();
349 s_pObject.store(newObject, std::memory_order_relaxed);
350 std::atomic_thread_fence(std::memory_order_release);
355 T *p = s_pObject.m_p;
361 T *newObject = m_objectFactory();
371 s_pObject.m_p = newObject;
387 template <
typename PTR,
typename OFF>
388 inline PTR
PtrAdd(PTR pointer, OFF offset)
390 return pointer+
static_cast<ptrdiff_t
>(offset);
400 template <
typename PTR,
typename OFF>
401 inline PTR
PtrSub(PTR pointer, OFF offset)
403 return pointer-
static_cast<ptrdiff_t
>(offset);
415 template <
typename PTR>
416 inline ptrdiff_t
PtrDiff(
const PTR pointer1,
const PTR pointer2)
418 return pointer1 - pointer2;
430 template <
typename PTR>
433 return (
size_t)(
reinterpret_cast<uintptr_t
>(pointer1) - reinterpret_cast<uintptr_t>(pointer2));
448 return reinterpret_cast<byte*
>(&str[0]);
467 return reinterpret_cast<const byte*
>(&str[0]);
498 #if (CRYPTOPP_CXX11_CONSTEXPR) 499 template <
typename T>
501 return static_cast<int>(v);
504 # define EnumToInt(v) static_cast<int>(v) 507 #if (!__STDC_WANT_SECURE_LIB__ && !defined(_MEMORY_S_DEFINED)) || defined(CRYPTOPP_WANT_SECURE_LIB) 527 inline void memcpy_s(
void *dest,
size_t sizeInBytes,
const void *src,
size_t count)
538 if (count > sizeInBytes)
541 #if CRYPTOPP_MSC_VERSION 542 # pragma warning(push) 543 # pragma warning(disable: 4996) 544 # if (CRYPTOPP_MSC_VERSION >= 1400) 545 # pragma warning(disable: 6386) 548 if (src != NULLPTR && dest != NULLPTR)
549 std::memcpy(dest, src, count);
550 #if CRYPTOPP_MSC_VERSION 551 # pragma warning(pop) 573 inline void memmove_s(
void *dest,
size_t sizeInBytes,
const void *src,
size_t count)
582 if (count > sizeInBytes)
585 #if CRYPTOPP_MSC_VERSION 586 # pragma warning(push) 587 # pragma warning(disable: 4996) 588 # if (CRYPTOPP_MSC_VERSION >= 1400) 589 # pragma warning(disable: 6386) 592 if (src != NULLPTR && dest != NULLPTR)
593 std::memmove(dest, src, count);
594 #if CRYPTOPP_MSC_VERSION 595 # pragma warning(pop) 599 #if __BORLANDC__ >= 0x620 602 # define memcpy_s CryptoPP::memcpy_s 603 # define memmove_s CryptoPP::memmove_s 606 #endif // __STDC_WANT_SECURE_LIB__ 623 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5120) 640 inline void *
memset_z(
void *ptr,
int val,
size_t num)
643 #if CRYPTOPP_GCC_VERSION >= 30001 || CRYPTOPP_LLVM_CLANG_VERSION >= 20800 || \ 644 CRYPTOPP_APPLE_CLANG_VERSION >= 30000 645 if (__builtin_constant_p(num) && num==0)
648 return std::memset(ptr, val, num);
657 template <
class T>
inline const T&
STDMIN(
const T& a,
const T& b)
659 return b < a ? b : a;
668 template <
class T>
inline const T&
STDMAX(
const T& a,
const T& b)
670 return a < b ? b : a;
673 #if CRYPTOPP_MSC_VERSION 674 # pragma warning(push) 675 # pragma warning(disable: 4389) 678 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 679 # pragma GCC diagnostic push 680 # pragma GCC diagnostic ignored "-Wstrict-overflow" 681 # if (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 30000) 682 # pragma GCC diagnostic ignored "-Wtautological-compare" 683 # elif (CRYPTOPP_GCC_VERSION >= 40300) 684 # pragma GCC diagnostic ignored "-Wtype-limits" 695 template <
class T1,
class T2>
inline const T1
UnsignedMin(
const T1& a,
const T2& b)
701 if (
sizeof(T1)<=
sizeof(T2))
702 return b < (T2)a ? (T1)b : a;
704 return (T1)b < a ? (T1)b : a;
717 template <
class T1,
class T2>
720 to =
static_cast<T2
>(from);
721 if (from != to || (from > 0) != (to > 0))
745 to =
static_cast<word64>(from);
759 to =
static_cast<word64>(from);
775 to =
static_cast<word64>(from);
789 if (from > static_cast<word64>((std::numeric_limits<sword64>::max)()))
791 to =
static_cast<sword64>(from);
805 to =
static_cast<sword64>(from);
819 to =
static_cast<sword64>(from);
833 if (from > static_cast<word64>((std::numeric_limits<word32>::max)()))
835 to =
static_cast<word32>(from);
851 else if (from > static_cast<sword64>((std::numeric_limits<word32>::max)()))
853 to =
static_cast<word32>(from);
869 to =
static_cast<word32>(from);
883 if (from > static_cast<word64>((std::numeric_limits<sword32>::max)()))
885 to =
static_cast<sword32>(from);
899 if (from > static_cast<sword64>((std::numeric_limits<sword32>::max)()))
901 else if (from < static_cast<sword64>((std::numeric_limits<sword32>::min)()))
903 to =
static_cast<sword32>(from);
917 if (from > static_cast<word32>((std::numeric_limits<sword32>::max)()))
919 to =
static_cast<sword32>(from);
932 const unsigned int HIGH_BIT = (1U << 31);
933 const char CH = !!(base & HIGH_BIT) ?
'A' :
'a';
949 T digit = value % base;
950 result = char((digit < 10 ?
'0' : (CH - 10)) + digit) + result;
954 result =
"-" + result;
964 template <> CRYPTOPP_DLL
986 template <> CRYPTOPP_DLL
989 #if CRYPTOPP_MSC_VERSION 990 # pragma warning(pop) 993 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 994 # pragma GCC diagnostic pop 997 #define RETURN_IF_NONZERO(x) size_t returnedValue = x; if (returnedValue) return returnedValue 1000 #define GETBYTE(x, y) (unsigned int)byte((x)>>(8*(y))) 1005 #define CRYPTOPP_GET_BYTE_AS_BYTE(x, y) byte((x)>>(8*(y))) 1014 for (
unsigned int i=8*
sizeof(value)/2; i>0; i/=2)
1015 value ^= value >> i;
1016 return (
unsigned int)value&1;
1029 unsigned int l=0, h=8*
sizeof(value);
1032 unsigned int t = (l+h)/2;
1052 unsigned int l=0, h=8*
sizeof(value);
1056 unsigned int t = (l+h)/2;
1078 #if defined(__BMI__) 1079 return (
unsigned int)_tzcnt_u32(v);
1080 #elif defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 30400) 1081 return (
unsigned int)__builtin_ctz(v);
1082 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) 1083 unsigned long result;
1084 _BitScanForward(&result, v);
1085 return static_cast<unsigned int>(result);
1088 static const int MultiplyDeBruijnBitPosition[32] =
1090 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
1091 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
1093 return MultiplyDeBruijnBitPosition[((
word32)((v & -v) * 0x077CB531U)) >> 27];
1109 #if defined(__BMI__) && defined(__x86_64__) 1110 return (
unsigned int)_tzcnt_u64(v);
1111 #elif defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 30400) 1112 return (
unsigned int)__builtin_ctzll(v);
1113 #elif defined(_MSC_VER) && (_MSC_VER >= 1400) && (defined(_M_X64) || defined(_M_IA64)) 1114 unsigned long result;
1115 _BitScanForward64(&result, v);
1116 return static_cast<unsigned int>(result);
1131 inline T
Crop(T value,
size_t bits)
1133 if (bits < 8*
sizeof(value))
1134 return T(value & ((T(1) << bits) - 1));
1145 return ((bitCount+7)/(8));
1217 return value > 0 && (value & (value-1)) == 0;
1220 #if defined(__BMI__) 1222 inline bool IsPowerOf2<word32>(
const word32 &value)
1224 return value > 0 && _blsr_u32(value) == 0;
1227 # if defined(__x86_64__) 1229 inline bool IsPowerOf2<word64>(
const word64 &value)
1231 return value > 0 && _blsr_u64(value) == 0;
1233 # endif // __x86_64__ 1251 return (std::numeric_limits<T>::min)();
1269 return (std::numeric_limits<T>::max)();
1274 #if defined(CRYPTOPP_WORD128_AVAILABLE) 1283 #if defined(CRYPTOPP_APPLE_CLANG_VERSION) 1286 return (std::numeric_limits<word128>::max)();
1301 template <
class T1,
class T2>
1305 return T1((a > b) ? (a - b) : 0);
1318 template <
class T1,
class T2>
1322 return T1((a > b) ? (a - b) : 1);
1333 template <
class T1,
class T2>
1353 template <
class T1,
class T2>
1357 #if !defined(CRYPTOPP_APPLE_CLANG_VERSION) || (CRYPTOPP_APPLE_CLANG_VERSION >= 80000) 1383 template <
class T1,
class T2>
1387 #if !defined(CRYPTOPP_APPLE_CLANG_VERSION) || (CRYPTOPP_APPLE_CLANG_VERSION >= 80000) 1395 if (NumericLimitsMax<T1>() - m + 1 < n)
1411 #if defined(CRYPTOPP_CXX11_ALIGNOF) 1413 #elif (_MSC_VER >= 1300) 1414 return __alignof(T);
1415 #elif defined(__GNUC__) 1416 return __alignof__(T);
1417 #elif defined(__SUNPRO_CC) 1418 return __alignof__(T);
1419 #elif defined(__IBM_ALIGNOF__) 1420 return __alignof__(T);
1421 #elif CRYPTOPP_BOOL_SLOW_WORD64 1438 const uintptr_t x =
reinterpret_cast<uintptr_t
>(ptr);
1439 return alignment==1 || (
IsPowerOf2(alignment) ?
ModPowerOf2(x, alignment) == 0 : x % alignment == 0);
1455 #if (CRYPTOPP_LITTLE_ENDIAN) 1457 #elif (CRYPTOPP_BIG_ENDIAN) 1460 # error "Unable to determine endianness" 1475 return NativeByteOrder::ToEnum();
1512 unsigned int carry=1;
1513 while (carry && size != 0)
1516 carry = ! ++inout[size-1];
1533 unsigned int carry=1;
1534 while (carry && size != 0)
1537 carry = ! (output[size-1] = input[size-1] + 1);
1543 output[size-1] = input[size-1];
1569 ptrdiff_t t = size_t(c) * (a - b);
1588 volatile T *p = buf+n;
1593 #if !defined(CRYPTOPP_DISABLE_ASM) && \ 1594 (_MSC_VER >= 1400 || defined(__GNUC__)) && \ 1595 (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86) 1604 volatile byte *p = buf;
1606 asm volatile(
"rep stosb" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1608 __stosb(reinterpret_cast<byte *>(reinterpret_cast<size_t>(p)), 0, n);
1619 volatile word16 *p = buf;
1621 asm volatile(
"rep stosw" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1623 __stosw(reinterpret_cast<word16 *>(reinterpret_cast<size_t>(p)), 0, n);
1634 volatile word32 *p = buf;
1636 asm volatile(
"rep stosl" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1638 __stosd(reinterpret_cast<unsigned long *>(reinterpret_cast<size_t>(p)), 0, n);
1649 #if CRYPTOPP_BOOL_X64 1650 volatile word64 *p = buf;
1652 asm volatile(
"rep stosq" :
"+c"(n),
"+D"(p) :
"a"(0) :
"memory");
1654 __stosq(const_cast<word64 *>(p), 0, n);
1661 #endif // CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 1663 #if !defined(CRYPTOPP_DISABLE_ASM) && (_MSC_VER >= 1700) && defined(_M_ARM) 1666 char *p =
reinterpret_cast<char*
>(buf+n);
1668 __iso_volatile_store8(--p, 0);
1673 short *p =
reinterpret_cast<short*
>(buf+n);
1675 __iso_volatile_store16(--p, 0);
1680 int *p =
reinterpret_cast<int*
>(buf+n);
1682 __iso_volatile_store32(--p, 0);
1687 __int64 *p =
reinterpret_cast<__int64*
>(buf+n);
1689 __iso_volatile_store64(--p, 0);
1702 if (
sizeof(T) % 8 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word64>() == 0)
1703 SecureWipeBuffer(reinterpret_cast<word64 *>(static_cast<void *>(buf)), n * (
sizeof(T)/8));
1704 else if (
sizeof(T) % 4 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word32>() == 0)
1705 SecureWipeBuffer(reinterpret_cast<word32 *>(static_cast<void *>(buf)), n * (
sizeof(T)/4));
1706 else if (
sizeof(T) % 2 == 0 && GetAlignmentOf<T>() % GetAlignmentOf<word16>() == 0)
1707 SecureWipeBuffer(reinterpret_cast<word16 *>(static_cast<void *>(buf)), n * (
sizeof(T)/2));
1709 SecureWipeBuffer(reinterpret_cast<byte *>(static_cast<void *>(buf)), n *
sizeof(T));
1724 std::string
StringNarrow(
const wchar_t *str,
bool throwOnError =
true);
1738 std::wstring
StringWiden(
const char *str,
bool throwOnError =
true);
1763 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1764 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1766 return T((x<<R)|(x>>(-R&MASK)));
1789 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1790 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1792 return T((x >> R)|(x<<(-R&MASK)));
1814 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1815 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1817 return T((x<<y)|(x>>(-y&MASK)));
1839 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1840 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1842 return T((x >> y)|(x<<(-y&MASK)));
1859 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1860 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1862 return T((x<<y)|(x>>(-y&MASK)));
1879 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1880 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1882 return T((x>>y)|(x<<(-y&MASK)));
1894 template <
class T>
inline T
rotlMod(T x,
unsigned int y)
1896 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1897 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1898 return T((x<<(y&MASK))|(x>>(-y&MASK)));
1910 template <
class T>
inline T
rotrMod(T x,
unsigned int y)
1912 CRYPTOPP_CONSTANT(THIS_SIZE =
sizeof(T)*8);
1913 CRYPTOPP_CONSTANT(MASK = THIS_SIZE-1);
1914 return T((x>>(y&MASK))|(x<<(-y&MASK)));
1928 template<>
inline word32 rotlFixed<word32>(
word32 x,
unsigned int y)
1932 return y ? _lrotl(x, static_cast<byte>(y)) : x;
1944 template<>
inline word32 rotrFixed<word32>(
word32 x,
unsigned int y)
1948 return y ? _lrotr(x, static_cast<byte>(y)) : x;
1960 template<>
inline word32 rotlVariable<word32>(
word32 x,
unsigned int y)
1963 return _lrotl(x, static_cast<byte>(y));
1975 template<>
inline word32 rotrVariable<word32>(
word32 x,
unsigned int y)
1978 return _lrotr(x, static_cast<byte>(y));
1989 template<>
inline word32 rotlMod<word32>(
word32 x,
unsigned int y)
1992 return _lrotl(x, static_cast<byte>(y));
2003 template<>
inline word32 rotrMod<word32>(
word32 x,
unsigned int y)
2006 return _lrotr(x, static_cast<byte>(y));
2009 #endif // #ifdef _MSC_VER 2011 #if (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 2023 template<>
inline word64 rotlFixed<word64>(
word64 x,
unsigned int y)
2027 return y ? _rotl64(x, static_cast<byte>(y)) : x;
2039 template<>
inline word64 rotrFixed<word64>(
word64 x,
unsigned int y)
2043 return y ? _rotr64(x, static_cast<byte>(y)) : x;
2055 template<>
inline word64 rotlVariable<word64>(
word64 x,
unsigned int y)
2058 return _rotl64(x, static_cast<byte>(y));
2070 template<>
inline word64 rotrVariable<word64>(
word64 x,
unsigned int y)
2073 return y ? _rotr64(x, static_cast<byte>(y)) : x;
2084 template<>
inline word64 rotlMod<word64>(
word64 x,
unsigned int y)
2087 return y ? _rotl64(x, static_cast<byte>(y)) : x;
2098 template<>
inline word64 rotrMod<word64>(
word64 x,
unsigned int y)
2101 return y ? _rotr64(x, static_cast<byte>(y)) : x;
2104 #endif // #if _MSC_VER >= 1310 2106 #if _MSC_VER >= 1400 && !defined(__INTEL_COMPILER) 2108 template<>
inline word16 rotlFixed<word16>(
word16 x,
unsigned int y)
2111 return _rotl16(x, static_cast<byte>(y));
2114 template<>
inline word16 rotrFixed<word16>(
word16 x,
unsigned int y)
2117 return _rotr16(x, static_cast<byte>(y));
2120 template<>
inline word16 rotlVariable<word16>(
word16 x,
unsigned int y)
2122 return _rotl16(x, static_cast<byte>(y));
2125 template<>
inline word16 rotrVariable<word16>(
word16 x,
unsigned int y)
2127 return _rotr16(x, static_cast<byte>(y));
2130 template<>
inline word16 rotlMod<word16>(
word16 x,
unsigned int y)
2132 return _rotl16(x, static_cast<byte>(y));
2135 template<>
inline word16 rotrMod<word16>(
word16 x,
unsigned int y)
2137 return _rotr16(x, static_cast<byte>(y));
2140 template<>
inline byte rotlFixed<byte>(
byte x,
unsigned int y)
2143 return _rotl8(x, static_cast<byte>(y));
2146 template<>
inline byte rotrFixed<byte>(
byte x,
unsigned int y)
2149 return _rotr8(x, static_cast<byte>(y));
2152 template<>
inline byte rotlVariable<byte>(
byte x,
unsigned int y)
2154 return _rotl8(x, static_cast<byte>(y));
2157 template<>
inline byte rotrVariable<byte>(
byte x,
unsigned int y)
2159 return _rotr8(x, static_cast<byte>(y));
2162 template<>
inline byte rotlMod<byte>(
byte x,
unsigned int y)
2164 return _rotl8(x, static_cast<byte>(y));
2167 template<>
inline byte rotrMod<byte>(
byte x,
unsigned int y)
2169 return _rotr8(x, static_cast<byte>(y));
2172 #endif // #if _MSC_VER >= 1400 2174 #if (defined(__MWERKS__) && TARGET_CPU_PPC) 2176 template<>
inline word32 rotlFixed<word32>(
word32 x,
unsigned int y)
2179 return y ? __rlwinm(x,y,0,31) : x;
2182 template<>
inline word32 rotrFixed<word32>(
word32 x,
unsigned int y)
2185 return y ? __rlwinm(x,32-y,0,31) : x;
2188 template<>
inline word32 rotlVariable<word32>(
word32 x,
unsigned int y)
2191 return (__rlwnm(x,y,0,31));
2194 template<>
inline word32 rotrVariable<word32>(
word32 x,
unsigned int y)
2197 return (__rlwnm(x,32-y,0,31));
2200 template<>
inline word32 rotlMod<word32>(
word32 x,
unsigned int y)
2202 return (__rlwnm(x,y,0,31));
2205 template<>
inline word32 rotrMod<word32>(
word32 x,
unsigned int y)
2207 return (__rlwnm(x,32-y,0,31));
2210 #endif // __MWERKS__ && TARGET_CPU_PPC 2222 return GETBYTE(value, index);
2224 return GETBYTE(value,
sizeof(T)-index-1);
2242 #if defined(CRYPTOPP_BYTESWAP_AVAILABLE) 2243 return bswap_16(value);
2244 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 2245 return _byteswap_ushort(value);
2257 #if defined(CRYPTOPP_BYTESWAP_AVAILABLE) 2258 return bswap_32(value);
2259 #elif defined(CRYPTOPP_ARM_BYTEREV_AVAILABLE) 2261 __asm__ (
"rev %0, %1" :
"=r" (rvalue) :
"r" (value));
2263 #elif defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) 2264 __asm__ (
"bswap %0" :
"=r" (value) :
"0" (value));
2266 #elif defined(__MWERKS__) && TARGET_CPU_PPC 2267 return (
word32)__lwbrx(&value,0);
2268 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 2269 return _byteswap_ulong(value);
2270 #elif CRYPTOPP_FAST_ROTATE(32) && !defined(__xlC__) 2275 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
2286 #if defined(CRYPTOPP_BYTESWAP_AVAILABLE) 2287 return bswap_64(value);
2288 #elif defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) && defined(__x86_64__) 2289 __asm__ (
"bswap %0" :
"=r" (value) :
"0" (value));
2291 #elif (_MSC_VER >= 1400) || (defined(_MSC_VER) && !defined(_DLL)) 2292 return _byteswap_uint64(value);
2293 #elif CRYPTOPP_BOOL_SLOW_WORD64 2296 value = ((value &
W64LIT(0xFF00FF00FF00FF00)) >> 8) | ((value &
W64LIT(0x00FF00FF00FF00FF)) << 8);
2297 value = ((value &
W64LIT(0xFFFF0000FFFF0000)) >> 16) | ((value &
W64LIT(0x0000FFFF0000FFFF)) << 16);
2302 #if defined(CRYPTOPP_WORD128_AVAILABLE) 2321 value =
byte((value & 0xAA) >> 1) |
byte((value & 0x55) << 1);
2322 value =
byte((value & 0xCC) >> 2) |
byte((value & 0x33) << 2);
2331 #if defined(CRYPTOPP_ARM_BITREV_AVAILABLE) 2334 __asm__ (
"rbit %0, %1" :
"=r" (rvalue) :
"r" (value));
2335 return word16(rvalue >> 16);
2338 value =
word16((value & 0xAAAA) >> 1) |
word16((value & 0x5555) << 1);
2339 value =
word16((value & 0xCCCC) >> 2) |
word16((value & 0x3333) << 2);
2340 value =
word16((value & 0xF0F0) >> 4) |
word16((value & 0x0F0F) << 4);
2350 #if defined(CRYPTOPP_ARM_BITREV_AVAILABLE) 2353 __asm__ (
"rbit %0, %1" :
"=r" (rvalue) :
"r" (value));
2357 value =
word32((value & 0xAAAAAAAA) >> 1) |
word32((value & 0x55555555) << 1);
2358 value =
word32((value & 0xCCCCCCCC) >> 2) |
word32((value & 0x33333333) << 2);
2359 value =
word32((value & 0xF0F0F0F0) >> 4) |
word32((value & 0x0F0F0F0F) << 4);
2369 #if CRYPTOPP_BOOL_SLOW_WORD64 2392 else if (
sizeof(T) == 2)
2394 else if (
sizeof(T) == 4)
2396 else if (
sizeof(T) == 8)
2398 #if defined(CRYPTOPP_WORD128_AVAILABLE) 2399 else if (
sizeof(T) == 16)
2465 size_t count = byteCount/
sizeof(T);
2466 for (
size_t i=0; i<count; i++)
2489 memcpy_s(out, byteCount, in, byteCount);
2502 const size_t U =
sizeof(T);
2504 memcpy_s(out, outlen*U, in, inlen);
2518 CRYPTOPP_UNUSED(order); CRYPTOPP_UNUSED(unused);
2531 CRYPTOPP_UNUSED(unused);
2533 ? block[1] | (block[0] << 8)
2534 : block[0] | (block[1] << 8);
2546 CRYPTOPP_UNUSED(unused);
2561 CRYPTOPP_UNUSED(unused);
2565 (
word64(block[6]) << 8) |
2566 (
word64(block[5]) << 16) |
2567 (
word64(block[4]) << 24) |
2568 (
word64(block[3]) << 32) |
2569 (
word64(block[2]) << 40) |
2570 (
word64(block[1]) << 48) |
2571 (
word64(block[0]) << 56))
2574 (
word64(block[1]) << 8) |
2575 (
word64(block[2]) << 16) |
2576 (
word64(block[3]) << 24) |
2577 (
word64(block[4]) << 32) |
2578 (
word64(block[5]) << 40) |
2579 (
word64(block[6]) << 48) |
2580 (
word64(block[7]) << 56));
2583 #if defined(CRYPTOPP_WORD128_AVAILABLE) 2594 CRYPTOPP_UNUSED(unused);
2642 CRYPTOPP_UNUSED(order);
2643 block[0] =
static_cast<byte>(xorBlock ? (value ^ xorBlock[0]) : value);
2659 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2660 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2664 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2665 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2672 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2673 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2677 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2678 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2696 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2697 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2698 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2699 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2703 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2704 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2705 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2706 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2713 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2714 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2715 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2716 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2720 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2721 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2722 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2723 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2741 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2742 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2743 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2744 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2745 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2746 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2747 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2748 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2752 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2753 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2754 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2755 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2756 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2757 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2758 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2759 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2766 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2767 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2768 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2769 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2770 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2771 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2772 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2773 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2777 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2778 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2779 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2780 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2781 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2782 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2783 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2784 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2789 #if defined(CRYPTOPP_WORD128_AVAILABLE) 2804 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 15);
2805 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 14);
2806 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 13);
2807 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 12);
2808 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 11);
2809 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 10);
2810 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 9);
2811 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 8);
2813 block[ 8] = xorBlock[ 8] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2814 block[ 9] = xorBlock[ 9] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2815 block[10] = xorBlock[10] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2816 block[11] = xorBlock[11] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2817 block[12] = xorBlock[12] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2818 block[13] = xorBlock[13] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2819 block[14] = xorBlock[14] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2820 block[15] = xorBlock[15] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2824 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 15);
2825 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 14);
2826 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 13);
2827 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 12);
2828 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 11);
2829 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 10);
2830 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 9);
2831 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 8);
2833 block[ 8] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2834 block[ 9] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2835 block[10] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2836 block[11] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2837 block[12] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2838 block[13] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2839 block[14] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2840 block[15] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2847 block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2848 block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2849 block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2850 block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2851 block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2852 block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2853 block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2854 block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2856 block[ 8] = xorBlock[ 8] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 8);
2857 block[ 9] = xorBlock[ 9] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 9);
2858 block[10] = xorBlock[10] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 10);
2859 block[11] = xorBlock[11] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 11);
2860 block[12] = xorBlock[12] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 12);
2861 block[13] = xorBlock[13] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 13);
2862 block[14] = xorBlock[14] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 14);
2863 block[15] = xorBlock[15] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 15);
2867 block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0);
2868 block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1);
2869 block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2);
2870 block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3);
2871 block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4);
2872 block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5);
2873 block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6);
2874 block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7);
2876 block[ 8] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 8);
2877 block[ 9] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 9);
2878 block[10] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 10);
2879 block[11] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 11);
2880 block[12] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 12);
2881 block[13] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 13);
2882 block[14] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 14);
2883 block[15] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 15);
2908 CRYPTOPP_UNUSED(assumeAligned);
2911 if (block != NULLPTR) {std::memcpy(&temp, block,
sizeof(T));}
2934 result = GetWord<T>(assumeAligned, order, block);
2950 CRYPTOPP_UNUSED(assumeAligned);
2954 if (xorBlock != NULLPTR) {std::memcpy(&t2, xorBlock,
sizeof(T)); t1 ^= t2;}
2955 if (block != NULLPTR) {std::memcpy(block, &t1,
sizeof(T));}
2973 template <
class T,
class B,
bool A=false>
2980 : m_block((const
byte *)block) {}
2990 x = GetWord<T>(A, B::ToEnum(), m_block);
2991 m_block +=
sizeof(T);
2996 const byte *m_block;
3014 template <
class T,
class B,
bool A=false>
3022 : m_xorBlock((const
byte *)xorBlock), m_block((
byte *)block) {}
3031 PutWord(A, B::ToEnum(), m_block, (T)x, m_xorBlock);
3032 m_block +=
sizeof(T);
3034 m_xorBlock +=
sizeof(T);
3039 const byte *m_xorBlock;
3051 template <
class T,
class B,
bool GA=false,
bool PA=false>
3070 return std::string((
char *)&value,
sizeof(value));
3109 CRYPTOPP_UNUSED(value); CRYPTOPP_UNUSED(bits);
3121 CRYPTOPP_UNUSED(value); CRYPTOPP_UNUSED(bits);
3139 return value >> bits;
3150 return value << bits;
3162 template <
unsigned int bits,
class T>
3176 template <
unsigned int bits,
class T>
3189 template<
typename InputIt,
typename T>
3190 inline InputIt
FindIfNot(InputIt first, InputIt last,
const T &value) {
3191 #ifdef CRYPTOPP_CXX11_LAMBDA 3192 return std::find_if(first, last, [&value](
const T &o) {
3196 return std::find_if(first, last, std::bind2nd(std::not_equal_to<T>(), value));
3202 #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);} 3203 #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);} 3204 #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);} 3205 #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);} 3206 #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);} 3207 #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);} 3208 #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);} 3209 #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);} 3210 #define CRYPTOPP_BLOCKS_END(i) size_t SST() {return SS##i();} void AllocateBlocks() {m_aggregate.New(SST());} AlignedSecByteBlock m_aggregate; 3214 #if (CRYPTOPP_MSC_VERSION) 3215 # pragma warning(pop) 3218 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 3219 # 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.
CRYPTOPP_DLL std::string IntToString< Integer >(Integer value, unsigned int base)
Converts an Integer to a string.
void GetUserKey(ByteOrder order, T *out, size_t outlen, const byte *in, size_t inlen)
Copy bytes in a buffer to an array of elements in big-endian order.
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()
#define CRYPTOPP_API
Win32 calling convention.
bool SafeConvert(T1 from, T2 &to)
Perform a conversion from from to to.
__uint128_t word128
128-bit unsigned datatype
#define EnumToInt(v)
Integer value.
#define W64LIT(x)
Declare an unsigned word64.
ByteOrder
Provides the byte ordering.
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.
const unsigned int WORD_BITS
Size of a platform word in bits.
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.
unsigned int word32
32-bit unsigned datatype
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.
void UnalignedbyteNonTemplate(ByteOrder order, byte *block, byte value, const byte *xorBlock)
Write a byte to an unaligned buffer.
byte * BytePtr(std::string &str)
Pointer to the first element of a string.
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 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.
signed int sword32
32-bit signed datatype
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 * memset_z(void *ptr, int val, size_t num)
Memory block initializer.
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.
unsigned long long word64
64-bit unsigned datatype
#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.
CRYPTOPP_DLL std::string IntToString< word64 >(word64 value, unsigned int base)
Converts an unsigned value to a string.
void ConditionalSwapPointers(bool c, T &a, T &b)
Performs a branch-less swap of pointers a and b if condition c is true.
const byte * ConstBytePtr(const std::string &str)
Const pointer to the first element of a string.
Multiple precision integer with arithmetic operations.
CRYPTOPP_DLL void xorbuf(byte *buf, const byte *mask, size_t count)
Performs an XOR of a buffer with a mask.
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 negative 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.
Forward declarations for SecBlock.
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.
unsigned short word16
16-bit unsigned datatype
void ConditionalSwap(bool c, T &a, T &b)
Performs a branch-less swap of values a and b if condition c is true.
unsigned char byte
8-bit unsigned datatype
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.
const lword LWORD_MAX
Large word type max value.
Debugging and diagnostic assertions.
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.
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.
CRYPTOPP_DLL bool VerifyBufsEqual(const byte *buf1, const byte *buf2, size_t count)
Performs a near constant-time comparison of two equally sized buffers.
Crypto++ library namespace.
T rotrVariable(T x, unsigned int y)
Performs a right rotate.
void swap(::SecBlock< T, A > &a, ::SecBlock< T, A > &b)
Swap two SecBlocks.
size_t BytePtrSize(const std::string &str)
Size of a string.
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.
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.
signed long long sword64
64-bit signed datatype
const unsigned int WORD_SIZE
Size of a platform word in bytes.
byte UnalignedGetWordNonTemplate(ByteOrder order, const byte *block, const byte *unused)
Retrieve a byte from an unaligned buffer.
void vec_swap(T &a, T &b)
Swaps two variables which are arrays.