]> granicus.if.org Git - pdns/commitdiff
SHA1/224/256/384/512 implementation
authorAki Tuomi <cmouse@cmouse.fi>
Sun, 16 Jun 2013 09:58:59 +0000 (12:58 +0300)
committerAki Tuomi <cmouse@desteem.org>
Tue, 3 Sep 2013 15:21:35 +0000 (18:21 +0300)
pdns/sha.hh [new file with mode: 0644]

diff --git a/pdns/sha.hh b/pdns/sha.hh
new file mode 100644 (file)
index 0000000..3d5b47b
--- /dev/null
@@ -0,0 +1,111 @@
+#ifndef _SHA_HH
+#define _SHA_HH
+
+#include <string>
+#include <stdint.h>
+#ifdef HAVE_LIBPOLARSSLSSL
+#include <polarssl/sha1.h>
+#include <polarssl/sha2.h>
+#include <polarssl/sha4.h>
+#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<const unsigned char*>(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<const unsigned char*>(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<const unsigned char*>(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<const unsigned char*>(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<const unsigned char*>(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 */