X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=sha1.cc;h=321807552535057a26c022e32d408b16b8ff4cdc;hb=030ddd80e04aa65738bf21557dd541bec757de5b;hp=7a9c0fb52a377f27b5a747b9eb1223902ba645b9;hpb=25b6639fb1783e0061affa177e6d6d2131c457f5;p=cumulus.git diff --git a/sha1.cc b/sha1.cc index 7a9c0fb..3218075 100644 --- a/sha1.cc +++ b/sha1.cc @@ -30,9 +30,14 @@ #include "sha1.h" #include +#include #include #include +#include + +using std::string; + /* SWAP does an endian swap on architectures that are little-endian, as SHA1 needs some data in a big-endian form. */ #define SWAP(n) htonl(n) @@ -344,8 +349,46 @@ void SHA1Checksum::process(const void *data, size_t len) sha1_process_bytes(data, len, &ctx); } +bool SHA1Checksum::process_file(const char *filename) +{ + FILE *f = fopen(filename, "rb"); + if (f == NULL) + return false; + + while (!feof(f)) { + char buf[4096]; + size_t bytes = fread(buf, 1, sizeof(buf), f); + + if (ferror(f)) { + fclose(f); + return false; + } + + process(buf, bytes); + } + + fclose(f); + return true; +} + const uint8_t *SHA1Checksum::checksum() { sha1_finish_ctx(&ctx, resbuf); return (const uint8_t *)resbuf; } + +string SHA1Checksum::checksum_str() +{ + uint8_t resbuf[20]; + char hexbuf[4]; + string result = "sha1="; + + sha1_finish_ctx(&ctx, resbuf); + + for (int i = 0; i < 20; i++) { + sprintf(hexbuf, "%02x", resbuf[i]); + result += hexbuf; + } + + return result; +}