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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline fordil  
#1 Оставлено : 30 сентября 2010 г. 0:00:55(UTC)
fordil

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

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

Добрый день.
Есть pkcs#7 контейнер с attached подписью.
Вытаскиваю подписанные данные с помощью CryptMsgGetParam с типом CMSG_CONTENT_PARAM.
Как мне определить тип файла который был подписан?
Допустим был *.txt или *.xml файл. Его подписали. Получили attached подпись. Как определить, что был именно *.txt или *.xml, а не какой-либо другой.
Возможно это где-то написано, а я просто упустил из виду. Или может это вообще не реально(т.е подобные данные не сохраняются)?
Offline fordil  
#2 Оставлено : 30 сентября 2010 г. 1:59:56(UTC)
fordil

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

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

И еще вопрос вдогонку..

Я правильно понимаю, что attached подпись от detached подписи только и отличается наличием опционального поля content в ContentInfo? ( в detached оно отсутствует или пустое?)

Если только этим и отличается, то есть возможность как-то удалить(очистить) именно это поле чтобы получить detached подпись?
Offline Kirill Sobolev  
#3 Оставлено : 30 сентября 2010 г. 17:29:20(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Или может это вообще не реально(т.е подобные данные не сохраняются)?

Ни имя файла, ни его расширение специально нигде не сохраняются. Если Вам это нужно - можно вручную добавить атрибут с этими значениями.
Цитата:
Если только этим и отличается, то есть возможность как-то удалить(очистить) именно это поле чтобы получить detached подпись?

Да, с помощью CryptDecodeObject/CryptEncodeObject.
Техническую поддержку оказываем тут
Наша база знаний
Offline fordil  
#4 Оставлено : 30 сентября 2010 г. 17:57:36(UTC)
fordil

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

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

Цитата:
Да, с помощью CryptDecodeObject/CryptEncodeObject.

Спасибо, буду пробовать.

Цитата:
Если Вам это нужно - можно вручную добавить атрибут с этими значениями.

А можно поподробней куда и как добавить?
Offline Kirill Sobolev  
#5 Оставлено : 30 сентября 2010 г. 18:07:06(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Добавить в подпись, с помощью CryptMsgControl(.., CMSG_CTRL_ADD_SIGNER, ..), поля rgAuthAttr и rgUnauthAttr структуры CMSG_SIGNER_ENCODE_INFO - в зависимости от того, нужно ли Вам подписывать эту информацию или нет.
Техническую поддержку оказываем тут
Наша база знаний
Offline fordil  
#6 Оставлено : 1 октября 2010 г. 2:06:51(UTC)
fordil

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

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

Цитата:
Да, с помощью CryptDecodeObject/CryptEncodeObject.


Что-то я разобраться не могу.

Приведу последовательность своих действий, поправьте, пожалуйста, где неправ.

DWORD lenght;

CryptDecodeObject(
X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
PKCS_CONTENT_INFO,
SrcData, //BYTE массив со всем pkcs сообщением
SrcDataSize, //соответственно его размер
CRYPT_DECODE_NOCOPY_FLAG,
NULL,
&lenght);


BYTE *data = new BYTE[lenght];

CryptDecodeObject(
X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
PKCS_CONTENT_INFO,
SrcData, //BYTE массив со всем pkcs сообщением
SrcDataSize, //соответственно его размер
CRYPT_DECODE_NOCOPY_FLAG,
data,
&lenght);




CRYPT_CONTENT_INFO *cont;

cont= (CRYPT_CONTENT_INFO *)data;

Теперь в cont структура типа PKCS_CONTENT_INFO с полем CRYPT_DER_BLOB Content , которое можно расшифровать аналогичным образом и получить собственно подписанные данные?

Если так, то далее в cont очищаю поле Content, кодирую CryptEncodeObject.
Получу закодированную структуру. Как мне далее ее поместить обратно в pkcs контейнер?
Offline Kirill Sobolev  
#7 Оставлено : 1 октября 2010 г. 22:30:22(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Проще декодировать и кодировать с константой PKCS_CONTENT_INFO_SEQUENCE_OF_ANY.
Формат этой структуры описан в RFC 3852.
Техническую поддержку оказываем тут
Наша база знаний
Offline fordil  
#8 Оставлено : 2 октября 2010 г. 14:54:09(UTC)
fordil

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

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

Вот такая структура контейнера

SEQUENCE {
OBJECT IDENTIFIER signedData (1 2 840 113549 1 7 2)
[0] {
SEQUENCE {
INTEGER 1
SET {
SEQUENCE {
OBJECT IDENTIFIER GOST R 34.11-94 (1 2 643 2 2 9)
NULL
}
}
SEQUENCE {
OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
[0] {
OCTET STRING ... <--- Нужно добраться до сюда и удалить это поле

}
}
..............

Если я весь массив с контейнером декодирую как структуру CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY,
то в pszObjId окажется OID: 1 2 840 113549 1 7 2.
А что будет в rgValue ? Все что вложено а скобки после первой метки [0]? Как мне добраться до нужной структуры?
Offline Kirill Sobolev  
#9 Оставлено : 4 октября 2010 г. 16:25:00(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
В массиве rgValue будет
Код:
SEQUENCE {
        version CMSVersion,
        digestAlgorithms DigestAlgorithmIdentifiers,
        encapContentInfo EncapsulatedContentInfo,
        certificates [0] IMPLICIT CertificateSet OPTIONAL,
        crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
        signerInfos SignerInfos }

Я все-таки настойчиво рекомендую прочитать RFC3852, п 5.1 .
Техническую поддержку оказываем тут
Наша база знаний
Offline fordil  
#10 Оставлено : 4 октября 2010 г. 18:19:28(UTC)
fordil

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

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

Ну на главный вопрос, вы так и не ответили.
Как добраться до
Цитата:
encapContentInfo EncapsulatedContentInfo
?
Побитово разбирать rgValue в поисках нужного OIDa, основываясь на правилах кодирования?
Или можно это как-то распарсить используя апишные функции?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.