@NonNull
  public OperationResult execute(ChangeUnlockParcel unlockParcel, CryptoInputParcel cryptoInput) {
    OperationResult.OperationLog log = new OperationResult.OperationLog();
    log.add(OperationResult.LogType.MSG_ED, 0);

    if (unlockParcel == null || unlockParcel.mMasterKeyId == null) {
      log.add(OperationResult.LogType.MSG_ED_ERROR_NO_PARCEL, 1);
      return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
    }

    // Perform actual modification
    PgpEditKeyResult modifyResult;
    {
      PgpKeyOperation keyOperations =
          new PgpKeyOperation(new ProgressScaler(mProgressable, 0, 70, 100));

      try {
        log.add(
            OperationResult.LogType.MSG_ED_FETCHING,
            1,
            KeyFormattingUtils.convertKeyIdToHex(unlockParcel.mMasterKeyId));

        CanonicalizedSecretKeyRing secRing =
            mProviderHelper.getCanonicalizedSecretKeyRing(unlockParcel.mMasterKeyId);
        modifyResult = keyOperations.modifyKeyRingPassphrase(secRing, cryptoInput, unlockParcel);

        if (modifyResult.isPending()) {
          // obtain original passphrase from user
          log.add(modifyResult, 1);
          return new EditKeyResult(log, modifyResult);
        }
      } catch (ProviderHelper.NotFoundException e) {
        log.add(OperationResult.LogType.MSG_ED_ERROR_KEY_NOT_FOUND, 2);
        return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
      }
    }

    log.add(modifyResult, 1);

    if (!modifyResult.success()) {
      // error is already logged by modification
      return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
    }

    // Cannot cancel from here on out!
    mProgressable.setPreventCancel();

    // It's a success, so this must be non-null now
    UncachedKeyRing ring = modifyResult.getRing();

    SaveKeyringResult saveResult =
        mProviderHelper.saveSecretKeyRing(ring, new ProgressScaler(mProgressable, 70, 95, 100));
    log.add(saveResult, 1);

    // If the save operation didn't succeed, exit here
    if (!saveResult.success()) {
      return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
    }

    updateProgress(R.string.progress_done, 100, 100);
    log.add(OperationResult.LogType.MSG_ED_SUCCESS, 0);
    return new EditKeyResult(EditKeyResult.RESULT_OK, log, ring.getMasterKeyId());
  }