Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Nikolay85  
#1 Оставлено : 25 октября 2021 г. 17:35:07(UTC)
Nikolay85

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.10.2021(UTC)
Сообщений: 6
Российская Федерация

Добрый вечер. Возникли проблемы с отменой расшифровки:
В одном потоке вызываю EnvelopedSignature.decrypt
Код:

mIs = new ByteArrayInputStream(buff);
mOs = new ByteArrayOutputStream();
mEnvelopedSignature.set(new EnvelopedSignature(mIs));
mEnvelopedSignature.get().decrypt(certConEx.x509Cert(), privKey, mOs);

Из другого потока пытаюсь прервать расшифроку, вызвав close:
Код:

EnvelopedSignature es = mEnvelopedSignature.get();
if (es != null) {
  try {
    Log.d(TAG, "cancel: closing is");
    mIs.close();
    Log.d(TAG, "cancel: closing os");
    mOs.close();
    Log.d(TAG, "cancel: closing es");
    es.close();
  }
  catch (Exception ex) {
      Log.d(TAG, "cancel: caught exception: ", ex);
  }
}

Но никакого эффекта нет. Не подскажите, что я делаю не так? В последнем случае(es.close()) вылетает NullPointerException:
Цитата:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean ru.CryptoPro.CAdES.pc_1.cl_1.a()' on a null object reference
at ru.CryptoPro.CAdES.EnvelopedSignature.close(Unknown Source:5)
at com.ncloudtech.crypto.gost.CmsEnvelopeManager.cancel(CmsEnvelopeManager.java:351)
...
Offline Nikolay85  
#2 Оставлено : 26 октября 2021 г. 11:29:20(UTC)
Nikolay85

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.10.2021(UTC)
Сообщений: 6
Российская Федерация

Не подскажите вообще такой функционал есть по отмене decrypt/verify у EnvelopedSignature? Если нет, то что тогда использовать?
Offline Александр Лавник  
#3 Оставлено : 27 октября 2021 г. 13:26:51(UTC)
Александр Лавник

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 30.06.2016(UTC)
Сообщений: 3,376
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 773 раз в 715 постах
Вопрос рассматривается в рамках обращения № 42129 на портале технической поддержки.
Техническую поддержку оказываем тут
Наша база знаний
Offline Nikolay85  
#4 Оставлено : 27 октября 2021 г. 14:18:38(UTC)
Nikolay85

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.10.2021(UTC)
Сообщений: 6
Российская Федерация

Спасибо. А я как-то могу отследить это обращение или ответ в тему придет?
Offline Александр Лавник  
#5 Оставлено : 27 октября 2021 г. 14:40:55(UTC)
Александр Лавник

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 30.06.2016(UTC)
Сообщений: 3,376
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 773 раз в 715 постах
Автор: Nikolay85 Перейти к цитате
Спасибо. А я как-то могу отследить это обращение или ответ в тему придет?
Результат общения в обращении продублируем здесь.
Техническую поддержку оказываем тут
Наша база знаний
Offline Nikolay85  
#6 Оставлено : 27 октября 2021 г. 14:43:36(UTC)
Nikolay85

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.10.2021(UTC)
Сообщений: 6
Российская Федерация

Больше спасибо!
Offline Евгений Афанасьев  
#7 Оставлено : 27 октября 2021 г. 20:19:00(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
close() для ByteArrayInputStream и ByteArrayOutputStream пустой в отличие, например, от FileInputStream. А close() у EnvelopedSignature предусмотрен только для зашифрования. Поэтому конкретно в данном примере расшифрование будет выполняться до конца.
Offline Nikolay85  
#8 Оставлено : 27 октября 2021 г. 21:14:13(UTC)
Nikolay85

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.10.2021(UTC)
Сообщений: 6
Российская Федерация

Добрый вечер. А какой-то механизм предусмотрен, чтобы прервать EnvelopedSignature.decrypt? Вижу, что нет перегрузки с CancellationToken и close соответственно тоже не работает. Было бы неплохо добавить такой функционал, т.к. получается невозможно принудительно завершить поток, это критично для мобильных устройств.
Offline Евгений Афанасьев  
#9 Оставлено : 27 октября 2021 г. 21:45:57(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Фактически обращение к криптографическим операциям для расшифрования выполняется внутри bouncycastle его парсером, а так как входящий/исходящий потоки не имеют рабочего close или иного механизма прерывания, прервать выполнение нельзя. Попробуйте добавить его:
Код:

class FailOnCloseByteArrayInputStream extends ByteArrayInputStream {

  private boolean stop = false;

  public FailOnCloseByteArrayInputStream(byte[] buf) {
    super(buf);
  }

  @Override
  public int read() {
    if (stop) throw new RuntimeException("Stopped.");
    return super.read();
  }

  @Override
  public int read(byte b[], int off, int len) {
    if (stop) throw new RuntimeException("Stopped.");
    return super.read(b, off, len);
  }

  public void close() throws IOException {
    stop = true;
  }

}
...
FailOnCloseByteArrayInputStream mIs = new FailOnCloseByteArrayInputStream(encrypted);
mEnvelopedSignature.set(new EnvelopedSignature(mIs));
...
// для прерывания в другом месте позвать
mIs.close();
Offline Nikolay85  
#10 Оставлено : 28 октября 2021 г. 12:33:11(UTC)
Nikolay85

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.10.2021(UTC)
Сообщений: 6
Российская Федерация

Спасибо, все отлично работает после переопределения ByteArrayInputStream.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.