Ошибка подписи/проверки подписи

Автор s@ilor, 11 Июль 2014, 16:02:17

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Вниз

s@ilor

Реализовал функцию подписи XML.
Когда посылаю операции на проверку, то иногда получаю такую вот ошибку:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at Kz.GammaTech.Math.BigInteger.MakeMagnitude(Byte[] bytes, Int32 offset, Int32 length)
   at Kz.GammaTech.Math.BigInteger..ctor(Int32 sign, Byte[] bytes, Int32 offset, Int32 length)
   at Kz.GammaTech.Signers.GostSigner.VerifyData(Byte[] input, Byte[] sign)


примерно 10 случаев из 1000.
При разборе проблемы выяснилось, что размер подписи составляет в этих случаях 63 байта, вместо обычных 64.

В чем может быть проблема?

Дано:
Windows XP
Tumar CSP 5.2.0
Лицензия: KISC до 01.03.2015
Ключи для подписи не просроченные, годные, предназначенные для подписи.

Sergey

Добрый день.

Вероятнее всего при формировании подписи возникает ошибка, какими средствами формируется подпись xml?
Какое SDK используется для постановки и проверки подписи?

s@ilor

Насчет подписи XML - в принципе не важно ))
Я использую класс GostSigner для проверки и генерации подписи, .NET SKD, библиотека crypto.dll

Классу передаю значение хэша, вычисленного с помощью класса Gost3411Digest, он вычисляет хэш данных и далее я подписываю данный хэш и на подписи получаю результаты описанные выше.
Не всегда.

Вычисление подписи данных:

return new GostSigner { privatekey = Key }.SignData(input);


Вычисление хэша данных:

var gost3411Digest = new Gost3411Digest();

                gost3411Digest.BlockUpdate(input, 0, input.Length);


                var hashValue = new byte[gost3411Digest.GetDigestSize()];

                gost3411Digest.DoFinal(hashValue, 0);


                return hashValue;

s@ilor

Ошибка появляется под нагрузкой, 1000 проверок подписи и подписаний соответственно в течении максимум 5 минут.

Sergey


s@ilor


Sergey

Добрый день.

У нас не получилось повторить данную ошибку.
Выкладываю последнюю версию данной библиотеки, мы исключили все места где данная ошибка может появится.

s@ilor

Проблема была решена путем переписывания классов из данной библиотеки и значительного их упрощения.
Класс BigInteger не использовался, потому как именно он генерил ошибку. Под дебагов было выяснено, что значение подписи выдается в размере 64 байт, затем формируется массив из двух BigInteger, которые принимают в себя по 32 байта в конструкторе. Пр проверке подписи эти объекты конвертируются в массивы байт для передачи функциям криптопровайдера. В этот момент одно из чисел, в результате вызова функции BigInteger.ToUnsignedByteArray(), возвращает не 32 байта, а 31 и из-за этого проверка подписи валиться.
Из-за чего так - разобраться не получилось.

Sergey

Это связано с тем что класс BigInteger это число, и если в левой части числа встречаются 0, то размер байтового представления данного числа поменяется.
Например массив байт вида  0x00, 0x00, 0x00, 0x00, 0x01 (5 байт) в числовом представлении будет 0x01 (1 байт).

s@ilor

Возникла следующая проблема - XML, подписанная с помощью jce версии Tumar, не проходит проверку подписи в .NET. Алгоритм - ГОСТ, ключи валидные.

код, с помощью которого осуществляется подпись XML:

XMLSignature signature = new XMLSignature(document, "", signatureMethodURI);

        if (document.getFirstChild() != null) {

            document.getFirstChild().appendChild(signature.getElement());


            Transforms transforms = new Transforms(document);
            transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
            transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);


            signature.addDocument("", transforms, digestMethodURI);
            signature.addKeyInfo(cert);
            signature.sign(privateKey);

            return XmlUtils.documentToString(document);
        }


Подпись проходит без проблем, также как и проверка подписи в Java проходит также без проблем.
Проверка подписи XML-файла, который был создан в Java не проходит, функция возвращает false:

var resultJavaSigned = new XmlSigned().VerifyXmlFile(new FileStream("C:\\tumar_signed.xml", FileMode.Open));


Была использована последняя версия crypto.dll, которая была прикреплена выше.

Sergey

Добрый день.

Выложите xml файлы которые не проверяются до подписания и после подписания.

s@ilor

Приложил файлы:
1. tumar_original.xml - файл, содержимое которого подписано в Java
1. tumar_signed.xml - файл, содержимое не проходит проверку подписи в .NET

Renat

Добрый день.
У Вас неверно вычислено хеш-значение.
Вместо "9sEl6RP5qelyL96AULfAq18q+rxHIeJF662LsKETkk4=" должно быть "dUmLkyZRgMEONCw5BA0WFlo7qlfh9OW5unuPb+fIYFk=".

s@ilor

13 Август 2014, 16:56:56 #13 Последнее редактирование: 13 Август 2014, 17:07:49 от s@ilor
Дело в том, что "неверное" значение хэша было вычислено при помощи криптопровайдера Тумар Java-версией. Код почти точно повторяет код из документации, все стандартно )))
Проверка подписанной XML проходит также в Java версии на ура. На вычисление хэша никак уж повлиять не могу.

Renat

Какие версии библиотек Вами используются?


Вверх