1

Тема: Добавление атрибута szOID_RSA_signingTime "1.2.840.113549.1.9.5"

Здравствуйте!

При формировании  подписи  с  помощью  функций  CryptoApi   в  подпись  не  добавляется атрибут   дата  подписи ( szOID_RSA_signingTime   "1.2.840.113549.1.9.5").

В  некоторых  криптопровайдерах  она  добавляется  автоматически,  есть  ли  настройка  СКИЗИ СКАД  Сигнатура,  согласно  которой  криптопровайдер  делал бы  это автоматически?


краткий  код,  при котором  дата  не  добавляется:


    CMSG_SIGNER_ENCODE_INFO SignerEncodeInfo;
    CMSG_SIGNER_ENCODE_INFO SignerEncodeInfoArray[1];
    CERT_BLOB SignerCertBlob;
    CERT_BLOB SignerCertBlobArray[1];
    CMSG_SIGNED_ENCODE_INFO SignedMsgEncodeInfo;
        CryptMsgCalculateEncodedLength(... CMSG_SIGNED ...)
        CryptMsgOpenToEncode(... CMSG_SIGNED ...)
        CryptMsgUpdate (... (BYTE*)  pbContent ...)
        CryptMsgGetParam( ...CMSG_CONTENT_PARAM...)

2

Re: Добавление атрибута szOID_RSA_signingTime "1.2.840.113549.1.9.5"

Добрый день!

есть  ли  настройка,  согласно  которой  криптопровайдер  делал бы  это автоматически?

Нет, такой настройки в СКЗИ СКАД  Сигнатура нет.

3

Re: Добавление атрибута szOID_RSA_signingTime "1.2.840.113549.1.9.5"

alart пишет:

Добрый день!

есть  ли  настройка,  согласно  которой  криптопровайдер  делал бы  это автоматически?

Нет, такой настройки в СКЗИ СКАД  Сигнатура нет.


Как  правильно  добавить  дату  подписи


в структуру поле  rgAuthAttr CMSG_SIGNER_ENCODE_INFO?

в  какой  момент?

CMSG_SIGNER_ENCODE_INFO SignerEncodeInfo;
     .....

CryptEncodeObject( (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING), szOID_RSA_signingTime, &curtime, pTime, &szTime);
    pTime = (BYTE *)LocalAlloc(GPTR, szTime);
    CryptEncodeObject( (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING), szOID_RSA_signingTime, &curtime, pTime, &szTime);
   
    CRYPT_ATTR_BLOB time_blob;
    memset(&time_blob,0,sizeof(CRYPT_ATTR_BLOB));
    time_blob.cbData = szTime;
    time_blob.pbData = pTime;

        CRYPT_ATTRIBUTE attrib[1];
    attrib[0].pszObjId = szOID_RSA_signingTime;
    attrib[0].cValue = 1;
    attrib[0].rgValue = &time_blob;
    SignerEncodeInfo.cAuthAttr = 1;
    SignerEncodeInfo.rgAuthAttr =  attrib;

CryptMsgCalculateEncodedLength(... CMSG_SIGNED ...)
        CryptMsgOpenToEncode(... CMSG_SIGNED ...)
        CryptMsgUpdate (... (BYTE*)  pbContent ...)
        CryptMsgGetParam( ...CMSG_CONTENT_PARAM...)

то в CryptMsgGetParam  возникает  ошибка: "Имеются дополнительные данные.  (0x00EA)"

4

Re: Добавление атрибута szOID_RSA_signingTime "1.2.840.113549.1.9.5"

Решение:

        CMSG_SIGNER_ENCODE_INFO SignerEncodeInfo;
    SYSTEMTIME  curtime  ;
    GetSystemTime(&curtime);  
    FILETIME fileTime;
    SystemTimeToFileTime(&curtime, &fileTime);

    bool result = true;
     
    
    CRYPT_ATTR_BLOB time_blob = {0, NULL};
    if(result)
    if(!CryptEncodeObject(    PKCS_7_ASN_ENCODING  , 
         szOID_RSA_signingTime, 
        (LPVOID)&fileTime,
        NULL,
        &time_blob.cbData))
    {
        MyHandleError(_T("CryptEncodeObject szOID_RSA_signingTime I "),*errorMessage, GetLastError());
        result = false;
    }
     
        
    if(result){
        time_blob.pbData = (BYTE *)LocalAlloc(GPTR, time_blob.cbData);
        if (!CryptEncodeObject(  PKCS_7_ASN_ENCODING , 
            szOID_RSA_signingTime,
            (LPVOID)&fileTime, 
            time_blob.pbData,
            &time_blob.cbData))
        {
            MyHandleError(_T("CryptEncodeObject szOID_RSA_signingTime II "),*errorMessage, GetLastError());
            result = false;
        }
    }

    
     

    CRYPT_ATTRIBUTE attrib={szOID_RSA_signingTime,1, &time_blob};

     SignerEncodeInfo.cAuthAttr = 1;
     SignerEncodeInfo.rgAuthAttr = &attrib;


CryptMsgCalculateEncodedLength(... CMSG_SIGNED ...)
        CryptMsgOpenToEncode(... CMSG_SIGNED ...)
        CryptMsgUpdate (... (BYTE*)  pbContent ...)
        CryptMsgGetParam( ...CMSG_CONTENT_PARAM...)

5

Re: Добавление атрибута szOID_RSA_signingTime "1.2.840.113549.1.9.5"

ivanychhh пишет:

Решение:

        
    SYSTEMTIME  curtime  ;
    GetSystemTime(&curtime);  
    FILETIME fileTime;
    SystemTimeToFileTime(&curtime, &fileTime);

А теперь самое важное. СКАД Сигнатура 5.0.332.0
не преобразует данную дату в локальное время.
То есть он берёт время FileTime и не преобразует в CurrentTime при проверки подписи, что достаточно проблемно со стороны конечного пользователя, так как время показывается в GMT(UTC)

6

Re: Добавление атрибута szOID_RSA_signingTime "1.2.840.113549.1.9.5"

Согласно документации Руководство программиста ВАМБ.00106-01 33 01, раздел 1.4.9 Результаты выполнения функций, в структуре sign_status_t время подписания представлено в часовом поясе UTC:

− date_t time
Время вычисления ЭП в часовом поясе UTC (если присутствует в подписанном сообщении,
иначе равно ”0”).