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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline YuriyI  
#1 Оставлено : 8 мая 2018 г. 18:52:08(UTC)
YuriyI

Статус: Активный участник

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

Сказал(а) «Спасибо»: 3 раз
Доброго времени суток.
Пытаюсь верифицировать подписанные данные на основе внешнего сертификата.
Код:
        private byte[] verify(byte[] data, final X509Certificate senderCert) {

        //Читаем и проверяем содержимое
//        final ru.CryptoPro.JCP.tools.Decoder decoder = new ru.CryptoPro.JCP.tools.Decoder();
//        byte[] decData;
//        try {
//            decData = decoder.decodeBuffer(new ByteArrayInputStream(data));
//        } catch (IOException e) {
//            throw new RuntimeException("Input read error.");
//        }
//
//        final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(decData);
        final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(data);
        final ContentInfo all = new ContentInfo();
        try {
            all.decode(asnBuf);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't read input data.");
        }

        if (!new OID(STR_CMS_OID_SIGNED).eq(all.contentType.value)) {
            throw new RuntimeException("Not supported");
        } // if

        final SignedData cms = (SignedData) all.content;
        final byte[] text;

        if (cms.encapContentInfo.eContent != null) {
            text = cms.encapContentInfo.eContent.value;
        } else {
            throw new RuntimeException("No content for verify");
        }


        OID digestOid = null;
        final DigestAlgorithmIdentifier digestAlgorithmIdentifier =
                new DigestAlgorithmIdentifier(new OID(DIGEST_OID).value);

        for (int i = 0; i < cms.digestAlgorithms.elements.length; i++) {
            if (cms.digestAlgorithms.elements[i].algorithm
                    .equals(digestAlgorithmIdentifier.algorithm)) {
                digestOid = new OID(cms.digestAlgorithms.elements[i].algorithm.value);
                break;
            } // if
        } // for

        if (digestOid == null) {
            throw new RuntimeException("Unknown digest");
        } // if

        X509Certificate cert;

        if (senderCert != null) {
            cert = senderCert;
        } else if (cms.certificates != null) {

            //Проверка на вложенном сертификате
            final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
            try {
                cms.certificates.elements[0].encode(encBuf);
            } catch (Exception e) {
                throw new RuntimeException("Couldn't encode data on EncodeBuffer.");
            }

            try {
                final CertificateFactory cf = CertificateFactory.getInstance("X.509");
                cert = (X509Certificate) cf.generateCertificate(encBuf.getInputStream());
            } catch (Exception e) {
                throw new RuntimeException("Couldn't recreate certificate from cms.");
            }
        } else {
            throw new RuntimeException("Certificate not found!");
        }
        final SignerInfo info = cms.signerInfos.elements[0];
        if (!digestOid.equals(new OID(info.digestAlgorithm.algorithm.value))) {
            throw new RuntimeException("Not signed on certificate.");
        } // if
        // Проверяем подпись.
        Signature signature;
        try {
            signature = Signature.getInstance(GOST_EL_SIGN_NAME, PROVIDER_NAME);
            signature.initVerify(cert);
            signature.update(text);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Couldn't recreate the sign from cms.");
        }
        try {
            if (!signature.verify(info.signature.value)) throw new RuntimeException("Sign is invalid!");
        } catch (SignatureException e) {
            throw new RuntimeException("Signature error.");
        }


        return text;
    }

signature.verify всегда возвращает false. На тех же данных через утилиту cryptcp проверка проходит успешно.
В чем может быть ошибка ?
Offline Евгений Афанасьев  
#2 Оставлено : 10 мая 2018 г. 9:17:57(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Возможно, подпись выполнена не на данные, а на атрибуты. Посмотрите пример расширенной проверки в пакете CMS, класс CMSVerify, архив samples-sources.jar.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
YuriyI оставлено 10.05.2018(UTC)
Offline YuriyI  
#3 Оставлено : 10 мая 2018 г. 9:27:14(UTC)
YuriyI

Статус: Активный участник

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

Сказал(а) «Спасибо»: 3 раз
С проверкой атрибутов все заработало. Спасибо!

Отредактировано пользователем 10 мая 2018 г. 10:17:39(UTC)  | Причина: Не указана

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