📄 misc.h
字号:
inline void PutBlockLittleEndian(byte *block, T a, T b){#ifdef IS_LITTLE_ENDIAN ((T *)block)[0] = a; ((T *)block)[1] = b;#else ((T *)block)[0] = byteReverse(a); ((T *)block)[1] = byteReverse(b);#endif}// Fetch 4 words from user's buffer into "a", "b", "c", "d" in LITTLE-endian ordertemplate <class T>inline void GetBlockLittleEndian(const byte *block, T &a, T &b, T &c, T &d){#ifdef IS_LITTLE_ENDIAN a = ((T *)block)[0]; b = ((T *)block)[1]; c = ((T *)block)[2]; d = ((T *)block)[3];#else a = byteReverse(((T *)block)[0]); b = byteReverse(((T *)block)[1]); c = byteReverse(((T *)block)[2]); d = byteReverse(((T *)block)[3]);#endif}// Put 4 words back into user's buffer in LITTLE-endian ordertemplate <class T>inline void PutBlockLittleEndian(byte *block, T a, T b, T c, T d){#ifdef IS_LITTLE_ENDIAN ((T *)block)[0] = a; ((T *)block)[1] = b; ((T *)block)[2] = c; ((T *)block)[3] = d;#else ((T *)block)[0] = byteReverse(a); ((T *)block)[1] = byteReverse(b); ((T *)block)[2] = byteReverse(c); ((T *)block)[3] = byteReverse(d);#endif}// Fetch 2 words from user's buffer into "a", "b" in BIG-endian ordertemplate <class T>inline void GetBlockBigEndian(const byte *block, T &a, T &b){#ifndef IS_LITTLE_ENDIAN a = ((T *)block)[0]; b = ((T *)block)[1];#else a = byteReverse(((T *)block)[0]); b = byteReverse(((T *)block)[1]);#endif}// Put 2 words back into user's buffer in BIG-endian ordertemplate <class T>inline void PutBlockBigEndian(byte *block, T a, T b){#ifndef IS_LITTLE_ENDIAN ((T *)block)[0] = a; ((T *)block)[1] = b;#else ((T *)block)[0] = byteReverse(a); ((T *)block)[1] = byteReverse(b);#endif}// Fetch 4 words from user's buffer into "a", "b", "c", "d" in BIG-endian ordertemplate <class T>inline void GetBlockBigEndian(const byte *block, T &a, T &b, T &c, T &d){#ifndef IS_LITTLE_ENDIAN a = ((T *)block)[0]; b = ((T *)block)[1]; c = ((T *)block)[2]; d = ((T *)block)[3];#else a = byteReverse(((T *)block)[0]); b = byteReverse(((T *)block)[1]); c = byteReverse(((T *)block)[2]); d = byteReverse(((T *)block)[3]);#endif}// Put 4 words back into user's buffer in BIG-endian ordertemplate <class T>inline void PutBlockBigEndian(byte *block, T a, T b, T c, T d){#ifndef IS_LITTLE_ENDIAN ((T *)block)[0] = a; ((T *)block)[1] = b; ((T *)block)[2] = c; ((T *)block)[3] = d;#else ((T *)block)[0] = byteReverse(a); ((T *)block)[1] = byteReverse(b); ((T *)block)[2] = byteReverse(c); ((T *)block)[3] = byteReverse(d);#endif}template <class T>std::string WordToString(T value, bool highFirst = true){ if (!CheckEndianess(highFirst)) value = byteReverse(value); return std::string((char *)&value, sizeof(value));}template <class T>T StringToWord(const std::string &str, bool highFirst = true){ T value = 0; memcpy(&value, str.data(), STDMIN(sizeof(value), str.size())); return CheckEndianess(highFirst) ? value : byteReverse(value);}// ************** key length query ***************/// support query of fixed key lengthtemplate <unsigned int N>class FixedKeyLength{public: enum {KEYLENGTH=N, MIN_KEYLENGTH=N, MAX_KEYLENGTH=N, DEFAULT_KEYLENGTH=N}; /// returns the key length static unsigned int KeyLength(unsigned int) {return KEYLENGTH;}};/// support query of variable key length, template parameters are default, min, max, multiple (default multiple 1)template <unsigned int D, unsigned int N, unsigned int M, unsigned int Q=1>class VariableKeyLength{public: enum {MIN_KEYLENGTH=N, MAX_KEYLENGTH=M, DEFAULT_KEYLENGTH=D, KEYLENGTH_MULTIPLE=Q}; /// returns the smallest valid key length in bytes that is >= min(n, MAX_KEYLENGTH) static unsigned int KeyLength(unsigned int n) { assert(KEYLENGTH_MULTIPLE > 0 && MIN_KEYLENGTH % KEYLENGTH_MULTIPLE == 0 && MAX_KEYLENGTH % KEYLENGTH_MULTIPLE == 0); if (n < MIN_KEYLENGTH) return MIN_KEYLENGTH; else if (n > MAX_KEYLENGTH) return MAX_KEYLENGTH; else return RoundUpToMultipleOf(n, KEYLENGTH_MULTIPLE); }};/// support query of key length that's the same as another classtemplate <class T>class SameKeyLengthAs{public: enum {MIN_KEYLENGTH=T::MIN_KEYLENGTH, MAX_KEYLENGTH=T::MAX_KEYLENGTH, DEFAULT_KEYLENGTH=T::DEFAULT_KEYLENGTH}; /// returns the smallest valid key length in bytes that is >= min(n, MAX_KEYLENGTH) static unsigned int KeyLength(unsigned int keylength) {return T::KeyLength(keylength);}};// ************** secure memory allocation ***************#ifdef SECALLOC_DEFAULT#define SecAlloc(type, number) (new type[(number)])#define SecFree(ptr, number) (memset((ptr), 0, (number)*sizeof(*(ptr))), delete [] (ptr))#else#define SecAlloc(type, number) (new type[(number)])#define SecFree(ptr, number) (delete [] (ptr))#endif//! a block of memory allocated using SecAlloctemplate <class T> struct SecBlock{ explicit SecBlock(unsigned int size=0) : size(size) {ptr = SecAlloc(T, size);} SecBlock(const SecBlock<T> &t) : size(t.size) {ptr = SecAlloc(T, size); memcpy(ptr, t.ptr, size*sizeof(T));} SecBlock(const T *t, unsigned int len) : size(len) {ptr = SecAlloc(T, len); memcpy(ptr, t, len*sizeof(T));} ~SecBlock() {SecFree(ptr, size);}#if defined(__GNUC__) || defined(__BCPLUSPLUS__) operator const void *() const {return ptr;} operator void *() {return ptr;}#endif#if defined(__GNUC__) // reduce warnings operator const void *() {return ptr;}#endif operator const T *() const {return ptr;} operator T *() {return ptr;}#if defined(__GNUC__) // reduce warnings operator const T *() {return ptr;}#endif// CodeWarrior defines _MSC_VER#if !defined(_MSC_VER) || defined(__MWERKS__) T *operator +(unsigned int offset) {return ptr+offset;} const T *operator +(unsigned int offset) const {return ptr+offset;} T& operator[](unsigned int index) {assert(index<size); return ptr[index];} const T& operator[](unsigned int index) const {assert(index<size); return ptr[index];}#endif const T* Begin() const {return ptr;} T* Begin() {return ptr;} const T* End() const {return ptr+size;} T* End() {return ptr+size;} unsigned int Size() const {return size;} void Assign(const T *t, unsigned int len) { New(len); memcpy(ptr, t, len*sizeof(T)); } void Assign(const SecBlock<T> &t) { New(t.size); memcpy(ptr, t.ptr, size*sizeof(T)); } SecBlock& operator=(const SecBlock<T> &t) { Assign(t); return *this; } bool operator==(const SecBlock<T> &t) const { return size == t.size && memcmp(ptr, t.ptr, size*sizeof(T)) == 0; } bool operator!=(const SecBlock<T> &t) const { return !operator==(t); } void New(unsigned int newSize) { if (newSize != size) { T *newPtr = SecAlloc(T, newSize); SecFree(ptr, size); ptr = newPtr; size = newSize; } } void CleanNew(unsigned int newSize) { if (newSize != size) { T *newPtr = SecAlloc(T, newSize); SecFree(ptr, size); ptr = newPtr; size = newSize; } memset(ptr, 0, size*sizeof(T)); } void Grow(unsigned int newSize) { if (newSize > size) { T *newPtr = SecAlloc(T, newSize); memcpy(newPtr, ptr, size*sizeof(T)); SecFree(ptr, size); ptr = newPtr; size = newSize; } } void CleanGrow(unsigned int newSize) { if (newSize > size) { T *newPtr = SecAlloc(T, newSize); memcpy(newPtr, ptr, size*sizeof(T)); memset(newPtr+size, 0, (newSize-size)*sizeof(T)); SecFree(ptr, size); ptr = newPtr; size = newSize; } } void Resize(unsigned int newSize) { if (newSize != size) { T *newPtr = SecAlloc(T, newSize); memcpy(newPtr, ptr, STDMIN(newSize, size)*sizeof(T)); SecFree(ptr, size); ptr = newPtr; size = newSize; } } void swap(SecBlock<T> &b); unsigned int size; T *ptr;};template <class T> void SecBlock<T>::swap(SecBlock<T> &b){ std::swap(size, b.size); std::swap(ptr, b.ptr);}typedef SecBlock<byte> SecByteBlock;typedef SecBlock<word> SecWordBlock;NAMESPACE_ENDNAMESPACE_BEGIN(std)template <class T>inline void swap(CryptoPP::SecBlock<T> &a, CryptoPP::SecBlock<T> &b){ a.swap(b);}NAMESPACE_END#endif // MISC_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -