+/*
+ * 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)
long nFileLen = GetFileLen(m_pFile);
unsigned int nTotalChainCount = nFileLen / 8;
if (nFileLen % 8 != 0)
- printf("file length mismatch (%ld bytes)\n", nFileLen);
+ printf("file length mismatch (%lu bytes)\n", nFileLen);
else
{
// File length check
if (nIndexFileLen % 11 != 0)
- printf("index file length mismatch (%ld 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 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;
}
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);
}
}
-int RTIReader::ReadChains(unsigned int &numChains, RainbowChainCP *pData)
+int RTIReader::ReadChains(unsigned int &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(unsigned int i = 0; i < m_nIndexSize; i++)
+ for(UINT4 i = 0; i < m_nIndexSize; i++)
{
if(m_chainPosition + readChains > m_pIndex[i].nFirstChain + m_pIndex[i].nChainCount) // We found the matching index
continue;
}
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;
+UINT4 RTIReader::GetChainsLeft()
+{
+ return (GetFileLen(m_pFile) / 8) - m_chainPosition;
}
RTIReader::~RTIReader(void)