📄 misc.h
字号:
return _rotr16(x, y);}template<> inline word16 rotlMod<word16>(word16 x, unsigned int y){ return _rotl16(x, y);}template<> inline word16 rotrMod<word16>(word16 x, unsigned int y){ return _rotr16(x, y);}template<> inline byte rotlFixed<byte>(byte x, unsigned int y){ assert(y < 8*sizeof(x)); return y ? _rotl8(x, y) : x;}template<> inline byte rotrFixed<byte>(byte x, unsigned int y){ assert(y < 8*sizeof(x)); return y ? _rotr8(x, y) : x;}template<> inline byte rotlVariable<byte>(byte x, unsigned int y){ assert(y < 8*sizeof(x)); return _rotl8(x, y);}template<> inline byte rotrVariable<byte>(byte x, unsigned int y){ assert(y < 8*sizeof(x)); return _rotr8(x, y);}template<> inline byte rotlMod<byte>(byte x, unsigned int y){ return _rotl8(x, y);}template<> inline byte rotrMod<byte>(byte x, unsigned int y){ return _rotr8(x, y);}#endif // #if _MSC_VER >= 1400#if (defined(__MWERKS__) && TARGET_CPU_PPC)template<> inline word32 rotlFixed<word32>(word32 x, unsigned int y){ assert(y < 32); return y ? __rlwinm(x,y,0,31) : x;}template<> inline word32 rotrFixed<word32>(word32 x, unsigned int y){ assert(y < 32); return y ? __rlwinm(x,32-y,0,31) : x;}template<> inline word32 rotlVariable<word32>(word32 x, unsigned int y){ assert(y < 32); return (__rlwnm(x,y,0,31));}template<> inline word32 rotrVariable<word32>(word32 x, unsigned int y){ assert(y < 32); return (__rlwnm(x,32-y,0,31));}template<> inline word32 rotlMod<word32>(word32 x, unsigned int y){ return (__rlwnm(x,y,0,31));}template<> inline word32 rotrMod<word32>(word32 x, unsigned int y){ return (__rlwnm(x,32-y,0,31));}#endif // #if (defined(__MWERKS__) && TARGET_CPU_PPC)// ************** endian reversal ***************template <class T>inline unsigned int GetByte(ByteOrder order, T value, unsigned int index){ if (order == LITTLE_ENDIAN_ORDER) return GETBYTE(value, index); else return GETBYTE(value, sizeof(T)-index-1);}inline byte ByteReverse(byte value){ return value;}inline word16 ByteReverse(word16 value){#ifdef CRYPTOPP_BYTESWAP_AVAILABLE return bswap_16(value);#elif defined(_MSC_VER) && _MSC_VER >= 1300 return _byteswap_ushort(value);#else return rotlFixed(value, 8U);#endif}inline word32 ByteReverse(word32 value){#if defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) __asm__ ("bswap %0" : "=r" (value) : "0" (value)); return value;#elif defined(CRYPTOPP_BYTESWAP_AVAILABLE) return bswap_32(value);#elif defined(__MWERKS__) && TARGET_CPU_PPC return (word32)__lwbrx(&value,0);#elif _MSC_VER >= 1400 || (_MSC_VER >= 1300 && !defined(_DLL)) return _byteswap_ulong(value);#elif CRYPTOPP_FAST_ROTATE(32) // 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}inline word64 ByteReverse(word64 value){#if defined(__GNUC__) && defined(CRYPTOPP_X86_ASM_AVAILABLE) && defined(__x86_64__) __asm__ ("bswap %0" : "=r" (value) : "0" (value)); return value;#elif defined(CRYPTOPP_BYTESWAP_AVAILABLE) return bswap_64(value);#elif defined(_MSC_VER) && _MSC_VER >= 1300 return _byteswap_uint64(value);#elif CRYPTOPP_BOOL_SLOW_WORD64 return (word64(ByteReverse(word32(value))) << 32) | ByteReverse(word32(value>>32));#else value = ((value & W64LIT(0xFF00FF00FF00FF00)) >> 8) | ((value & W64LIT(0x00FF00FF00FF00FF)) << 8); value = ((value & W64LIT(0xFFFF0000FFFF0000)) >> 16) | ((value & W64LIT(0x0000FFFF0000FFFF)) << 16); return rotlFixed(value, 32U);#endif}inline byte BitReverse(byte value){ value = ((value & 0xAA) >> 1) | ((value & 0x55) << 1); value = ((value & 0xCC) >> 2) | ((value & 0x33) << 2); return rotlFixed(value, 4U);}inline word16 BitReverse(word16 value){ value = ((value & 0xAAAA) >> 1) | ((value & 0x5555) << 1); value = ((value & 0xCCCC) >> 2) | ((value & 0x3333) << 2); value = ((value & 0xF0F0) >> 4) | ((value & 0x0F0F) << 4); return ByteReverse(value);}inline word32 BitReverse(word32 value){ value = ((value & 0xAAAAAAAA) >> 1) | ((value & 0x55555555) << 1); value = ((value & 0xCCCCCCCC) >> 2) | ((value & 0x33333333) << 2); value = ((value & 0xF0F0F0F0) >> 4) | ((value & 0x0F0F0F0F) << 4); return ByteReverse(value);}inline word64 BitReverse(word64 value){#if CRYPTOPP_BOOL_SLOW_WORD64 return (word64(BitReverse(word32(value))) << 32) | BitReverse(word32(value>>32));#else value = ((value & W64LIT(0xAAAAAAAAAAAAAAAA)) >> 1) | ((value & W64LIT(0x5555555555555555)) << 1); value = ((value & W64LIT(0xCCCCCCCCCCCCCCCC)) >> 2) | ((value & W64LIT(0x3333333333333333)) << 2); value = ((value & W64LIT(0xF0F0F0F0F0F0F0F0)) >> 4) | ((value & W64LIT(0x0F0F0F0F0F0F0F0F)) << 4); return ByteReverse(value);#endif}template <class T>inline T BitReverse(T value){ if (sizeof(T) == 1) return (T)BitReverse((byte)value); else if (sizeof(T) == 2) return (T)BitReverse((word16)value); else if (sizeof(T) == 4) return (T)BitReverse((word32)value); else { assert(sizeof(T) == 8); return (T)BitReverse((word64)value); }}template <class T>inline T ConditionalByteReverse(ByteOrder order, T value){ return NativeByteOrderIs(order) ? value : ByteReverse(value);}template <class T>void ByteReverse(T *out, const T *in, size_t byteCount){ assert(byteCount % sizeof(T) == 0); size_t count = byteCount/sizeof(T); for (size_t i=0; i<count; i++) out[i] = ByteReverse(in[i]);}template <class T>inline void ConditionalByteReverse(ByteOrder order, T *out, const T *in, size_t byteCount){ if (!NativeByteOrderIs(order)) ByteReverse(out, in, byteCount); else if (in != out) memcpy_s(out, byteCount, in, byteCount);}template <class T>inline void GetUserKey(ByteOrder order, T *out, size_t outlen, const byte *in, size_t inlen){ const size_t U = sizeof(T); assert(inlen <= outlen*U); memcpy_s(out, outlen*U, in, inlen); memset_z((byte *)out+inlen, 0, outlen*U-inlen); ConditionalByteReverse(order, out, out, RoundUpToMultipleOf(inlen, U));}#ifndef CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESSinline byte UnalignedGetWordNonTemplate(ByteOrder order, const byte *block, const byte *){ return block[0];}inline word16 UnalignedGetWordNonTemplate(ByteOrder order, const byte *block, const word16 *){ return (order == BIG_ENDIAN_ORDER) ? block[1] | (block[0] << 8) : block[0] | (block[1] << 8);}inline word32 UnalignedGetWordNonTemplate(ByteOrder order, const byte *block, const word32 *){ return (order == BIG_ENDIAN_ORDER) ? 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);}inline word64 UnalignedGetWordNonTemplate(ByteOrder order, const byte *block, const word64 *){ return (order == BIG_ENDIAN_ORDER) ? (word64(block[7]) | (word64(block[6]) << 8) | (word64(block[5]) << 16) | (word64(block[4]) << 24) | (word64(block[3]) << 32) | (word64(block[2]) << 40) | (word64(block[1]) << 48) | (word64(block[0]) << 56)) : (word64(block[0]) | (word64(block[1]) << 8) | (word64(block[2]) << 16) | (word64(block[3]) << 24) | (word64(block[4]) << 32) | (word64(block[5]) << 40) | (word64(block[6]) << 48) | (word64(block[7]) << 56));}inline void UnalignedPutWordNonTemplate(ByteOrder order, byte *block, byte value, const byte *xorBlock){ block[0] = xorBlock ? (value ^ xorBlock[0]) : value;}inline void UnalignedPutWordNonTemplate(ByteOrder order, byte *block, word16 value, const byte *xorBlock){ if (order == BIG_ENDIAN_ORDER) { if (xorBlock) { block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); } else { block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); } } else { if (xorBlock) { block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); } else { block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); } }}inline void UnalignedPutWordNonTemplate(ByteOrder order, byte *block, word32 value, const byte *xorBlock){ if (order == BIG_ENDIAN_ORDER) { if (xorBlock) { block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); } else { block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); } } else { if (xorBlock) { block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); } else { block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); } }}inline void UnalignedPutWordNonTemplate(ByteOrder order, byte *block, word64 value, const byte *xorBlock){ if (order == BIG_ENDIAN_ORDER) { if (xorBlock) { block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7); block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6); block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5); block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4); block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); } else { block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7); block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6); block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5); block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4); block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); } } else { if (xorBlock) { block[0] = xorBlock[0] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); block[1] = xorBlock[1] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[2] = xorBlock[2] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[3] = xorBlock[3] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); block[4] = xorBlock[4] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 4); block[5] = xorBlock[5] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 5); block[6] = xorBlock[6] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 6); block[7] = xorBlock[7] ^ CRYPTOPP_GET_BYTE_AS_BYTE(value, 7); } else { block[0] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 0); block[1] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 1); block[2] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 2); block[3] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 3); block[4] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 4); block[5] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 5); block[6] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 6); block[7] = CRYPTOPP_GET_BYTE_AS_BYTE(value, 7); } }}#endif // #ifndef CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESStemplate <class T>inline T GetWord(bool assumeAligned, ByteOrder order, const byte *block){#ifndef CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS if (!assumeAligned) return UnalignedGetWordNonTemplate(order, block, (T*)NULL); assert(IsAligned<T>(block));#endif return ConditionalByteReverse(order, *reinterpret_cast<const T *>(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 = NULL){#ifndef CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS if (!assumeAligned) return UnalignedPutWordNonTemplate(order, block, value, xorBlock); assert(IsAligned<T>(block)); assert(IsAligned<T>(xorBlock));#endif *reinterpret_cast<T *>(block) = ConditionalByteReverse(order, value) ^ (xorBlock ? *reinterpret_cast<const T *>(xorBlock) : 0);}template <class T, class B, bool A=false>class GetBlock{public: GetBlock(const void *block) : m_block((const byte *)block) {} template <class U> inline GetBlock<T, B, A> & operator()(U &x) { CRYPTOPP_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=false>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 GA=false, bool PA=false>struct BlockGetAndPut{ // function needed because of C++ grammatical ambiguity between expression-statements and declarations static inline GetBlock<T, B, GA> Get(const void *block) {return GetBlock<T, B, GA>(block);} typedef PutBlock<T, B, PA> Put;};template <class T>std::string WordToString(T value, ByteOrder order = BIG_ENDIAN_ORDER){ if (!NativeByteOrderIs(order)) value = ByteReverse(value); return std::string((char *)&value, sizeof(value));}template <class T>T StringToWord(const std::string &str, ByteOrder order = BIG_ENDIAN_ORDER){ T value = 0; memcpy_s(&value, sizeof(value), str.data(), UnsignedMin(str.size(), sizeof(value))); return NativeByteOrderIs(order) ? value : ByteReverse(value);}// ************** help remove warning on g++ ***************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);}// ************** use one buffer for multiple data members ***************#define CRYPTOPP_BLOCK_1(n, t, s) t* m_##n() {return (t *)(m_aggregate+0);} size_t SS1() {return sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_2(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS1());} size_t SS2() {return SS1()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_3(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS2());} size_t SS3() {return SS2()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_4(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS3());} size_t SS4() {return SS3()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_5(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS4());} size_t SS5() {return SS4()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_6(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS5());} size_t SS6() {return SS5()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_7(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS6());} size_t SS7() {return SS6()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCK_8(n, t, s) t* m_##n() {return (t *)(m_aggregate+SS7());} size_t SS8() {return SS7()+sizeof(t)*(s);} size_t m_##n##Size() {return (s);}#define CRYPTOPP_BLOCKS_END(i) size_t SST() {return SS##i();} void AllocateBlocks() {m_aggregate.New(SST());} AlignedSecByteBlock m_aggregate;NAMESPACE_END#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -