Тема: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)
Здравствуйте! Стоит задача реализовать взаимодействие со СМЭВ 3 с использованием криптосервера Валидата.
Необходимо подписывать XML-сообщения с помощью алгоритма подписи ГОСТ Р 34.10-2012 с ключом 256 (OID 1.2.643.7.1.1.1.1)
Описание текущего сценария подписи сообщения:
1. Создаем шаблон сообщения
2. Выбираем структуру <SenderProvidedRequestData> - она нам потребуется для расчета ХЭШа, значение которого будет помещено в структуру <DigestValue>
3. Приводим структуру <SenderProvidedRequestData> к каноничному виду согласно алгоритму Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"
4. Трансформируем каноникализированную структуру <SenderProvidedRequestData> согласно алгоритму Algorithm="urn://smev-gov-ru/xmldsig/transform"
5. Получаем значение ХЭШ по алгоритму хэширования ГОСТ Р 34.11-12 с длиной 256(OID 1.2.643.7.1.1.2.2) Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"
// C# получение строки BASE64 ХЭШ рассчитаного для строки input
var inputBytes = Encoding.UTF8.GetBytes(input);
var hashCtx = new StreamHashCtx("1.2.643.7.1.1.2.2");
var outputBytes = _vcert.Value.StreamHashMem(hashCtx, inputBytes, true); // Где _vcert.Value - Validata.CryptoServer.VcertObject
var output = Convert.ToBase64String(outputBytes);
6. Создаем структуру <SignedInfo> в которую помещаем информацию об алгоритмах канонизации и подписи. Заполнение значение структуры <DigestValue> строкой полученной в пункте №5
7. Приводим структуру <SignedInfo> к каноничному виду согласно алгоритму Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"
8. Трансформируем каноникализированную структуру <SignedInfo> согласно алгоритму Algorithm="urn://smev-gov-ru/xmldsig/transform"
9. Получаем значение ХЭШ структуры <SignedInfo> по алгоритму хэширования ГОСТ Р 34.11-12 с длиной 256(OID 1.2.643.7.1.1.2.2) Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"
Реализация описана в пункте №5
10. Вычисляем значение подписи на основе ХЭШа(не конвертированного в BASE64) полученного в пункте №9
//C# Подписываем ХЭШ. input - Байтовый массив хеша
CertificateId session = new CertificateId();
session.Alias = _cryptoServerSession;
var outputBytes = _vcert.Value.SignHash(session, input);
var output = Convert.ToBase64String(outputBytes);
11. Сохраняем открытый ключ сертификата в BASE64
12. Получаем готовую структуру подписи <Signature>
13. Получаем готовое сообщение для отправки
14. Получаем ответ на отправленное сообщение из пункта №13.
Каждый пункт сценария сопровождается файлом с наименование соответствующим номеру пункта. Файлы загрузил нв облако https://yadi.sk/d/8YlMLNHRs5cToA
Прошу помочь в решении проблемы с формированием подписи сообщения. Поиск ошибки осложняется тем, что у нас нет экземпляра разобранного подписанного примера сообщения, с которым можно было бы сверить формирование собственной подписи и понять на каком из этапов некорректная реализация.