From 161978b24c8ffdc05795a1ae109fcf76ea7d20d0 Mon Sep 17 00:00:00 2001 From: zyp Date: Mon, 8 May 2006 13:25:19 +0000 Subject: [project @ zyp-20060508132519-3c461a2255e6d8d9] [project @ 25] Adding missing files. --- src/multihash.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++++++ src/multihash.h | 37 +++++++++++++++++++++ src/multihash_wrapper.cpp | 14 ++++++++ 3 files changed, 136 insertions(+) create mode 100644 src/multihash.cpp create mode 100644 src/multihash.h create mode 100644 src/multihash_wrapper.cpp (limited to 'src') diff --git a/src/multihash.cpp b/src/multihash.cpp new file mode 100644 index 0000000..64dff76 --- /dev/null +++ b/src/multihash.cpp @@ -0,0 +1,85 @@ +#include "multihash.h" +#include "crc32.h" + +#include + +namespace Hex { + static char* digits = "0123456789abcdef"; + std::string hex(char* bin, int length) { + std::string s(length * 2, ' '); + for(int i = 0; i < length; i++) { + s[i*2] = digits[(bin[i] >> 4) & 0xf]; + s[i*2+1] = digits[bin[i] & 0xf]; + } + return s; + } + std::string hex(int bin) { + std::string s(sizeof(int) * 2, ' '); + for(int i = 0; i < sizeof(int) * 2; i++) { + s[sizeof(int) * 2 - 1 - i] = digits[bin & 0xf]; + bin = bin >> 4; + } + return s; + } +} + +Multihash::Multihash() { + finished = false; + + crc32_ctx = 0; + crc32_str = ""; + + ed2k_str = ""; + + MD5_Init(&md5_ctx); + md5_str = ""; + + SHA1_Init(&sha1_ctx); + sha1_str = ""; +} + +void Multihash::update(std::string data) { + if(finished) { + throw std::runtime_error("Can't update after digest."); + } + crc32_ctx = CRC32::crc32(crc32_ctx, data.c_str(), data.length()); + ed2k_ctx.update(data.c_str(), data.length()); + MD5_Update(&md5_ctx, data.c_str(), data.length()); + SHA1_Update(&sha1_ctx, data.c_str(), data.length()); +} + +std::string Multihash::crc32() { + return Hex::hex(crc32_ctx); +} + +std::string Multihash::ed2k() { + if(!ed2k_str.length()) { + finished = true; + char* digest = ed2k_ctx.digest(); + ed2k_str = Hex::hex(digest, 16); + delete digest; + } + return ed2k_str; +} + +std::string Multihash::md5() { + if(!md5_str.length()) { + finished = true; + char* digest = new char[16]; + MD5_Final((unsigned char*)digest, &md5_ctx); + md5_str = Hex::hex(digest, 16); + delete digest; + } + return md5_str; +} + +std::string Multihash::sha1() { + if(!sha1_str.length()) { + finished = true; + char* digest = new char[20]; + SHA1_Final((unsigned char*)digest, &sha1_ctx); + sha1_str = Hex::hex(digest, 20); + delete digest; + } + return sha1_str; +} diff --git a/src/multihash.h b/src/multihash.h new file mode 100644 index 0000000..5af339f --- /dev/null +++ b/src/multihash.h @@ -0,0 +1,37 @@ +#ifndef _MULTIHASH_H_ +#define _MULTIHASH_H_ + +#include + +#include "ed2k.h" + +#include +#include +#include + +class Multihash { + private: + bool finished; + + int crc32_ctx; + std::string crc32_str; + + Ed2k ed2k_ctx; + std::string ed2k_str; + + MD5_CTX md5_ctx; + std::string md5_str; + + SHA_CTX sha1_ctx; + std::string sha1_str; + + public: + Multihash(); + void update(std::string data); + std::string crc32(); + std::string ed2k(); + std::string md5(); + std::string sha1(); +}; + +#endif // _HASH_H_ diff --git a/src/multihash_wrapper.cpp b/src/multihash_wrapper.cpp new file mode 100644 index 0000000..aa6f615 --- /dev/null +++ b/src/multihash_wrapper.cpp @@ -0,0 +1,14 @@ +#include "multihash.h" + +#include +using namespace boost::python; + +BOOST_PYTHON_MODULE(_multihash) +{ + class_("Multihash") + .def("update", &Multihash::update) + .def("crc32", &Multihash::crc32) + .def("ed2k", &Multihash::ed2k) + .def("md5", &Multihash::md5) + .def("sha1", &Multihash::sha1); +} -- cgit v1.2.3