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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vdp1955  
#1 Оставлено : 18 января 2017 г. 18:14:32(UTC)
vdp1955

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

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

Добрый день.

С помощью помощью интерфейса клиентских приложений сформировал запрос на штамп времени, получил ответ и выделил токен штампа времени. Теперь нужно добавить этот токен к PKCS7 подписи, как неподписанный атрибут. Пытаюсь сделать это с помощью такого кода:

BYTE *addTimeStampToSign: (const BYTE *sign, DWORD sign_len, const BYTE *tsp_token, DWORD tsp_len) {
HCRYPTMSG hMsg;
ULONG error;
#define MY_ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)

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, tsp_token, tsp_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);

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;
}

CRYPT_ATTR_BLOB cablob[1];
cablob[0].cbData = encoded_signer_len;
cablob[0].pbData = encoded_signer_data;

CRYPT_ATTRIBUTE caTsp;
caTsp.cValue = 1;
caTsp.pszObjId = (LPSTR)"1.2.840.113549.1.9.16.1.4";
caTsp.rgValue = cablob;

DWORD encoded_len;
if (!CryptEncodeObject(MY_ENCODING, PKCS_ATTRIBUTE, &caTsp, NULL, &encoded_len)) {
printf("Sizing of CryptEncodeObject error\n");
return nil;
}

BYTE *encoded_data = (BYTE *)malloc(encoded_len);
if (!CryptEncodeObject(MY_ENCODING, PKCS_ATTRIBUTE, &caTsp, 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 (!(hMsg = CryptMsgOpenToDecode(MY_ENCODING, 0, 0, NULL, NULL, NULL))) {
printf("CryptMsgOpenToDecode error");
return nil;
}
if (!CryptMsgUpdate(hMsg, sign, sign_len, TRUE)) {
printf("CryptMsgUpdate error");
return nil;
}
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;
}

CryptMsgClose(hMsg);

return sign_buffer;
}

В результате получаю ошибку при попытке закодировать полученную из токена структуру SignerInfo:
Sizing of CryptEncodeObject PKCS7_SIGNER_INFO error: 80092002

Подскажите, что я делаю не так?

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