private void DecryptWorkerDoWork(object sender, DoWorkEventArgs e) { TimeSpan ts; const int timeSlice = 50; const int nrOfSpeedMeasurements = 50; ulong passwordCount = 0, prevPasswordCount = 0; object[] args = (object[])e.Argument; IDecryptor decryptor = DecryptorFactory.Get((EncryptionRecord)args[0]); IPasswordIterator passwordIterator = (IPasswordIterator)args[1]; ValidationMode validationMode = (ValidationMode)args[2]; IMovingAverage avg = new SimpleMovingAverage(nrOfSpeedMeasurements); PasswordValidity passwordValidity = PasswordValidity.Invalid; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string currentPassword = passwordIterator.GetNextPassword(); while (!string.IsNullOrEmpty(currentPassword) && validationMode != ValidationMode.None && !decryptBackgroundWorker.CancellationPending) { passwordValidity = decryptor.ValidatePassword(currentPassword, validationMode); passwordCount++; ts = stopWatch.Elapsed; if (ts.Milliseconds > timeSlice || passwordValidity != PasswordValidity.Invalid) { avg.AddSample((60000 * (passwordCount - prevPasswordCount)) / ((ulong)ts.Milliseconds + 1)); //Avoid div by zero decryptBackgroundWorker.ReportProgress(0, new object[] { passwordValidity, currentPassword, (ulong)avg.Average, passwordCount }); prevPasswordCount = passwordCount; stopWatch.Restart(); if ((passwordValidity & PasswordValidity.OwnerPasswordIsValid) == PasswordValidity.OwnerPasswordIsValid) { validationMode &= ~ValidationMode.ValidateOwnerPassword; } if ((passwordValidity & PasswordValidity.UserPasswordIsValid) == PasswordValidity.UserPasswordIsValid) { validationMode &= ~ValidationMode.ValidateUserPassword; } } currentPassword = passwordIterator.GetNextPassword(); } if (decryptBackgroundWorker.CancellationPending) { e.Cancel = true; } else { e.Result = passwordCount; } }
private void OnDecryptCmdExecute() { Status = string.Empty; ClearAllErrors(); if (SelectedFile == null) { Status = "Please select a PDF file to decrypt."; SetErrors("SelectedFile", new List <ValidationResult>() { new ValidationResult(false, Status) }); } else if (!SelectedFile.EncryptionRecordInfo.isEncrypted) { Status = "No encryption dictionary found in PDF."; } else if (!SelectedFile.OwnerPasswordIsSet && !SelectedFile.UserPasswordIsSet) { Status = "Both the User password and the Owner password are empty."; } else if (ValidationModeRequested == ValidationMode.None) { Status = "Please select the password you want to recover."; SetErrors("ValidationModeRequested", new List <ValidationResult>() { new ValidationResult(false, Status) }); } else if ((ValidationModeRequested & ValidationMode.ValidateOwnerPassword) == ValidationMode.ValidateOwnerPassword && (ValidationModeRequested & ValidationMode.ValidateUserPassword) == ValidationMode.ValidateUserPassword && !string.IsNullOrEmpty(SelectedFile.RecoveredOwnerPassword) && !string.IsNullOrEmpty(SelectedFile.RecoveredUserPassword)) { Status = "The requested passwords are already recovered."; } else if ((ValidationModeRequested == ValidationMode.ValidateOwnerPassword && !string.IsNullOrEmpty(SelectedFile.RecoveredOwnerPassword)) || ((ValidationModeRequested == ValidationMode.ValidateUserPassword && !string.IsNullOrEmpty(SelectedFile.RecoveredUserPassword)))) { Status = "The requested password is already recovered."; } else if (SelectedTabItem is ITabViewModel) { string errormsg = string.Empty; IPasswordIterator passwordIterator = SelectedTabItem.PasswordIterator; if (passwordIterator.Initialize(SelectedFile.EncryptionRecordInfo.PasswordCharset, SelectedFile.EncryptionRecordInfo.MaxPasswordSize, ref errormsg) == Constants.Success) { IsBusy = true; CurrentPassword = string.Empty; passwordIterator.PasswordCasing = PasswordCasing; passwordIterator.RemoveWhitespace = RemoveWhitespace; decryptBackgroundWorker.RunWorkerAsync(new object[] { SelectedFile.EncryptionRecordInfo, passwordIterator, ValidationModeRequested }); } else { SetErrors("SelectedTabItem", new List <ValidationResult>() { new ValidationResult(false, errormsg) }); Status = errormsg; } } }