Статус: Новичок
Группы: Участники
Зарегистрирован: 09.01.2008(UTC) Сообщений: 7 Откуда: Москва
|
Сообщение подписано и проходит проверку. Есть ли какие-то особенности в извлечении времени подписания из сообщения? Использую код: Код:
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
int get_signing_time (HCRYPTMSG hMsg, int signerIndex) {
DWORD ret = 0;
PCRYPT_ATTRIBUTES authAttr = NULL;
DWORD authAttr_len = 0;
DWORD i = 0;
PCRYPT_ATTR_BLOB timeBlob = NULL;
DWORD size = 0;
FILETIME fileTime;
SYSTEMTIME systemTime;
ret = CryptMsgGetParam(hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM, signerIndex, NULL, &authAttr_len);
if (ret) { printf("The attribute (CMSG_SIGNER_AUTH_ATTR_PARAM) has been acquired. Attribute size: %d\n", authAttr_len);}
else {
if (GetLastError() == CRYPT_E_ATTRIBUTES_MISSING) {
printf("The attribute CMSG_SIGNER_AUTH_ATTR_PARAM is not included into message.\n");
ret = 1;
return ret;
}
else {
printf("Decode CMSG_SIGNER_AUTH_ATTR_PARAM failed\n");
return ret;
}
}
// Резервируем память
if (authAttr_len) {
authAttr= (PCRYPT_ATTRIBUTES) malloc(authAttr_len);
if (!authAttr){
printf("Decode memory allocation failed\n");
return ret;
}
// Вернем атрибут
ret = CryptMsgGetParam(hMsg, CMSG_SIGNER_AUTH_ATTR_PARAM, signerIndex, authAttr, &authAttr_len);
if (ret) printf("The attribute (CMSG_SIGNER_AUTH_ATTR_PARAM) returned. Length is %lu.\n", authAttr_len);
else {
printf("Decode CMSG_SIGNER_AUTH_ATTR_PARAM #2 failed\n");
return ret;
}
}
for (i = 0; i < authAttr->cAttr; i++) {
if (strcmp (authAttr->rgAttr[i].pszObjId, szOID_RSA_signingTime) == 0 && authAttr->rgAttr[i].cValue ) {
timeBlob =(authAttr->rgAttr[i]).rgValue;
size = sizeof (FILETIME);
ret = CryptDecodeObject(MY_ENCODING_TYPE, szOID_RSA_signingTime, timeBlob->pbData, timeBlob->cbData, 0, (DWORD*) &fileTime, &size);
if (! ret) return ret;
if ( ! FileTimeToSystemTime(&fileTime, &systemTime)) return 0;
printf ("Signing time is: %d:%d.%d %02d-%02d-%d\n",
systemTime.wHour, systemTime.wMinute, systemTime.wSecond,
systemTime.wDay, systemTime.wMonth, systemTime.wYear);
}
}
return ret;
}
Ошибку вызывает CryptDecodeObject(...): GetLastError возвращает ошибку: 0x57
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Ну в этом коде я надеюсь ошибок нет :) А каким образом Вы это время добавляете в сообщение? Можно на саму подпись взглянуть? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.01.2008(UTC) Сообщений: 7 Откуда: Москва
|
Кирилл, подписанный документ отправил Вам как личное сообщение.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Да я получил, если честно ничего сказать не могу. Ваш код у меня работает, с Вашим же документом. Правда это на Win2003, VS 2005. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.01.2008(UTC) Сообщений: 7 Откуда: Москва
|
У нас все тоже работает при использовании CAPICOM, а если делать через CAPILite, то на декодировании времени подписи ошибку выдает
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close