From efe88c043ba03a362cbdd9641d273acaed685f96 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Mon, 4 Sep 2017 20:07:47 -0400 Subject: Use aligned buffer for datatest.cpp --- datatest.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 23 deletions(-) (limited to 'datatest.cpp') diff --git a/datatest.cpp b/datatest.cpp index 2f9bcb5f..71420868 100644 --- a/datatest.cpp +++ b/datatest.cpp @@ -30,11 +30,25 @@ #endif NAMESPACE_BEGIN(CryptoPP) + +typedef std::basic_string, AllocatorWithCleanup > aligned_string; +typedef StringSinkTemplate AlignedStringSink; + NAMESPACE_BEGIN(Test) typedef std::map TestData; static bool s_thorough = false; +bool operator ==(const std::string& a, const aligned_string& b) +{ + return a.length() == b.length() && 0 == std::memcmp(a.data(), b.data(), a.size()); +} + +bool operator !=(const std::string& a, const aligned_string& b) +{ + return !(a == b); +} + class TestFailure : public Exception { public: @@ -87,7 +101,7 @@ void RandomizedTransfer(BufferedTransformation &source, BufferedTransformation & { while (source.MaxRetrievable() > (finish ? 0 : 4096)) { - byte buf[4096+64]; + CRYPTOPP_ALIGN_DATA(16) byte buf[4096+64]; size_t start = Test::GlobalRNG().GenerateWord32(0, 63); size_t len = Test::GlobalRNG().GenerateWord32(1, UnsignedMin(4096U, 3*source.MaxRetrievable()/2)); len = source.Get(buf+start, len); @@ -181,6 +195,13 @@ std::string GetDecodedDatum(const TestData &data, const char *name) return s; } +aligned_string GetAlignedDecodedDatum(const TestData &data, const char *name) +{ + aligned_string s; + PutDecodedDatumInto(data, name, AlignedStringSink(s).Ref()); + return s; +} + std::string GetOptionalDecodedDatum(const TestData &data, const char *name) { std::string s; @@ -189,6 +210,14 @@ std::string GetOptionalDecodedDatum(const TestData &data, const char *name) return s; } +aligned_string GetOptionalAlignedDecodedDatum(const TestData &data, const char *name) +{ + aligned_string s; + if (DataExists(data, name)) + PutDecodedDatumInto(data, name, AlignedStringSink(s).Ref()); + return s; +} + class TestDataNameValuePairs : public NameValuePairs { public: @@ -384,11 +413,11 @@ void TestAsymmetricCipher(TestData &v) void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters) { - std::string name = GetRequiredDatum(v, "Name"); - std::string test = GetRequiredDatum(v, "Test"); + const std::string name = GetRequiredDatum(v, "Name"); + const std::string test = GetRequiredDatum(v, "Test"); - std::string key = GetDecodedDatum(v, "Key"); - std::string plaintext = GetDecodedDatum(v, "Plaintext"); + const aligned_string key = GetAlignedDecodedDatum(v, "Key"); + const aligned_string plaintext = GetAlignedDecodedDatum(v, "Plaintext"); TestDataNameValuePairs testDataPairs(v); CombinedNameValuePairs pairs(overrideParameters, testDataPairs); @@ -446,16 +475,17 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters) // If overrideParameters are specified, the caller is responsible for managing the parameter. v.erase("Tweak"); v.erase("BlockSize"); v.erase("BlockPaddingScheme"); - std::string encrypted, xorDigest, ciphertext, ciphertextXorDigest; + // std::string encrypted, xorDigest, ciphertext, ciphertextXorDigest; + aligned_string encrypted, xorDigest, ciphertext, ciphertextXorDigest; if (test == "EncryptionMCT" || test == "DecryptionMCT") { SymmetricCipher *cipher = encryptor.get(); - SecByteBlock buf((byte *)plaintext.data(), plaintext.size()), keybuf((byte *)key.data(), key.size()); + AlignedSecByteBlock buf((byte *)plaintext.data(), plaintext.size()), keybuf((byte *)key.data(), key.size()); if (test == "DecryptionMCT") { cipher = decryptor.get(); - ciphertext = GetDecodedDatum(v, "Ciphertext"); + ciphertext = GetAlignedDecodedDatum(v, "Ciphertext"); buf.Assign((byte *)ciphertext.data(), ciphertext.size()); } @@ -473,11 +503,11 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters) cipher->SetKey(keybuf, keybuf.size()); } encrypted.assign((char *)buf.begin(), buf.size()); - ciphertext = GetDecodedDatum(v, test == "EncryptionMCT" ? "Ciphertext" : "Plaintext"); + ciphertext = GetAlignedDecodedDatum(v, test == "EncryptionMCT" ? "Ciphertext" : "Plaintext"); if (encrypted != ciphertext) { std::cout << "\nincorrectly encrypted: "; - StringSource xx(encrypted, false, new HexEncoder(new FileSink(std::cout))); + StringSource xx(reinterpret_cast(encrypted.data()), encrypted.size(), false, new HexEncoder(new FileSink(std::cout))); xx.Pump(256); xx.Flush(false); std::cout << "\n"; SignalTestFailure(); @@ -485,7 +515,7 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters) return; } - StreamTransformationFilter encFilter(*encryptor, new StringSink(encrypted), + StreamTransformationFilter encFilter(*encryptor, new AlignedStringSink(encrypted), static_cast(paddingScheme)); RandomizedTransfer(StringStore(plaintext).Ref(), encFilter, true); encFilter.MessageEnd(); @@ -500,10 +530,10 @@ void TestSymmetricCipher(TestData &v, const NameValuePairs &overrideParameters) CRYPTOPP_ASSERT(encrypted[i] == z[i]); }*/ if (test != "EncryptXorDigest") - ciphertext = GetDecodedDatum(v, "Ciphertext"); + ciphertext = GetAlignedDecodedDatum(v, "Ciphertext"); else { - ciphertextXorDigest = GetDecodedDatum(v, "CiphertextXorDigest"); + ciphertextXorDigest = GetAlignedDecodedDatum(v, "CiphertextXorDigest"); xorDigest.append(encrypted, 0, 64); for (size_t i=64; i(encrypted.data()), encrypted.size(), false, new HexEncoder(new FileSink(std::cout))); xx.Pump(2048); xx.Flush(false); std::cout << "\n"; SignalTestFailure(); } - std::string decrypted; - StreamTransformationFilter decFilter(*decryptor, new StringSink(decrypted), + aligned_string decrypted; + StreamTransformationFilter decFilter(*decryptor, new AlignedStringSink(decrypted), static_cast(paddingScheme)); RandomizedTransfer(StringStore(encrypted).Ref(), decFilter, true); decFilter.MessageEnd(); if (decrypted != plaintext) { std::cout << "\nincorrectly decrypted: "; - StringSource xx(decrypted, false, new HexEncoder(new FileSink(std::cout))); + StringSource xx(reinterpret_cast(decrypted.data()), decrypted.size(), false, new HexEncoder(new FileSink(std::cout))); xx.Pump(256); xx.Flush(false); std::cout << "\n"; SignalTestFailure(); @@ -542,13 +572,13 @@ void TestAuthenticatedSymmetricCipher(TestData &v, const NameValuePairs &overrid std::string type = GetRequiredDatum(v, "AlgorithmType"); std::string name = GetRequiredDatum(v, "Name"); std::string test = GetRequiredDatum(v, "Test"); - std::string key = GetDecodedDatum(v, "Key"); + aligned_string key = GetAlignedDecodedDatum(v, "Key"); - std::string plaintext = GetOptionalDecodedDatum(v, "Plaintext"); - std::string ciphertext = GetOptionalDecodedDatum(v, "Ciphertext"); - std::string header = GetOptionalDecodedDatum(v, "Header"); - std::string footer = GetOptionalDecodedDatum(v, "Footer"); - std::string mac = GetOptionalDecodedDatum(v, "MAC"); + aligned_string plaintext = GetOptionalAlignedDecodedDatum(v, "Plaintext"); + aligned_string ciphertext = GetOptionalAlignedDecodedDatum(v, "Ciphertext"); + aligned_string header = GetOptionalAlignedDecodedDatum(v, "Header"); + aligned_string footer = GetOptionalAlignedDecodedDatum(v, "Footer"); + aligned_string mac = GetOptionalAlignedDecodedDatum(v, "MAC"); TestDataNameValuePairs testDataPairs(v); CombinedNameValuePairs pairs(overrideParameters, testDataPairs); -- cgit v1.2.1