Add ability to Seek64 in test framework (GH #732)
Also see https://github.com/randombit/botan/pull/1728pull/737/head
parent
f7c0fab5b2
commit
40fa6873f9
|
|
@ -24,7 +24,8 @@ before the Test field.
|
|||
Data Types
|
||||
==========
|
||||
|
||||
int - small integer (less than 2^32) in decimal representation
|
||||
signed int - small integer (less than 2^32) in decimal representation
|
||||
unsigned long - large integer (less than 2^64) convertible by strtoul or strtoull
|
||||
string - human readable string
|
||||
encoded string - can be one of the following
|
||||
- quoted string: "message" means "message" without the quotes
|
||||
|
|
@ -68,6 +69,7 @@ DerivedLength - encoded string
|
|||
Digest - encoded string
|
||||
TruncatedSize - int, size of truncated digest in bytes
|
||||
Seek - int, seek location for random access ciphers
|
||||
Seek64 - unsigned long, seek location for random access ciphers
|
||||
(more to come here)
|
||||
|
||||
Possible Tests
|
||||
|
|
|
|||
18
cryptlib.h
18
cryptlib.h
|
|
@ -393,6 +393,24 @@ public:
|
|||
CRYPTOPP_DLL int GetIntValueWithDefault(const char *name, int defaultValue) const
|
||||
{return GetValueWithDefault(name, defaultValue);}
|
||||
|
||||
/// \brief Get a named value with type word64
|
||||
/// \param name the name of the value to retrieve
|
||||
/// \param value the value retrieved upon success
|
||||
/// \return true if an word64 value was retrieved, false otherwise
|
||||
/// \sa GetValue(), GetValueWithDefault(), GetWord64ValueWithDefault(), GetIntValue(),
|
||||
/// GetIntValueWithDefault(), GetRequiredParameter() and GetRequiredIntParameter()
|
||||
CRYPTOPP_DLL bool GetWord64Value(const char *name, word64 &value) const
|
||||
{return GetValue(name, value);}
|
||||
|
||||
/// \brief Get a named value with type word64, with default
|
||||
/// \param name the name of the value to retrieve
|
||||
/// \param defaultValue the default value if the name does not exist
|
||||
/// \return the value retrieved on success or the default value
|
||||
/// \sa GetValue(), GetValueWithDefault(), GetWord64Value(), GetIntValue(),
|
||||
/// GetIntValueWithDefault(), GetRequiredParameter() and GetRequiredWord64Parameter()
|
||||
CRYPTOPP_DLL word64 GetWord64ValueWithDefault(const char *name, word64 defaultValue) const
|
||||
{return GetValueWithDefault(name, defaultValue);}
|
||||
|
||||
/// \brief Ensures an expected name and type is present
|
||||
/// \param name the name of the value
|
||||
/// \param stored the type that was stored for the name
|
||||
|
|
|
|||
33
datatest.cpp
33
datatest.cpp
|
|
@ -30,6 +30,12 @@
|
|||
# pragma warning(disable: 4505 4355)
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define STRTOUL64 _strtoui64
|
||||
#else
|
||||
# define STRTOUL64 strtoull
|
||||
#endif
|
||||
|
||||
NAMESPACE_BEGIN(CryptoPP)
|
||||
NAMESPACE_BEGIN(Test)
|
||||
|
||||
|
|
@ -220,6 +226,16 @@ public:
|
|||
|
||||
if (valueType == typeid(int))
|
||||
*reinterpret_cast<int *>(pValue) = atoi(value.c_str());
|
||||
else if (valueType == typeid(word64))
|
||||
{
|
||||
std::string x(value); errno = 0;
|
||||
const char* beg = &x[0];
|
||||
char* end = &x[0] + value.size();
|
||||
|
||||
*reinterpret_cast<word64*>(pValue) = STRTOUL64(beg, &end, 0);
|
||||
if (errno != 0)
|
||||
return false;
|
||||
}
|
||||
else if (valueType == typeid(Integer))
|
||||
*reinterpret_cast<Integer *>(pValue) = Integer((std::string(value) + "h").c_str());
|
||||
else if (valueType == typeid(ConstByteArrayParameter))
|
||||
|
|
@ -445,11 +461,20 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters)
|
|||
decryptor->SetKey(reinterpret_cast<const byte*>(&key[0]), key.size(), pairs);
|
||||
}
|
||||
|
||||
int seek = pairs.GetIntValueWithDefault("Seek", 0);
|
||||
if (seek)
|
||||
word64 seek64 = pairs.GetWord64ValueWithDefault("Seek64", 0);
|
||||
if (seek64)
|
||||
{
|
||||
encryptor->Seek(seek);
|
||||
decryptor->Seek(seek);
|
||||
encryptor->Seek(seek64);
|
||||
decryptor->Seek(seek64);
|
||||
}
|
||||
else
|
||||
{
|
||||
int seek = pairs.GetIntValueWithDefault("Seek", 0);
|
||||
if (seek)
|
||||
{
|
||||
encryptor->Seek(seek);
|
||||
decryptor->Seek(seek);
|
||||
}
|
||||
}
|
||||
|
||||
// If a per-test vector parameter was set for a test, like BlockPadding,
|
||||
|
|
|
|||
16
strciphr.cpp
16
strciphr.cpp
|
|
@ -76,8 +76,6 @@ void AdditiveCipherTemplate<S>::ProcessData(byte *outString, const byte *inStrin
|
|||
length -= len; m_leftOver -= len;
|
||||
inString = PtrAdd(inString, len);
|
||||
outString = PtrAdd(outString, len);
|
||||
|
||||
if (!length) {return;}
|
||||
}
|
||||
|
||||
PolicyInterface &policy = this->AccessPolicy();
|
||||
|
|
@ -93,8 +91,6 @@ void AdditiveCipherTemplate<S>::ProcessData(byte *outString, const byte *inStrin
|
|||
inString = PtrAdd(inString, iterations * bytesPerIteration);
|
||||
outString = PtrAdd(outString, iterations * bytesPerIteration);
|
||||
length -= iterations * bytesPerIteration;
|
||||
|
||||
if (!length) {return;}
|
||||
}
|
||||
|
||||
size_t bufferByteSize = m_buffer.size();
|
||||
|
|
@ -134,7 +130,7 @@ template <class BASE>
|
|||
void AdditiveCipherTemplate<BASE>::Seek(lword position)
|
||||
{
|
||||
PolicyInterface &policy = this->AccessPolicy();
|
||||
unsigned int bytesPerIteration = policy.GetBytesPerIteration();
|
||||
word32 bytesPerIteration = policy.GetBytesPerIteration();
|
||||
|
||||
policy.SeekToIteration(position / bytesPerIteration);
|
||||
position %= bytesPerIteration;
|
||||
|
|
@ -142,7 +138,7 @@ void AdditiveCipherTemplate<BASE>::Seek(lword position)
|
|||
if (position > 0)
|
||||
{
|
||||
policy.WriteKeystream(PtrSub(KeystreamBufferEnd(), bytesPerIteration), 1);
|
||||
m_leftOver = bytesPerIteration - (unsigned int)position;
|
||||
m_leftOver = bytesPerIteration - static_cast<word32>(position);
|
||||
}
|
||||
else
|
||||
m_leftOver = 0;
|
||||
|
|
@ -179,7 +175,7 @@ void CFB_CipherTemplate<BASE>::ProcessData(byte *outString, const byte *inString
|
|||
CRYPTOPP_ASSERT(length % this->MandatoryBlockSize() == 0);
|
||||
|
||||
PolicyInterface &policy = this->AccessPolicy();
|
||||
unsigned int bytesPerIteration = policy.GetBytesPerIteration();
|
||||
word32 bytesPerIteration = policy.GetBytesPerIteration();
|
||||
byte *reg = policy.GetRegisterBegin();
|
||||
|
||||
if (m_leftOver)
|
||||
|
|
@ -190,8 +186,6 @@ void CFB_CipherTemplate<BASE>::ProcessData(byte *outString, const byte *inString
|
|||
m_leftOver -= len; length -= len;
|
||||
inString = PtrAdd(inString, len);
|
||||
outString = PtrAdd(outString, len);
|
||||
|
||||
if (!length) {return;}
|
||||
}
|
||||
|
||||
// TODO: Figure out what is happening on ARM A-32. x86, Aarch64 and PowerPC are OK.
|
||||
|
|
@ -204,8 +198,8 @@ void CFB_CipherTemplate<BASE>::ProcessData(byte *outString, const byte *inString
|
|||
// Also see https://github.com/weidai11/cryptopp/issues/683.
|
||||
//
|
||||
// UPDATE: It appears the issue is related to alignment checks. When we made
|
||||
// the alignment check result volatile GCC and Clang stopped
|
||||
// short-circuiting the transform, which is what we wanted. I suspect
|
||||
// the alignment check result volatile GCC and Clang stopped short-
|
||||
// circuiting the transform, which is what we wanted. I suspect
|
||||
// there's a little more to the issue, but we can enable the block again.
|
||||
|
||||
const unsigned int alignment = policy.GetAlignment();
|
||||
|
|
|
|||
Loading…
Reference in New Issue