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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline МайндпассСемен  
#1 Оставлено : 7 августа 2014 г. 16:18:16(UTC)
МайндпассСемен

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Получается следующая ошибка:
java.lang.NullPointerException: invalid null input

Код:

        byte[] sign;
        try
        {
            X509Certificate certificate;
            PrivateKey privateKey;
            KeyStore ks = KeyStore.getInstance(JCSP.HD_STORE_NAME, JCSP.PROVIDER_NAME);
            ks.load(null, null);

            int i = 0;
            String aliasName = null;
            Enumeration<String> enu = ks.aliases();
            while (enu.hasMoreElements())
            {
                aliasName = enu.nextElement();
                if (i == certNum)
                {
                    break;
                }
                i++;
            }
            if (i == ks.size())
            {
                return null;
            }

            KeyStore.ProtectionParameter protectedParam =
                    new KeyStore.PasswordProtection(pin.toCharArray());

            KeyStore.Entry entryO = ks.getEntry(aliasName, protectedParam); /// <- вот здесь выбрасывают исключение
 ...
         } catch (Exception e)
         {
         }        

При этом ks.aliases очевидно не пуст
Как такую ошибку интерпретировать и исправить?

UPD:
Версия SDK и ACSP.apk на устройстве: 2.0.37363

Отредактировано пользователем 7 августа 2014 г. 16:19:05(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 7 августа 2014 г. 16:20:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Возможно, в контейнере нет сертификата.
Offline МайндпассСемен  
#3 Оставлено : 7 августа 2014 г. 16:23:25(UTC)
МайндпассСемен

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
А как это проверить/поправить.
Что такое тогда alias и как перечислить только те из них, которые содержат ключевую пару?
Offline Евгений Афанасьев  
#4 Оставлено : 7 августа 2014 г. 19:42:42(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Алиас - название контейнера. Попробуйте использовать getKey() и getCertificate().
Offline МайндпассСемен  
#5 Оставлено : 16 октября 2014 г. 15:08:55(UTC)
МайндпассСемен

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Продолжает падать, исключение не выдает:
Код:

					  KeyStore ks = KeyStore.getInstance(JCSP.HD_STORE_NAME, JCSP.PROVIDER_NAME);
            ks.load(null, null);

            if (aliasName == null || aliasName.isEmpty())
            {
                throw new ModuleException(303, "Cert not found");
            }

            Key entryO = ks.getKey(aliasName, pin.toCharArray());
            certificate = (X509Certificate) ks.getCertificate(aliasName);
            privateKey = (PrivateKey) entryO;


            if (privateKey == null || certificate == null)
            {
                throw new Exception("Private key or/and certificate is null.");
            }
            else
            {
                Log.i(TAG, "Certificate: " + certificate.getSubjectDN());
            }

            final String privateKeyAlgorithm = privateKey.getAlgorithm();
            String signAlgorithm = JCP.GOST_EL_SIGN_NAME;

            Signature sn = Signature.getInstance(signAlgorithm, JCSP.PROVIDER_NAME);
            sn.initSign(privateKey);
            sn.update(data);
            sign = sn.sign(); //Тут падает в JNI
  

Стэк ошибки:
Код:

  10-16 14:44:11.255: WARN/dalvikvm(28480): JNI WARNING: JNI method called with exception pending
10-16 14:44:11.255: WARN/dalvikvm(28480): in Lru/CryptoPro/JCSP/MSCAPI/CAPI;.cryptSignHash:(JILjava/lang/String;I[B[I)I (CallIntMethodV)
10-16 14:44:11.255: WARN/dalvikvm(28480): Pending exception is:
10-16 14:44:11.255: INFO/dalvikvm(28480): java.lang.NullPointerException:
10-16 14:44:11.255: INFO/dalvikvm(28480): at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)
10-16 14:44:11.255: INFO/dalvikvm(28480): at android.app.AlertDialog.<init>(AlertDialog.java:98)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.tools.common.window.CSPDialog.<init>((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.tools.common.window.CSPPin.<init>((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.MSCAPI.CAPI.cryptSignHash(Native Method)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.MSCAPI.j.a((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.MSCAPI.i.b((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.MSCAPI.b.a((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.Key.AbstractKeySpec.signature((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.Sign.CryptoProSign.engineSign((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.CryptoPro.JCSP.Sign.JCSPGostElSign.engineSign((null):-1)
10-16 14:44:11.255: INFO/dalvikvm(28480): at java.security.Signature.sign(Signature.java:318)
10-16 14:44:11.255: INFO/dalvikvm(28480): at ru.mindpass.android.cryptopro.CryptoProModule.getSign(CryptoProModule.java:196)

Похоже, криптобиблиотеки зачем-то понадобился гуй, хотя она в фоновом таске, в соответствии с Best Practices по поводу рабочих потоков
Offline Евгений Афанасьев  
#6 Оставлено : 16 октября 2014 г. 17:05:05(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
В CSPConfig есть функция registerActivityContext, ее следует вызвать при смене activity и передавать ей контекст activity для отображения диалоговых окон.
Offline МайндпассСемен  
#7 Оставлено : 22 октября 2014 г. 18:20:56(UTC)
МайндпассСемен

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Все еще падает из AsyncTask внутри сервиса
Код:

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.app.Dialog.<init>(Dialog.java:107)
at android.app.AlertDialog.<init>(AlertDialog.java:114)
at android.app.AlertDialog.<init>(AlertDialog.java:98)
at ru.CryptoPro.JCSP.tools.common.window.CSPDialog.<init>(Unknown Source)
at ru.CryptoPro.JCSP.tools.common.window.CSPPin.<init>(Unknown Source)
at ru.CryptoPro.JCSP.MSCAPI.CAPI.cryptSignHash(Native Method)


Если же предоставить Looper - то сервис зависает "наглухо"
Если в качестве контекста передать не Activity, а сам Service - то получаю сообщение о неправильном токене

Отредактировано пользователем 22 октября 2014 г. 19:24:41(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 23 октября 2014 г. 18:14:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Автор: МайндпассСемен Перейти к цитате

Если же предоставить Looper - то сервис зависает "наглухо"
Если в качестве контекста передать не Activity, а сам Service - то получаю сообщение о неправильном токене

Спасибо, проверим.

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