/* */ #include "MessageDigestHelper.h" #include "messageDigest.h" #include "DlAbortEx.h" #include "message.h" #include "DefaultDiskWriter.h" #include "Util.h" #include string MessageDigestHelper::digest(const string& algo, DiskWriterHandle diskWriter, int64_t offset, int64_t length) { MessageDigestContext ctx; ctx.trySetAlgo(algo); ctx.digestInit(); int32_t BUFSIZE = 4096; char BUF[BUFSIZE]; int64_t iteration = length/BUFSIZE; int32_t tail = length%BUFSIZE; for(int64_t i = 0; i < iteration; ++i) { int32_t readLength = diskWriter->readData(BUF, BUFSIZE, offset); if(readLength != BUFSIZE) { throw new DlAbortEx(EX_FILE_READ, "n/a", strerror(errno)); } ctx.digestUpdate(BUF, readLength); offset += readLength; } if(tail) { int32_t readLength = diskWriter->readData(BUF, tail, offset); if(readLength != tail) { throw new DlAbortEx(EX_FILE_READ, "n/a", strerror(errno)); } ctx.digestUpdate(BUF, readLength); } string rawMD = ctx.digestFinal(); return Util::toHex((const unsigned char*)rawMD.c_str(), rawMD.size()); } string MessageDigestHelper::digest(const string& algo, const string& filename) { DiskWriterHandle writer = new DefaultDiskWriter(); writer->openExistingFile(filename); return digest(algo, writer); } string MessageDigestHelper::digest(const string& algo, const void* data, int32_t length) { MessageDigestContext ctx; ctx.trySetAlgo(algo); ctx.digestInit(); ctx.digestUpdate(data, length); string rawMD = ctx.digestFinal(); return Util::toHex((const unsigned char*)rawMD.c_str(), rawMD.size()); } void MessageDigestHelper::digest(unsigned char* md, int32_t mdLength, const string& algo, const void* data, int32_t length) { if(mdLength < MessageDigestContext::digestLength(algo)) { throw new DlAbortEx("Insufficient space for storing message digest: %d required, but only %d is allocated", MessageDigestContext::digestLength(algo), mdLength); } MessageDigestContext ctx; ctx.trySetAlgo(algo); ctx.digestInit(); ctx.digestUpdate(data, length); ctx.digestFinal(md); }