32
32
* files in the program, then also delete it here.
34
34
/* copyright --> */
35
#include "LibgcryptMessageDigestImpl.h"
39
#include "array_fun.h"
40
#include "HashFuncEntry.h"
41
#include "a2functional.h"
36
#include "MessageDigestImpl.h"
45
MessageDigestImpl::MessageDigestImpl(int hashFunc) : hashFunc_{hashFunc}
47
gcry_md_open(&ctx_, hashFunc_, 0);
50
MessageDigestImpl::~MessageDigestImpl()
55
std::unique_ptr<MessageDigestImpl> MessageDigestImpl::sha1()
57
return make_unique<MessageDigestImpl>(GCRY_MD_SHA1);
60
typedef HashFuncEntry<int> CHashFuncEntry;
61
typedef FindHashFunc<int> CFindHashFunc;
64
CHashFuncEntry hashFuncs[] = {
65
CHashFuncEntry("sha-1", GCRY_MD_SHA1),
66
CHashFuncEntry("sha-224", GCRY_MD_SHA224),
67
CHashFuncEntry("sha-256", GCRY_MD_SHA256),
68
CHashFuncEntry("sha-384", GCRY_MD_SHA384),
69
CHashFuncEntry("sha-512", GCRY_MD_SHA512),
70
CHashFuncEntry("md5", GCRY_MD_MD5)
44
class MessageDigestBase : public MessageDigestImpl {
47
void operator()(gcry_md_hd_t ctx) {
56
gcry_md_hd_t ctx = nullptr;
57
gcry_md_open(&ctx, hash, 0);
61
virtual ~MessageDigestBase() {}
63
static size_t length() {
64
return ::gcry_md_get_algo_dlen(hash);
66
virtual size_t getDigestLength() const CXX11_OVERRIDE {
67
return ::gcry_md_get_algo_dlen(hash);
69
virtual void reset() CXX11_OVERRIDE {
70
::gcry_md_reset(ctx_.get());
72
virtual void update(const void* data, size_t length) CXX11_OVERRIDE {
73
auto bytes = reinterpret_cast<const uint8_t*>(data);
75
size_t l = std::min(length, (size_t)std::numeric_limits<uint32_t>::max());
76
gcry_md_write(ctx_.get(), bytes, length);
81
virtual void digest(unsigned char* md) CXX11_OVERRIDE {
82
::memcpy(md, gcry_md_read(ctx_.get(), 0), getDigestLength());
86
std::unique_ptr<std::remove_pointer<gcry_md_hd_t>::type, Deleter> ctx_;
90
typedef MessageDigestBase<GCRY_MD_MD5> MessageDigestMD5;
91
typedef MessageDigestBase<GCRY_MD_SHA1> MessageDigestSHA1;
92
typedef MessageDigestBase<GCRY_MD_SHA224> MessageDigestSHA224;
93
typedef MessageDigestBase<GCRY_MD_SHA256> MessageDigestSHA256;
94
typedef MessageDigestBase<GCRY_MD_SHA384> MessageDigestSHA384;
95
typedef MessageDigestBase<GCRY_MD_SHA512> MessageDigestSHA512;
74
std::unique_ptr<MessageDigestImpl> MessageDigestImpl::create
75
(const std::string& hashType)
77
int hashFunc = getHashFunc(std::begin(hashFuncs), std::end(hashFuncs),
79
return make_unique<MessageDigestImpl>(hashFunc);
82
bool MessageDigestImpl::supports(const std::string& hashType)
84
return std::end(hashFuncs) != std::find_if(std::begin(hashFuncs),
86
CFindHashFunc(hashType));
89
size_t MessageDigestImpl::getDigestLength(const std::string& hashType)
91
int hashFunc = getHashFunc(std::begin(hashFuncs), std::end(hashFuncs),
93
return gcry_md_get_algo_dlen(hashFunc);
96
size_t MessageDigestImpl::getDigestLength() const
98
return gcry_md_get_algo_dlen(hashFunc_);
101
void MessageDigestImpl::reset()
105
void MessageDigestImpl::update(const void* data, size_t length)
107
gcry_md_write(ctx_, data, length);
110
void MessageDigestImpl::digest(unsigned char* md)
112
memcpy(md, gcry_md_read(ctx_, 0), gcry_md_get_algo_dlen(hashFunc_));
98
std::unique_ptr<MessageDigestImpl> MessageDigestImpl::sha1()
100
return std::unique_ptr<MessageDigestImpl>(new MessageDigestSHA1());
103
MessageDigestImpl::hashes_t MessageDigestImpl::hashes = {
104
{ "sha-1", make_hi<MessageDigestSHA1>() },
105
{ "sha-224", make_hi<MessageDigestSHA224>() },
106
{ "sha-256", make_hi<MessageDigestSHA256>() },
107
{ "sha-384", make_hi<MessageDigestSHA384>() },
108
{ "sha-512", make_hi<MessageDigestSHA512>() },
109
{ "md5", make_hi<MessageDigestMD5>() },
115
112
} // namespace aria2