#include <SHA1.h>
Public Types | |
| enum | { REPORT_HEX = 0, REPORT_DIGIT = 1 } |
Public Member Functions | |
| CSHA1 () | |
| ~CSHA1 () | |
| void | Reset () |
| void | Update (UINT_8 *data, UINT_32 len) |
| bool | HashFile (char *szFileName) |
| void | Final () |
| void | ReportHash (char *szReport, unsigned char uReportType=REPORT_HEX) |
| void | GetHash (UINT_8 *puDest) |
Public Attributes | |
| UINT_32 | m_state [5] |
| UINT_32 | m_count [2] |
| UINT_32 | __reserved1 [1] |
| UINT_8 | m_buffer [64] |
| UINT_8 | m_digest [20] |
| UINT_32 | __reserved2 [3] |
Private Member Functions | |
| void | Transform (UINT_32 *state, UINT_8 *buffer) |
Private Attributes | |
| UINT_8 | m_workspace [64] |
| SHA1_WORKSPACE_BLOCK * | m_block |
Definition at line 97 of file SHA1.h.
| anonymous enum |
Definition at line 102 of file SHA1.h.
{
REPORT_HEX = 0,
REPORT_DIGIT = 1
};
| CSHA1::CSHA1 | ( | ) |
Definition at line 64 of file SHA1.cc.
{
m_block = (SHA1_WORKSPACE_BLOCK *)m_workspace;
Reset();
}
| void CSHA1::Final | ( | ) |
Definition at line 263 of file SHA1.cc.
Referenced by I3Identifier::createFromHash(), SimpleNcs::falsifyDelay(), SimpleNodeEntry::getFaultyDelay(), DHT::handleGetRequest(), and OverlayKey::sha1().
{
UINT_32 i;
UINT_8 finalcount[8];
for(i = 0; i < 8; i++)
finalcount[i] = (UINT_8)((m_count[((i >= 4) ? 0 : 1)]
>> ((3 - (i & 3)) * 8) ) & 255); // Endian independent
Update((UINT_8 *)"\200", 1);
while ((m_count[0] & 504) != 448)
Update((UINT_8 *)"\0", 1);
Update(finalcount, 8); // Cause a SHA1Transform()
for(i = 0; i < 20; i++) {
m_digest[i] = (UINT_8)((m_state[i >> 2] >> ((3 - (i & 3)) * 8) ) & 255);
}
// Wipe variables for security reasons
#ifdef SHA1_WIPE_VARIABLES
i = 0;
memset(m_buffer, 0, 64);
memset(m_state, 0, 20);
memset(m_count, 0, 8);
memset(finalcount, 0, 8);
Transform(m_state, m_buffer);
#endif
}
| void CSHA1::GetHash | ( | UINT_8 * | puDest | ) |
Definition at line 326 of file SHA1.cc.
Referenced by I3Identifier::createFromHash(), SimpleNcs::falsifyDelay(), SimpleNodeEntry::getFaultyDelay(), DHT::handleGetRequest(), and OverlayKey::sha1().
{
memcpy(puDest, m_digest, 20);
}
| bool CSHA1::HashFile | ( | char * | szFileName | ) |
Definition at line 221 of file SHA1.cc.
{
unsigned long ulFileSize, ulRest, ulBlocks;
unsigned long i;
UINT_8 uData[SHA1_MAX_FILE_BUFFER];
FILE *fIn;
if(szFileName == NULL)
return false;
fIn = fopen(szFileName, "rb");
if(fIn == NULL)
return false;
fseek(fIn, 0, SEEK_END);
ulFileSize = (unsigned long)ftell(fIn);
fseek(fIn, 0, SEEK_SET);
if(ulFileSize != 0) {
ulBlocks = ulFileSize / SHA1_MAX_FILE_BUFFER;
ulRest = ulFileSize % SHA1_MAX_FILE_BUFFER;
} else {
ulBlocks = 0;
ulRest = 0;
}
for(i = 0; i < ulBlocks; i++) {
fread(uData, 1, SHA1_MAX_FILE_BUFFER, fIn);
Update((UINT_8 *)uData, SHA1_MAX_FILE_BUFFER);
}
if(ulRest != 0) {
fread(uData, 1, ulRest, fIn);
Update((UINT_8 *)uData, ulRest);
}
fclose(fIn);
fIn = NULL;
return true;
}
| void CSHA1::ReportHash | ( | char * | szReport, | |
| unsigned char | uReportType = REPORT_HEX | |||
| ) |
Definition at line 296 of file SHA1.cc.
{
unsigned char i;
char szTemp[16];
if(szReport == NULL)
return;
if(uReportType == REPORT_HEX) {
//sprintf(szTemp, "%02x", m_digest[0]);
//strcat(szReport, szTemp);
for(i = 0; i < 20; i++) {
sprintf(szTemp, "%02x", m_digest[i]);
strcat(szReport, szTemp);
}
} else if(uReportType == REPORT_DIGIT) {
sprintf(szTemp, "%u", m_digest[0]);
strcat(szReport, szTemp);
for(i = 1; i < 20; i++) {
sprintf(szTemp, " %u", m_digest[i]);
strcat(szReport, szTemp);
}
} else
strcpy(szReport, "Error: Unknown report type!");
}
| void CSHA1::Reset | ( | ) |
Definition at line 76 of file SHA1.cc.
Referenced by I3Identifier::createFromHash(), CSHA1(), SimpleNcs::falsifyDelay(), SimpleNodeEntry::getFaultyDelay(), DHT::handleGetRequest(), OverlayKey::sha1(), and ~CSHA1().
| void CSHA1::Transform | ( | UINT_32 * | state, | |
| UINT_8 * | buffer | |||
| ) | [private] |
Definition at line 89 of file SHA1.cc.
Referenced by Final(), and Update().
{
// Copy state[] to working vars
UINT_32 a = state[0], b = state[1], c = state[2], d = state[3], e = state[4];
memcpy(m_block, buffer, 64);
// 4 rounds of 20 operations each. Loop unrolled.
_R0(a,b,c,d,e, 0);
_R0(e,a,b,c,d, 1);
_R0(d,e,a,b,c, 2);
_R0(c,d,e,a,b, 3);
_R0(b,c,d,e,a, 4);
_R0(a,b,c,d,e, 5);
_R0(e,a,b,c,d, 6);
_R0(d,e,a,b,c, 7);
_R0(c,d,e,a,b, 8);
_R0(b,c,d,e,a, 9);
_R0(a,b,c,d,e,10);
_R0(e,a,b,c,d,11);
_R0(d,e,a,b,c,12);
_R0(c,d,e,a,b,13);
_R0(b,c,d,e,a,14);
_R0(a,b,c,d,e,15);
_R1(e,a,b,c,d,16);
_R1(d,e,a,b,c,17);
_R1(c,d,e,a,b,18);
_R1(b,c,d,e,a,19);
_R2(a,b,c,d,e,20);
_R2(e,a,b,c,d,21);
_R2(d,e,a,b,c,22);
_R2(c,d,e,a,b,23);
_R2(b,c,d,e,a,24);
_R2(a,b,c,d,e,25);
_R2(e,a,b,c,d,26);
_R2(d,e,a,b,c,27);
_R2(c,d,e,a,b,28);
_R2(b,c,d,e,a,29);
_R2(a,b,c,d,e,30);
_R2(e,a,b,c,d,31);
_R2(d,e,a,b,c,32);
_R2(c,d,e,a,b,33);
_R2(b,c,d,e,a,34);
_R2(a,b,c,d,e,35);
_R2(e,a,b,c,d,36);
_R2(d,e,a,b,c,37);
_R2(c,d,e,a,b,38);
_R2(b,c,d,e,a,39);
_R3(a,b,c,d,e,40);
_R3(e,a,b,c,d,41);
_R3(d,e,a,b,c,42);
_R3(c,d,e,a,b,43);
_R3(b,c,d,e,a,44);
_R3(a,b,c,d,e,45);
_R3(e,a,b,c,d,46);
_R3(d,e,a,b,c,47);
_R3(c,d,e,a,b,48);
_R3(b,c,d,e,a,49);
_R3(a,b,c,d,e,50);
_R3(e,a,b,c,d,51);
_R3(d,e,a,b,c,52);
_R3(c,d,e,a,b,53);
_R3(b,c,d,e,a,54);
_R3(a,b,c,d,e,55);
_R3(e,a,b,c,d,56);
_R3(d,e,a,b,c,57);
_R3(c,d,e,a,b,58);
_R3(b,c,d,e,a,59);
_R4(a,b,c,d,e,60);
_R4(e,a,b,c,d,61);
_R4(d,e,a,b,c,62);
_R4(c,d,e,a,b,63);
_R4(b,c,d,e,a,64);
_R4(a,b,c,d,e,65);
_R4(e,a,b,c,d,66);
_R4(d,e,a,b,c,67);
_R4(c,d,e,a,b,68);
_R4(b,c,d,e,a,69);
_R4(a,b,c,d,e,70);
_R4(e,a,b,c,d,71);
_R4(d,e,a,b,c,72);
_R4(c,d,e,a,b,73);
_R4(b,c,d,e,a,74);
_R4(a,b,c,d,e,75);
_R4(e,a,b,c,d,76);
_R4(d,e,a,b,c,77);
_R4(c,d,e,a,b,78);
_R4(b,c,d,e,a,79);
// Add the working vars back into state
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
state[4] += e;
// Wipe variables
#ifdef SHA1_WIPE_VARIABLES
a = b = c = d = e = 0;
#endif
}
| void CSHA1::Update | ( | UINT_8 * | data, | |
| UINT_32 | len | |||
| ) |
Definition at line 193 of file SHA1.cc.
Referenced by I3Identifier::createFromHash(), SimpleNcs::falsifyDelay(), Final(), SimpleNodeEntry::getFaultyDelay(), DHT::handleGetRequest(), HashFile(), and OverlayKey::sha1().
{
UINT_32 i, j;
j = (m_count[0] >> 3) & 63;
if((m_count[0] += len << 3) < (len << 3))
m_count[1]++;
m_count[1] += (len >> 29);
if((j + len) > 63) {
i = 64 - j;
memcpy(&m_buffer[j], data, i);
Transform(m_state, m_buffer);
for( ; i + 63 < len; i += 64)
Transform(m_state, &data[i]);
j = 0;
} else
i = 0;
memcpy(&m_buffer[j], &data[i], len - i);
}
| UINT_32 CSHA1::__reserved1[1] |
| UINT_32 CSHA1::__reserved2[3] |
SHA1_WORKSPACE_BLOCK* CSHA1::m_block [private] |
Definition at line 146 of file SHA1.h.
Referenced by CSHA1(), and Transform().
| UINT_8 CSHA1::m_buffer[64] |
| UINT_32 CSHA1::m_count[2] |
| UINT_8 CSHA1::m_digest[20] |
Definition at line 117 of file SHA1.h.
Referenced by Final(), GetHash(), and ReportHash().
| UINT_32 CSHA1::m_state[5] |
UINT_8 CSHA1::m_workspace[64] [private] |
1.7.1