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

Уведомление

Icon
Error

6 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline Kirill Sobolev  
#11 Оставлено : 28 марта 2013 г. 14:16:20(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Для подписи высокоуровневая функция, для соподписи набор низкоуровневых.

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


Техническую поддержку оказываем тут
Наша база знаний
Offline Boris@Serezhkin.com  
#12 Оставлено : 28 марта 2013 г. 18:14:54(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Щасс попробую осмыслить.
Предлагается не блоб в цикле крутить, а hMsg.
Остается вопрос как поведет себя связка
CryptMsgOpenToEncode, CryptMsgUpdate(блоб)
если блоб уже подписан.
Если добавлять к подписаному, то decode, update ....
А если к чистому то Encode, update ...
По моему вопрос остается: Тук-тук, а кто в блобике живет?
И по видимому вопрос придется решать организационно, где-то хранить
флаг был ли подписан блоб.
Offline Новожилова Елена  
#13 Оставлено : 5 апреля 2013 г. 12:43:24(UTC)
Новожилова Елена

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

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

Поблагодарили: 99 раз в 95 постах
А почему бы сразу не передать все сертификаты и не подписать за один прием?

При помощи CryptMsgOpenToEncode(CMSG_SIGNED)... Передаете структуру CMSG_SIGNED_ENCODE_INFO, в которой и заполняете массив rgSigners.
Offline Boris@Serezhkin.com  
#14 Оставлено : 5 апреля 2013 г. 16:58:36(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Новожилова Елена Перейти к цитате
А почему бы сразу не передать все сертификаты и не подписать за один прием?


А сидят, бяки такие, в разных кабинетах и корпусах. Angel
Данные я могу перегонять и как файд и через майл-слот.
SQL у многих нету, было бы проще.

Конечно я утрирую и малость фантазирую.
Я всегда знаю когда накладывается первая подпись, а когда последующие...
Все равно хочется обойтись без "если ПЕРВАЯ то ... иначе ..."
Однако вроде не ладится чаша... Как минимум надо изначально данные обернуть в ASN.1,
а потом одинаковой процедурой ...
Идеологически я прав в этом?
Anxious

А насчет - подписать одним махом - так они в рутокенах запутаются, коий втыкивать.

Борис


Offline Boris@Serezhkin.com  
#15 Оставлено : 5 апреля 2013 г. 17:20:59(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
И вдогонку еще маленький вопрос:
Шифрование на N адресатов.
Так как теоретически они могут лежать в разных хранилищах,
то при построении PCCERT_CONTEXT rgpRecipientCert[ ]
для CryptEncryptMessage, я в цикле по адресатам -
открываю хранилище, нахожу нужный сертификат и делаю следующее:
ppcert^ := CertDuplicateCertificateContext(pcert);
Inc(ppcert);
CertFreeCertificateContext(pcert);
CertCloseStore(hStore, CERT_CLOSE_STORE_CHECK_FLAG);
исходя из того, что одновременно держать открытми N хранилищ
явно неправильно.
Вроде все работает.
Так вопрос в том правомочно ли я здесь использую CertDuplicateCertificateContext ?
Или можно обойтись без него, не освобождая контекст ?

Борис

PS: по окончании CryptEncryptMessage я освобождаю все использованные контексты.

Отредактировано пользователем 5 апреля 2013 г. 17:31:54(UTC)  | Причина: Add PS

Offline Новожилова Елена  
#16 Оставлено : 5 апреля 2013 г. 18:03:06(UTC)
Новожилова Елена

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

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

Поблагодарили: 99 раз в 95 постах
Цитата:
Как минимум надо изначально данные обернуть в ASN.1...


А вы укажите число подписей - 0 Whistle И будут вам данные в ASN1
Offline Boris@Serezhkin.com  
#17 Оставлено : 5 апреля 2013 г. 18:13:58(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Новожилова Елена Перейти к цитате
Цитата:
Как минимум надо изначально данные обернуть в ASN.1...


А вы укажите число подписей - 0 Whistle И будут вам данные в ASN1


М`дааа... до чего дошел прогресс... В жисть бы не додумался. d'oh!
Собственно про CryptMsgOpenToEncode я и думал.
Не ожидал такого подхода. Собирался покапаться в параметрах...

СПАСИБО.
Борис

Offline Boris@Serezhkin.com  
#18 Оставлено : 14 апреля 2013 г. 14:17:27(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Новожилова Елена Перейти к цитате
Цитата:
Как минимум надо изначально данные обернуть в ASN.1...

А вы укажите число подписей - 0 Whistle И будут вам данные в ASN1

Обернул, все замечательно, все работает. И внутренняя стройность прорисовалась.

Однако, наши "визуализаторы" только щасс сказали - нужна отсоединенная попись.

Тут я и припух, малость.
Создать DETACHED подпись одним махом - легко. CryptSignMessage
Проверить DETACHED подпись - могу.
CryptMsgOpenToDecode(...)
CryptMsgUpdate(..SignBlob)
CryptMsgUpdate(..DataBlob)
цикл по подписантам: проверяем каждого

Добавить DETACHED подпись - почти могу.
CryptMsgOpenToDecode(...)
CryptMsgUpdate(..SignBlob)
CryptMsgUpdate(..DataBlob)
CryptMsgControl(..CMSG_CTRL_ADD_SIGNER)
и вот тут я заткнулся.
CryptMsgGetParam(..CMSG_CONTENT_PARAM)
возвращает нормальный блоб с присоединенной подписью.

Ранее искал по форуму нашел одно упоминание человек также хотел
"разодрать" данные и подпись для раздельного хранения.

Так вот и вопрос: как извлечь блоб с добавленной подписью?

Борис

ps: Общение на форуме плохо влияет на пищеварение. Shhh
На днях котлеты подгорели, вчера полтора кг окорока (чуть-чуть) Think
А сегодня собачья каша убежала. Они ее не догнали....Dancing




Offline Boris@Serezhkin.com  
#19 Оставлено : 15 апреля 2013 г. 1:43:44(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Автор: Boris@Serezhkin.com Перейти к цитате

Добавить DETACHED подпись - почти могу.
CryptMsgOpenToDecode(...)
CryptMsgUpdate(..SignBlob)
CryptMsgUpdate(..DataBlob)
CryptMsgControl(..CMSG_CTRL_ADD_SIGNER)
и вот тут я заткнулся.
CryptMsgGetParam(..CMSG_CONTENT_PARAM)
возвращает нормальный блоб с присоединенной подписью.


Урра, разобрался. Просто замыленым глазом я бежал не по той ветке,
Вот и удивлялся.
Все прекрасно работает при добавлении DETACHED подписи
CryptMsgGetParam(..CMSG_CONTENT_PARAM)
возвращает блоб с подписью.
Надеюсь что и при удалении одной из подписей вопросов не возникнет.

Однако вопрос остался
"Каким топором отрубить ATTACHED подпись и сохранить как DETACHED"?
Данные ведь извлекаются легко.

Offline Boris@Serezhkin.com  
#20 Оставлено : 15 апреля 2013 г. 9:50:18(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
НЕТ В МИРЕ СОВЕРШЕНСТВА...

Создал DETACH подпись в криптоарме, проверяю - вот они два подписанта.
Добавил еще три, кодом который ниже, проверяю - все пять тут.
Однако рано я обрадовался. Пытаюсь создать первую DETACH подпись:
(проверки и прочее из кода убираю)
сертификат ГОСТ или RSA - результат одинаков, и печален.

bGetBlob(fName, xData); - получили данные
bGetBlob(fName+'.sig', xSign);- получили подпись изначально (0,nil)

bDETACH := true;

if xSign.cbData =0 then begin
xSign := xData; - вставил от безысходности, на результат не влияет.
Result := bPrepareBlob(xSign)
- bPrepareBlob это
- CryptSignMessage(@SigParams, bDETACH, 1,Addr(MessageArray), Addr(MessageSizeArray),xMsg.pbData, xMsg.cbData)
- с параметрами SigParams.cMsgCert := 0; SigParams.rgpMsgCert := nil;
- как посоветовала Елена. Для присоединенной подписи все работает.
end;

bPutBlob('EmptySign.txt',xSign);
в результате получаем структуру 37 байт, прикладываю в файле
// 0 35: SEQUENCE {
// 2 9: OBJECT IDENTIFIER signedData (1 2 840 113549 1 7 2)
// 13 22: [0] {
// 15 20: SEQUENCE {
// 17 1: INTEGER 1
// 20 0: SET {}
// 22 11: SEQUENCE {
// 24 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
// : }
// 35 0: SET {}
// : }
// : }
// : }
//.


if not (bGetMyCert(hStore,pCert,myCert)) then exit;
if not CryptAcquireCertificatePrivateKey(pCert, 0, nil, hProv, @KeySpec, @CallerFree) then
- Сертификат находится, ключ есть.

hMsg := CryptMsgOpenToDecode(bMY_TYPE, CMSG_DETACHED_FLAG, 0, 0, nil, nil);
- ок
if not (CryptMsgUpdate(hMsg, xSign.pbData, xSign.cbData, TRUE)) then begin
- ок
if not (CryptMsgUpdate(hMsg, xData.pbData, xData.cbData, true)) then begin
- ок

// Initialize the CMSG_SIGNER_ENCODE_INFO structure for the cosigner.
FillChar(CosignerInfo, SizeOf(CMSG_SIGNER_ENCODE_INFO), #0 );
CosignerInfo.cbSize := sizeof(CMSG_SIGNER_ENCODE_INFO);
- размер либо 48, либо 84 пробовал и так и так
CosignerInfo.pCertInfo := pCert.pCertInfo;
CosignerInfo.hCryptProv := hProv;
CosignerInfo.dwKeySpec := KeySpec; //AT_SIGNATURE; = 1
CosignerInfo.HashAlgorithm.pszObjId := pChar(bhashalg(pCert)); = '1.3.14.3.2.2.6'
CosignerInfo.cAuthAttr :=0;
CosignerInfo.rgAuthAttr :=nil;
CosignerInfo.cUnauthAttr := 0;
CosignerInfo.rgUnauthAttr :=nil;
{$IFDEF CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS}
- полная структура или укороченная на результат не влияет.
CosignerInfo.SignerId := mycert.idCert; - (3,SHA1HASHblob)
CosignerInfo.HashEncryptionAlgorithm := pCert.pCertInfo.SubjectPublicKeyInfo.Algorithm ;
= '1.2.840.113549.1.1.1'
CosignerInfo.pvHashEncryptionAuxInfo := nil;
{$ENDIF CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS}

// ADD Attribute. - добавляются

// Add the cosigner to the message.
if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @CosignerInfo) then

- ERROR

LastERR = 80091002h -2146889726
LastDSC = Unknown cryptographic algorithm
- для присоединенной подписи работает,
- для DETACH если уже что-то было, тоже все замечательно

// Add the cosigner's certificate to the message.
if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, @CoCert) then
- если переместить этот кусочек выше, выполняется.

if not CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, nil, xOut.cbData) then
bSetBlob(xOut);
if not (CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, xOut.pbData, xOut.cbData)) then

CryptMsgClose(hMsg);
CryptReleaseContext(hProv, 0);
CertFreeCertificateContext(pcert);
CertCloseStore(hStore, CERT_CLOSE_STORE_FORCE_FLAG);

bPutBlob(fName+'.sig',xOut);

В чем проблема не могу понять.
А так хочется иметь одну функцию SignBlob()Angel

Борис

PS:
Попробую удалить всех подписантов и посмотрю что останется в xSign-е ?

Отредактировано пользователем 15 апреля 2013 г. 9:58:02(UTC)  | Причина: Add PS

Вложение(я):
EmptySign.txt (1kb) загружен 3 раз(а).

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