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
pull/1/head
Tatsuhiro Tsujikawa 2010-05-14 14:11:56 +00:00
parent 88475a6aa0
commit b305edd7c5
10 changed files with 99 additions and 51 deletions

View File

@ -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

View File

@ -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() {}

View File

@ -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();

View File

@ -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

View File

@ -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)

View File

@ -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();

View File

@ -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();

View File

@ -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

View File

@ -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());

View File

@ -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());
}