]> granicus.if.org Git - pdns/commitdiff
cleanup hmac calculation functions
authorKees Monshouwer <mind04@monshouwer.org>
Thu, 28 Nov 2013 07:56:06 +0000 (08:56 +0100)
committermind04 <mind04@monshouwer.org>
Thu, 28 Nov 2013 07:56:06 +0000 (08:56 +0100)
pdns/dnssecinfra.cc
pdns/dnssecinfra.hh
pdns/md5.hh
pdns/test-md5_hh.cc

index 24753d9e3158919f2b61c43a9f56e5712126e5de..85fb5ada9820bad38fb3627363ebd12cec142e4a 100644 (file)
@@ -9,11 +9,11 @@
 #include <boost/algorithm/string.hpp>
 #include "dnssecinfra.hh" 
 #include "dnsseckeeper.hh"
+#include <polarssl/md5.h>
 #include <polarssl/sha1.h>
 #include <boost/assign/std/vector.hpp> // for 'operator+=()'
 #include <boost/assign/list_inserter.hpp>
 #include "base64.hh"
-#include "md5.hh"
 #include "sha.hh"
 #include "namespaces.hh"
 using namespace boost::assign;
@@ -421,35 +421,15 @@ void decodeDERIntegerSequence(const std::string& input, vector<string>& output)
   }  
 }
 
-string calculateMD5HMAC(const std::string& key_, const std::string& text)
+string calculateMD5HMAC(const std::string& key, const std::string& text)
 {
-  unsigned char key[64] = {0};
-  key_.copy((char*)key,64); 
-  unsigned char keyIpad[64];
-  unsigned char keyOpad[64];
-
-  //~ cerr<<"Key: "<<makeHexDump(key_)<<endl;
-  //~ cerr<<"txt: "<<makeHexDump(text)<<endl;
-
-  for(unsigned int n=0; n < 64; ++n) {
-    if(n < key_.length()) {
-      keyIpad[n] = (unsigned char)(key[n] ^ 0x36);
-      keyOpad[n] = (unsigned char)(key[n] ^ 0x5c);
-    }
-    else  {
-      keyIpad[n]=0x36;
-      keyOpad[n]=0x5c;
-    }
-  }
-
-  MD5Summer md5_1, md5_2;
-  md5_1.feed((const char*)keyIpad, 64);
-  md5_1.feed(text);
+  std::string res;
+  unsigned char hash[16];
 
-  md5_2.feed((const char*)keyOpad, 64);
-  md5_2.feed(md5_1.get());
+  md5_hmac(reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), reinterpret_cast<const unsigned char*>(text.c_str()), text.size(), hash);
+  res.assign(reinterpret_cast<const char*>(hash), 16);
 
-  return md5_2.get();
+  return res;
 }
 
 string calculateSHAHMAC(const std::string& key, const std::string& text, TSIGHashEnum hasher)
@@ -460,46 +440,31 @@ string calculateSHAHMAC(const std::string& key, const std::string& text, TSIGHas
   switch(hasher) {
   case TSIG_SHA1:
   {
-      sha1_context ctx;
-      sha1_hmac_starts(&ctx, reinterpret_cast<const unsigned char*>(key.c_str()), key.size());
-      sha1_hmac_update(&ctx, reinterpret_cast<const unsigned char*>(text.c_str()), text.size());
-      sha1_hmac_finish(&ctx, hash);
+      sha1_hmac(reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), reinterpret_cast<const unsigned char*>(text.c_str()), text.size(), hash);
       res.assign(reinterpret_cast<const char*>(hash), 20);
       break;
   };
   case TSIG_SHA224:
   {
-      sha2_context ctx;
-      sha2_hmac_starts(&ctx, reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), 1);
-      sha2_hmac_update(&ctx, reinterpret_cast<const unsigned char*>(text.c_str()), text.size());
-      sha2_hmac_finish(&ctx, hash);
+      sha2_hmac(reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), reinterpret_cast<const unsigned char*>(text.c_str()), text.size(), hash, 1);
       res.assign(reinterpret_cast<const char*>(hash), 28);
       break;
   };
   case TSIG_SHA256:
   {
-      sha2_context ctx;
-      sha2_hmac_starts(&ctx, reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), 0);
-      sha2_hmac_update(&ctx, reinterpret_cast<const unsigned char*>(text.c_str()), text.size());
-      sha2_hmac_finish(&ctx, hash);
+      sha2_hmac(reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), reinterpret_cast<const unsigned char*>(text.c_str()), text.size(), hash, 0);
       res.assign(reinterpret_cast<const char*>(hash), 32);
       break;
   };
   case TSIG_SHA384:
   {
-      sha4_context ctx;
-      sha4_hmac_starts(&ctx, reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), 1);
-      sha4_hmac_update(&ctx, reinterpret_cast<const unsigned char*>(text.c_str()), text.size());
-      sha4_hmac_finish(&ctx, hash);
+      sha4_hmac(reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), reinterpret_cast<const unsigned char*>(text.c_str()), text.size(), hash, 1);
       res.assign(reinterpret_cast<const char*>(hash), 48);
       break;
   };
   case TSIG_SHA512:
   {
-      sha4_context ctx;
-      sha4_hmac_starts(&ctx, reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), 0);
-      sha4_hmac_update(&ctx, reinterpret_cast<const unsigned char*>(text.c_str()), text.size());
-      sha4_hmac_finish(&ctx, hash);
+      sha4_hmac(reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), reinterpret_cast<const unsigned char*>(text.c_str()), text.size(), hash, 0);
       res.assign(reinterpret_cast<const char*>(hash), 64);
       break;
   };
@@ -510,12 +475,12 @@ string calculateSHAHMAC(const std::string& key, const std::string& text, TSIGHas
   return res;
 }
 
-string calculateHMAC(const std::string& key_, const std::string& text, TSIGHashEnum hash) {
-  if (hash == TSIG_MD5) return calculateMD5HMAC(key_, text);
-  
+string calculateHMAC(const std::string& key, const std::string& text, TSIGHashEnum hash) {
+  if (hash == TSIG_MD5) return calculateMD5HMAC(key, text);
+
   // add other algorithms here
 
-  return calculateSHAHMAC(key_, text, hash);
+  return calculateSHAHMAC(key, text, hash);
 }
 
 string makeTSIGMessageFromTSIGPacket(const string& opacket, unsigned int tsigOffset, const string& keyname, const TSIGRecordContent& trc, const string& previous, bool timersonly, unsigned int dnsHeaderOffset)
index cc8746d3a23855685af41b7db5545519927dab9a..96362a44cbc15f458b85487472b509fd1f166c50 100644 (file)
@@ -130,9 +130,9 @@ void addRRSigs(DNSSECKeeper& dk, DNSBackend& db, const std::set<string, CIString
 
 typedef enum { TSIG_MD5, TSIG_SHA1, TSIG_SHA224, TSIG_SHA256, TSIG_SHA384, TSIG_SHA512 } TSIGHashEnum;
 
-string calculateMD5HMAC(const std::string& key_, const std::string& text);
-string calculateSHAHMAC(const std::string& key_, const std::string& text, TSIGHashEnum hash);
-string calculateHMAC(const std::string& key_, const std::string& text, TSIGHashEnum hash);
+string calculateMD5HMAC(const std::string& key, const std::string& text);
+string calculateSHAHMAC(const std::string& key, const std::string& text, TSIGHashEnum hash);
+string calculateHMAC(const std::string& key, const std::string& text, TSIGHashEnum hash);
 
 string makeTSIGMessageFromTSIGPacket(const string& opacket, unsigned int tsigoffset, const string& keyname, const TSIGRecordContent& trc, const string& previous, bool timersonly, unsigned int dnsHeaderOffset=0);
 bool getTSIGHashEnum(const string &algoName, TSIGHashEnum& algoEnum);
index be3a767cc2b2c6142acd2588a732f0f7119b6e83..6dd6683dd5293f6b94f075931848395c126e02b4 100644 (file)
@@ -5,26 +5,6 @@
 #include <stdint.h>
 #include <polarssl/md5.h>
 
-class MD5Summer
-{
-public:
-  MD5Summer() { md5_starts(&d_context); };
-  void feed(const std::string &str) { feed(str.c_str(), str.length()); }
-  void feed(const char* ptr, size_t len) { md5_update(&d_context, reinterpret_cast<const unsigned char*>(ptr), len); };
-  const std::string get() const {  
-    md5_context ctx2;
-    unsigned char result[16] = {0};
-    ctx2=d_context;
-    md5_finish(&ctx2, result);
-    return std::string(result, result + sizeof result);
-  };
-private:
-  MD5Summer(const MD5Summer&);
-  MD5Summer& operator=(const MD5Summer&);
-
-  md5_context d_context;
-};
-
 inline std::string pdns_md5sum(const std::string& input)
 {
   unsigned char result[16] = {0};
index 08960d330188af67b2733a0459daa31673870f0a..132ff44b2f193aa1c8428ec7db6a80e75c1ae66b 100644 (file)
@@ -10,28 +10,6 @@ using namespace boost;
 
 BOOST_AUTO_TEST_SUITE(test_md5_hh)
 
-BOOST_AUTO_TEST_CASE(test_md5summer) 
-{
-   std::string result = "a3 24 8c e3 1a 88 a6 40 e6 30 73 98 57 6d 06 9e ";
-   std::vector<std::string> cases = boost::assign::list_of
-     ("a ")
-     ("quick ")
-     ("brown ")
-     ("fox ")
-     ("jumped ")
-     ("over ")
-     ("the ")
-     ("lazy ")
-     ("dog");
-     MD5Summer s;
-     BOOST_FOREACH(std::string item, cases) {
-       s.feed(item);
-     }
-
-     BOOST_CHECK_EQUAL(makeHexDump(s.get()), result);
-}
-
 BOOST_AUTO_TEST_CASE(test_pdns_md5sum)
 {
    std::string result = "a3 24 8c e3 1a 88 a6 40 e6 30 73 98 57 6d 06 9e ";