Статус: Новичок
Группы: Участники
Зарегистрирован: 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) ...
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.10.2021(UTC) Сообщений: 6
|
Не подскажите вообще такой функционал есть по отмене decrypt/verify у EnvelopedSignature? Если нет, то что тогда использовать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,403 Сказал «Спасибо»: 53 раз Поблагодарили: 779 раз в 721 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.10.2021(UTC) Сообщений: 6
|
Спасибо. А я как-то могу отследить это обращение или ответ в тему придет?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,403 Сказал «Спасибо»: 53 раз Поблагодарили: 779 раз в 721 постах
|
Автор: Nikolay85 Спасибо. А я как-то могу отследить это обращение или ответ в тему придет? Результат общения в обращении продублируем здесь. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.10.2021(UTC) Сообщений: 6
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,927 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Здравствуйте. close() для ByteArrayInputStream и ByteArrayOutputStream пустой в отличие, например, от FileInputStream. А close() у EnvelopedSignature предусмотрен только для зашифрования. Поэтому конкретно в данном примере расшифрование будет выполняться до конца. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.10.2021(UTC) Сообщений: 6
|
Добрый вечер. А какой-то механизм предусмотрен, чтобы прервать EnvelopedSignature.decrypt? Вижу, что нет перегрузки с CancellationToken и close соответственно тоже не работает. Было бы неплохо добавить такой функционал, т.к. получается невозможно принудительно завершить поток, это критично для мобильных устройств.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,927 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Фактически обращение к криптографическим операциям для расшифрования выполняется внутри 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();
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.10.2021(UTC) Сообщений: 6
|
Спасибо, все отлично работает после переопределения ByteArrayInputStream.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close