to/fromHex for SHA1Hash. Fix up sha1 handling in db.
authorMarc Burns <m4burns@strombola.csclub.uwaterloo.ca>
Thu, 10 Nov 2011 21:46:17 +0000 (16:46 -0500)
committerMarc Burns <m4burns@strombola.csclub.uwaterloo.ca>
Thu, 10 Nov 2011 21:46:17 +0000 (16:46 -0500)
database/db.cpp
database/sha1.cpp
database/sha1.h

index 63664a4..93f667f 100644 (file)
@@ -103,14 +103,10 @@ uint32_t PosDb::getAccountFromHash(const SHA1Hash & hash) {
 
 std::list<std::string> PosDb::getHashesFromAccount(uint32_t account) {
        std::list<std::string> result;
-       char bfr[20];
 
        ath_it_r range = account_to_hash.equal_range(account);
        for(ath_it p = range.first; p != range.second; ++p)
-       {
-               p->second.get((unsigned char *)bfr);
-               result.push_back(bfr);
-       }
+               result.push_back(p->second.toHex());
 
        return result;
 }
index 4eaf578..644ea16 100644 (file)
@@ -1,6 +1,7 @@
 #include "sha1.h"
 #include "linus_sha1.h"
 #include <cstring>
+#include <cstdio>
 
 SHA1Hash::SHA1Hash() {}
 
@@ -19,6 +20,22 @@ SHA1Hash::SHA1Hash(const SHA1Hash & other) {
        memcpy(data, other.data, sizeof(unsigned char) * 20);
 }
 
+std::string SHA1Hash::toHex() {
+       char bfr[41];
+       int c = 0;
+       for(int i=0;i<20;++i)
+               snprintf(bfr + 2*i, 3, "%02x", data[i]);
+       return std::string(bfr);
+}
+
+void SHA1Hash::fromHex(std::string s) {
+       if(s.length() != 40)
+               return;
+       for(int i=0;i<20;++i)
+               data[i] = 16 * ((s[2*i] > '9') ? (s[2*i] - 87) : (s[2*i] - 48))
+                       + ((s[2*i+1] > '9') ? (s[2*i+1] - 87) : (s[2*i+1] - 48));
+}
+
 void SHA1Hash::set(const unsigned char * from) {
        memcpy(data, from, sizeof(unsigned char) * 20);
 }
index aae7625..c30b709 100644 (file)
@@ -8,6 +8,8 @@ struct __attribute__ ((packed)) SHA1Hash {
        explicit SHA1Hash(const char * str);
        explicit SHA1Hash(const std::string str);
        SHA1Hash(const SHA1Hash & other);
+       std::string toHex();
+       void fromHex(std::string s);
        bool operator==(const SHA1Hash & other) const;
        void set(const unsigned char * from);
        void get(unsigned char * to) const;