Добрый день.
Сформировал я запрос, получил ответ, выделил токен и попытался вставить его в подпись с помощью такого кода в 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 раз(а).