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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline miritec.com  
#1 Оставлено : 28 января 2014 г. 15:01:31(UTC)
miritec.com

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

Группы: Участники
Зарегистрирован: 25.01.2014(UTC)
Сообщений: 2
Украина
Откуда: Киев

Возвращает ошибку подписи для документа с валидной подписью. Исходный файл подписи и документ
имеют валидную подпись согласно проверке на сайте http://www.gosuslugi.ru/pgu/eds/order

Документ, который подписан - это xml файл, но подписывается как бинарный.

Environment:

JCP - version 1.0.54
JRE - Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
OS - Ubuntu Linux 12.04.4 LTS (64bit)

Код:
Код:

private void checkSign() throws Exception {
    final ContentInfo all = new ContentInfo();
    all.decode(new Asn1BerDecodeBuffer(getSignatureBinaryFile()));

    final SignedData cms = (SignedData) all.content;
    final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();

    cms.certificates.elements[0].encode(encBuf);
    final CertificateFactory cf = CertificateFactory.getInstance("X.509");
    final X509Certificate cert = (X509Certificate) cf.generateCertificate(encBuf.getInputStream());

    byte[] text = getFileContent(doc_filename, false);

    CMS.CMSVerify2(cms, cert, text);
    System.exit(0);
}


Метод CMS.CMSVerify2 возвращает ошибку "Invalid signature". Этот метод взят из примера и косметически изменен.

Код:

public static void CMSVerify2(final SignedData cms, Certificate cert, byte[] data) throws Exception {
    int i;
    if (cms.version.value != 1) {
        throw new Exception("Incorrect version");
    }
    if (!new OID(CMStools.STR_CMS_OID_DATA).eq(cms.encapContentInfo.eContentType.value)) {
        throw new Exception("Nested not supported");
    }
    byte[] text = null;
    if (data != null) {
        text = data;
    } else if (cms.encapContentInfo.eContent != null) {
        text = cms.encapContentInfo.eContent.value;
    }
    if (text == null) {
        throw new Exception("No content");
    }
    OID digestOid = null;
    DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(new OID(CMStools.DIGEST_OID).value);
    for (i = 0; i < cms.digestAlgorithms.elements.length; i++) {
        if (cms.digestAlgorithms.elements[i].algorithm.equals(a.algorithm)) {
            digestOid = new OID(cms.digestAlgorithms.elements[i].algorithm.value);
            break;
        }
    }
    if (digestOid == null) {
        throw new Exception("Unknown digest");
    }
    int pos = -1;
    for (i = 0; i < cms.certificates.elements.length; i++) {
        final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
        cms.certificates.elements[i].encode(encBuf);
        final byte[] in = encBuf.getMsgCopy();
        if (Arrays.equals(in, cert.getEncoded())) {
            System.out.println("Certificate: " + ((X509Certificate) cert).getSubjectDN());
            pos = i;
            break;
        }
    }
    if (pos == -1) {
        throw new Exception("Not signed on certificate.");
    }

    final SignerInfo info = cms.signerInfos.elements[pos];
    if (info.version.value != 1) {
        throw new Exception("Incorrect version");
    }
    if (!digestOid.equals(new OID(info.digestAlgorithm.algorithm.value))) {
        throw new Exception("Not signed on certificate.");
    }
    final byte[] sign = info.signature.value;

    // check
    final Signature signature = Signature.getInstance(JCP.GOST_EL_SIGN_NAME);
    signature.initVerify(cert);
    signature.update(text);
    final boolean checkResult = signature.verify(sign);
    if (checkResult) {
        CMStools.logger.info("Valid signature");
    } else {
        CMStools.logger.info("INVALID signature");
    }
    //return text;
}


Во втором методе в конце
final boolean checkResult = signature.verify(sign);
возвращает false.

Вывод такой:
Certificate: STREET=ул. Бражкина 7, CN=ООО Сивушный дом, GIVENNAME=Максимка Спиртович, SURNAME=Краснов, C=RU, ST=77 г. Москва, L=Москва, O=ООО Сивушный дом, OU=Отдел самогоноварения, T=Директор, OID.1.2.643.100.1=#120D36363433343137343733353631, OID.1.2.643.100.3=#120B3030303030303030303030, OID.1.2.643.3.131.1.1=#120C303039363731333433373731, EMAILADDRESS=info@astralnalog.ru
Jan 28, 2014 12:59:44 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.54 36641
Jan 28, 2014 12:59:44 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Jan 28, 2014 12:59:44 PM leradata.dsf.CMS CMSVerify2
INFO: INVALID signature

Можете подсказать, в какую сторону дальше смотреть? Код примера в библиотеке
говорит, что подпись invalid, проверка на сайте дает положительный результат.
Что значит, что родпись в порядке.

Файл подписи: https://dl.dropboxuserco....com/u/23011347/sign.bin
Документ: https://dl.dropboxuserco...23011347/signed_data.xml
Скриншот проверки подписи на сайте: https://dl.dropboxuserco...1347/sign_screenshot.png

Отредактировано пользователем 28 января 2014 г. 15:06:20(UTC)  | Причина: Не указана

Offline Юрий  
#2 Оставлено : 28 января 2014 г. 15:08:01(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Можно, наверное уже в FAQ добавить.

Скорее всего дело вот в этом:
http://www.cryptopro.ru/forum2/default.aspx?g=posts&t=7223#post45986
С уважением,
Юрий Строжевский
Offline Евгений Афанасьев  
#3 Оставлено : 28 января 2014 г. 17:59:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 713 раз в 673 постах
В подписи есть подписанные атрибуты, проверять подпись надо по ним, пример - класс CMSVerify, ф. CMSVerify.

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

Offline miritec.com  
#4 Оставлено : 28 января 2014 г. 18:00:10(UTC)
miritec.com

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

Группы: Участники
Зарегистрирован: 25.01.2014(UTC)
Сообщений: 2
Украина
Откуда: Киев

2Юрий:
Как я понял из ссылки, мне необходимо отзеркалить байты подписи.

Вот HEX представление подписи (64 байта)
B4BA777B80AFD1CAFDA5600E551A5032E8E0052D7AA998E45D83CA125CEB84A4CC884E3834812D7A1303B96FC14E38A055EA390E5645D5E0A765FBA63A86C32E
Отзеркаленная подпись (64 байта)
2EC3863AA6FB65A7E0D545560E39EA55A0384EC16FB903137A2D8134384E88CCA484EB5C12CA835DE498A97A2D05E0E832501A550E60A5FDCAD1AF807B77BAB4

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