Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Здравствуйте. Подскажите, пожалуйста.
Нужно из подписи извлечь 32 байта хэша данных. Подпись обычная detached.
Вызываю CryptMsgGetParam(CMSG_HASH_DATA_PARAM), получаю FALSE; Вызываю CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM), получаю 32 байта, но отличается от хэша данных. А что здесь лежит CryptMsgGetParam(CMSG_SIGNER_INFO_PARAM, pSignerInfo). pSignerInfo->AuthAttrs == szOID_RSA_messageDigest ??? Вообще 34 байта возвращает.
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Попробуйте декодировать содержимое атрибута szOID_RSA_messageDigest как OCTET STRING. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Я правильно понимаю, что атрибут szOID_RSA_messageDigest совсем не обязательно должен присутствовать?
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Да. Но если его нет, то вас должен устроить CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM). |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Но CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) возвращает неверный хэш. 32 байта, но они отличаются от того, что возвращает отдельно вычисленный хэш с помощью CryptHashData() и то, что лежит в атрибуте подписи szOID_RSA_messageDigest.
CryptHashData() == szOID_RSA_messageDigest но CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) != CryptHashData()
что я не правильно делаю?
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Вы все делаете правильно. CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) и содержимое szOID_RSA_messageDigest - это разные хэш-значения. В CMS-сообщении без подписанных атрибутов нет атрибута szOID_RSA_messageDigest и подпись считается непосредтвенно на данные. В этом случае результат CryptHashData должен совпадать с CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) (пока это предположение, которое вам предстоит проверить). Если же создатель сообщения вкладывает в него хотя бы один подписанный атрибут, то в него автоматом добавляются атрибуты szOID_RSA_messageDigest и content-type. В этом случае хэш-значение данных попадает в атрибут szOID_RSA_messageDigest, а подпись считается на DER-закодированное представление всех подписанных атрибутов. По моему предположению CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) в этом случае возвращает хэш-значение от подписанных атрибутов. Подробнее о подписи CMS см. RFC3852. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Большое спасибо. Интуитивно догадывался.
Чтоб полностью раскрыть тему: Почему CryptMsgGetParam(CMSG_HASH_DATA_PARAM) всегда FALSE и как нужно построить CMS, чтоб было TRUE?
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Не могу ответить на последний вопрос. Могу только догадываться, что CMSG_HASH_DATA_PARAM относится к типу сообщения Digested-data, а не Signed-data.
Скажите пожалуйста, моё предположение, высказанное в предыдущем сообщении оказалось верным? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Смирнов написал:В CMS-сообщении без подписанных атрибутов нет атрибута szOID_RSA_messageDigest и подпись считается непосредтвенно на данные. В этом случае результат CryptHashData должен совпадать с CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) (пока это предположение, которое вам предстоит проверить). Это предположение не верно :( При pSignerInfo->AuthAttrs.cAttr==0 хэш не совпадает. Думал, что в хэш включены еще какие-то данные из CMSG_SIGNER_INFO, но как оказалось даже для разных сертификатов и данных эти значения равны константе, а собственно хэш функция от нулевых данных: 981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0 Смирнов написал:По моему предположению CryptMsgGetParam(CMSG_COMPUTED_HASH_PARAM) в этом случае возвращает хэш-значение от подписанных атрибутов. Похоже на правду. Мое предположение, что это хэш ТОЛЬКО от атрибутов. При pSignerInfo->AuthAttrs.cAttr==0 это хэш значение константа и равно хэш от NULL. При наличии только атрибута szOID_RSA_messageDigest == константа, значение хэша тоже константа, независимо от сертификата. При включении в подпись атрибута szOID_RSA_signingTime, этот хэш меняется для каждой созданной подписи. И все-таки неясно как вытащить значение хэш из detached CMS-подписи, в которой нет атрибутов (а их присутствие необязательно?) ? Отредактировано пользователем 24 июня 2009 г. 22:20:11(UTC)
| Причина: Не указана
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Судя по результатам ваших экспериментов, никак. :) |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close