ewmscp  ..
md5sum.cpp
Go to the documentation of this file.
1 #include "md5sum.h"
2 #include "block.h"
3 #include <iomanip>
4 #include <iostream>
5 #include <sstream>
6 #include <vector>
7 
8 namespace checksum {
9  decltype(md5sum::factory) md5sum::factory("md5sum");
10  md5sum::md5sum(const std::string& aName ): base(aName) {
11  #ifdef USE_OPENSSL
12  ctx = EVP_MD_CTX_create();
13  mdType = EVP_md5();
14  EVP_MD_CTX_init(ctx);
15  EVP_DigestInit_ex(ctx, mdType, nullptr);
16  #else
18  #endif
19  }
20  void md5sum::update(void *data, size_t size) {
21  for (size_t bytes_done = 0; bytes_done < size;) {
22  size_t bytes = 4096;
23  auto missing = size - bytes_done;
24 
25  if (missing < bytes) {
26  bytes = missing;
27  }
28 
29  auto dataStart = static_cast<void*>(static_cast<char*>(data) + bytes_done);
30  #ifdef USE_OPENSSL
31  EVP_DigestUpdate(ctx, dataStart, bytes);
32  #else
33 
34  if (size & (64 - 1)) { // use processor that needs no 64Byte size
35  __md5_process_bytes(dataStart, bytes, &ctx);
36  } else {
37  __md5_process_block(dataStart, bytes, &ctx);
38  }
39 
40  #endif
41  bytes_done += bytes;
42  }
43  }
44  void md5sum::update(size_t size) { // case for block of zeroes
45  #ifndef USE_OPENSSL
46  if ((size & (64 - 1)) == 0) {
47  __md5_process_zero(size, &ctx);
48  } else
49  #endif
50  {
51  for (size_t bytes_done = 0; bytes_done < size;) {
52  auto missing = size - bytes_done;
53  auto bytes = std::min(missing, block::nullBufferSize());
54  #ifdef USE_OPENSSL
55  EVP_DigestUpdate(ctx, block::nullBuffer(), bytes);
56  #else
57 
58  if (size & (64 - 1)) { // use processor that needs no 64Byte size
60  } else {
61  __md5_process_zero(bytes, &ctx);
62  }
63 
64  #endif
65  bytes_done += bytes;
66  }
67  }
68  }
69 
70  void md5sum::finish() {
71  #ifdef USE_OPENSSL
72  std::vector<unsigned char> md(EVP_MD_size(mdType));
73  EVP_DigestFinal_ex(ctx, md.data(), nullptr);
74  EVP_MD_CTX_cleanup(ctx);
75  EVP_MD_CTX_destroy(ctx);
76  #else
77  unsigned char md[16];
78  __md5_finish_ctx(&ctx, md);
79  #endif
80  std::ostringstream hashBuffer;
81 
82  for (auto c : md) {
83  hashBuffer << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(c);
84  }
85 
86  result = hashBuffer.str();
87  }
88 }; // end namespace checksum
block.h
checksum::md5sum::update
void update(void *data, size_t size) override
proces size bytes in the block at data
Definition: md5sum.cpp:20
block::nullBuffer
static const void * nullBuffer()
Definition: block.cpp:37
md5sum.h
checksum::md5sum::ctx
struct md5_ctx ctx
Definition: md5sum.h:25
__md5_process_bytes
#define __md5_process_bytes
Definition: md5.h:56
__md5_finish_ctx
#define __md5_finish_ctx
Definition: md5.h:52
checksum::base
Definition: checksumBase.h:8
__md5_process_block
#define __md5_process_block
Definition: md5.h:55
checksum::md5sum::md5sum
md5sum(const std::string &name)
Definition: md5sum.cpp:10
block::nullBufferSize
static size_t nullBufferSize()
Definition: block.cpp:34
checksum::md5sum::finish
void finish() override
finish calculation ad write to result
Definition: md5sum.cpp:70
checksum::base::result
std::string result
Definition: checksumBase.h:38
__md5_init_ctx
#define __md5_init_ctx
Definition: md5.h:53
checksum::md5sum::factory
static factoryTemplate< md5sum > factory
Definition: md5sum.h:20
checksum
Definition: adler32.cpp:9
__md5_process_zero
#define __md5_process_zero
Definition: md5.h:54