Просмотр исходного кода

2010-05-14 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	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
Tatsuhiro Tsujikawa 15 лет назад
Родитель
Сommit
b305edd7c5

+ 15 - 0
ChangeLog

@@ -1,3 +1,18 @@
+2010-05-14  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	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  <t-tujikawa@users.sourceforge.net>
 
 	Fixed typo in log message

+ 5 - 2
src/Checksum.h

@@ -36,9 +36,12 @@
 #define _D_CHECKSUM_H_
 
 #include "common.h"
-#include "SharedHandle.h"
+
 #include <string>
 
+#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() {}
 

+ 13 - 19
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();

+ 24 - 9
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

+ 8 - 0
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)

+ 3 - 2
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<DownloadContext> dctx
     (new DownloadContext(100, 250, "chunkChecksumTestFile250.txt"));
   dctx->setChecksum("898a81b8e0181280ae2ee1b81e269196d91e869a");
-  dctx->setChecksumHashAlgo("sha1");
+  dctx->setChecksumHashAlgo(MessageDigestContext::SHA1);
   SharedHandle<DefaultPieceStorage> ps(new DefaultPieceStorage(dctx, &option));
   ps->initStorage();
   ps->getDiskAdaptor()->openFile();
@@ -54,7 +55,7 @@ void IteratableChecksumValidatorTest::testValidate_fail() {
   SharedHandle<DownloadContext> dctx
     (new DownloadContext(100, 250, "chunkChecksumTestFile250.txt"));
   dctx->setChecksum(std::string(40, '0')); // set wrong checksum
-  dctx->setChecksumHashAlgo("sha1");
+  dctx->setChecksumHashAlgo(MessageDigestContext::SHA1);
   SharedHandle<DefaultPieceStorage> ps(new DefaultPieceStorage(dctx, &option));
   ps->initStorage();
   ps->getDiskAdaptor()->openFile();

+ 3 - 2
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<DownloadContext> dctx
     (new DownloadContext(100, 250, "chunkChecksumTestFile250.txt"));
   dctx->setPieceHashes(&csArray[0], &csArray[3]);
-  dctx->setPieceHashAlgo("sha1");
+  dctx->setPieceHashAlgo(MessageDigestContext::SHA1);
   SharedHandle<DefaultPieceStorage> 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<DefaultPieceStorage> ps(new DefaultPieceStorage(dctx, &option));
   ps->initStorage();
   ps->getDiskAdaptor()->openFile();

+ 9 - 4
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

+ 4 - 2
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());

+ 15 - 11
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<MetalinkEntry> 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<MetalinkEntry> e = m->entries[0];
     SharedHandle<ChunkChecksum> 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<ChunkChecksum> 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());
   }