]> git.sesse.net Git - freerainbowtables/blob - Client Applications/rcracki_mt/RTI2Reader.cpp
(C)
[freerainbowtables] / Client Applications / rcracki_mt / RTI2Reader.cpp
1 /*
2  * rcracki_mt is a multithreaded implementation and fork of the original 
3  * RainbowCrack
4  *
5  * Copyright 2010 Martin Westergaard Jørgensen <martinwj2005@gmail.com>
6  * Copyright 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>
7  * Copyright 2010, 2011 James Nobis <frt@quelrod.net>
8  *
9  * This file is part of rcracki_mt.
10  *
11  * rcracki_mt is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * rcracki_mt is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with rcracki_mt.  If not, see <http://www.gnu.org/licenses/>.
23  */
24
25 #include "RTI2Reader.h"
26
27 #include <math.h>
28
29 RTI2Header *RTI2Reader::m_pHeader = NULL;
30 RTI2Reader::RTI2Reader(string Filename)
31 {
32         //m_pIndexPos = NULL, m_pChainPos = NULL;;
33         m_pIndex = NULL;
34         m_pFile = fopen(Filename.c_str(), "rb");
35         if(m_pFile == NULL)
36         {
37                 printf("Unable to open file %s", Filename.c_str());
38                 exit(1);
39         }
40         FILE *pFileIndex = fopen(Filename.append(".index").c_str(), "rb");
41         if(pFileIndex == NULL)
42         {
43                 printf("Unable to open file %s", Filename.append(".index").c_str());
44                 exit(1);
45         }
46         m_chainPosition = 0;
47
48         long len = GetFileLen(pFileIndex);
49         fseek(pFileIndex, 0, SEEK_SET);
50
51         m_pIndex = new (nothrow) unsigned char[len];
52         if(m_pIndex == NULL) {
53                 printf("Error allocating %ld MB memory for index in RTI2Reader::RTI2Reader()", len / (1024 * 1024));
54                 exit(-2);
55         }
56         if(fread(m_pIndex, 1, len, pFileIndex) != (unsigned long)len)
57         {
58                 printf("Error while reading index file");
59                 exit(1);
60         }
61         fclose(pFileIndex);
62         m_pHeader = new RTI2Header();   
63         memcpy(m_pHeader, m_pIndex, sizeof(RTI2Header));
64         m_pHeader->m_cppos = (unsigned int*)(m_pIndex + 8);
65         m_pHeader->prefixstart = *(uint64*)(m_pIndex + 8 + (m_pHeader->rti_cplength * 4));
66         m_chainsizebytes = (uint32)ceil((float)(m_pHeader->rti_startptlength + m_pHeader->rti_endptlength + m_pHeader->rti_cplength) / 8); // Get the size of each chain in bytes
67         m_indexrowsizebytes = (uint32)ceil((float)m_pHeader->rti_index_numchainslength / 8);
68         // Check the filesize
69         fseek(m_pFile, 0, SEEK_END);
70         len = ftell(m_pFile);
71         fseek(m_pFile, 0, SEEK_SET);
72         if(len % m_chainsizebytes > 0)
73         {
74                 printf("Invalid filesize %lu\n", len);
75                 return;
76         }
77         
78
79 }
80
81 RTI2Reader::~RTI2Reader(void)
82 {
83         if(m_pIndex != NULL) delete m_pIndex;
84         if(m_pFile != NULL) fclose(m_pFile);
85
86 }
87
88 uint32 RTI2Reader::GetChainsLeft()
89 {
90         long len = GetFileLen(m_pFile);
91         return len / m_chainsizebytes - m_chainPosition;
92 }
93
94 int RTI2Reader::ReadChains(unsigned int &numChains, RainbowChainO *pData)
95 {
96         if(strncmp(m_pHeader->header, "RTI2", 4) != 0)
97         {
98                 numChains = 0;
99                 return -1;
100         }
101         unsigned char *pNumChains = m_pIndex + (m_pHeader->rti_cplength * 4) + 16; // Pointer into the index containing info about how many numbers are in the first chain prefix
102         unsigned int i = 0;
103         unsigned int indexRow = 0; // Current offset into the index
104         unsigned int curRowPosition = 0;
105         
106         while(true) // Fast forward to current position
107         {
108                 /// XXX
109                 // ALERT: Possible problem here if m_indexrowsizebytes > 1 as pNumChains is a unsigned char.
110                 unsigned int NumChainsInRow = (unsigned int)*(pNumChains + indexRow * m_indexrowsizebytes);
111                 if(m_indexrowsizebytes > 1)
112                 {
113                         //XXX Have to find a solution to this problem
114                         printf( "FATAL: m_indexrowsizebytes > 1: %d\n", m_indexrowsizebytes ); 
115                         exit(2);
116                 }
117                 if(i + NumChainsInRow > m_chainPosition)
118                 {
119                         curRowPosition = m_chainPosition - i;
120                         break; // The current position is somewhere within this prefix
121                 }
122                 indexRow++;             
123                 i += NumChainsInRow;
124         }
125         
126         uint64 chainrow = 0; // Buffer to store a single read chain
127         unsigned int chainsProcessed = 0; // Number of chains processed
128
129         // XXX: same problem with unsigned char here.
130         unsigned int NumChainsInRow = *(pNumChains + indexRow);
131         while(chainsProcessed < numChains && fread(&chainrow, 1, m_chainsizebytes, m_pFile) == m_chainsizebytes)
132         {
133                 if(curRowPosition >= NumChainsInRow)
134                 { // Skip to next index row position
135                         indexRow++;
136                         curRowPosition = 0;
137                         NumChainsInRow = *(pNumChains + indexRow);
138                 }
139                 while(NumChainsInRow == 0) // We skip forward until we hit a index with > 0 chains
140                 {
141                         indexRow++;
142                         NumChainsInRow = *(pNumChains + indexRow);
143                         curRowPosition = 0;
144                 }
145                 // Load the starting point from the data
146                 pData[chainsProcessed].nIndexS = chainrow << ( 64 - m_pHeader->rti_startptlength );
147                 pData[chainsProcessed].nIndexS = pData[chainsProcessed].nIndexS >> ( 64 - m_pHeader->rti_startptlength );
148
149                 // Load the ending point prefix 
150                 pData[chainsProcessed].nIndexE = ( m_pHeader->prefixstart + indexRow ) << m_pHeader->rti_endptlength;
151                 // Append the ending point suffix
152 #if defined(_WIN32) && !defined(__GNUC__)
153                 pData[chainsProcessed].nIndexE |= (chainrow & (0xFFFFFFFFFFFFFFFFI64 >> m_pHeader->rti_cplength)) >> m_pHeader->rti_startptlength;
154 #else
155                 pData[chainsProcessed].nIndexE |= (chainrow & (0xFFFFFFFFFFFFFFFFllu >> m_pHeader->rti_cplength)) >> m_pHeader->rti_startptlength;
156 #endif
157                 //pData[chainsProcessed].nCheckPoint = (chainrow >> m_pHeader->rti_startptlength + m_pHeader->rti_endptlength);
158                 curRowPosition++;
159                 chainsProcessed++;
160         }
161         numChains = chainsProcessed;
162         m_chainPosition += numChains;
163         return 0;
164 }