ewmscp  ..
sslCheckSum.cpp
Go to the documentation of this file.
1 #include "sslCheckSum.h"
2 #include "block.h"
3 #include <iomanip>
4 #include <iostream>
5 #include <sstream>
6 #include <vector>
7 #include <openssl/objects.h>
8 #include <list>
9 namespace checksum {
10  void sslSum::createFactoryCallback(const OBJ_NAME *obj, void */*arg*/) {
11  std::string name(obj->name);
12  for (const auto& unwanted : {
13  "With", "with", "Encryption", "ssl2-", "ssl3-", "160"
14  }) {
15  if (name.find(unwanted) != decltype(name)::npos) {
16  return;
17  }
18  }
19  if (name.front() >= 'A' && name.front() <= 'Z') {
20  return;
21  }
23  }
25  OpenSSL_add_all_digests();
26  OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, createFactoryCallback, nullptr);
27  return true;
28  }
30 
31  sslSum::sslSum(const std::string& aName ): base(aName) {
32  ctx = EVP_MD_CTX_create();
33 
34  mdType = EVP_get_digestbyname(name.c_str());
35  if (mdType == nullptr) {
36  throw std::runtime_error("got no ssl digest named " + name);
37  }
38  EVP_MD_CTX_init(ctx);
39  EVP_DigestInit_ex(ctx, mdType, nullptr);
40  }
42  EVP_MD_CTX_destroy(ctx);
43  }
44 
45  void sslSum::update(void *data, size_t size) {
46  EVP_DigestUpdate(ctx, data, size);
47  }
48  void sslSum::update(size_t size) { // case for block of zeroes
49  for (size_t bytes_done = 0; bytes_done < size;) {
50  auto missing = size - bytes_done;
51  auto bytes = std::min(missing, block::nullBufferSize());
52  EVP_DigestUpdate(ctx, block::nullBuffer(), bytes);
53  bytes_done += bytes;
54  }
55  }
56 
57  void sslSum::finish() {
58  std::vector<unsigned char> md(EVP_MD_size(mdType));
59  EVP_DigestFinal_ex(ctx, md.data(), nullptr);
60  std::ostringstream hashBuffer;
61 
62  for (auto c : md) {
63  hashBuffer << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(c);
64  }
65 
66  result = hashBuffer.str();
67  }
68 }; // end namespace checksum
block.h
checksum::sslSum::factoryInitStateDummy
static bool factoryInitStateDummy
Definition: sslCheckSum.h:15
block::nullBuffer
static const void * nullBuffer()
Definition: block.cpp:37
checksum::sslSum::finish
void finish() override
finish calculation ad write to result
Definition: sslCheckSum.cpp:57
checksum::sslSum::createFactories
static bool createFactories()
Definition: sslCheckSum.cpp:24
checksum::base::name
const std::string & name
Definition: checksumBase.h:37
checksum::base
Definition: checksumBase.h:8
checksum::base::factoryTemplate
Definition: checksumBase.h:28
checksum::sslSum::sslSum
sslSum(const std::string &name)
Definition: sslCheckSum.cpp:31
checksum::sslSum::update
void update(void *data, size_t size) override
proces size bytes in the block at data
Definition: sslCheckSum.cpp:45
checksum::sslSum::ctx
decltype(EVP_MD_CTX_create()) ctx
Definition: sslCheckSum.h:16
checksum::sslSum::createFactoryCallback
static void createFactoryCallback(const OBJ_NAME *obj, void *)
Definition: sslCheckSum.cpp:10
block::nullBufferSize
static size_t nullBufferSize()
Definition: block.cpp:34
checksum::sslSum::mdType
decltype(EVP_md5()) mdType
Definition: sslCheckSum.h:17
checksum::base::result
std::string result
Definition: checksumBase.h:38
checksum
Definition: adler32.cpp:9
checksum::sslSum::~sslSum
virtual ~sslSum()
Definition: sslCheckSum.cpp:41
sslCheckSum.h