📄 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 order
template <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 order
template <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 order
template <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 order
template <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 order
template <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 order
template <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 length
template <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 class
template <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 SecAlloc
template <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_END
NAMESPACE_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 + -