Security Scol plugin
|
Utility functions for the Crypto++ library. More...
#include "config.h"
#include "cryptlib.h"
#include "secblockfwd.h"
#include "smartptr.h"
#include "stdcpp.h"
#include "trap.h"
Go to the source code of this file.
Classes | |
struct | CompileAssert< b > |
class | Empty |
An Empty class. More... | |
class | TwoBases< BASE1, BASE2 > |
class | ThreeBases< BASE1, BASE2, BASE3 > |
class | ObjectHolder< T > |
Uses encapsulation to hide an object in derived classes. More... | |
class | NotCopyable |
Ensures an object is not copyable. More... | |
struct | NewObject< T > |
An object factory function. More... | |
class | Singleton< T, F, instance > |
Restricts the instantiation of a class to one static object without locks. More... | |
class | GetBlock< T, B, A > |
Access a block of memory. More... | |
class | PutBlock< T, B, A > |
Access a block of memory. More... | |
struct | BlockGetAndPut< T, B, GA, PA > |
Access a block of memory. More... | |
struct | SafeShifter< true > |
Shifts a value in the presence of overflow. More... | |
struct | SafeShifter< false > |
Shifts a value in the absence of overflow. More... | |
Macros | |
#define | CRYPTOPP_FAST_ROTATE(x) 0 |
#define | SIZE_MAX ((std::numeric_limits<size_t>::max)()) |
#define | CRYPTOPP_COMPILE_ASSERT(assertion) CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__) |
#define | CRYPTOPP_ASSERT_JOIN(X, Y) CRYPTOPP_DO_ASSERT_JOIN(X, Y) |
#define | CRYPTOPP_DO_ASSERT_JOIN(X, Y) X##Y |
#define | CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) |
#define | COUNTOF(x) (sizeof(x)/sizeof(x[0])) |
#define | MEMORY_BARRIER() |
#define | EnumToInt(v) static_cast<int>(v) |
Integer value. | |
#define | RETURN_IF_NONZERO(x) size_t returnedValue = x; if (returnedValue) return returnedValue |
#define | GETBYTE(x, y) (unsigned int)byte((x)>>(8*(y))) |
#define | CRYPTOPP_GET_BYTE_AS_BYTE(x, y) byte((x)>>(8*(y))) |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#define | CRYPTOPP_BLOCKS_END(i) size_t SST() {return SS##i();} void AllocateBlocks() {m_aggregate.New(SST());} AlignedSecByteBlock m_aggregate; |
Typedefs | |
typedef LittleEndian | NativeByteOrder |
Functions | |
template<typename PTR , typename OFF > | |
PTR | PtrAdd (PTR pointer, OFF offset) |
Create a pointer with an offset. | |
template<typename PTR , typename OFF > | |
PTR | PtrSub (PTR pointer, OFF offset) |
Create a pointer with an offset. | |
template<typename PTR > | |
ptrdiff_t | PtrDiff (const PTR pointer1, const PTR pointer2) |
Determine pointer difference. | |
template<typename PTR > | |
size_t | PtrByteDiff (const PTR pointer1, const PTR pointer2) |
Determine pointer difference. | |
byte * | BytePtr (std::string &str) |
Pointer to the first element of a string. | |
byte * | BytePtr (SecByteBlock &str) |
Pointer to the first element of a string. | |
const byte * | ConstBytePtr (const std::string &str) |
Const pointer to the first element of a string. | |
const byte * | ConstBytePtr (const SecByteBlock &str) |
Const pointer to the first element of a string. | |
size_t | BytePtrSize (const std::string &str) |
Size of a string. | |
size_t | BytePtrSize (const SecByteBlock &str) |
Size of a string. | |
void | memcpy_s (void *dest, size_t sizeInBytes, const void *src, size_t count) |
Bounds checking replacement for memcpy() | |
void | memmove_s (void *dest, size_t sizeInBytes, const void *src, size_t count) |
Bounds checking replacement for memmove() | |
template<class T > | |
void | vec_swap (T &a, T &b) |
Swaps two variables which are arrays. | |
void * | memset_z (void *ptr, int val, size_t num) |
Memory block initializer. | |
template<class T > | |
const T & | STDMIN (const T &a, const T &b) |
Replacement function for std::min. | |
template<class T > | |
const T & | STDMAX (const T &a, const T &b) |
Replacement function for std::max. | |
template<class T1 , class T2 > | |
const T1 | UnsignedMin (const T1 &a, const T2 &b) |
Safe comparison of values that could be negative and incorrectly promoted. | |
template<class T1 , class T2 > | |
bool | SafeConvert (T1 from, T2 &to) |
Tests whether a conversion from -> to is safe to perform. | |
template<class T > | |
std::string | IntToString (T value, unsigned int base=10) |
Converts a value to a string. | |
template<> | |
CRYPTOPP_DLL std::string | IntToString< word64 > (word64 value, unsigned int base) |
Converts an unsigned value to a string. | |
template<> | |
CRYPTOPP_DLL std::string | IntToString< Integer > (Integer value, unsigned int base) |
Converts an Integer to a string. | |
template<class T > | |
unsigned int | Parity (T value) |
Returns the parity of a value. | |
template<class T > | |
unsigned int | BytePrecision (const T &value) |
Returns the number of 8-bit bytes or octets required for a value. | |
template<class T > | |
unsigned int | BitPrecision (const T &value) |
Returns the number of bits required for a value. | |
unsigned int | TrailingZeros (word32 v) |
unsigned int | TrailingZeros (word64 v) |
template<class T > | |
T | Crop (T value, size_t bits) |
Truncates the value to the specified number of bits. | |
size_t | BitsToBytes (size_t bitCount) |
Returns the number of 8-bit bytes or octets required for the specified number of bits. | |
size_t | BytesToWords (size_t byteCount) |
Returns the number of words required for the specified number of bytes. | |
size_t | BitsToWords (size_t bitCount) |
Returns the number of words required for the specified number of bits. | |
size_t | BitsToDwords (size_t bitCount) |
Returns the number of double words required for the specified number of bits. | |
CRYPTOPP_DLL void CRYPTOPP_API | xorbuf (byte *buf, const byte *mask, size_t count) |
CRYPTOPP_DLL void CRYPTOPP_API | xorbuf (byte *output, const byte *input, const byte *mask, size_t count) |
CRYPTOPP_DLL bool CRYPTOPP_API | VerifyBufsEqual (const byte *buf1, const byte *buf2, size_t count) |
Performs a near constant-time comparison of two equally sized buffers. | |
template<class T > | |
bool | IsPowerOf2 (const T &value) |
Tests whether a value is a power of 2. | |
template<class T > | |
T | NumericLimitsMin () |
Provide the minimum value for a type. | |
template<class T > | |
T | NumericLimitsMax () |
Provide the maximum value for a type. | |
template<class T1 , class T2 > | |
T1 | SaturatingSubtract (const T1 &a, const T2 &b) |
Performs a saturating subtract clamped at 0. | |
template<class T1 , class T2 > | |
T1 | SaturatingSubtract1 (const T1 &a, const T2 &b) |
Performs a saturating subtract clamped at 1. | |
template<class T1 , class T2 > | |
T2 | ModPowerOf2 (const T1 &a, const T2 &b) |
Reduces a value to a power of 2. | |
template<class T1 , class T2 > | |
T1 | RoundDownToMultipleOf (const T1 &n, const T2 &m) |
Rounds a value down to a multiple of a second value. | |
template<class T1 , class T2 > | |
T1 | RoundUpToMultipleOf (const T1 &n, const T2 &m) |
Rounds a value up to a multiple of a second value. | |
template<class T > | |
unsigned int | GetAlignmentOf () |
Returns the minimum alignment requirements of a type. | |
bool | IsAlignedOn (const void *ptr, unsigned int alignment) |
Determines whether ptr is aligned to a minimum value. | |
template<class T > | |
bool | IsAligned (const void *ptr) |
Determines whether ptr is minimally aligned. | |
ByteOrder | GetNativeByteOrder () |
Returns NativeByteOrder as an enumerated ByteOrder value. | |
bool | NativeByteOrderIs (ByteOrder order) |
Determines whether order follows native byte ordering. | |
template<class T > | |
CipherDir | GetCipherDir (const T &obj) |
Returns the direction the cipher is being operated. | |
void | IncrementCounterByOne (byte *inout, unsigned int size) |
Performs an addition with carry on a block of bytes. | |
void | IncrementCounterByOne (byte *output, const byte *input, unsigned int size) |
Performs an addition with carry on a block of bytes. | |
template<class T > | |
void | ConditionalSwap (bool c, T &a, T &b) |
Performs a branch-less swap of values a and b if condition c is true. | |
template<class T > | |
void | ConditionalSwapPointers (bool c, T &a, T &b) |
Performs a branch-less swap of pointers a and b if condition c is true. | |
template<class T > | |
void | SecureWipeBuffer (T *buf, size_t n) |
Sets each element of an array to 0. | |
template<class T > | |
void | SecureWipeArray (T *buf, size_t n) |
Sets each element of an array to 0. | |
std::string | StringNarrow (const wchar_t *str, bool throwOnError=true) |
Converts a wide character C-string to a multibyte string. | |
std::wstring | StringWiden (const char *str, bool throwOnError=true) |
Converts a multibyte C-string to a wide character string. | |
template<unsigned int R, class T > | |
T | rotlConstant (T x) |
Performs a left rotate. | |
template<unsigned int R, class T > | |
T | rotrConstant (T x) |
Performs a right rotate. | |
template<class T > | |
T | rotlFixed (T x, unsigned int y) |
Performs a left rotate. | |
template<class T > | |
T | rotrFixed (T x, unsigned int y) |
Performs a right rotate. | |
template<class T > | |
T | rotlVariable (T x, unsigned int y) |
Performs a left rotate. | |
template<class T > | |
T | rotrVariable (T x, unsigned int y) |
Performs a right rotate. | |
template<class T > | |
T | rotlMod (T x, unsigned int y) |
Performs a left rotate. | |
template<class T > | |
T | rotrMod (T x, unsigned int y) |
Performs a right rotate. | |
template<class T > | |
unsigned int | GetByte (ByteOrder order, T value, unsigned int index) |
Gets a byte from a value. | |
byte | ByteReverse (byte value) |
Reverses bytes in a 8-bit value. | |
word16 | ByteReverse (word16 value) |
Reverses bytes in a 16-bit value. | |
word32 | ByteReverse (word32 value) |
Reverses bytes in a 32-bit value. | |
word64 | ByteReverse (word64 value) |
Reverses bytes in a 64-bit value. | |
byte | BitReverse (byte value) |
Reverses bits in a 8-bit value. | |
word16 | BitReverse (word16 value) |
Reverses bits in a 16-bit value. | |
word32 | BitReverse (word32 value) |
Reverses bits in a 32-bit value. | |
word64 | BitReverse (word64 value) |
Reverses bits in a 64-bit value. | |
template<class T > | |
T | BitReverse (T value) |
Reverses bits in a value. | |
template<class T > | |
T | ConditionalByteReverse (ByteOrder order, T value) |
Reverses bytes in a value depending upon endianness. | |
template<class T > | |
void | ByteReverse (T *out, const T *in, size_t byteCount) |
Reverses bytes in an element from an array of elements. | |
template<class T > | |
void | ConditionalByteReverse (ByteOrder order, T *out, const T *in, size_t byteCount) |
Conditionally reverses bytes in an element from an array of elements. | |
template<class T > | |
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. | |
byte | UnalignedGetWordNonTemplate (ByteOrder order, const byte *block, const byte *unused) |
Retrieve a byte from an unaligned buffer. | |
word16 | UnalignedGetWordNonTemplate (ByteOrder order, const byte *block, const word16 *unused) |
Retrieve a word16 from an unaligned buffer. | |
word32 | UnalignedGetWordNonTemplate (ByteOrder order, const byte *block, const word32 *unused) |
Retrieve a word32 from an unaligned buffer. | |
word64 | UnalignedGetWordNonTemplate (ByteOrder order, const byte *block, const word64 *unused) |
Retrieve a word64 from an unaligned buffer. | |
void | UnalignedbyteNonTemplate (ByteOrder order, byte *block, byte value, const byte *xorBlock) |
Write a byte to an unaligned buffer. | |
void | UnalignedbyteNonTemplate (ByteOrder order, byte *block, word16 value, const byte *xorBlock) |
Write a word16 to an unaligned buffer. | |
void | UnalignedbyteNonTemplate (ByteOrder order, byte *block, word32 value, const byte *xorBlock) |
Write a word32 to an unaligned buffer. | |
void | UnalignedbyteNonTemplate (ByteOrder order, byte *block, word64 value, const byte *xorBlock) |
Write a word64 to an unaligned buffer. | |
template<class T > | |
T | GetWord (bool assumeAligned, ByteOrder order, const byte *block) |
Access a block of memory. | |
template<class T > | |
void | GetWord (bool assumeAligned, ByteOrder order, T &result, const byte *block) |
Access a block of memory. | |
template<class T > | |
void | PutWord (bool assumeAligned, ByteOrder order, byte *block, T value, const byte *xorBlock=NULLPTR) |
Access a block of memory. | |
template<class T > | |
std::string | WordToString (T value, ByteOrder order=BIG_ENDIAN_ORDER) |
Convert a word to a string. | |
template<class T > | |
T | StringToWord (const std::string &str, ByteOrder order=BIG_ENDIAN_ORDER) |
Convert a string to a word. | |
template<unsigned int bits, class T > | |
T | SafeRightShift (T value) |
Safely right shift values when undefined behavior could occur. | |
template<unsigned int bits, class T > | |
T | SafeLeftShift (T value) |
Safely left shift values when undefined behavior could occur. | |
template<typename InputIt , typename T > | |
InputIt | FindIfNot (InputIt first, InputIt last, const T &value) |
Finds first element not in a range. | |
Utility functions for the Crypto++ library.
Definition in file misc.h.
#define CRYPTOPP_ASSERT_JOIN | ( | X, | |
Y | |||
) | CRYPTOPP_DO_ASSERT_JOIN(X, Y) |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#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);} |
#define CRYPTOPP_BLOCKS_END | ( | i | ) | size_t SST() {return SS##i();} void AllocateBlocks() {m_aggregate.New(SST());} AlignedSecByteBlock m_aggregate; |
#define CRYPTOPP_COMPILE_ASSERT | ( | assertion | ) | CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__) |
#define CRYPTOPP_COMPILE_ASSERT_INSTANCE | ( | assertion, | |
instance | |||
) |
#define CRYPTOPP_GET_BYTE_AS_BYTE | ( | x, | |
y | |||
) | byte((x)>>(8*(y))) |
#define EnumToInt | ( | v | ) | static_cast<int>(v) |
#define RETURN_IF_NONZERO | ( | x | ) | size_t returnedValue = x; if (returnedValue) return returnedValue |
typedef LittleEndian NativeByteOrder |
unsigned int BitPrecision | ( | const T & | value | ) |
|
inline |
Reverses bits in a value.
value | the value to reverse |
The template overload of BitReverse operates on signed and unsigned values. Internally the size of T is checked, and then value is cast to a byte, word16, word32 or word64. After the cast, the appropriate BitReverse overload is called.
|
inline |
|
inline |
Returns the number of 8-bit bytes or octets required for the specified number of bits.
bitCount | the number of bits |
BitsToBytes is effectively a ceiling function based on 8-bit bytes.
|
inline |
Returns the number of double words required for the specified number of bits.
bitCount | the number of bits |
BitsToDwords is effectively a ceiling function based on 2*WORD_BITS
. WORD_BITS
is defined in config.h
|
inline |
Returns the number of words required for the specified number of bits.
bitCount | the number of bits |
BitsToWords is effectively a ceiling function based on WORD_BITS
. WORD_BITS
is defined in config.h
unsigned int BytePrecision | ( | const T & | value | ) |
byte * BytePtr | ( | SecByteBlock & | str | ) |
|
inline |
size_t BytePtrSize | ( | const SecByteBlock & | str | ) |
|
inline |
void ByteReverse | ( | T * | out, |
const T * | in, | ||
size_t | byteCount | ||
) |
Reverses bytes in an element from an array of elements.
T | the class or type |
out | the output array of elements |
in | the input array of elements |
byteCount | the total number of bytes in the array |
Internally, ByteReverse visits each element in the in array calls ByteReverse on it, and writes the result to out.
ByteReverse does not process tail byes, or bytes that are not part of a full element. If T is int (and int is 4 bytes), then byteCount = 10
means only the first 2 elements or 8 bytes are reversed.
The following program should help illustrate the behavior.
vector<word32> v1, v2; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v2.resize(v1.size()); ByteReverse<word32>(&v2[0], &v1[0], 16); cout << "V1: "; for(unsigned int i = 0; i < v1.size(); i++) cout << std::hex << v1[i] << " "; cout << endl; cout << "V2: "; for(unsigned int i = 0; i < v2.size(); i++) cout << std::hex << v2[i] << " "; cout << endl;
The program above results in the following output.
V1: 00000001 00000002 00000003 00000004 V2: 01000000 02000000 03000000 04000000
|
inline |
|
inline |
Returns the number of words required for the specified number of bytes.
byteCount | the number of bytes |
BytesToWords is effectively a ceiling function based on WORD_SIZE
. WORD_SIZE
is defined in config.h
|
inline |
Conditionally reverses bytes in an element from an array of elements.
T | the class or type |
order | the ByteOrder of the data |
out | the output array of elements |
in | the input array of elements |
byteCount | the byte count of the arrays |
ConditionalByteReverse visits each element in the in array calls ByteReverse on it depending on the desired endianness, and writes the result to out.
ByteReverse does not process tail byes, or bytes that are not part of a full element. If T is int (and int is 4 bytes), then byteCount = 10
means only the first 2 elements or 8 bytes are reversed.
|
inline |
Reverses bytes in a value depending upon endianness.
T | the class or type |
order | the ByteOrder of the data |
value | the value to conditionally reverse |
Internally, the ConditionalByteReverse calls NativeByteOrderIs. If order matches native byte order, then the original value is returned. If not, then ByteReverse is called on the value before returning to the caller.
|
inline |
|
inline |
const byte * ConstBytePtr | ( | const SecByteBlock & | str | ) |
|
inline |
|
inline |
Truncates the value to the specified number of bits.
T | class or type |
value | the value to truncate or mask |
bits | the number of bits to truncate or mask |
This function masks the low-order bits of value and returns the result. The mask is created with (1 << bits) - 1
.
|
inline |
Finds first element not in a range.
InputIt | Input iterator type |
T | class or type |
first | iterator to first element |
last | iterator to last element |
value | the value used as a predicate |
|
inline |
Returns the minimum alignment requirements of a type.
T | class or type |
T
, in bytesInternally the function calls C++11's alignof
if available. If not available, then the function uses compiler specific extensions such as __alignof
and alignof
. If an extension is not available, then the function uses sizeof(T)
.
|
inline |
|
inline |
Returns the direction the cipher is being operated.
T | class or type |
obj | the cipher object being queried |
A cipher can be operated in a "forward" direction (encryption) or a "reverse" direction (decryption). The operations do not have to be symmetric, meaning a second application of the transformation does not necessarily return the original message. That is, E(D(m))
may not equal E(E(m))
; and D(E(m))
may not equal D(D(m))
.
|
inline |
Returns NativeByteOrder as an enumerated ByteOrder value.
NativeByteOrder is a typedef depending on the platform. If CRYPTOPP_LITTLE_ENDIAN is set in config.h, then GetNativeByteOrder returns LittleEndian. If CRYPTOPP_BIG_ENDIAN is set, then GetNativeByteOrder returns BigEndian.
|
inline |
Copy bytes in a buffer to an array of elements in big-endian order.
T | the class or type |
order | the ByteOrder of the data |
out | the output array of elements |
outlen | the byte count of the array |
in | the input array of elements |
inlen | the byte count of the array |
Access a block of memory.
T | class or type |
assumeAligned | flag indicating alignment |
order | the ByteOrder of the data |
block | the byte buffer to be processed |
GetWord() provides alternate read access to a block of memory. The flag assumeAligned indicates if the memory block is aligned for class or type T. The enumeration ByteOrder is BIG_ENDIAN_ORDER or LITTLE_ENDIAN_ORDER.
An example of reading two word32 values from a block of memory is shown below. w
will be 0x03020100
.
word32 w; byte buffer[4] = {0,1,2,3}; w = GetWord<word32>(false, LITTLE_ENDIAN_ORDER, buffer);
|
inline |
Access a block of memory.
T | class or type |
assumeAligned | flag indicating alignment |
order | the ByteOrder of the data |
result | the word in the specified byte order |
block | the byte buffer to be processed |
GetWord() provides alternate read access to a block of memory. The flag assumeAligned indicates if the memory block is aligned for class or type T. The enumeration ByteOrder is BIG_ENDIAN_ORDER or LITTLE_ENDIAN_ORDER.
An example of reading two word32 values from a block of memory is shown below. w
will be 0x03020100
.
word32 w; byte buffer[4] = {0,1,2,3}; w = GetWord<word32>(false, LITTLE_ENDIAN_ORDER, buffer);
|
inline |
Performs an addition with carry on a block of bytes.
inout | the byte block |
size | the size of the block, in bytes |
Performs an addition with carry by adding 1 on a block of bytes starting at the least significant byte. Once carry is 0, the function terminates and returns to the caller.
Performs an addition with carry on a block of bytes.
output | the destination block of bytes |
input | the source block of bytes |
size | the size of the block |
Performs an addition with carry on a block of bytes starting at the least significant byte. Once carry is 0, the remaining bytes from input are copied to output using memcpy.
The function is close to near-constant time because it operates on all the bytes in the blocks.
std::string IntToString | ( | T | value, |
unsigned int | base = 10 |
||
) |
CRYPTOPP_DLL std::string IntToString< Integer > | ( | Integer | value, |
unsigned int | base | ||
) |
Converts an Integer to a string.
value | the Integer to convert |
base | the base to use during the conversion |
This is a template specialization of IntToString(). Use it like IntToString():
// Print integer in base 10 Integer n... std::string s = IntToString(n, 10);
The string is presented with lowercase letters by default. A hack is available to switch to uppercase letters without modifying the function signature.
// Print integer in base 16, uppercase letters Integer n... const unsigned int UPPER = (1 << 31); std::string s = IntToString(n, (UPPER | 16));
Definition at line 4767 of file integer.cpp.
CRYPTOPP_DLL std::string IntToString< word64 > | ( | word64 | value, |
unsigned int | base | ||
) |
Converts an unsigned value to a string.
value | the value to convert |
base | the base to use during the conversion |
this template function specialization was added to suppress Coverity findings on IntToString() with unsigned types.
Definition at line 4833 of file integer.cpp.
|
inline |
Determines whether ptr is minimally aligned.
T | class or type |
ptr | the pointer to check for alignment |
ptr
is aligned to at least T
boundary, false otherwiseInternally the function calls IsAlignedOn with a second parameter of GetAlignmentOf<T>.
|
inline |
Determines whether ptr is aligned to a minimum value.
ptr | the pointer being checked for alignment |
alignment | the alignment value to test the pointer against |
ptr
is aligned on at least alignment
boundary, false otherwiseInternally the function tests whether alignment is 1. If so, the function returns true. If not, then the function effectively performs a modular reduction and returns true if the residue is 0.
|
inline |
Tests whether a value is a power of 2.
value | the value to test |
The function creates a mask of value - 1
and returns the result of an AND operation compared to 0. If value is 0 or less than 0, then the function returns false.
|
inline |
Bounds checking replacement for memcpy()
dest | pointer to the destination memory block |
sizeInBytes | size of the destination memory block, in bytes |
src | pointer to the source memory block |
count | the number of bytes to copy |
InvalidArgument |
ISO/IEC TR-24772 provides bounds checking interfaces for potentially unsafe functions like memcpy(), strcpy() and memmove(). However, not all standard libraries provides them, like Glibc. The library's memcpy_s() is a near-drop in replacement. Its only a near-replacement because the library's version throws an InvalidArgument on a bounds violation.
memcpy_s() and memmove_s() are guarded by STDC_WANT_SECURE_LIB. If STDC_WANT_SECURE_LIB is not defined or defined to 0, then the library makes memcpy_s() and memmove_s() available. The library will also optionally make the symbols available if CRYPTOPP_WANT_SECURE_LIB
is defined. CRYPTOPP_WANT_SECURE_LIB
is in config.h, but it is disabled by default.
memcpy_s() will assert the pointers src and dest are not NULL in debug builds. Passing NULL for either pointer is undefined behavior.
|
inline |
Bounds checking replacement for memmove()
dest | pointer to the destination memory block |
sizeInBytes | size of the destination memory block, in bytes |
src | pointer to the source memory block |
count | the number of bytes to copy |
InvalidArgument |
ISO/IEC TR-24772 provides bounds checking interfaces for potentially unsafe functions like memcpy(), strcpy() and memmove(). However, not all standard libraries provides them, like Glibc. The library's memmove_s() is a near-drop in replacement. Its only a near-replacement because the library's version throws an InvalidArgument on a bounds violation.
memcpy_s() and memmove_s() are guarded by STDC_WANT_SECURE_LIB. If STDC_WANT_SECURE_LIB is not defined or defined to 0, then the library makes memcpy_s() and memmove_s() available. The library will also optionally make the symbols available if CRYPTOPP_WANT_SECURE_LIB
is defined. CRYPTOPP_WANT_SECURE_LIB
is in config.h, but it is disabled by default.
memmove_s() will assert the pointers src and dest are not NULL in debug builds. Passing NULL for either pointer is undefined behavior.
|
inline |
Memory block initializer.
ptr | pointer to the memory block being written |
val | the integer value to write for each byte |
num | the size of the source memory block, in bytes |
Internally the function calls memset with the value val
. memset_z can be used to initialize a freshly allocated memory block. To zeroize a memory block on destruction use SecureWipeBuffer
.
|
inline |
Reduces a value to a power of 2.
T1 | class or type |
T2 | class or type |
a | the first value |
b | the second value |
a & (b-1)
. b
must be a power of 2. Use IsPowerOf2() to determine if b
is a suitable candidate.
|
inline |
|
inline |
Provide the maximum value for a type.
T | type of class |
NumericLimitsMax() was introduced for Clang at Issue 364, Apple Clang 6.0 and numeric_limits<word128>::max() returns 0.
NumericLimitsMax() requires a specialization for T
, meaning std::numeric_limits<T>::is_specialized
must return true
. In the case of word128
Clang did not specialize numeric_limits
for the type.
|
inline |
Provide the minimum value for a type.
T | type of class |
NumericLimitsMin() was introduced for Clang at Issue 364, Apple Clang 6.0 and numeric_limits<word128>::max() returns 0.
NumericLimitsMin() requires a specialization for T
, meaning std::numeric_limits<T>::is_specialized
must return true
. In the case of word128
Clang did not specialize numeric_limits
for the type.
unsigned int Parity | ( | T | value | ) |
|
inline |
|
inline |
Determine pointer difference.
PTR | a pointer type |
pointer1 | the first pointer |
pointer2 | the second pointer |
PtrByteDiff can be used to squash Clang and GCC UBsan findings for pointer addition and subtraction. pointer1 and pointer2 must point to the same object or array (or one past the end), and yields the number of bytes (not elements) difference.
|
inline |
Determine pointer difference.
PTR | a pointer type |
pointer1 | the first pointer |
pointer2 | the second pointer |
PtrDiff can be used to squash Clang and GCC UBsan findings for pointer addition and subtraction. pointer1 and pointer2 must point to the same object or array (or one past the end), and yields the number of elements (not bytes) difference.
|
inline |
|
inline |
Access a block of memory.
T | class or type |
assumeAligned | flag indicating alignment |
order | the ByteOrder of the data |
block | the destination byte buffer |
value | the word in the specified byte order |
xorBlock | an optional byte buffer to xor |
PutWord() provides alternate write access to a block of memory. The flag assumeAligned indicates if the memory block is aligned for class or type T. The enumeration ByteOrder is BIG_ENDIAN_ORDER or LITTLE_ENDIAN_ORDER.
|
inline |
Performs a left rotate.
R | the number of bit positions to rotate the value |
T | the word type |
x | the value to rotate |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
R must be in the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior. Use rotlMod if the rotate amount R is outside the range.
Use rotlConstant when the rotate amount is constant. The template function was added because Clang did not propagate the constant when passed as a function parameter. Clang's need for a constexpr meant rotlFixed failed to compile on occasion.
rotate IMM
instruction because its often faster than a rotate REG
. Immediate rotates can be up to three times faster than their register counterparts.
|
inline |
Performs a left rotate.
T | the word type |
x | the value to rotate |
y | the number of bit positions to rotate the value |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
y must be in the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior. Use rotlMod if the rotate amount y is outside the range.
rotate IMM
instruction because its often faster than a rotate REG
. Immediate rotates can be up to three times faster than their register counterparts. New code should use rotlConstant
, which accepts the rotate amount as a template parameter.
|
inline |
Performs a left rotate.
T | the word type |
x | the value to rotate |
y | the number of bit positions to rotate the value |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
y is reduced to the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior.
rotate IMM
or rotate REG
.
|
inline |
Performs a left rotate.
T | the word type |
x | the value to rotate |
y | the number of bit positions to rotate the value |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
y must be in the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior. Use rotlMod if the rotate amount y is outside the range.
rotate IMM
instruction because its often faster than a rotate REG
. Immediate rotates can be up to three times faster than their register counterparts.
|
inline |
Performs a right rotate.
R | the number of bit positions to rotate the value |
T | the word type |
x | the value to rotate |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
R must be in the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior. Use rotrMod if the rotate amount R is outside the range.
Use rotrConstant when the rotate amount is constant. The template function was added because Clang did not propagate the constant when passed as a function parameter. Clang's need for a constexpr meant rotrFixed failed to compile on occasion.
rotate IMM
instruction because its often faster than a rotate REG
. Immediate rotates can be up to three times faster than their register counterparts.
|
inline |
Performs a right rotate.
T | the word type |
x | the value to rotate |
y | the number of bit positions to rotate the value |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
y must be in the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior. Use rotrMod if the rotate amount y is outside the range.
rotate IMM
instruction because its often faster than a rotate REG
. Immediate rotates can be up to three times faster than their register counterparts. New code should use rotrConstant
, which accepts the rotate amount as a template parameter.
|
inline |
Performs a right rotate.
T | the word type |
x | the value to rotate |
y | the number of bit positions to rotate the value |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
y is reduced to the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior.
rotate IMM
or rotate REG
.
|
inline |
Performs a right rotate.
T | the word type |
x | the value to rotate |
y | the number of bit positions to rotate the value |
This is a portable C/C++ implementation. The value x to be rotated can be 8 to 64-bits wide.
y must be in the range [0, sizeof(T)*8 - 1]
to avoid undefined behavior. Use rotrMod if the rotate amount y is outside the range.
rotate IMM
instruction because its often faster than a rotate REG
. Immediate rotates can be up to three times faster than their register counterparts.
|
inline |
Rounds a value down to a multiple of a second value.
T1 | class or type |
T2 | class or type |
n | the value to reduce |
m | the value to reduce n to a multiple |
RoundDownToMultipleOf is effectively a floor function based on m. The function returns the value n - n%m
. If n is a multiple of m, then the original value is returned.
T1
and T2
should be unsigned arithmetic types. If T1
or T2
is signed, then the value should be non-negative. The library asserts in debug builds when practical, but allows you to perform the operation in release builds.
|
inline |
Rounds a value up to a multiple of a second value.
T1 | class or type |
T2 | class or type |
n | the value to reduce |
m | the value to reduce n to a multiple |
RoundUpToMultipleOf is effectively a ceiling function based on m. The function returns the value n + n%m
. If n is a multiple of m, then the original value is returned. If the value n would overflow, then an InvalidArgument exception is thrown.
T1
and T2
should be unsigned arithmetic types. If T1
or T2
is signed, then the value should be non-negative. The library asserts in debug builds when practical, but allows you to perform the operation in release builds.
|
inline |
|
inline |
Safely left shift values when undefined behavior could occur.
bits | the number of bit positions to shift the value |
T | class or type |
value | the value to left shift |
SafeLeftShift safely shifts the value to the left when undefined behavior could occur under C/C++ rules. SafeLeftShift will return the shifted value or 0 if undefined behavior would occur.
|
inline |
Safely right shift values when undefined behavior could occur.
bits | the number of bit positions to shift the value |
T | class or type |
value | the value to right shift |
SafeRightShift safely shifts the value to the right when undefined behavior could occur under C/C++ rules. SafeRightShift will return the shifted value or 0 if undefined behavior would occur.
|
inline |
Performs a saturating subtract clamped at 0.
T1 | class or type |
T2 | class or type |
a | the minuend |
b | the subtrahend |
Saturating arithmetic restricts results to a fixed range. Results that are less than 0 are clamped at 0.
Use of saturating arithmetic in places can be advantageous because it can avoid a branch by using an instruction like a conditional move (CMOVE
).
|
inline |
Performs a saturating subtract clamped at 1.
T1 | class or type |
T2 | class or type |
a | the minuend |
b | the subtrahend |
Saturating arithmetic restricts results to a fixed range. Results that are less than 1 are clamped at 1.
Use of saturating arithmetic in places can be advantageous because it can avoid a branch by using an instruction like a conditional move (CMOVE
).
|
inline |
void SecureWipeBuffer | ( | T * | buf, |
size_t | n | ||
) |
|
inline |
Replacement function for std::max.
T | class or type |
a | the first value |
b | the second value |
a < b
using operator<
STDMAX was provided because the library could not easily use std::min or std::max in Windows or Cygwin 1.1.0
|
inline |
Replacement function for std::min.
T | class or type |
a | the first value |
b | the second value |
b < a
using operator<
STDMIN was provided because the library could not easily use std::min or std::max in Windows or Cygwin 1.1.0
std::string StringNarrow | ( | const wchar_t * | str, |
bool | throwOnError = true |
||
) |
Converts a wide character C-string to a multibyte string.
str | C-string consisting of wide characters |
throwOnError | flag indicating the function should throw on error |
StringNarrow() converts a wide string to a narrow string using C++ std::wcstombs() under the executing thread's locale. A locale must be set before using this function, and it can be set with std::setlocale() if needed. Upon success, the converted string is returned.
Upon failure with throwOnError as false, the function returns an empty string. If throwOnError as true, the function throws an InvalidArgument() exception.
T StringToWord | ( | const std::string & | str, |
ByteOrder | order = BIG_ENDIAN_ORDER |
||
) |
std::wstring StringWiden | ( | const char * | str, |
bool | throwOnError = true |
||
) |
Converts a multibyte C-string to a wide character string.
str | C-string consisting of wide characters |
throwOnError | flag indicating the function should throw on error |
StringWiden() converts a narrow string to a wide string using C++ std::mbstowcs() under the executing thread's locale. A locale must be set before using this function, and it can be set with std::setlocale() if needed. Upon success, the converted string is returned.
Upon failure with throwOnError as false, the function returns an empty string. If throwOnError as true, the function throws an InvalidArgument() exception.
|
inline |
Determines the number of trailing 0-bits in a value
v | the 32-bit value to test |
TrailingZeros returns the number of trailing 0-bits in v, starting at the least significant bit position. The return value is undefined if there are no 1-bits set in the value v.
|
inline |
Determines the number of trailing 0-bits in a value
v | the 64-bit value to test |
TrailingZeros returns the number of trailing 0-bits in v, starting at the least significant bit position. The return value is undefined if there are no 1-bits set in the value v.
|
inline |
Safe comparison of values that could be negative and incorrectly promoted.
T1 | class or type |
T2 | class or type |
a | the first value |
b | the second value |
operator<
.The comparison b < a
is performed and the value returned is a's type T1.
|
inline |
Swaps two variables which are arrays.
T | class or type |
a | the first value |
b | the second value |
C++03 does not provide support for std::swap(__m128i a, __m128i b)
because __m128i
is an unsigned long long[2]
. Most compilers support it out of the box, but Sun Studio C++ compilers 12.2 and 12.3 do not.
CRYPTOPP_DLL bool CRYPTOPP_API VerifyBufsEqual | ( | const byte * | buf1, |
const byte * | buf2, | ||
size_t | count | ||
) |
Performs a near constant-time comparison of two equally sized buffers.
buf1 | the first buffer |
buf2 | the second buffer |
count | the size of the buffers, in bytes |
VerifyBufsEqual performs an XOR of the elements in two equally sized buffers and returns a result based on the XOR operation. A count of 0 returns true because two empty buffers are considered equal.
The function is near constant-time because CPU micro-code timings could affect the "constant-ness". Calling code is responsible for mitigating timing attacks if the buffers are not equally sized.
std::string WordToString | ( | T | value, |
ByteOrder | order = BIG_ENDIAN_ORDER |
||
) |
Performs an XOR of a buffer with a mask
buf | the buffer to XOR with the mask |
mask | the mask to XOR with the buffer |
count | the size of the buffers, in bytes |
The function effectively visits each element in the buffers and performs buf[i] ^= mask[i]
. buf and mask must be of equal size.
CRYPTOPP_DLL void CRYPTOPP_API xorbuf | ( | byte * | output, |
const byte * | input, | ||
const byte * | mask, | ||
size_t | count | ||
) |
Performs an XOR of an input buffer with a mask and stores the result in an output buffer
output | the destination buffer |
input | the source buffer to XOR with the mask |
mask | the mask buffer to XOR with the input buffer |
count | the size of the buffers, in bytes |
The function effectively visits each element in the buffers and performs output[i] = input[i] ^ mask[i]
. output, input and mask must be of equal size.