2014-04-29 11:37:15 -04:00
|
|
|
|
|
|
|
// Sha1Checksum.cpp
|
|
|
|
|
|
|
|
// Declares the cSha1Checksum class representing the SHA-1 checksum calculator
|
|
|
|
|
|
|
|
#include "Globals.h"
|
|
|
|
#include "Sha1Checksum.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
// Self-test the hash formatting for known values:
|
|
|
|
// sha1(Notch) : 4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48
|
|
|
|
// sha1(jeb_) : -7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1
|
|
|
|
// sha1(simon) : 88e16a1019277b15d58faf0541e11910eb756f6
|
|
|
|
|
|
|
|
static class Test
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Test(void)
|
|
|
|
{
|
|
|
|
AString DigestNotch, DigestJeb, DigestSimon;
|
|
|
|
Byte Digest[20];
|
|
|
|
cSha1Checksum Checksum;
|
|
|
|
Checksum.Update((const Byte *)"Notch", 5);
|
|
|
|
Checksum.Finalize(Digest);
|
|
|
|
cSha1Checksum::DigestToJava(Digest, DigestNotch);
|
|
|
|
Checksum.Restart();
|
|
|
|
Checksum.Update((const Byte *)"jeb_", 4);
|
|
|
|
Checksum.Finalize(Digest);
|
|
|
|
cSha1Checksum::DigestToJava(Digest, DigestJeb);
|
|
|
|
Checksum.Restart();
|
|
|
|
Checksum.Update((const Byte *)"simon", 5);
|
|
|
|
Checksum.Finalize(Digest);
|
|
|
|
cSha1Checksum::DigestToJava(Digest, DigestSimon);
|
|
|
|
printf("Notch: \"%s\"\n", DigestNotch.c_str());
|
|
|
|
printf("jeb_: \"%s\"\n", DigestJeb.c_str());
|
|
|
|
printf("simon: \"%s\"\n", DigestSimon.c_str());
|
|
|
|
assert(DigestNotch == "4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48");
|
|
|
|
assert(DigestJeb == "-7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1");
|
|
|
|
assert(DigestSimon == "88e16a1019277b15d58faf0541e11910eb756f6");
|
|
|
|
}
|
|
|
|
} test;
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-07-17 16:15:34 -04:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2014-04-29 11:37:15 -04:00
|
|
|
// cSha1Checksum:
|
|
|
|
|
|
|
|
cSha1Checksum::cSha1Checksum(void) :
|
|
|
|
m_DoesAcceptInput(true)
|
|
|
|
{
|
|
|
|
sha1_starts(&m_Sha1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cSha1Checksum::Update(const Byte * a_Data, size_t a_Length)
|
|
|
|
{
|
|
|
|
ASSERT(m_DoesAcceptInput); // Not Finalize()-d yet, or Restart()-ed
|
|
|
|
|
|
|
|
sha1_update(&m_Sha1, a_Data, a_Length);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cSha1Checksum::Finalize(cSha1Checksum::Checksum & a_Output)
|
|
|
|
{
|
|
|
|
ASSERT(m_DoesAcceptInput); // Not Finalize()-d yet, or Restart()-ed
|
|
|
|
|
|
|
|
sha1_finish(&m_Sha1, a_Output);
|
|
|
|
m_DoesAcceptInput = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cSha1Checksum::DigestToJava(const Checksum & a_Digest, AString & a_Out)
|
|
|
|
{
|
|
|
|
Checksum Digest;
|
|
|
|
memcpy(Digest, a_Digest, sizeof(Digest));
|
|
|
|
|
|
|
|
bool IsNegative = (Digest[0] >= 0x80);
|
|
|
|
if (IsNegative)
|
|
|
|
{
|
|
|
|
// Two's complement:
|
|
|
|
bool carry = true; // Add one to the whole number
|
|
|
|
for (int i = 19; i >= 0; i--)
|
|
|
|
{
|
|
|
|
Digest[i] = ~Digest[i];
|
|
|
|
if (carry)
|
|
|
|
{
|
|
|
|
carry = (Digest[i] == 0xff);
|
|
|
|
Digest[i]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
a_Out.clear();
|
|
|
|
a_Out.reserve(40);
|
|
|
|
for (int i = 0; i < 20; i++)
|
|
|
|
{
|
|
|
|
AppendPrintf(a_Out, "%02x", Digest[i]);
|
|
|
|
}
|
|
|
|
while ((a_Out.length() > 0) && (a_Out[0] == '0'))
|
|
|
|
{
|
|
|
|
a_Out.erase(0, 1);
|
|
|
|
}
|
|
|
|
if (IsNegative)
|
|
|
|
{
|
|
|
|
a_Out.insert(0, "-");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cSha1Checksum::Restart(void)
|
|
|
|
{
|
|
|
|
sha1_starts(&m_Sha1);
|
|
|
|
m_DoesAcceptInput = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|