mirror of https://github.com/dnomd343/md5sum.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.2 KiB
41 lines
1.2 KiB
#include <cstring>
|
|
|
|
#include "md5.h"
|
|
|
|
using ::md5::impl::MD5;
|
|
|
|
std::string MD5::Digest() const {
|
|
std::string result {};
|
|
result.resize(32);
|
|
auto *ptr = reinterpret_cast<const uint8_t *>(&ctx_);
|
|
for (int i = 0; i < 32; ++ptr) {
|
|
result[i++] = HexTable[*ptr >> 4];
|
|
result[i++] = HexTable[*ptr & 0b1111];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MD5& MD5::Update(const void *data, uint64_t len) {
|
|
if (buffer_size_ != 0) {
|
|
if (buffer_size_ + len < 64) { // buffer not filled
|
|
::std::memcpy(buffer_ + buffer_size_, data, len);
|
|
buffer_size_ += len;
|
|
return *this; // save into buffer and return
|
|
}
|
|
|
|
auto size = 64 - buffer_size_;
|
|
::std::memcpy(buffer_ + buffer_size_, data, size);
|
|
UpdateImpl(buffer_, 64); // fill and update with buffer
|
|
data = static_cast<const char*>(data) + size;
|
|
buffer_size_ = 0;
|
|
len -= size;
|
|
} // buffer is empty for now
|
|
|
|
data = UpdateImpl(data, len);
|
|
len &= 0b111111; // len -> [0, 64)
|
|
if (len != 0) {
|
|
::std::memcpy(buffer_, data, len); // save remain data into buffer
|
|
buffer_size_ = len;
|
|
}
|
|
return *this;
|
|
}
|
|
|