From b305edd7c5ccd2c0ca78ecb3e92f9840065b5c31 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 14 May 2010 14:11:56 +0000 Subject: [PATCH] 2010-05-14 Tatsuhiro Tsujikawa Left only IANA hash function textual name in messageDigest.cc. Assign only IANA hash function textual name to Checksum and ChunkChecksum. Fixed the value of MessageDigestContext::MD5. * src/Checksum.h * src/MetalinkParserController.cc * src/messageDigest.cc * src/messageDigest.h * test/IteratableChecksumValidatorTest.cc * test/IteratableChunkChecksumValidatorTest.cc * test/MessageDigestHelperTest.cc * test/Metalink2RequestGroupTest.cc * test/MetalinkProcessorTest.cc --- ChangeLog | 15 +++++++++ src/Checksum.h | 7 +++-- src/MetalinkParserController.cc | 32 ++++++++----------- src/messageDigest.cc | 33 ++++++++++++++------ src/messageDigest.h | 8 +++++ test/IteratableChecksumValidatorTest.cc | 5 +-- test/IteratableChunkChecksumValidatorTest.cc | 5 +-- test/MessageDigestHelperTest.cc | 13 +++++--- test/Metalink2RequestGroupTest.cc | 6 ++-- test/MetalinkProcessorTest.cc | 26 ++++++++------- 10 files changed, 99 insertions(+), 51 deletions(-) diff --git a/ChangeLog b/ChangeLog index 78e5b751..b61517c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2010-05-14 Tatsuhiro Tsujikawa + + Left only IANA hash function textual name in messageDigest.cc. + Assign only IANA hash function textual name to Checksum and + ChunkChecksum. Fixed the value of MessageDigestContext::MD5. + * src/Checksum.h + * src/MetalinkParserController.cc + * src/messageDigest.cc + * src/messageDigest.h + * test/IteratableChecksumValidatorTest.cc + * test/IteratableChunkChecksumValidatorTest.cc + * test/MessageDigestHelperTest.cc + * test/Metalink2RequestGroupTest.cc + * test/MetalinkProcessorTest.cc + 2010-05-14 Tatsuhiro Tsujikawa Fixed typo in log message diff --git a/src/Checksum.h b/src/Checksum.h index 31e66d07..e51dfcc9 100644 --- a/src/Checksum.h +++ b/src/Checksum.h @@ -36,9 +36,12 @@ #define _D_CHECKSUM_H_ #include "common.h" -#include "SharedHandle.h" + #include +#include "SharedHandle.h" +#include "messageDigest.h" + namespace aria2 { class Checksum { @@ -50,7 +53,7 @@ public: Checksum(const std::string& algo, const std::string& messageDigest): _algo(algo), _messageDigest(messageDigest) {} Checksum(): - _algo("sha1") {} + _algo(MessageDigestContext::SHA1) {} ~Checksum() {} diff --git a/src/MetalinkParserController.cc b/src/MetalinkParserController.cc index 9c228a56..6944fbb5 100644 --- a/src/MetalinkParserController.cc +++ b/src/MetalinkParserController.cc @@ -53,15 +53,6 @@ namespace aria2 { -#ifdef ENABLE_MESSAGE_DIGEST -static bool isValidHash(const std::string& algo, const std::string& hash) -{ - return util::isHexDigit(hash) && - MessageDigestContext::supports(algo) && - MessageDigestContext::digestLength(algo)*2 == hash.size(); -} -#endif // ENABLE_MESSAGE_DIGEST - MetalinkParserController::MetalinkParserController(): _metalinker(new Metalinker()) {} @@ -272,8 +263,9 @@ void MetalinkParserController::setTypeOfChecksum(const std::string& type) if(_tChecksum.isNull()) { return; } - if(MessageDigestContext::supports(type)) { - _tChecksum->setAlgo(type); + std::string calgo = MessageDigestContext::getCanonicalAlgo(type); + if(MessageDigestContext::supports(calgo)) { + _tChecksum->setAlgo(calgo); } else { cancelChecksumTransaction(); } @@ -286,7 +278,7 @@ void MetalinkParserController::setHashOfChecksum(const std::string& md) if(_tChecksum.isNull()) { return; } - if(isValidHash(_tChecksum->getAlgo(), md)) { + if(MessageDigestContext::isValidHash(_tChecksum->getAlgo(), md)) { _tChecksum->setMessageDigest(md); } else { cancelChecksumTransaction(); @@ -333,8 +325,9 @@ void MetalinkParserController::setTypeOfChunkChecksumV4(const std::string& type) if(_tChunkChecksumV4.isNull()) { return; } - if(MessageDigestContext::supports(type)) { - _tChunkChecksumV4->setAlgo(type); + std::string calgo = MessageDigestContext::getCanonicalAlgo(type); + if(MessageDigestContext::supports(calgo)) { + _tChunkChecksumV4->setAlgo(calgo); } else { cancelChunkChecksumTransactionV4(); } @@ -361,7 +354,7 @@ void MetalinkParserController::addHashOfChunkChecksumV4(const std::string& md) if(_tChunkChecksumV4.isNull()) { return; } - if(isValidHash(_tChunkChecksumV4->getAlgo(), md)) { + if(MessageDigestContext::isValidHash(_tChunkChecksumV4->getAlgo(), md)) { _tempChunkChecksumsV4.push_back(md); } else { cancelChunkChecksumTransactionV4(); @@ -411,8 +404,9 @@ void MetalinkParserController::setTypeOfChunkChecksum(const std::string& type) if(_tChunkChecksum.isNull()) { return; } - if(MessageDigestContext::supports(type)) { - _tChunkChecksum->setAlgo(type); + std::string calgo = MessageDigestContext::getCanonicalAlgo(type); + if(MessageDigestContext::supports(calgo)) { + _tChunkChecksum->setAlgo(calgo); } else { cancelChunkChecksumTransaction(); } @@ -439,7 +433,7 @@ void MetalinkParserController::addHashOfChunkChecksum(size_t order, const std::s if(_tChunkChecksum.isNull()) { return; } - if(isValidHash(_tChunkChecksum->getAlgo(), md)) { + if(MessageDigestContext::isValidHash(_tChunkChecksum->getAlgo(), md)) { _tempChunkChecksums.push_back(std::make_pair(order, md)); } else { cancelChunkChecksumTransaction(); @@ -463,7 +457,7 @@ void MetalinkParserController::setMessageDigestOfChunkChecksum(const std::string if(_tChunkChecksum.isNull()) { return; } - if(isValidHash(_tChunkChecksum->getAlgo(), md)) { + if(MessageDigestContext::isValidHash(_tChunkChecksum->getAlgo(), md)) { _tempHashPair.second = md; } else { cancelChunkChecksumTransaction(); diff --git a/src/messageDigest.cc b/src/messageDigest.cc index ce860f89..02e7bfbf 100644 --- a/src/messageDigest.cc +++ b/src/messageDigest.cc @@ -42,7 +42,7 @@ const std::string MessageDigestContext::SHA1("sha-1"); const std::string MessageDigestContext::SHA256("sha-256"); -const std::string MessageDigestContext::MD5("md-5"); +const std::string MessageDigestContext::MD5("md5"); namespace { struct DigestAlgoEntry { @@ -68,13 +68,9 @@ static const DigestAlgoMap& getDigestAlgos() DigestAlgoMap::value_type("md5", DigestAlgoEntry(EVP_md5(), STRENGTH_MD5)), DigestAlgoMap::value_type ("sha-1", DigestAlgoEntry(EVP_sha1(), STRENGTH_SHA_1)), - DigestAlgoMap::value_type - ("sha1", DigestAlgoEntry(EVP_sha1(), STRENGTH_SHA_1)), # ifdef HAVE_EVP_SHA256 DigestAlgoMap::value_type ("sha-256", DigestAlgoEntry(EVP_sha256(), STRENGTH_SHA_256)), - DigestAlgoMap::value_type - ("sha256", DigestAlgoEntry(EVP_sha256(), STRENGTH_SHA_256)), # endif // HAVE_EVP_SHA256 #elif HAVE_LIBGCRYPT DigestAlgoMap::value_type @@ -82,17 +78,29 @@ static const DigestAlgoMap& getDigestAlgos() DigestAlgoMap::value_type ("sha-1", DigestAlgoEntry(GCRY_MD_SHA1, STRENGTH_SHA_1)), DigestAlgoMap::value_type - ("sha1", DigestAlgoEntry(GCRY_MD_SHA1, STRENGTH_SHA_1)), - DigestAlgoMap::value_type ("sha-256", DigestAlgoEntry(GCRY_MD_SHA256, STRENGTH_SHA_256)), - DigestAlgoMap::value_type - ("sha256", DigestAlgoEntry(GCRY_MD_SHA256, STRENGTH_SHA_256)), #endif // HAVE_LIBGCRYPT }; static const DigestAlgoMap algomap(vbegin(digests), vend(digests)); return algomap; } +std::string MessageDigestContext::getCanonicalAlgo +(const std::string& algostring) +{ + if(strcasecmp("sha-1", algostring.c_str()) == 0 || + strcasecmp("sha1", algostring.c_str()) == 0) { + return SHA1; + } else if(strcasecmp("sha-256", algostring.c_str()) == 0 || + strcasecmp("sha256", algostring.c_str()) == 0) { + return SHA256; + } else if(strcasecmp("md5", algostring.c_str()) == 0) { + return MD5; + } else { + return algostring; + } +} + std::string MessageDigestContext::digestFinal() { size_t length = digestLength(algo); @@ -151,4 +159,11 @@ bool MessageDigestContext::isStronger return (*lhsitr).second.strength > (*rhsitr).second.strength; } +bool MessageDigestContext::isValidHash +(const std::string& algostring, const std::string& hashstring) +{ + return util::isHexDigit(hashstring) && + supports(algostring) && digestLength(algostring)*2 == hashstring.size(); +} + } // namespace aria2 diff --git a/src/messageDigest.h b/src/messageDigest.h index 789b3a03..2e42faf3 100644 --- a/src/messageDigest.h +++ b/src/messageDigest.h @@ -106,6 +106,14 @@ public: // or both are not supported, returns false. static bool isStronger(const std::string& lhs, const std::string& rhs); + static bool isValidHash + (const std::string& algostring, const std::string& hashstring); + + // Returns canonical hash algorithm name of given algostring. If + // given algostring is not supported, then returns algostring + // unchanged. + static std::string getCanonicalAlgo(const std::string& algostring); + std::string digestFinal(); #if defined(HAVE_OLD_LIBSSL) diff --git a/test/IteratableChecksumValidatorTest.cc b/test/IteratableChecksumValidatorTest.cc index a4ce5528..57ee51e9 100644 --- a/test/IteratableChecksumValidatorTest.cc +++ b/test/IteratableChecksumValidatorTest.cc @@ -8,6 +8,7 @@ #include "DiskAdaptor.h" #include "FileEntry.h" #include "PieceSelector.h" +#include "messageDigest.h" namespace aria2 { @@ -35,7 +36,7 @@ void IteratableChecksumValidatorTest::testValidate() { SharedHandle dctx (new DownloadContext(100, 250, "chunkChecksumTestFile250.txt")); dctx->setChecksum("898a81b8e0181280ae2ee1b81e269196d91e869a"); - dctx->setChecksumHashAlgo("sha1"); + dctx->setChecksumHashAlgo(MessageDigestContext::SHA1); SharedHandle ps(new DefaultPieceStorage(dctx, &option)); ps->initStorage(); ps->getDiskAdaptor()->openFile(); @@ -54,7 +55,7 @@ void IteratableChecksumValidatorTest::testValidate_fail() { SharedHandle dctx (new DownloadContext(100, 250, "chunkChecksumTestFile250.txt")); dctx->setChecksum(std::string(40, '0')); // set wrong checksum - dctx->setChecksumHashAlgo("sha1"); + dctx->setChecksumHashAlgo(MessageDigestContext::SHA1); SharedHandle ps(new DefaultPieceStorage(dctx, &option)); ps->initStorage(); ps->getDiskAdaptor()->openFile(); diff --git a/test/IteratableChunkChecksumValidatorTest.cc b/test/IteratableChunkChecksumValidatorTest.cc index 127aadf2..9fa2543d 100644 --- a/test/IteratableChunkChecksumValidatorTest.cc +++ b/test/IteratableChunkChecksumValidatorTest.cc @@ -8,6 +8,7 @@ #include "DiskAdaptor.h" #include "FileEntry.h" #include "PieceSelector.h" +#include "messageDigest.h" namespace aria2 { @@ -40,7 +41,7 @@ void IteratableChunkChecksumValidatorTest::testValidate() { SharedHandle dctx (new DownloadContext(100, 250, "chunkChecksumTestFile250.txt")); dctx->setPieceHashes(&csArray[0], &csArray[3]); - dctx->setPieceHashAlgo("sha1"); + dctx->setPieceHashAlgo(MessageDigestContext::SHA1); SharedHandle ps (new DefaultPieceStorage(dctx, &option)); ps->initStorage(); @@ -80,7 +81,7 @@ void IteratableChunkChecksumValidatorTest::testValidate_readError() { hashes.push_back("ffffffffffffffffffffffffffffffffffffffff"); hashes.push_back("ffffffffffffffffffffffffffffffffffffffff"); dctx->setPieceHashes(hashes.begin(), hashes.end()); - dctx->setPieceHashAlgo("sha1"); + dctx->setPieceHashAlgo(MessageDigestContext::SHA1); SharedHandle ps(new DefaultPieceStorage(dctx, &option)); ps->initStorage(); ps->getDiskAdaptor()->openFile(); diff --git a/test/MessageDigestHelperTest.cc b/test/MessageDigestHelperTest.cc index e2a89c4a..faa7abd1 100644 --- a/test/MessageDigestHelperTest.cc +++ b/test/MessageDigestHelperTest.cc @@ -4,6 +4,7 @@ #include "util.h" #include "DefaultDiskWriter.h" +#include "messageDigest.h" namespace aria2 { @@ -33,23 +34,27 @@ void MessageDigestHelperTest::testDigestDiskWriter() { (new DefaultDiskWriter("4096chunk.txt")); diskio->openExistingFile(); CPPUNIT_ASSERT_EQUAL(std::string("608cabc0f2fa18c260cafd974516865c772363d5"), - MessageDigestHelper::digest("sha1", diskio, 0, 4096)); + MessageDigestHelper::digest + (MessageDigestContext::SHA1, diskio, 0, 4096)); CPPUNIT_ASSERT_EQUAL(std::string("7a4a9ae537ebbbb826b1060e704490ad0f365ead"), - MessageDigestHelper::digest("sha1", diskio, 5, 100)); + MessageDigestHelper::digest + (MessageDigestContext::SHA1, diskio, 5, 100)); } void MessageDigestHelperTest::testDigestFilename() { CPPUNIT_ASSERT_EQUAL(std::string("608cabc0f2fa18c260cafd974516865c772363d5"), - MessageDigestHelper::digest("sha1", "4096chunk.txt")); + MessageDigestHelper::digest + (MessageDigestContext::SHA1, "4096chunk.txt")); } void MessageDigestHelperTest::testDigestData() { std::string data = "aria2"; CPPUNIT_ASSERT_EQUAL(std::string("f36003f22b462ffa184390533c500d8989e9f681"), - MessageDigestHelper::digest("sha1", data.c_str(), data.size())); + MessageDigestHelper::digest + (MessageDigestContext::SHA1, data.c_str(), data.size())); } } // namespace aria2 diff --git a/test/Metalink2RequestGroupTest.cc b/test/Metalink2RequestGroupTest.cc index 833e02b6..82adb407 100644 --- a/test/Metalink2RequestGroupTest.cc +++ b/test/Metalink2RequestGroupTest.cc @@ -9,6 +9,7 @@ #include "Option.h" #include "RequestGroup.h" #include "FileEntry.h" +#include "messageDigest.h" namespace aria2 { @@ -60,7 +61,8 @@ void Metalink2RequestGroupTest::testGenerate() CPPUNIT_ASSERT_EQUAL((uint64_t)0ULL, dctx->getTotalLength()); CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), dctx->getDir()); #ifdef ENABLE_MESSAGE_DIGEST - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), dctx->getChecksumHashAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, + dctx->getChecksumHashAlgo()); CPPUNIT_ASSERT_EQUAL (std::string("a96cf3f0266b91d87d5124cf94326422800b627d"), dctx->getChecksum()); @@ -80,7 +82,7 @@ void Metalink2RequestGroupTest::testGenerate() CPPUNIT_ASSERT(!dctx.isNull()); CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), dctx->getDir()); #ifdef ENABLE_MESSAGE_DIGEST - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), dctx->getPieceHashAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, dctx->getPieceHashAlgo()); CPPUNIT_ASSERT_EQUAL((size_t)2, dctx->getPieceHashes().size()); CPPUNIT_ASSERT_EQUAL((size_t)262144, dctx->getPieceLength()); CPPUNIT_ASSERT_EQUAL(std::string(""), dctx->getChecksumHashAlgo()); diff --git a/test/MetalinkProcessorTest.cc b/test/MetalinkProcessorTest.cc index b42b5780..02ddf0e6 100644 --- a/test/MetalinkProcessorTest.cc +++ b/test/MetalinkProcessorTest.cc @@ -95,10 +95,11 @@ void MetalinkProcessorTest::testParseFileV4() CPPUNIT_ASSERT_EQUAL(std::string("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), e->checksum->getMessageDigest()); CPPUNIT_ASSERT(!e->checksum.isNull()); - CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), e->checksum->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, e->checksum->getAlgo()); CPPUNIT_ASSERT(!e->chunkChecksum.isNull()); if(MessageDigestContext::supports(MessageDigestContext::SHA256)) { - CPPUNIT_ASSERT_EQUAL(std::string("sha-256"), e->chunkChecksum->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA256, + e->chunkChecksum->getAlgo()); CPPUNIT_ASSERT_EQUAL((size_t)262144, e->chunkChecksum->getChecksumLength()); CPPUNIT_ASSERT_EQUAL((size_t)3, e->chunkChecksum->countChecksum()); CPPUNIT_ASSERT_EQUAL(std::string("0245178074fd042e19b7c3885b360fc21064b30e73f5626c7e3b005d048069c5"), @@ -108,7 +109,8 @@ void MetalinkProcessorTest::testParseFileV4() CPPUNIT_ASSERT_EQUAL(std::string("37290d74ac4d186e3a8e5785d259d2ec04fac91ae28092e7620ec8bc99e830aa"), e->chunkChecksum->getChecksum(2)); } else { - CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), e->chunkChecksum->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, + e->chunkChecksum->getAlgo()); CPPUNIT_ASSERT_EQUAL((size_t)262144, e->chunkChecksum->getChecksumLength()); CPPUNIT_ASSERT_EQUAL((size_t)3, e->chunkChecksum->countChecksum()); CPPUNIT_ASSERT_EQUAL @@ -509,7 +511,8 @@ void MetalinkProcessorTest::testParseFile() #ifdef ENABLE_MESSAGE_DIGEST CPPUNIT_ASSERT_EQUAL(std::string("a96cf3f0266b91d87d5124cf94326422800b627d"), entry1->checksum->getMessageDigest()); - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), entry1->checksum->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, + entry1->checksum->getAlgo()); #endif // ENABLE_MESSAGE_DIGEST CPPUNIT_ASSERT(!entry1->getSignature().isNull()); CPPUNIT_ASSERT_EQUAL(std::string("pgp"), entry1->getSignature()->getType()); @@ -564,7 +567,8 @@ void MetalinkProcessorTest::testParseFile() entry2->chunkChecksum->getChecksum(0)); CPPUNIT_ASSERT_EQUAL(std::string("fecf8bc9a1647505fe16746f94e97a477597dbf3"), entry2->chunkChecksum->getChecksum(1)); - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), entry2->checksum->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, + entry2->checksum->getAlgo()); #endif // ENABLE_MESSAGE_DIGEST // See that signature is null CPPUNIT_ASSERT(entry2->getSignature().isNull()); @@ -585,11 +589,11 @@ void MetalinkProcessorTest::testParseFile() SharedHandle entry4 = *entryItr; CPPUNIT_ASSERT_EQUAL(std::string("UnsupportedVerificationHashTypeIncluded"), entry4->getPath()); #ifdef ENABLE_MESSAGE_DIGEST - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, entry4->checksum->getAlgo()); CPPUNIT_ASSERT_EQUAL(std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"), entry4->checksum->getMessageDigest()); - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, entry4->chunkChecksum->getAlgo()); #endif // ENABLE_MESSAGE_DIGEST @@ -899,7 +903,7 @@ void MetalinkProcessorTest::testMultiplePieces() SharedHandle e = m->entries[0]; SharedHandle c = e->chunkChecksum; - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), c->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, c->getAlgo()); CPPUNIT_ASSERT_EQUAL((size_t)1024, c->getChecksumLength()); } catch(Exception& e) { CPPUNIT_FAIL(e.stackTrace()); @@ -934,7 +938,7 @@ void MetalinkProcessorTest::testBadPieceNo() CPPUNIT_ASSERT(!c.isNull()); CPPUNIT_ASSERT_EQUAL((size_t)1024, c->getChecksumLength()); - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), c->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, c->getAlgo()); } catch(Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } @@ -967,7 +971,7 @@ void MetalinkProcessorTest::testBadPieceLength() SharedHandle c = e->chunkChecksum; CPPUNIT_ASSERT(!c.isNull()); CPPUNIT_ASSERT_EQUAL((size_t)1024, c->getChecksumLength()); - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), c->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, c->getAlgo()); } catch(Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } @@ -1000,7 +1004,7 @@ void MetalinkProcessorTest::testUnsupportedType_piece() CPPUNIT_ASSERT(!c.isNull()); CPPUNIT_ASSERT_EQUAL((size_t)1024, c->getChecksumLength()); - CPPUNIT_ASSERT_EQUAL(std::string("sha1"), c->getAlgo()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, c->getAlgo()); } catch(Exception& e) { CPPUNIT_FAIL(e.stackTrace()); }