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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline MaCeL  
#1 Оставлено : 5 марта 2013 г. 18:59:24(UTC)
MaCeL

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

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте.

Возникла такая проблема. Необходимо доподписать сообщение, при этом добавить в подпись неподписываемый строковый атрибут.
Выяснил, что в структуру PCMSG_SIGNER_ENCODE_INFO есть возможность передать массив аттрибутов. Т.е. примерный java-код добавления атрибута будет представлять собой:
Код:

PCMSG_SIGNER_ENCODE_INFO cosignerInfo = new PCMSG_SIGNER_ENCODE_INFO();

...
        
PCRYPT_ATTR_BLOB blb = new PCRYPT_ATTR_BLOB();
        
PCRYPT_ATTRIBUTE crAtr = new PCRYPT_ATTRIBUTE();
crAtr.pszObjId = "1.2.643.5.1.5.2.10000.1.2"; //OID добавляемого атрибута 
crAtr.cValue = 1;
crAtr.rgValue = blb;
        
String attrValue = "test"; //Значение атрибута

//Собственно здесь необходимо заполнить blb
... 

cosignerInfo.rgUnauthAttr = crAtr;
cosignerInfo.cUnauthAttr = 1;
...


Вопрос. Как правильно заполнить структуру PCRYPT_ATTR_BLOB? Просмотрел форум - нашел одну похожую тему, но ответа в ней так и не было :( (http://www.cryptopro.ru/forum2/...aspx?g=posts&m=30992).

Буду очень благодарен за примеры (подойдет любой язык) или любую другую помощь.

Отредактировано пользователем 5 марта 2013 г. 19:10:39(UTC)  | Причина: Не указана

Offline Юрий  
#2 Оставлено : 5 марта 2013 г. 21:10:33(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Достаточно объемная для объяснения тема. Примерный план получения искомого:
1)
CryptMsgOpenToDecode();

2)
CryptMsgGetParam(...CMSG_SIGNER_INFO_PARAM...);

3)
CRYPT_ATTRIBUTE caCoSigner;
caCoSigner.cValue = 1;
caCoSigner.pszObjId = szOID_RSA_counterSign; // Ну или что там у Вас ещё добавляется
caCoSigner.rgValue = attrblobCoSigner;

CryptEncodeObject(...PKCS_ATTRIBUTE...);

4)
CryptMsgControl(...CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR...);

Вот как-то так. Дальше найдёте сами. Наверное :)
С уважением,
Юрий Строжевский
Offline Юрий  
#3 Оставлено : 5 марта 2013 г. 21:15:08(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
На всякий случай поясню: "attrblobCoSigner" получается так
1)
CMSG_SIGNER_INFO* pSignerInfo;

2)
CryptEncodeObject(...PKCS7_SIGNER_INFO...);
С уважением,
Юрий Строжевский
Offline Новожилова Елена  
#4 Оставлено : 6 марта 2013 г. 12:25:51(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 893
Женщина
Откуда: Крипто-Про

Поблагодарили: 85 раз в 82 постах
Здравствуйте!

Что именно вы подразумеваете под словами "доподписать сообщение"?

Создать "параллельную" подпись? То есть одни и те же данные подписывают 2 разных лица.

Или создать "заверяющую" подпись? То есть второй человек подписывает не исходные данные, а значение первой подписи.

Или вам нужно просто добавить неподписанный атрибут к существующей подписи?
Offline MaCeL  
#5 Оставлено : 6 марта 2013 г. 13:02:03(UTC)
MaCeL

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Новожилова Елена Перейти к цитате

Что именно вы подразумеваете под словами "доподписать сообщение"?


Елена, имеется ввиду создание именно параллельной подписи, т.е. одно и то же сообщение подписывается 2-мя людьми.

Механизм добавления не так важен, т.е. большой разницы не имеет, добавить неподписываемый атрибут после наложения 2-ой подписи или же во время подписывания (если конечно такая возможность есть)
Offline Новожилова Елена  
#6 Оставлено : 6 марта 2013 г. 13:39:08(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 893
Женщина
Откуда: Крипто-Про

Поблагодарили: 85 раз в 82 постах
А атрибут нужно добавить в первую или вторую подпись?

Если во вторую (которая создается) то используете функцию CryptMsgControl(CMSG_CTRL_ADD_SIGNER). См. http://msdn.microsoft.co...ws/desktop/aa380220.aspx

В качестве параметра передается структура CMSG_SIGNER_ENCODE_INFO. Для того, чтобы добавить неподписанный атрибут заполняете вот эти поля:
Код:

DWORD cUnauthAttr;
PCRYPT_ATTRIBUTE rgUnauthAttr;


Это число атрибутов (в вашем случае один) и массив указателей(в вашем случае с одним элементом). См. http://msdn.microsoft.co...ws/desktop/aa378102.aspx

Если в первую (уже созданную), то используете CryptMsgControl(CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR)

Как закодировать атрибут - зависит от того, какое в нем должно лежать значение. Посмотрите на флаги для функции CryptEncodeObject http://msdn.microsoft.co...ws/desktop/aa378145.aspx

Отредактировано пользователем 6 марта 2013 г. 13:42:44(UTC)  | Причина: Не указана

Offline MaCeL  
#7 Оставлено : 11 марта 2013 г. 15:04:37(UTC)
MaCeL

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Новожилова Елена Перейти к цитате


Как закодировать атрибут - зависит от того, какое в нем должно лежать значение. Посмотрите на флаги для функции CryptEncodeObject http://msdn.microsoft.co...ws/desktop/aa378145.aspx


Собственно вопрос и был как раз по поводу того, какую структуру(ы) использовать для кодирования атрибута (значение атрибута представляет собой обычную ascii строку).
Просмотрел описание констант для CryptEncodeObject, из наиболее подходящего нашел пару CRYPT_DATA_BLOB - X509_OCTET_STRING. Но не уверен, что это корректно.
Можете подсказать что то по этому поводу?
P.S.
Для добавления атрибута использую функцию CryptMsgControl(CMSG_CTRL_ADD_SIGNER).

Offline Новожилова Елена  
#8 Оставлено : 13 марта 2013 г. 13:22:40(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 893
Женщина
Откуда: Крипто-Про

Поблагодарили: 85 раз в 82 постах
Почему вы считаете, что выбор OCTET_STRING для кодирования атрибута будет некорректным?

Насколько я понимаю, это ваш собственный внутренний атрибут - вам и решать, как его кодировать. Главное, чтобы принимающая сторона знала как с таким атрибутом работать.
thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
MaCeL оставлено 15.03.2013(UTC)
Offline MaCeL  
#9 Оставлено : 15 марта 2013 г. 12:29:05(UTC)
MaCeL

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Новожилова Елена Перейти к цитате
Почему вы считаете, что выбор OCTET_STRING для кодирования атрибута будет некорректным?

Насколько я понимаю, это ваш собственный внутренний атрибут - вам и решать, как его кодировать. Главное, чтобы принимающая сторона знала как с таким атрибутом работать.


Просто подумал, что существует общепринятая практика по добавлению такого рода атрибутов. Если в использовании OCTET_STRING нет ничего страшного, то пожалуй так и поступлю.
Огромное спасибо.

Offline Eurosport  
#10 Оставлено : 4 июля 2015 г. 7:59:14(UTC)
Eurosport

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

Группы: Участники
Зарегистрирован: 18.04.2015(UTC)
Сообщений: 5
Мужчина
Российская Федерация
Откуда: Ульяновск

Уважаемые профессионалы, подскажите пожалуйста, какими функциями мне далее следует пользоваться:
Реализация в delphi7.
Есть подпись (массив байт), полученная при подписании XML через функцию CryptSignMessage.
Есть штамп времени (массив байт), полученный при отправке на TSA-сервер самой подписи через функцию CryptRetrieveTimeStamp.
Требуется реализовать добавление это штампа в подпись в соответствии со спецификацией CAdES-T (ETSI TS 101 733 "CMS Advanced Electronic Signatures (CadES))
Offline proskura.e  
#11 Оставлено : 12 января 2021 г. 12:33:05(UTC)
proskura.e

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

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте!
Подскажите, пожалуйста, как добавить неподписанный атрибут к существующей подписи? Задача в том, чтобы при создании этой подписи добавить этот атрибут.
Пыталась при создании структуры CMSG_SIGNER_ENCODE_INFO добавить этот атрибут - получаю при вызове функции CryptMsgCalculateEncodedLength такую ошибку:
capi20: 0x101753880: :245 CryptMsgCalculateEncodedLength () Exception :'' at file:'/dailybuildsbranches/CSP_4_0/CSPbuild/CSP/capilite/CMSSignedMessage.cpp' line:2288

Решила попробовать через CryptMsgControl, но, видимо, чего-то не понимаю:

NSString *oid = attributeList.allKeys.firstObject; // 1.3.6.1.4.1.311.88.5.6
NSData *value = [attributeList[oid] dataUsingEncoding:NSUTF8StringEncoding]; // BBAgQ5XhIZBqQ6A5OF6Wjlg9

CRYPT_ATTR_BLOB cablob;
cablob.cbData = value.length;
cablob.pbData = value.bytes;

CRYPT_ATTRIBUTE ca;
ca.cValue = 1;
ca.pszObjId = (LPSTR)oid.UTF8String;
ca.rgValue = &cablob;

DWORD encoded_len;
if (!CryptEncodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_ATTRIBUTE, &ca, NULL, &encoded_len)) {
printf("Sizing of CryptEncodeObject error\n");
return nil;
}

BYTE *encoded_data = (BYTE *)malloc(encoded_len);
if (!CryptEncodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_ATTRIBUTE, &ca, encoded_data, &encoded_len)) {
printf("CryptEncodeObject error\n");
return nil;
}

CRYPT_DATA_BLOB tsp_blob;
tsp_blob.cbData = encoded_len;
tsp_blob.pbData = encoded_data;

CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA attr_para;
attr_para.cbSize = sizeof(attr_para);
attr_para.dwSignerIndex = 0;
attr_para.blob = tsp_blob;

if (!CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR, &attr_para)) {
fprintf(stderr, "CryptMsgControl failed 0x%0x", CSP_GetLastError());
free(encoded_data);
return nil;
}
free(encoded_data);

Попробовала обернуть атрибут в структуру CMSG_SIGNER_ENCODE_INFO:
SignerEncodeInfo.cUnauthAttr = 1;
SignerEncodeInfo.rgUnauthAttr = ca;

но на этапе кодирования этой струткуры получаю ошибку:
DWORD encoded_len;
if (!CryptEncodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS7_SIGNER_INFO, &SignerEncodeInfo, NULL, &encoded_len)) {
printf("Sizing of CryptEncodeObject error\n");
return nil;
}

Подскажите, пожалуйста, где я свернула не туда?
Offline proskura.e  
#12 Оставлено : 12 января 2021 г. 21:25:27(UTC)
proskura.e

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

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

Сказал(а) «Спасибо»: 2 раз
И в догонку вопрос: а как добавить подписанные атрибуты при создании подписи? Опишите, пожалуйста, хотя бы примерный алгоритм добавления подписанных и не подписанных кастомных атрибутов
Offline Санчир Момолдаев  
#13 Оставлено : 13 января 2021 г. 9:53:13(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 71 раз
Поблагодарили: 176 раз в 171 постах
обращение решается в рамках заявки на портале 35129
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.