void CAbstractFile::LoadComment() { CIni ini(thePrefs.GetFileCommentsFilePath(), md4str(GetFileHash())); m_strComment = ini.GetStringUTF8(_T("Comment")).Left(MAXFILECOMMENTLEN); m_uRating = ini.GetInt(_T("Rate"), 0); m_bCommentLoaded = true; }
bool FBuildPatchAppManifest::GetFileHash(const FGuid& FileGuid, FSHAHashData& OutHash) const { const FString* const * FoundFilename = FileNameLookup.Find(FileGuid); if (FoundFilename) { return GetFileHash(**FoundFilename, OutHash); } return false; }
uint32 CModInfoManager::GetDirectoryHash( const char *pPath ) { if (!gEnv || !gEnv->pCryPak) { assert(0); return 0; } ICryPak* pCryPak = gEnv->pCryPak; // Recursively find all files and hash them uint32 result = 0; CryStackStringT<char, _MAX_PATH*2> searchPath; searchPath.Format("%s\\*", pPath); _finddata_t fd; intptr_t h = pCryPak->FindFirst(searchPath.c_str(), &fd, 0, true); if (h != -1) { CryStackStringT<char, _MAX_PATH*2> path; do { if ((fd.attrib & _A_SUBDIR) == 0) { // Add to checksum uint32 fileHash = 0; CryStackStringT<char, _MAX_PATH*2> modPath; modPath.Format("%s\\%s", pPath, fd.name); if (GetFileHash(modPath.c_str(), fileHash)) { result += fileHash; } continue; } if (strcmp(fd.name, ".") == 0 || strcmp(fd.name, "..") == 0) continue; path = pPath; path += "\\"; path += fd.name; result += GetDirectoryHash(path.c_str()); } while(0 == pCryPak->FindNext(h, &fd)); pCryPak->FindClose (h); } return result; }
int main(int argc, char *argv[]) { HANDLE signf = 0; HANDLE signmmf = 0; PBYTE signdata = NULL; LARGE_INTEGER signsz = {.QuadPart = 0}; void *keyblob = NULL; unsigned char err = 1; HCRYPTPROV prov; HCRYPTKEY key; HCRYPTHASH hash = 0; if (argc != 3) { fputs("Usage: lab2sign <input file> <output file>", stderr); return -1; } crash_if(!CryptAcquireContext(&prov, "lab2", MS_ENHANCED_PROV, PROV_RSA_FULL, 0), "Can't acquire crypt context."); hash = GetFileHash(prov, argv[1]); signf = CreateFileA(argv[2], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); signmmf = CreateFileMappingA(signf, NULL, PAGE_READONLY, 0, 0, NULL); crash_if(!signmmf, "Can't open memory mapped file."); GetFileSizeEx(signf, &signsz); signdata = MapViewOfFile(signmmf, FILE_MAP_READ, 0, 0, 0); crash_if(!signdata, "Can't map view of file."); crash_if(!CryptGetUserKey(prov, AT_SIGNATURE, &key), "Can't acquire signature key."); if (CryptVerifySignature(hash, signdata, signsz.LowPart, key, NULL, 0)) { printf("Signature matches.\n"); err = 0; } else { printf("Signature mismatch.\n"); } err: apply_not_null(signdata, UnmapViewOfFile); apply_not_null(signmmf, CloseHandle); apply_not_null(signf, CloseHandle); apply_not_null(keyblob, free); apply_not_null(hash, CryptDestroyHash) if (err) return -1; return 0; }
CPacket* CKnownFile::CreateSrcInfoPacket(const CUpDownClient* forClient, uint8 byRequestedVersion, uint16 nRequestedOptions) { // Kad reviewed if (m_ClientUploadList.empty()) { return NULL; } if ((((CKnownFile*)forClient->GetRequestFile() != this) && ((CKnownFile*)forClient->GetUploadFile() != this)) || forClient->GetUploadFileID() != GetFileHash()) { wxString file1 = _("Unknown"); if (forClient->GetRequestFile() && forClient->GetRequestFile()->GetFileName().IsOk()) { file1 = forClient->GetRequestFile()->GetFileName().GetPrintable(); } else if (forClient->GetUploadFile() && forClient->GetUploadFile()->GetFileName().IsOk()) { file1 = forClient->GetUploadFile()->GetFileName().GetPrintable(); } wxString file2 = _("Unknown"); if (GetFileName().IsOk()) { file2 = GetFileName().GetPrintable(); } AddDebugLogLineM(false, logKnownFiles, wxT("File missmatch on source packet (K) Sending: ") + file1 + wxT(" From: ") + file2); return NULL; } const BitVector& rcvstatus = forClient->GetUpPartStatus(); bool SupportsUploadChunksState = !rcvstatus.empty(); //wxASSERT(rcvstatus.size() == GetPartCount()); // Obviously! if (rcvstatus.size() != GetPartCount()) { // Yuck. Same file but different part count? Seriously f****d up. AddDebugLogLineM(false, logKnownFiles, CFormat(wxT("Impossible situation: different partcounts for the same known file: %i (client) and %i (file)")) % rcvstatus.size() % GetPartCount()); return NULL; } CMemFile data(1024); uint8 byUsedVersion; bool bIsSX2Packet; if (forClient->SupportsSourceExchange2() && byRequestedVersion > 0){ // the client uses SourceExchange2 and requested the highest version he knows // and we send the highest version we know, but of course not higher than his request byUsedVersion = std::min(byRequestedVersion, (uint8)SOURCEEXCHANGE2_VERSION); bIsSX2Packet = true; data.WriteUInt8(byUsedVersion); // we don't support any special SX2 options yet, reserved for later use if (nRequestedOptions != 0) { AddDebugLogLineM(false, logKnownFiles, CFormat(wxT("Client requested unknown options for SourceExchange2: %u")) % nRequestedOptions); } } else { byUsedVersion = forClient->GetSourceExchange1Version(); bIsSX2Packet = false; if (forClient->SupportsSourceExchange2()) { AddDebugLogLineM(false, logKnownFiles, wxT("Client which announced to support SX2 sent SX1 packet instead")); } } uint16 nCount = 0; data.WriteHash(forClient->GetUploadFileID()); data.WriteUInt16(nCount); uint32 cDbgNoSrc = 0; SourceSet::iterator it = m_ClientUploadList.begin(); for ( ; it != m_ClientUploadList.end(); it++ ) { const CUpDownClient *cur_src = *it; if ( cur_src->HasLowID() || cur_src == forClient || !( cur_src->GetUploadState() == US_UPLOADING || cur_src->GetUploadState() == US_ONUPLOADQUEUE)) { continue; } bool bNeeded = false; if ( SupportsUploadChunksState ) { const BitVector& srcstatus = cur_src->GetUpPartStatus(); if ( !srcstatus.empty() ) { //wxASSERT(srcstatus.size() == GetPartCount()); // Obviously! if (srcstatus.size() != GetPartCount()) { continue; } if ( cur_src->GetUpPartCount() == forClient->GetUpPartCount() ) { for (int x = 0; x < GetPartCount(); x++ ) { if ( srcstatus.at(x) && !rcvstatus.at(x) ) { // We know the receiving client needs // a chunk from this client. bNeeded = true; break; } } } } else { cDbgNoSrc++; // This client doesn't support upload chunk status. // So just send it and hope for the best. bNeeded = true; } } else { // remote client does not support upload chunk status, // search sources which have at least one complete part // we could even sort the list of sources by available // chunks to return as much sources as possible which // have the most available chunks. but this could be // a noticeable performance problem. const BitVector& srcstatus = cur_src->GetUpPartStatus(); if ( !srcstatus.empty() ) { //wxASSERT(srcstatus.size() == GetPartCount()); if (srcstatus.size() != GetPartCount()) { continue; } for (int x = 0; x < GetPartCount(); x++ ) { if ( srcstatus.at(x) ) { // this client has at least one chunk bNeeded = true; break; } } } else { // This client doesn't support upload chunk status. // So just send it and hope for the best. bNeeded = true; } } if ( bNeeded ) { nCount++; uint32 dwID; if(byUsedVersion >= 3) { dwID = cur_src->GetUserIDHybrid(); } else { dwID = cur_src->GetIP(); } data.WriteUInt32(dwID); data.WriteUInt16(cur_src->GetUserPort()); data.WriteUInt32(cur_src->GetServerIP()); data.WriteUInt16(cur_src->GetServerPort()); if (byUsedVersion >= 2) { data.WriteHash(cur_src->GetUserHash()); } if (byUsedVersion >= 4){ // CryptSettings - SourceExchange V4 // 5 Reserved (!) // 1 CryptLayer Required // 1 CryptLayer Requested // 1 CryptLayer Supported const uint8 uSupportsCryptLayer = cur_src->SupportsCryptLayer() ? 1 : 0; const uint8 uRequestsCryptLayer = cur_src->RequestsCryptLayer() ? 1 : 0; const uint8 uRequiresCryptLayer = cur_src->RequiresCryptLayer() ? 1 : 0; const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0); data.WriteUInt8(byCryptOptions); } if (nCount > 500) { break; } } } if (!nCount) { return 0; } data.Seek(bIsSX2Packet ? 17 : 16, wxFromStart); data.WriteUInt16(nCount); CPacket* result = new CPacket(data, OP_EMULEPROT, bIsSX2Packet ? OP_ANSWERSOURCES2 : OP_ANSWERSOURCES); if ( result->GetPacketSize() > 354 ) { result->PackPacket(); } return result; }