]> git.sesse.net Git - freerainbowtables/blobdiff - Common/rt api/RTIReader.cpp
(C)
[freerainbowtables] / Common / rt api / RTIReader.cpp
index b72dbe2d214c4fdcee088957bbe6e32ef9ec3d21..2215f46af6b27adfca4205276c48722f5f519bac 100644 (file)
@@ -1,3 +1,26 @@
+/*
+ * freerainbowtables is a project for generating, distributing, and using
+ * perfect rainbow tables
+ *
+ * Copyright 2010, 2011 Martin Westergaard Jørgensen <martinwj2005@gmail.com>
+ * Copyright 2010, 2011 James Nobis <frt@quelrod.net>
+ *
+ * This file is part of freerainbowtables.
+ *
+ * freerainbowtables is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * freerainbowtables is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with freerainbowtables.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "RTIReader.h"
 
 RTIReader::RTIReader(string Filename)
@@ -17,24 +40,38 @@ RTIReader::RTIReader(string Filename)
        m_chainPosition = 0;
 
        // Load the index file
-       unsigned int nIndexFileLen = GetFileLen(pFileIndex);
-       unsigned int nFileLen = GetFileLen(m_pFile);
+       long nIndexFileLen = GetFileLen(pFileIndex);
+       long nFileLen = GetFileLen(m_pFile);
        unsigned int nTotalChainCount = nFileLen / 8;
        if (nFileLen % 8 != 0)
-               printf("file length mismatch (%u bytes)\n", nFileLen);
+               printf("file length mismatch (%lu bytes)\n", nFileLen);
        else
        {
                // File length check
                if (nIndexFileLen % 11 != 0)
-                       printf("index file length mismatch (%u bytes)\n", nIndexFileLen);
+                       printf("index file length mismatch (%lu bytes)\n", nIndexFileLen);
                else
                {
-                       m_pIndex = new IndexChain[nIndexFileLen / 11];
+                       if(m_pIndex != NULL) {
+                               delete m_pIndex;
+                               m_pIndex = NULL;
+                       }
+#ifdef _MEMORYDEBUG
+                       printf("Allocating %u MB memory for RTIReader::m_pIndex", nIndexFileLen / 11 / (1024 * 1024));
+#endif
+                       m_pIndex = new (nothrow) IndexChain[nIndexFileLen / 11];
+                       if(m_pIndex == NULL) {
+                               printf("\nFailed allocating %ld MB memory.\n", nIndexFileLen / 11 / (1024 * 1024));
+                               exit(-2);
+                       }
+#ifdef _MEMORYDEBUG
+                       printf(" - success!\n");
+#endif                 
                        memset(m_pIndex, 0x00, sizeof(IndexChain) * (nIndexFileLen / 11));
                        fseek(pFileIndex, 0, SEEK_SET);
-                       int nRead = 0;
-                       int nRows;
-                       for(nRows = 0; (nRows * 11) < nIndexFileLen; nRows++)
+                       //int nRead = 0;
+                       uint32 nRows;
+                       for(nRows = 0; (nRows * 11) < (uint32)nIndexFileLen; nRows++)
                        {
                                if(fread(&m_pIndex[nRows].nPrefix, 5, 1, pFileIndex) != 1) break;                                                       
                                if(fread(&m_pIndex[nRows].nFirstChain, 4, 1, pFileIndex) != 1) break;                                                   
@@ -60,7 +97,7 @@ RTIReader::RTIReader(string Filename)
                        }
                        if(m_pIndex[m_nIndexSize - 1].nFirstChain + m_pIndex[m_nIndexSize - 1].nChainCount > nTotalChainCount) // +1 is not needed here
                        {
-                               printf("Corrupted index detected: The index is covering more than the file\n");
+                               printf("Corrupted index detected: The index is covering more than the file (%i chains of %i chains)\n", m_pIndex[m_nIndexSize - 1].nFirstChain + m_pIndex[m_nIndexSize - 1].nChainCount, nTotalChainCount);
                                exit(-1);
                        }
 
@@ -76,13 +113,13 @@ RTIReader::RTIReader(string Filename)
 
 }
 
-int RTIReader::ReadChains(unsigned int &numChains, RainbowChainCP *pData)
+int RTIReader::ReadChains(uint32 &numChains, RainbowChain *pData)
 {      
        // We HAVE to reset the data to 0x00's or we will get in trouble
-       memset(pData, 0x00, sizeof(RainbowChainCP) * numChains);
+       memset(pData, 0x00, sizeof(RainbowChain) * numChains);
        unsigned int readChains = 0;
        unsigned int chainsleft = GetChainsLeft();
-       for(int i = 0; i < m_nIndexSize; i++)
+       for(uint32 i = 0; i < m_nIndexSize; i++)
        {
                if(m_chainPosition + readChains > m_pIndex[i].nFirstChain + m_pIndex[i].nChainCount) // We found the matching index
                        continue;
@@ -98,15 +135,17 @@ int RTIReader::ReadChains(unsigned int &numChains, RainbowChainCP *pData)
                }
                if(readChains == numChains) break;              
        }
-       if(readChains != numChains) numChains = readChains; // Update how many chains we read
+       if(readChains != numChains) { 
+               numChains = readChains; // Update how many chains we read
+       }
        m_chainPosition += readChains;
+       printf("Chain position is now %u\n", m_chainPosition);
        return 0;
 }
 
-unsigned int RTIReader::GetChainsLeft()
-{
-       int len = GetFileLen(m_pFile) / 8 - m_chainPosition;
-       return len;
+uint32 RTIReader::GetChainsLeft()
+{      
+       return (GetFileLen(m_pFile) / 8) - m_chainPosition;
 }
 
 RTIReader::~RTIReader(void)