]> git.sesse.net Git - freerainbowtables/blob - Common/rt api/RTIReader.cpp
merged paths
[freerainbowtables] / Common / rt api / RTIReader.cpp
1 #include "RTIReader.h"
2
3 RTIReader::RTIReader(string Filename)
4 {
5         m_pIndex = NULL;
6         m_pFile = fopen(Filename.c_str(), "rb");
7         if(m_pFile == NULL) {
8                 printf("could not open file %s\n", Filename.c_str());
9                 return;         
10         }
11         string sIndex = Filename.append(".index").c_str();
12         FILE *pFileIndex = fopen(sIndex.c_str(), "rb");
13         if(pFileIndex == NULL) {
14                 printf("could not open index file %s\n", sIndex.c_str());
15                 return;
16         }
17         m_chainPosition = 0;
18
19         // Load the index file
20         unsigned int nIndexFileLen = GetFileLen(pFileIndex);
21         unsigned int nFileLen = GetFileLen(m_pFile);
22         unsigned int nTotalChainCount = nFileLen / 8;
23         if (nFileLen % 8 != 0)
24                 printf("file length mismatch (%u bytes)\n", nFileLen);
25         else
26         {
27                 // File length check
28                 if (nIndexFileLen % 11 != 0)
29                         printf("index file length mismatch (%u bytes)\n", nIndexFileLen);
30                 else
31                 {
32                         if(m_pIndex != NULL) {
33                                 delete m_pIndex;
34                                 m_pIndex = NULL;
35                         }
36 #ifdef _MEMORYDEBUG
37                         printf("Allocating %u MB memory for RTIReader::m_pIndex", nIndexFileLen / 11 / (1024 * 1024));
38 #endif
39                         m_pIndex = new (nothrow) IndexChain[nIndexFileLen / 11];
40                         if(m_pIndex == NULL) {
41                                 printf("\nFailed allocating %i MB memory.\n", nIndexFileLen / 11 / (1024 * 1024));
42                                 exit(-2);
43                         }
44 #ifdef _MEMORYDEBUG
45                         printf(" - success!\n");
46 #endif                  
47                         memset(m_pIndex, 0x00, sizeof(IndexChain) * (nIndexFileLen / 11));
48                         fseek(pFileIndex, 0, SEEK_SET);
49                         int nRead = 0;
50                         UINT4 nRows;
51                         for(nRows = 0; (nRows * 11) < nIndexFileLen; nRows++)
52                         {
53                                 if(fread(&m_pIndex[nRows].nPrefix, 5, 1, pFileIndex) != 1) break;                                                       
54                                 if(fread(&m_pIndex[nRows].nFirstChain, 4, 1, pFileIndex) != 1) break;                                                   
55                                 if(fread(&m_pIndex[nRows].nChainCount, 2, 1, pFileIndex) != 1) break;                                                   
56                                 // Index checking part
57                                 if(nRows != 0 && m_pIndex[nRows].nFirstChain < m_pIndex[nRows-1].nFirstChain)
58                                 {
59                                         printf("Corrupted index detected (FirstChain is lower than previous)\n");
60                                         exit(-1);
61                                 }
62                                 else if(nRows != 0 && m_pIndex[nRows].nFirstChain != m_pIndex[nRows-1].nFirstChain + m_pIndex[nRows-1].nChainCount)
63                                 {
64                                         printf("Corrupted index detected (LastChain + nChainCount != FirstChain)\n");
65                                         exit(-1);
66                                 }
67                                 
68                         }
69                         m_nIndexSize = nRows;
70                         if(m_pIndex[m_nIndexSize - 1].nFirstChain + m_pIndex[m_nIndexSize - 1].nChainCount + 1 <= nTotalChainCount) // +1 is needed.
71                         {
72                                 printf("Corrupted index detected: Not covering the entire file\n");
73                                 exit(-1);
74                         }
75                         if(m_pIndex[m_nIndexSize - 1].nFirstChain + m_pIndex[m_nIndexSize - 1].nChainCount > nTotalChainCount) // +1 is not needed here
76                         {
77                                 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);
78                                 exit(-1);
79                         }
80
81         /*                                      if(nIndexSize != pIndex[i].nFirstChain + pIndex[i].nChainCount)
82                         {
83                                 printf("Index is not covering the entire tables\n");
84                         }*/
85                         fclose(pFileIndex);             
86         //                                      printf("debug: Index loaded successfully (%u entries)\n", nIndexSize);
87                 }               
88         }
89
90
91 }
92
93 int RTIReader::ReadChains(unsigned int &numChains, RainbowChain *pData)
94 {       
95         // We HAVE to reset the data to 0x00's or we will get in trouble
96         memset(pData, 0x00, sizeof(RainbowChain) * numChains);
97         unsigned int readChains = 0;
98         unsigned int chainsleft = GetChainsLeft();
99         for(UINT4 i = 0; i < m_nIndexSize; i++)
100         {
101                 if(m_chainPosition + readChains > m_pIndex[i].nFirstChain + m_pIndex[i].nChainCount) // We found the matching index
102                         continue;
103                 while(m_chainPosition + readChains < m_pIndex[i].nFirstChain + m_pIndex[i].nChainCount)
104                 {
105                         pData[readChains].nIndexE = m_pIndex[i].nPrefix << 16;
106                         int endpoint = 0; // We have to set it to 0
107                         fread(&pData[readChains].nIndexS, 6, 1, m_pFile);
108                         fread(&endpoint, 2, 1, m_pFile);
109                         pData[readChains].nIndexE += endpoint;
110                         readChains++;
111                         if(readChains == numChains || readChains == chainsleft) break;
112                 }
113                 if(readChains == numChains) break;              
114         }
115         if(readChains != numChains) { 
116                 numChains = readChains; // Update how many chains we read
117         }
118         m_chainPosition += readChains;
119         printf("Chain position is now %u\n", m_chainPosition);
120         return 0;
121 }
122
123 UINT4 RTIReader::GetChainsLeft()
124 {       
125         return (GetFileLen(m_pFile) / 8) - m_chainPosition;
126 }
127
128 RTIReader::~RTIReader(void)
129 {
130         if(m_pIndex != NULL)
131                 delete m_pIndex;
132         if(m_pFile != NULL)
133                 fclose(m_pFile);
134
135 }