#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] |