* RainbowCrack\r
*\r
* Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>\r
- * Copyright Martin Westergaard Jørgensen <martinwj2005@gmail.com>\r
+ * Copyright 2009, 2010 Martin Westergaard Jørgensen <martinwj2005@gmail.com>\r
* Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>\r
- * Copyright 2009, 2010 James Nobis <frt@quelrod.net>\r
+ * Copyright 2009, 2010, 2011 James Nobis <frt@quelrod.net>\r
* Copyright 2010 uroskn\r
*\r
* This file is part of rcracki_mt.\r
FILE* file = fopen(sPathName.c_str(), "rb");\r
if (file != NULL)\r
{\r
+ // XXX file type detection code needs a serious overhaul\r
// File length check\r
bool doOldFormat = CChainWalkContext::isOldFormat();\r
bool doRti2Format = CChainWalkContext::isRti2Format();\r
else\r
sizeOfChain = 8;\r
\r
- //if (nFileLen % 8 != 0 || nRainbowChainCount * 8 != nFileLen)\r
if ( ( (unsigned long)nFileLen % sizeOfChain != 0 || nRainbowChainCount * sizeOfChain != (unsigned long)nFileLen) && doRti2Format == false )\r
printf("file length mismatch\n");\r
else\r
{\r
RTI2Reader *pReader = NULL;\r
\r
- if(doRti2Format) {\r
- pReader = new RTI2Reader(sPathName);\r
-\r
- }\r
+ if(doRti2Format)\r
\r
if (debug)\r
{\r
}\r
\r
static CMemoryPool mp(bytesForChainWalkSet, debug, maxMem);\r
- RainbowChainO* pChain = (RainbowChainO*)mp.Allocate(nFileLen, nAllocatedSize);\r
- #ifdef _WIN32\r
- if (debug) printf("Allocated %I64u bytes, filelen %lu\n", nAllocatedSize, (unsigned long)nFileLen);\r
+ RainbowChainO* pChain = NULL;\r
+ if(doRti2Format)\r
+ pChain = (RainbowChainO*)mp.Allocate(pReader->GetChainsLeft() * 16, nAllocatedSize);\r
+ else\r
+ pChain = (RainbowChainO*)mp.Allocate(nFileLen, nAllocatedSize);\r
+\r
+ #if defined(_WIN32) && !defined(__GNUC__)\r
+ if (debug) printf("Allocated %I64 bytes, filelen %ld\n", nAllocatedSize, nFileLen);\r
#else\r
- if (debug) printf("Allocated %llu bytes, filelen %lu\n", nAllocatedSize, (unsigned long)nFileLen);\r
+ if (debug) printf("Allocated %llu bytes, filelen %ld\n", nAllocatedSize, nFileLen);\r
#endif\r
\r
if (pChain != NULL)\r
\r
// Load table chunk\r
if (debug) printf("reading...\n");\r
- unsigned int nDataRead = 0, nDataToRead = 0;\r
+ unsigned int nDataRead = 0;\r
gettimeofday( &tv, NULL );\r
if ( doRti2Format )\r
{\r
- nDataToRead = nAllocatedSize / 16;\r
- nDataRead = nDataToRead;\r
+ nDataRead = nAllocatedSize / 16;\r
+ if(pReader->GetChainsLeft() <= 0) // No more data\r
+ break; \r
pReader->ReadChains(nDataRead, pChain);\r
+\r
nDataRead *= 8; // Convert from chains read to bytes\r
}\r
else\r
printf("%u bytes read, disk access time: %.2f s\n", nDataRead, fTime);\r
m_fTotalDiskAccessTime += fTime;\r
\r
- int nRainbowChainCountRead = nDataRead / 16;\r
+ int nRainbowChainCountRead;\r
+\r
+ if(doRti2Format)\r
+ nRainbowChainCountRead = nDataRead / 8;\r
+ else\r
+ nRainbowChainCountRead = nDataRead / 16;\r
\r
// Verify table chunk\r
if (!fVerified)\r
if (!hs.AnyHashLeftWithLen(CChainWalkContext::GetHashLen()))\r
break;\r
\r
+/*\r
+ // XXX eliminated by PB - check correctness\r
// finished the current table\r
if( doRti2Format && nDataToRead > (nDataRead / 8) )\r
{\r
delete pReader;\r
break;\r
}\r
+*/\r
}\r
}\r
else\r
if(fIndex != NULL)\r
{\r
// File length check\r
- unsigned int nFileLenIndex = GetFileLen(fIndex);\r
+ long nFileLenIndex = GetFileLen(fIndex);\r
//unsigned int nRows = nFileLenIndex / 11;\r
//unsigned int nSize = nRows * sizeof(IndexChain);\r
//printf("Debug: 8\n");\r
if (nFileLenIndex % 11 != 0)\r
- printf("index file length mismatch (%u bytes)\n", nFileLenIndex);\r
+ printf("index file length mismatch (%ld bytes)\n", nFileLenIndex);\r
else\r
{\r
//printf("index nSize: %d\n", nSize);\r
//pIndex = (IndexChain*)new unsigned char[nSize];\r
IndexChain *pIndex = (IndexChain*)mpIndex.Allocate(nFileLenIndex, nAllocatedSizeIndex);\r
#ifdef _WIN32\r
- if (debug) printf("Debug: Allocated %I64u bytes for index with filelen %u\n", nAllocatedSizeIndex, nFileLenIndex);\r
+ if (debug) printf("Debug: Allocated %I64u bytes for index with filelen %ld\n", nAllocatedSizeIndex, nFileLenIndex);\r
#else\r
- if (debug) printf("Debug: Allocated %llu bytes for index with filelen %u\n", nAllocatedSizeIndex, nFileLenIndex);\r
+ if (debug) printf("Debug: Allocated %llu bytes for index with filelen %ld\n", nAllocatedSizeIndex, nFileLenIndex);\r
#endif\r
\r
static CMemoryPool mp(bytesForChainWalkSet + nAllocatedSizeIndex, debug, maxMem);\r
\r
fseek(fIndex, 0, SEEK_SET);\r
\r
- while ( (unsigned long)ftell(fIndex) != nFileLenIndex ) // Index chunk read loop\r
+ while ( ftell(fIndex) != nFileLenIndex ) // Index chunk read loop\r
{\r
// Load index chunk\r
#ifdef _WIN32\r
{\r
nAllocatedSize = nAllocatedSize / sizeOfChain * sizeOfChain; // Round to sizeOfChain boundary\r
\r
- //fseek(file, 0, SEEK_SET);\r
//bool fVerified = false;\r
uint32 nProcessedChains = 0;\r
- while (ftell(file) != nFileLen \r
+ while ( ftell(file) != nFileLen \r
&& nProcessedChains < nCoveredRainbowTableChains ) // Chunk read loop\r
{\r
// Load table chunk\r
// Reset statistics\r
ResetStatistics();\r
\r
+ // XXX it's not like the STL has a sort method...\r
// Sort vPathName (CChainWalkSet need it)\r
uint32 i, j;\r
for (i = 0; i < vPathName.size() - 1; i++)\r
return m_fTotalPrecalculationTime;\r
}\r
\r
-int CCrackEngine::GetStatTotalChainWalkStep()\r
+uint64 CCrackEngine::GetStatTotalChainWalkStep()\r
{\r
return m_nTotalChainWalkStep;\r
}\r
return m_nTotalFalseAlarm;\r
}\r
\r
-int CCrackEngine::GetStatTotalChainWalkStepDueToFalseAlarm()\r
+uint64 CCrackEngine::GetStatTotalChainWalkStepDueToFalseAlarm()\r
{\r
return m_nTotalChainWalkStepDueToFalseAlarm;\r
}\r