📄 misc.hpp
字号:
#undef min#endif inline word32 min(word32 a, word32 b){ return a < b ? a : b;}inline word32 ByteReverse(word32 value){#ifdef PPC_INTRINSICS // PPC: load reverse indexed instruction return (word32)__lwbrx(&value,0);#elif defined(FAST_ROTATE) // 5 instructions with rotate instruction, 9 without return (rotrFixed(value, 8U) & 0xff00ff00) | (rotlFixed(value, 8U) & 0x00ff00ff);#else // 6 instructions with rotate instruction, 8 without value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); return rotlFixed(value, 16U);#endif}template <typename T>inline void ByteReverse(T* out, const T* in, word32 byteCount){ assert(byteCount % sizeof(T) == 0); word32 count = byteCount/sizeof(T); for (word32 i=0; i<count; i++) out[i] = ByteReverse(in[i]);}inline void ByteReverse(byte* out, const byte* in, word32 byteCount){ word32* o = reinterpret_cast<word32*>(out); const word32* i = reinterpret_cast<const word32*>(in); ByteReverse(o, i, byteCount);}template <class T>inline T ByteReverseIf(T value, ByteOrder order){ return HostByteOrderIs(order) ? value : ByteReverse(value);}template <typename T>inline void ByteReverseIf(T* out, const T* in, word32 bc, ByteOrder order){ if (!HostByteOrderIs(order)) ByteReverse(out, in, bc); else if (out != in) memcpy(out, in, bc);}template <class T>inline void GetUserKey(ByteOrder order, T* out, word32 outlen, const byte* in, word32 inlen){ const unsigned int U = sizeof(T); assert(inlen <= outlen*U); memcpy(out, in, inlen); memset((byte *)out+inlen, 0, outlen*U-inlen); ByteReverseIf(out, out, RoundUpToMultipleOf(inlen, U), order);}#ifdef _MSC_VER // disable conversion warning #pragma warning(disable:4244)#endifinline byte UnalignedGetWordNonTemplate(ByteOrder order, const byte *block, byte*){ return block[0];}inline word16 UnalignedGetWordNonTemplate(ByteOrder order, const byte* block, word16*){ return (order == BigEndianOrder) ? block[1] | (block[0] << 8) : block[0] | (block[1] << 8);}inline word32 UnalignedGetWordNonTemplate(ByteOrder order, const byte* block, word32*){ return (order == BigEndianOrder) ? word32(block[3]) | (word32(block[2]) << 8) | (word32(block[1]) << 16) | (word32(block[0]) << 24) : word32(block[0]) | (word32(block[1]) << 8) | (word32(block[2]) << 16) | (word32(block[3]) << 24);}template <class T>inline T UnalignedGetWord(ByteOrder order, const byte *block, T* dummy = 0){ return UnalignedGetWordNonTemplate(order, block, dummy);}inline void UnalignedPutWord(ByteOrder order, byte *block, byte value, const byte *xorBlock = 0){ block[0] = xorBlock ? (value ^ xorBlock[0]) : value;}#define GETBYTE(x, y) (unsigned int)byte((x)>>(8*(y)))inline void UnalignedPutWord(ByteOrder order, byte *block, word16 value, const byte *xorBlock = 0){ if (order == BigEndianOrder) { block[0] = GETBYTE(value, 1); block[1] = GETBYTE(value, 0); } else { block[0] = GETBYTE(value, 0); block[1] = GETBYTE(value, 1); } if (xorBlock) { block[0] ^= xorBlock[0]; block[1] ^= xorBlock[1]; }}inline void UnalignedPutWord(ByteOrder order, byte* block, word32 value, const byte* xorBlock = 0){ if (order == BigEndianOrder) { block[0] = GETBYTE(value, 3); block[1] = GETBYTE(value, 2); block[2] = GETBYTE(value, 1); block[3] = GETBYTE(value, 0); } else { block[0] = GETBYTE(value, 0); block[1] = GETBYTE(value, 1); block[2] = GETBYTE(value, 2); block[3] = GETBYTE(value, 3); } if (xorBlock) { block[0] ^= xorBlock[0]; block[1] ^= xorBlock[1]; block[2] ^= xorBlock[2]; block[3] ^= xorBlock[3]; }}template <class T>inline T GetWord(bool assumeAligned, ByteOrder order, const byte *block){ if (assumeAligned) { assert(IsAligned<T>(block)); return ByteReverseIf(*reinterpret_cast<const T *>(block), order); } else return UnalignedGetWord<T>(order, block);}template <class T>inline void GetWord(bool assumeAligned, ByteOrder order, T &result, const byte *block){ result = GetWord<T>(assumeAligned, order, block);}template <class T>inline void PutWord(bool assumeAligned, ByteOrder order, byte* block, T value, const byte *xorBlock = 0){ if (assumeAligned) { assert(IsAligned<T>(block)); if (xorBlock) *reinterpret_cast<T *>(block) = ByteReverseIf(value, order) ^ *reinterpret_cast<const T *>(xorBlock); else *reinterpret_cast<T *>(block) = ByteReverseIf(value, order); } else UnalignedPutWord(order, block, value, xorBlock);}template <class T, class B, bool A=true>class GetBlock{public: GetBlock(const void *block) : m_block((const byte *)block) {} template <class U> inline GetBlock<T, B, A> & operator()(U &x) { TAOCRYPT_COMPILE_ASSERT(sizeof(U) >= sizeof(T)); x = GetWord<T>(A, B::ToEnum(), m_block); m_block += sizeof(T); return *this; }private: const byte *m_block;};template <class T, class B, bool A = true>class PutBlock{public: PutBlock(const void *xorBlock, void *block) : m_xorBlock((const byte *)xorBlock), m_block((byte *)block) {} template <class U> inline PutBlock<T, B, A> & operator()(U x) { PutWord(A, B::ToEnum(), m_block, (T)x, m_xorBlock); m_block += sizeof(T); if (m_xorBlock) m_xorBlock += sizeof(T); return *this; }private: const byte *m_xorBlock; byte *m_block;};template <class T, class B, bool A=true>struct BlockGetAndPut{ // function needed because of C++ grammatical ambiguity between // expression-statements and declarations static inline GetBlock<T, B, A> Get(const void *block) {return GetBlock<T, B, A>(block);} typedef PutBlock<T, B, A> Put;};template <bool overflow> struct SafeShifter;template<> struct SafeShifter<true>{ template <class T> static inline T RightShift(T value, unsigned int bits) { return 0; } template <class T> static inline T LeftShift(T value, unsigned int bits) { return 0; }};template<> struct SafeShifter<false>{ template <class T> static inline T RightShift(T value, unsigned int bits) { return value >> bits; } template <class T> static inline T LeftShift(T value, unsigned int bits) { return value << bits; }};template <unsigned int bits, class T>inline T SafeRightShift(T value){ return SafeShifter<(bits>=(8*sizeof(T)))>::RightShift(value, bits);}template <unsigned int bits, class T>inline T SafeLeftShift(T value){ return SafeShifter<(bits>=(8*sizeof(T)))>::LeftShift(value, bits);}inlineword ShiftWordsLeftByBits(word* r, unsigned int n, unsigned int shiftBits){ assert (shiftBits<WORD_BITS); word u, carry=0; if (shiftBits) for (unsigned int i=0; i<n; i++) { u = r[i]; r[i] = (u << shiftBits) | carry; carry = u >> (WORD_BITS-shiftBits); } return carry;}inlineword ShiftWordsRightByBits(word* r, unsigned int n, unsigned int shiftBits){ assert (shiftBits<WORD_BITS); word u, carry=0; if (shiftBits) for (int i=n-1; i>=0; i--) { u = r[i]; r[i] = (u >> shiftBits) | carry; carry = u << (WORD_BITS-shiftBits); } return carry;}inlinevoid ShiftWordsLeftByWords(word* r, unsigned int n, unsigned int shiftWords){ shiftWords = min(shiftWords, n); if (shiftWords) { for (unsigned int i=n-1; i>=shiftWords; i--) r[i] = r[i-shiftWords]; SetWords(r, 0, shiftWords); }}inlinevoid ShiftWordsRightByWords(word* r, unsigned int n, unsigned int shiftWords){ shiftWords = min(shiftWords, n); if (shiftWords) { for (unsigned int i=0; i+shiftWords<n; i++) r[i] = r[i+shiftWords]; SetWords(r+n-shiftWords, 0, shiftWords); }}template <class T1, class T2>inline T1 SaturatingSubtract(T1 a, T2 b){ TAOCRYPT_COMPILE_ASSERT_INSTANCE(T1(-1)>0, 0); // T1 is unsigned type TAOCRYPT_COMPILE_ASSERT_INSTANCE(T2(-1)>0, 1); // T2 is unsigned type return T1((a > b) ? (a - b) : 0);}// declaresunsigned int BytePrecision(unsigned long value);unsigned int BitPrecision(unsigned long);unsigned long Crop(unsigned long value, unsigned int size);} // namespace#endif // TAO_CRYPT_MISC_HPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -