From: Aki Tuomi Date: Sun, 16 Jun 2013 09:58:59 +0000 (+0300) Subject: SHA1/224/256/384/512 implementation X-Git-Tag: rec-3.6.0-rc1~468^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b474616f4733db4d19ddf86464e71e2b9e82c77;p=thirdparty%2Fpdns.git SHA1/224/256/384/512 implementation --- diff --git a/pdns/sha.hh b/pdns/sha.hh new file mode 100644 index 0000000000..3d5b47b531 --- /dev/null +++ b/pdns/sha.hh @@ -0,0 +1,111 @@ +#ifndef _SHA_HH +#define _SHA_HH + +#include +#include +#ifdef HAVE_LIBPOLARSSLSSL +#include +#include +#include +#else +#include "ext/polarssl-1.1.2/include/polarssl/sha1.h" +#include "ext/polarssl-1.1.2/include/polarssl/sha2.h" +#include "ext/polarssl-1.1.2/include/polarssl/sha4.h" +#endif + +class SHA1Summer +{ +public: + SHA1Summer() { sha1_starts(&d_context); }; + void feed(const std::string &str) { feed(str.c_str(), str.length()); }; + void feed(const char *ptr, size_t len) { sha1_update(&d_context, reinterpret_cast(ptr), len); }; + const std::string get() const { + sha1_context ctx2; + unsigned char result[20] = {0}; + ctx2=d_context; + sha1_finish(&ctx2, result); + return std::string(result, result + sizeof result); + }; +private: + SHA1Summer(const SHA1Summer&); + SHA1Summer& operator=(const SHA1Summer&); + sha1_context d_context; +}; + +class SHA224Summer +{ +public: + SHA224Summer() { sha2_starts(&d_context, 1); }; + void feed(const std::string &str) { feed(str.c_str(), str.length()); }; + void feed(const char *ptr, size_t len) { sha2_update(&d_context, reinterpret_cast(ptr), len); }; + const std::string get() const { + sha2_context ctx2; + unsigned char result[32] = {0}; + ctx2=d_context; + sha2_finish(&ctx2, result); + return std::string(result, result + 28); + }; +private: + SHA224Summer(const SHA1Summer&); + SHA224Summer& operator=(const SHA1Summer&); + sha2_context d_context; +}; + +class SHA256Summer +{ +public: + SHA256Summer() { sha2_starts(&d_context, 0); }; + void feed(const std::string &str) { feed(str.c_str(), str.length()); }; + void feed(const char *ptr, size_t len) { sha2_update(&d_context, reinterpret_cast(ptr), len); }; + const std::string get() const { + sha2_context ctx2; + unsigned char result[32] = {0}; + ctx2=d_context; + sha2_finish(&ctx2, result); + return std::string(result, result + 32); + }; +private: + SHA256Summer(const SHA1Summer&); + SHA256Summer& operator=(const SHA1Summer&); + sha2_context d_context; +}; + +class SHA384Summer +{ +public: + SHA384Summer() { sha4_starts(&d_context, 1); }; + void feed(const std::string &str) { feed(str.c_str(), str.length()); }; + void feed(const char *ptr, size_t len) { sha4_update(&d_context, reinterpret_cast(ptr), len); }; + const std::string get() const { + sha4_context ctx2; + unsigned char result[64] = {0}; + ctx2 = d_context; + sha4_finish(&ctx2, result); + return std::string(result, result + 48); + }; +private: + SHA384Summer(const SHA1Summer&); + SHA384Summer& operator=(const SHA1Summer&); + sha4_context d_context; +}; + +class SHA512Summer +{ +public: + SHA512Summer() { sha4_starts(&d_context, 0); }; + void feed(const std::string &str) { feed(str.c_str(), str.length()); }; + void feed(const char *ptr, size_t len) { sha4_update(&d_context, reinterpret_cast(ptr), len); }; + const std::string get() const { + sha4_context ctx2; + unsigned char result[64] = {0}; + ctx2=d_context; + sha4_finish(&ctx2, result); + return std::string(result, result + sizeof result); + }; +private: + SHA512Summer(const SHA1Summer&); + SHA512Summer& operator=(const SHA1Summer&); + sha4_context d_context; +}; + +#endif /* sha.hh */