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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline vdp1955  
#11 Оставлено : 15 декабря 2016 г. 16:09:51(UTC)
vdp1955

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

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

ViewController.swift.zip (3kb) загружен 7 раз(а).
ViewController был от старого варианта. Здесь правильный.
Offline Dmitry_Bokovikov  
#12 Оставлено : 16 декабря 2016 г. 13:29:59(UTC)
Dmitry_Bokovikov

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

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

Поблагодарили: 18 раз в 17 постах
Автор: vdp1955 Перейти к цитате
TestTSP.zip (70kb) загружен 10 раз(а).
Тестовый проект


Ошибки я вижу две:
1) CppWrapper имеет расширение *.m, а не *.mm
2) С++ header неправильно добавлен в bridging header. Как правильно добавить c++ header в bridging header можно почитать, например, здесь
Offline vdp1955  
#13 Оставлено : 16 декабря 2016 г. 18:21:41(UTC)
vdp1955

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

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

Добрый вечер!

Действительно, переименование в CppWraper.mm помогло (хотя в рабочем проекте и с CppWraper.m все компилируется).
Но теперь при линковке появляются undefined symbols типа:
CryptoPro::PKI::TSP::Client::CStamp::...
и
CryptoPro::PKI::TSP::Client::CRequest::...

Похоже, какой-то библиотеки не хватает?
Offline vdp1955  
#14 Оставлено : 19 декабря 2016 г. 11:54:27(UTC)
vdp1955

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

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

Добрый день!
Добавил библиотеку libpki.o и все слинковалось.
А где бы прочитать, какие бибдиотеки и в каких случаях добавлять в проект?
Offline vdp1955  
#15 Оставлено : 26 декабря 2016 г. 17:16:06(UTC)
vdp1955

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

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

Добрый день.
Сформировал я запрос, получил ответ, выделил токен и попытался вставить его в подпись с помощью такого кода в Objective-c++:

+(NSData *) addTimeStampToSign: (NSData *) sign TimeStampToken: (NSData *) tsp_token {
const BYTE *sign_data = (BYTE *)[sign bytes];
DWORD sign_len = (DWORD)[sign length];
BYTE *tsp_data = (BYTE *)[tsp_token bytes];
DWORD tsp_len = (DWORD)[tsp_token length];
HCRYPTMSG hMsg;
if (!(hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, NULL, NULL, NULL))) {
printf("CryptMsgOpenToDecode error");
return nil;
}
if (!CryptMsgUpdate(hMsg, sign_data, sign_len, TRUE)) {
printf("CryptMsgUpdate error");
return nil;
}

CRYPT_ATTR_BLOB cablob[1];
cablob[0].cbData = tsp_len;
cablob[0].pbData = tsp_data;

CRYPT_ATTRIBUTE ca;
ca.cValue = 1;
ca.pszObjId = (LPSTR)"1.2.840.113549.1.9.16.1.4";
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)) {
printf("CryptMsgControl error\n");
free(encoded_data);
return nil;
}
free(encoded_data);

if (!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, NULL, &sign_len)) {
printf("Sizing CryptMsgGetParam error\n");
return nil;
}

BYTE *sign_buffer = (BYTE *)malloc(sign_len);
if (!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, sign_buffer, &sign_len)) {
printf("CryptMsgGetParam error\n");
return nil;
}

if (hMsg) CryptMsgClose(hMsg);

NSData *enhanced_sign = [NSData dataWithBytes:sign_buffer length:sign_len];
free(sign_buffer);

return enhanced_sign;
}

Вроде все работает и при простом просмотре видны некоторые реквизиты штампа (например, кем сделан, каким сертификатом подписан и т.д.). Но при просмотре подписи с помощью КриптоАрм от компании “Цифровые Технологии” штамп показывается в каком-то закодированном виде. Вот этот кусок:

.....
Алгоритм подписи: ГОСТ Р 34.10-2001/ГОСТ Р 34.11-94

Атрибуты

Тип содержимого PKCS#7 - data
Время подписания 26.12.2016 13:00:51 UTC
Штамп времени 30 82 0e 69 06 09 2a 86 48 86 f7 0d 01 07 02 a0 82 0e 5a 30 82 0e 56 02 01 03 31 0c 30 0a 06 06 2a 85 03 02 02 09 05 00 30 7c 06 0b 2a 86 48 86 f7 0d 01 09 10 01 04 a0 6d 04 6b 30 69 02 01 01 06 07 2a 85 03 02 02 26 04 30 2c 30 08 06 06 2a 85 03 02 02 09 04 20 4f 28 c1 b3 dd 69 ea a7 46 6e 52 e8 0c 7d f1 69 8b fa 5b 1d de 1a 15 64 5a c7 21 8b 2a bb d2 9e 02 0d 1a 47 f4 c4 b9 00 00 00 00 01 01 01 df 18 0f 32 30 31 36 31 32 32 36 31 33 30 31 34 38 5a 30 03 02 01 64 02 08 55 70 32 cc 5f 17 7b e2 a0 82 08 65 30 82 08 61 30 82 08 10 a0 03 02 01 02 02 0a 11 6e ef ca 00 03 00 02 ce aa 30 08 06 06 2a 85 03 02 02 03 30 82 01 48 31 18 30 16 06 05 2a 85 03 64 01 12 0d 31 30 33 37 37 30 30 30 38 35 34 34 34 31 1a 30 18 06 08 2a 85 03 03 81 03 01 01 12 0c 30 30 37 37 31 37
.......

Штам, который я делаю в Windows с помощью Bouncy castle, этот же КриптоАрм показывает в нормальном читаемом виде.

Никак не могу понять, что я сделал не так.
Подпись с исходным файлом прилагаю.
s1.zip (3kb) загружен 6 раз(а).
Offline vdp1955  
#16 Оставлено : 28 декабря 2016 г. 17:02:19(UTC)
vdp1955

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

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

Так как никто не отвечает, приходится думать самому.

Посмотрев здесь решил, что нужно сначала сделать из токена штампа времени структуру CMSG_SIGNER_INFO и затем уже закодировать ее и добавить к подписи:

if (!(hMsg = CryptMsgOpenToDecode(MY_ENCODING, 0, 0, NULL, NULL, NULL))) {
error = CSP_GetLastError();
printf("CryptMsgOpenToDecode tsp error: %lx\n", error);
return nil;
}
if (!CryptMsgUpdate(hMsg, token_data, token_len, TRUE)) {
error = CSP_GetLastError();
printf("CryptMsgUpdate tsp error: %lx\n", error);
return nil;
}

DWORD signer_info_len;
if (!CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &signer_info_len)) {
error = CSP_GetLastError();
printf("CryptMsgGetParam error: %lx\n", error);
return nil;
}
printf("Signer_info length: %d\n", signer_info_len);


PCMSG_SIGNER_INFO pSignerInfo = (PCMSG_SIGNER_INFO)malloc(signer_info_len);
if (!CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, pSignerInfo, &signer_info_len)) {
error = CSP_GetLastError();
printf("CryptMsgGetParam error: %lx\n", error);
return nil;
}
printf("Signer info version: %d\n", pSignerInfo->dwVersion);
CryptMsgClose(hMsg);

До этого места все работает - размер структуры 1688, версия 1. Дальше кодируем:

DWORD encoded_signer_len;
if (!CryptEncodeObject(MY_ENCODING, PKCS7_SIGNER_INFO, pSignerInfo, NULL, &encoded_signer_len)) {
error = CSP_GetLastError();
printf("Sizing of CryptEncodeObject PKCS7_SIGNER_INFO error: %lx\n", error);
return nil;
}

BYTE *encoded_signer_data = (BYTE *)malloc(encoded_signer_len);
if (!CryptEncodeObject(MY_ENCODING, PKCS7_SIGNER_INFO, pSignerInfo, encoded_signer_data, &encoded_signer_len)) {
printf("CryptEncodeObject PKCS7_SIGNER_INFO error\n");
return nil;
}

И вот тут при определении размера выдается ошибка 80092002. Здесь обсуждалась такая же ошибка. Так может ее до сих пор не исправили? Писать собственную функцию кодирования SignerInfo, как сделал один из участников я пока не готов, да и нет полной уверенности, что все делаю правильно.

Кто-нибудь может помочь или все уже празднуют?
Offline vdp1955  
#17 Оставлено : 10 февраля 2017 г. 14:38:14(UTC)
vdp1955

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

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

Добрый день.
Может кто-нибудь что-то сказать по поводу ошибки 80092002 в CryptEncodeObject?
Ну хоть что-нибудь. Чтобы понять в каком направлении двигаться. Ждать нового фреймворка или реализовывать эту функцию самому? Или можно вообще обойтись без нее?
Пока занимался другими делами, но сейчас все упирается в эту проблему.
Offline Dmitry_Bokovikov  
#18 Оставлено : 10 февраля 2017 г. 15:13:37(UTC)
Dmitry_Bokovikov

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

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

Поблагодарили: 18 раз в 17 постах
Автор: vdp1955 Перейти к цитате
Добрый день.
Может кто-нибудь что-то сказать по поводу ошибки 80092002 в CryptEncodeObject?
Ну хоть что-нибудь. Чтобы понять в каком направлении двигаться. Ждать нового фреймворка или реализовывать эту функцию самому? Или можно вообще обойтись без нее?
Пока занимался другими делами, но сейчас все упирается в эту проблему.


Добрый день!
PKCS7_SIGNER_INFO не поддерживается в CryptEncodeObject
Offline vdp1955  
#19 Оставлено : 10 февраля 2017 г. 15:49:30(UTC)
vdp1955

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

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

Каким же образом тогда присоединить штамп времени к подписи?
Самому кодировать PKCS7_SIGNER_INFO или есть другой способ?
Offline Dmitry_Bokovikov  
#20 Оставлено : 10 февраля 2017 г. 15:54:32(UTC)
Dmitry_Bokovikov

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

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

Поблагодарили: 18 раз в 17 постах
Автор: vdp1955 Перейти к цитате
Каким же образом тогда присоединить штамп времени к подписи?
Самому кодировать PKCS7_SIGNER_INFO или есть другой способ?


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