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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline grig27  
#1 Оставлено : 21 августа 2019 г. 10:44:23(UTC)
grig27

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день.

Пробую добавить подпись к существующей откреплённой с помощью CryptoAPI.

Исходная подпись старый ГОСТ. Добавляемая новый ГОСТ.

Последовательность такая.

CryptMsgOpenToDecode(MY_ENCODING_TYPE, CMSG_DETACHED_FLAG,...)
CryptMsgUpdate(.. true) //добавляем откреплённую подпись
CryptMsgUpdate(.. false) //добавляем содержимое исходного файла
// Получаем сертификат PCERT_CONTEXT
CryptAcquireCertificatePrivateKey() //получает дескриптор HCRYPTPROV
// Заполняем структуру CMSG_SIGNER_ENCODE_INFO
siginfo.HashAlgorithm.pszObjId = certinfo.SignatureAlgorithm.pszObjId // указываем алгоритм подписи из исходного сертификата и другие параметры
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @siginfo) // добавляем подписанта

Вот тут и проблема... если алгоритмы подписи одинаковы у подписантов, то CryptMsgControl возвращает true и всё происходит нормально.
Если разные, то false и GetLasterror возвращает 0.

Подскажите, возможно в данном случае требуется использовать другую последовательность вызовов или вообще другой подход?
Offline grig27  
#2 Оставлено : 21 августа 2019 г. 13:44:26(UTC)
grig27

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

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

Сказал(а) «Спасибо»: 2 раз
Так же пробовал другой подход.

Использую флаг из CMSG_CTRL_ADD_CMS_SIGNER_INFO.

Создаю отдельную подпись со вторым сертификатом с помощью CryptSignMessage.
Далее из неё извлекаю CMSG_CMS_SIGNER_INFO.
Добавляю в ранее существующую с помощью CryptMsgControl(hMsg ,0 , CMSG_CTRL_ADD_CMS_SIGNER_INFO).

Подпись формируется, но при проверке в КриптоАРМ первая подпись действительная, а вторая нет.
Offline Русев Андрей  
#3 Оставлено : 21 августа 2019 г. 14:08:09(UTC)
Русев Андрей

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,271

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 446 раз в 325 постах
В заголовке CMS-подписи перечислены хэш алгоритмы, с помощью которых будут хэшироваться данные при вызове CryptMsgUpdate. При вызове CryptMsgControl(CMSG_CTRL_ADD_SIGNER) среди посчитанных хэшей выбирается подходящий и на него проставляется подпись. Поэтому такой вызов требует, чтобы в заголовке были все необходимые хэш алгоритмы. Если вы подписываете другим, то будет ошибка.

Для обхода проблемы можно:

  • Изначально формировать подписанные сообщения со всеми нужными хэшами в заголовке. Такое решение возможно только в полностью подконтрольных информационных системах.
  • Использовать CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO) - этот вызов механически добавляет уже готовую подпись. Но у него есть всё то же ограничение: в заголовке должны оказаться все нужные хэш алгоритмы. Поэтому в конечном итоге обход должен быть таким:

    • создаём подписанное сообщение со всеми нужными в будущем хэш алгоритмами
    • удаляем из него все подписи (в заголовке хэш алгоритмы останутся), сохраняем его - можно вшить в код - там несколько десятков байт
    • при необходимости добавить подпись в какое-то сообщение - извлекаем из него все подписи и с помощью CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO) кладём в болванку
    • новую подпись добавляем также с CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO)


Отмечу, что такая проблема есть только с detached-подписями. Поддержку CryptMsgControl(CMSG_CTRL_ADD_CMS_SIGNER_INFO) на unix мы добавили в рамках CPCSP-9673 (для отслеживания в changelog) - код попадёт в ближайшие релизы CSP 5.0 R2 и CSP 4.0 R5. Если горит, могу скинуть ночную сборку лично.
Официальная техподдержка. Официальная база знаний.
thanks 1 пользователь поблагодарил Русев Андрей за этот пост.
grig27 оставлено 21.08.2019(UTC)
Offline grig27  
#4 Оставлено : 21 августа 2019 г. 14:25:35(UTC)
grig27

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

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

Сказал(а) «Спасибо»: 2 раз
В общих чертах принцип понятен.

Про Unix пока вопрос не стоит, в Windows бы разобраться:-)


Цитата:
создаём подписанное сообщение со всеми нужными в будущем хэш алгоритмами
с этим пока не ясно куда копать... буду разбираться. Если так, то нужно иметь на машине несколько сертификатов с разными алгоритмами?

В КриптоАРМ как то обошли эту ситуацию.

Отредактировано пользователем 21 августа 2019 г. 14:27:11(UTC)  | Причина: Не указана

Offline Русев Андрей  
#5 Оставлено : 21 августа 2019 г. 14:43:50(UTC)
Русев Андрей

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,271

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 446 раз в 325 постах
Код:
// detached signed message with all Gost hash oid in header with no signers
static const unsigned char all_hash_stub[] = {
    0x30, 0x81, 0x4f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x81,
    0x41, 0x30, 0x81, 0x3e, 0x02, 0x01, 0x01, 0x31, 0x28, 0x30, 0x0a, 0x06, 0x06, 0x2a, 0x85, 0x03,
    0x02, 0x02, 0x09, 0x05, 0x00, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02,
    0x02, 0x05, 0x00, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x03, 0x05,
    0x00, 0x30, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x00,
    0x31, 0x00 };

КриптоАРМ некоторые операции делает прямым редактированием ASN.1, а не через CryptoAPI.
Официальная техподдержка. Официальная база знаний.
thanks 1 пользователь поблагодарил Русев Андрей за этот пост.
grig27 оставлено 21.08.2019(UTC)
Offline grig27  
#6 Оставлено : 21 августа 2019 г. 15:00:04(UTC)
grig27

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

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

Сказал(а) «Спасибо»: 2 раз
Цитата:
КриптоАРМ некоторые операции делает прямым редактированием ASN.1, а не через CryptoAPI.


Теперь стало ещё яснее:-)

Спасибо! Всё получилось.

Отредактировано пользователем 22 августа 2019 г. 6:47:01(UTC)  | Причина: Не указана

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