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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline CryptoUser  
#1 Оставлено : 21 апреля 2016 г. 13:26:34(UTC)
CryptoUser

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

Группы: Участники
Зарегистрирован: 22.03.2016(UTC)
Сообщений: 34

Добрый день

Клиент прислал нам подпись со штампом времени.
В криптоАрм открывается нормально.

Но с помощью интерфейса вашего плагина Cades проверить программно подпись не получается.

Выдаётся ошибка
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in VerifyTS.exe

Additional information: Элемент не найден.


Вот сам код
Код:

string data =Convert.ToBase64String(File.ReadAllBytes(@"C:\Desktop\d\src.xml"));
            string signature = Convert.ToBase64String(File.ReadAllBytes(@"C:\Desktop\d\src.xml.sig"));
            
            CadesSignedData signedData = new CadesSignedData();
            signedData.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            signedData.Content = data;
            CADESCOM_CADES_TYPE cadesType = CADESCOM_CADES_TYPE.CADESCOM_CADES_X_LONG_TYPE_1;

            signedData.VerifyCades(signature, cadesType, true);



Сами файлы прикладываю
src.xml (5kb) загружен 3 раз(а). src.xml.sig (8kb) загружен 3 раз(а).

Помогите разобраться в чём дело
Offline cross  
#2 Оставлено : 21 апреля 2016 г. 16:49:25(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Вы пытаетесь проверить подпись типа CADES X_LONG_TYPE_1 которая должна содержать помимо штампа еще другие атрибуты. И их не нашли. Скорее всего ваша подпись не X_LONG_TYPE_1
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline CryptoUser  
#3 Оставлено : 21 апреля 2016 г. 17:19:26(UTC)
CryptoUser

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

Группы: Участники
Зарегистрирован: 22.03.2016(UTC)
Сообщений: 34

Автор: cross Перейти к цитате
Вы пытаетесь проверить подпись типа CADES X_LONG_TYPE_1 которая должна содержать помимо штампа еще другие атрибуты. И их не нашли. Скорее всего ваша подпись не X_LONG_TYPE_1


Т.е. эту пришедшую подпись со штампом времени нельзя проверить средствами Cades plugin? Я приложил файлы. У вас есть возможность посмотреть этот файл с подписью? Это не может быть ошибкой плагина?

Какие альтернативные способы проверки подписи со штампом времени существуют? Может быть подскажите какие-нибудь библиотеки для C#, которые могут обрабатывать отличные от Cades X_LONG_TYPE_1 подписи со штампом времени.

Подпись к нам от клиента приходит. Соответственно повлиять как-то на её генерацию мы не можем(
Она корректная (судя по КриптоАрм), нужно проверить программно.
Offline CryptoUser  
#4 Оставлено : 27 апреля 2016 г. 18:21:17(UTC)
CryptoUser

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

Группы: Участники
Зарегистрирован: 22.03.2016(UTC)
Сообщений: 34

Посмотрел в "неподписанные" атрибуты
Там присутствует 1.2.840.113549.1.9.16.2.14

Этот атрибут означает "штамп времени на значение подписи" согласно посту Новожилова Елена https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=54184#post54184

Получается с подписью всё норм и необходимы атрибут присутствует? Или чего то для корректной работы плагина там не хватает?


Как вручную получить этот штамп времени из подписи?
Вот написал небольшой код, но непонятно как расшифровывать asnData.RawData

Код:

  var contentInfo = new ContentInfo(Convert.FromBase64String(data));
            var signedCms = new SignedCms(contentInfo, true);

            signedCms.Decode(Convert.FromBase64String(signature));
            signedCms.CheckSignature(true);


            foreach (var signerInfo in signedCms.SignerInfos)
            {
                foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)
                {
                    //нужный нам штамп времени
                    if (unsignedAttribute.Oid.Value == "1.2.840.113549.1.9.16.2.14")
                    {
                        AsnEncodedData asnData = unsignedAttribute.Values[0];

                        byte[] asnBinary = asnData.RawData;//как преобразовать это значение? К чему привести?
                    }


                }
            }


У вас есть пример как расшифровать этот штамп времени?
Меня в частности интересует дата подписи и проверить, что сам штамп времени валиден.

Отредактировано пользователем 27 апреля 2016 г. 18:43:44(UTC)  | Причина: Не указана

Offline CryptoUser  
#5 Оставлено : 28 апреля 2016 г. 17:39:24(UTC)
CryptoUser

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

Группы: Участники
Зарегистрирован: 22.03.2016(UTC)
Сообщений: 34

Получилось через BouncyCastle

Код:

AsnEncodedData asnData = unsignedAttribute.Values[0];
                            byte[] asnBinary = asnData.RawData;

                            CmsSignedData data = new CmsSignedData(asnBinary);
                            TimeStampToken t = new TimeStampToken(data);
                            
                            //validate timestamp with cert
                            try
                            {
                                foreach (Org.BouncyCastle.X509.X509Certificate bCert in data.GetCertificates("Collection").GetMatches(null))
                                {
                                    t.Validate(bCert);
                                    break;
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("Timestamp validation failed: {0}", ex.Message);
                            }

                            DateTime signTime = t.TimeStampInfo.GenTime;
Offline evgeni1  
#6 Оставлено : 15 сентября 2016 г. 15:07:08(UTC)
evgeni1

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

Группы: Участники
Зарегистрирован: 19.05.2016(UTC)
Сообщений: 12

Сказал(а) «Спасибо»: 1 раз
CryptoUser, можете подсказать, а как TimeStampToken записать в UnsignedAttribute ?
И от чего нужно считать хеш, который передается службе штампов времени
Offline Alex2103  
#7 Оставлено : 21 октября 2016 г. 22:52:46(UTC)
Alex2103

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

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

Присоединяюсь к просьбе. Есть ответ от TSPсервера, нужно как то положить его в структуру CRYPT_SIGN_MESSAGE_PARA в UnauthAttr?
Что то вроде:

CRYPT_ATTR_BLOB cablob[1];
CRYPT_ATTRIBUTE ca[1];
cablob[0].cbData = tstResponseSize;
cablob[0].pbData = tstResponse; // the response from TSA

ca[0].pszObjId = "1.2.840.113549.1.9.16.1.4"; // object identifier
ca[0].cValue = 1;
ca[0].rgValue = cablob;
SigParams.cUnauthAtt = 1;
SigParams.rgUnauthAttr = ca;

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