int main(int argc, char* argv[]) { if (argc != 3) { Logo(); printf("usage: rtdump rainbow_table_pathname rainbow_chain_index\n"); return 0; } string sPathName = argv[1]; int nRainbowChainIndex = atoi(argv[2]); int nRainbowChainLen, nRainbowChainCount; if (!CChainWalkContext::SetupWithPathName(sPathName, nRainbowChainLen, nRainbowChainCount)) return 0; if (nRainbowChainIndex < 0 || nRainbowChainIndex > nRainbowChainCount - 1) { printf("valid rainbow chain index range: 0 - %d\n", nRainbowChainCount - 1); return 0; } // Open file FILE* file = fopen(sPathName.c_str(), "rb"); if (file == NULL) { printf("failed to open %s\n", sPathName.c_str()); return 0; } // Dump if (GetFileLen(file) != nRainbowChainCount * 16) printf("rainbow table size check fail\n"); else { // Read required chain RainbowChain chain; fseek(file, nRainbowChainIndex * 16, SEEK_SET); fread(&chain, 1, 16, file); // Dump required chain CChainWalkContext cwc; cwc.SetIndex(chain.nIndexS); int nPos; for (nPos = 0; nPos < nRainbowChainLen - 1; nPos++) { cwc.IndexToPlain(); cwc.PlainToHash(); printf("#%-4d %s %s %s\n", nPos, uint64tohexstr(cwc.GetIndex()).c_str(), cwc.GetPlainBinary().c_str(), cwc.GetHash().c_str()); cwc.HashToIndex(nPos); } printf("#%-4d %s\n", nPos, uint64tohexstr(cwc.GetIndex()).c_str()); if (cwc.GetIndex() != chain.nIndexE) printf("\nwarning: rainbow chain integrity check fail!\n"); } // Close file fclose(file); return 0; }
void rcrackiThread::CheckAlarmO() { uint32_t i; if(cudaDevId < 0) { for (i = 0; i < t_pChainsFoundO.size(); i++) { RainbowChainO* t_pChain = t_pChainsFoundO[i]; int t_nGuessedPos = t_nGuessedPoss[i]; CChainWalkContext cwc; uint64_t nIndexS = t_pChain->nIndexS; cwc.SetIndex(nIndexS); int nPos; for (nPos = 0; nPos < t_nGuessedPos; nPos++) { cwc.IndexToPlain(); cwc.PlainToHash(); cwc.HashToIndex(nPos); } cwc.IndexToPlain(); cwc.PlainToHash(); if (cwc.CheckHash(t_pHash)) { t_Hash = cwc.GetHash(); t_Plain = cwc.GetPlain(); t_Binary = cwc.GetBinary(); foundHash = true; break; } else { foundHash = false; t_nChainWalkStepDueToFalseAlarm += t_nGuessedPos + 1; t_nFalseAlarm++; } } } #if GPU else { uint64_t *calcBuff = new uint64_t[2*cudaBuffCount]; CudaCWCExtender ex(&t_cwc); rcuda::RCudaTask cuTask; int nGuessedPos, nMaxGuessedPos; int ii, calcSize; size_t chainSize; ex.Init(); chainSize = t_pChainsFoundO.size(); foundHash = false; for(i = 0; !foundHash && i < chainSize; ) { calcSize = std::min<int>(i + cudaBuffCount, chainSize); nMaxGuessedPos = 0; for(ii = i; ii < calcSize; ii++) { calcBuff[(ii<<1)] = t_pChainsFoundO[ii]->nIndexS; nGuessedPos = t_nGuessedPoss[ii]; calcBuff[(ii<<1)+1] = (unsigned int)nGuessedPos; nMaxGuessedPos = (nMaxGuessedPos>=nGuessedPos? nMaxGuessedPos : nGuessedPos); } calcSize -= i; cuTask.hash = ex.GetHash(); cuTask.startIdx = i; cuTask.idxCount = calcSize; cuTask.dimVec = ex.GetPlainDimVec(); cuTask.dimVecSize = ex.GetPlainDimVecSize()/2; cuTask.charSet = ex.GetCharSet(); cuTask.charSetSize = ex.GetCharSetSize(); cuTask.reduceOffset = ex.GetReduceOffset(); cuTask.plainSpaceTotal = ex.GetPlainSpaceTotal(); cuTask.rainbowChainLen = nMaxGuessedPos; cuTask.kernChainSize = cudaChainSize; cuTask.targetHash = t_pHash; calcSize = rcuda::CheckAlarmOnCUDA(&cuTask, calcBuff); if(calcSize > 0 && calcSize == cuTask.idxCount) { for(ii = 0; ii < calcSize; ii++) { if(calcBuff[(ii<<1)|1] >= (1ull<<63)) { CChainWalkContext cwc; cwc.SetIndex(calcBuff[ii<<1]); cwc.IndexToPlain(); cwc.PlainToHash(); t_Hash = cwc.GetHash(); t_Plain = cwc.GetPlain(); t_Binary = cwc.GetBinary(); foundHash = true; break; } else { t_nChainWalkStepDueToFalseAlarm += calcBuff[(ii<<1)|1] + 1; t_nFalseAlarm++; } } i += calcSize; } else { printf("CheckAlarmO() on CUDA failed!\n"); exit(101); } } delete [] calcBuff; } #endif }