Добрый день.
С помощью помощью интерфейса клиентских приложений сформировал запрос на штамп времени, получил ответ и выделил токен штампа времени. Теперь нужно добавить этот токен к 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
Подскажите, что я делаю не так?