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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Roman2002  
#1 Оставлено : 26 февраля 2008 г. 14:57:22(UTC)
Roman2002

Статус: Новичок

Группы: Участники
Зарегистрирован: 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
Offline Kirill Sobolev  
#2 Оставлено : 26 февраля 2008 г. 15:29:53(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Ну в этом коде я надеюсь ошибок нет :) А каким образом Вы это время добавляете в сообщение? Можно на саму подпись взглянуть?
Техническую поддержку оказываем тут
Наша база знаний
Offline Roman2002  
#3 Оставлено : 27 февраля 2008 г. 15:03:15(UTC)
Roman2002

Статус: Новичок

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

Кирилл, подписанный документ отправил Вам как личное сообщение.
Offline Kirill Sobolev  
#4 Оставлено : 27 февраля 2008 г. 15:28:10(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Да я получил, если честно ничего сказать не могу.
Ваш код у меня работает, с Вашим же документом.
Правда это на Win2003, VS 2005.
Техническую поддержку оказываем тут
Наша база знаний
Offline Roman2002  
#5 Оставлено : 27 февраля 2008 г. 16:44:35(UTC)
Roman2002

Статус: Новичок

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

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