diff --git a/TestVectors/Readme.txt b/TestVectors/Readme.txt index 0c8e45cc..5a27c99f 100644 --- a/TestVectors/Readme.txt +++ b/TestVectors/Readme.txt @@ -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 diff --git a/cryptlib.h b/cryptlib.h index 78bb6d68..e4972bc0 100644 --- a/cryptlib.h +++ b/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 diff --git a/datatest.cpp b/datatest.cpp index 133faada..ba90c5d2 100644 --- a/datatest.cpp +++ b/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(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(pValue) = STRTOUL64(beg, &end, 0); + if (errno != 0) + return false; + } else if (valueType == typeid(Integer)) *reinterpret_cast(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(&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, diff --git a/strciphr.cpp b/strciphr.cpp index 194f6f1d..1ccb0670 100644 --- a/strciphr.cpp +++ b/strciphr.cpp @@ -76,8 +76,6 @@ void AdditiveCipherTemplate::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::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 void AdditiveCipherTemplate::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::Seek(lword position) if (position > 0) { policy.WriteKeystream(PtrSub(KeystreamBufferEnd(), bytesPerIteration), 1); - m_leftOver = bytesPerIteration - (unsigned int)position; + m_leftOver = bytesPerIteration - static_cast(position); } else m_leftOver = 0; @@ -179,7 +175,7 @@ void CFB_CipherTemplate::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::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::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();