#include #include #include #include #include #include #include #include #include #include "eyetil.h" #include "config.h" #ifdef HAVE_LIBUUID # include #endif binary_t& binary_t::from_hex(const std::string& h) { std::string::size_type hs = h.length(); if(hs&1) throw std::runtime_error("odd number of characters in hexadecimal number"); int rvs = hs>>1; resize(rvs); const unsigned char *hp = (const unsigned char*)h.data(); iterator oi=begin(); char t[3] = { 0,0,0 }; for(int i=0;i>16) sum = (sum&0xffff)+hw; return ~sum; } }; #pragma pack() binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { binary_t key; key.from_hex(ukey); std::vector blksums; blksums.reserve(size/sizeof(block512_t)); block512_t *db = (block512_t*)ptr, *de = db + size/sizeof(block512_t); std::transform( db, de, std::back_inserter(blksums), block512_t::tcpcksum ); binary_t subject; subject.from_data((void*)&(blksums.front()),blksums.size()*sizeof(uint16_t)); std::copy( key.begin(), key.end(), std::back_inserter(subject) ); return subject.md5(); }