Guest User

Untitled

a guest
Oct 21st, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. void CSHA1::Update(const UINT_8* pbData, UINT_32 uLen)
  2. {
  3.     UINT_32 j = ((m_count[0] >> 3) & 0x3F);
  4.  
  5.     if((m_count[0] += (uLen << 3)) < (uLen << 3))
  6.         ++m_count[1]; // Overflow
  7.  
  8.     m_count[1] += (uLen >> 29);
  9.  
  10.     UINT_32 i;
  11.     if((j + uLen) > 63)
  12.     {
  13.         i = 64 - j;
  14.         memcpy(&m_buffer[j], pbData, i);
  15.         Transform(m_state, m_buffer);
  16.  
  17.         for( ; (i + 63) < uLen; i += 64)
  18.             Transform(m_state, &pbData[i]);
  19.  
  20.         j = 0;
  21.     }
  22.     else i = 0;
  23.  
  24.     if((uLen - i) != 0)
  25.         memcpy(&m_buffer[j], &pbData[i], uLen - i);
  26. }
  27.  
  28. #ifdef SHA1_UTILITY_FUNCTIONS
  29. // Hash in file contents
  30. bool CSHA1::HashFile(const TCHAR* tszFileName)
  31. {
  32.     if(tszFileName == NULL) return false;
  33.  
  34.     FILE* fpIn = _tfopen(tszFileName, _T("rb"));
  35.     if(fpIn == NULL) return false;
  36.  
  37.     _fseeki64(fpIn, 0, SEEK_END);
  38.     const INT_64 lFileSize = _ftelli64(fpIn);
  39.     _fseeki64(fpIn, 0, SEEK_SET);
  40.  
  41.     const INT_64 lMaxBuf = SHA1_MAX_FILE_BUFFER;
  42.     UINT_8 vData[SHA1_MAX_FILE_BUFFER];
  43.     INT_64 lRemaining = lFileSize;
  44.  
  45.     while(lRemaining > 0)
  46.     {
  47.         const size_t uMaxRead = static_cast<size_t>((lRemaining > lMaxBuf) ?
  48.             lMaxBuf : lRemaining);
  49.  
  50.         const size_t uRead = fread(vData, 1, uMaxRead, fpIn);
  51.         if(uRead == 0)
  52.         {
  53.             fclose(fpIn);
  54.             return false;
  55.         }
  56.  
  57.         Update(vData, static_cast<UINT_32>(uRead));
  58.  
  59.         lRemaining -= static_cast<INT_64>(uRead);
  60.     }
  61.  
  62.     fclose(fpIn);
  63.     return (lRemaining == 0);
  64. }
  65. #endif
  66.  
  67. void CSHA1::Final()
  68. {
  69.     UINT_32 i;
  70.  
  71.     UINT_8 finalcount[8];
  72.     for(i = 0; i < 8; ++i)
  73.         finalcount[i] = (UINT_8)((m_count[((i >= 4) ? 0 : 1)]
  74.             >> ((3 - (i & 3)) * 8) ) & 255); // Endian independent
  75.  
  76.     Update((UINT_8*)"\200", 1);
  77.  
  78.     while ((m_count[0] & 504) != 448)
  79.         Update((UINT_8*)"\0", 1);
  80.  
  81.     Update(finalcount, 8); // Cause a SHA1Transform()
  82.  
  83.     for(i = 0; i < 20; ++i)
  84.         m_digest[i] = (UINT_8)((m_state[i >> 2] >> ((3 - (i & 3)) * 8)) & 0xFF);
  85.  
  86.     // Wipe variables for security reasons
  87. #ifdef SHA1_WIPE_VARIABLES
  88.     memset(m_buffer, 0, 64);
  89.     memset(m_state, 0, 20);
  90.     memset(m_count, 0, 8);
  91.     memset(finalcount, 0, 8);
  92.     Transform(m_state, m_buffer);
  93. #endif
  94. }
Add Comment
Please, Sign In to add comment