Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как приклеить к ЭЦП сертификат? 
:(
    Опции темы
artsb
Дата 7.5.2010, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Всем привет!

Есть отдельно ЭЦП и сертификат. Нужно их как-то объединить и сохранить в одном файле.
Делаю так:
Код

bool CertToECP(const char *ccFileName, Byte *bECP, int iECPLen, const Byte *bCert, int iCertLen) {

// ccFileName - путь куда будет сохранён результат
// bECP - файл ЭЦП (байтовый массив)
// iECPLen - длина массива
// bCert - файл сертификата (байтовый массив)
// iCertLen - длина массива

bool bResult = true;
HCERTSTORE hFileStore = NULL;
PCCERT_CONTEXT hCert = NULL;
CRYPT_DATA_BLOB cdb;

cdb.cbData = iECPLen;
cdb.pbData = (Byte*)bECP;

hFileStore = CertOpenStore(CERT_STORE_PROV_PKCS7,
                            PKCS_7_ASN_ENCODING,
                            NULL,
                            CERT_STORE_OPEN_EXISTING_FLAG,
                            &cdb);

if(!hFileStore) {
  return false;
}

hCert = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, bCert, iCertLen);

if(!hCert) {
  CertCloseStore(hFileStore, 0);
  return false;
}

if(!CertAddCertificateContextToStore(hFileStore, hCert, CERT_STORE_ADD_REPLACE_EXISTING, 0)) {
  bResult = false;
}

CertFreeCertificateContext(hCert);

if(!CertSaveStore(hFileStore,
               PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
               CERT_STORE_SAVE_AS_PKCS7,
               CERT_STORE_SAVE_TO_FILENAME_A,
               (void*) ccFileName,
               0)) {
  bResult = false;
}

CertCloseStore(hFileStore, 0);

return bResult;
}

Всё отрабатывает. На выходе имею *.p7b файл, который отлично открывается системой и там лежит сертификат. А вот ЭЦП нет.
Подскажите что не так.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 28.5.2010, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Решил проблему:
Код

bool CertToECP(const char *ccFileName, Byte *bECP, int iECPLen, Byte *bCert, int iCertLen) {

// ccFileName - путь куда будет сохранён результат
// bECP - файл ЭЦП (байтовый массив)
// iECPLen - длина массива
// bCert - файл сертификата (байтовый массив)
// iCertLen - длина массива

 HCRYPTMSG hMsg;
 CRYPT_INTEGER_BLOB cib;
 PCCERT_CONTEXT hCert = NULL;
 Byte *bRes;
 unsigned long int iSize;

 hCert = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, bCert, iCertLen);

 if(!hCert) {
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, NULL, NULL, NULL);
 if(!hMsg) {

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 if(!CryptMsgUpdate(hMsg, bECP, iECPLen, true)) {
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 cib.cbData = iCertLen;
 cib.pbData = bCert;

 if(!CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &cib)) {
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);                                                             

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 iSize = 0;
 if(!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, NULL, &iSize)) {      
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 bRes = new Byte[iSize];
 if(!bRes) {
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 if(!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, bRes, &iSize)) {
  delete [] bRes;
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 int hFile;
 hFile = FileCreate(ccFileName);

 if(hFile) {
  FileWrite(hFile, bRes, iSize);

  FileClose(hFile);
 }
 else {
  delete [] bRes;
  CertFreeCertificateContext(hCert);
  CryptMsgClose(hMsg);

  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0,
                NULL);

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);

  LocalFree(lpMsgBuf);

  return false;
 }

 delete [] bRes;
 CertFreeCertificateContext(hCert);
 CryptMsgClose(hMsg);
 return true;
}



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ivanychhh
Дата 13.2.2012, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Задачка обратная. Есть присоединенная ЭЦП, содержащаяя подписи нескольких лиц. Необходимо, удалить одну из соподписей. 

Если делали такую операцию подскажите пожалуйста как?

Знаю что надо использовать CryptMsgControl(.., CMSG_CTRL_DEL_SIGNER, ..), но что -то ни как недопойму, какие параметры надо давать этой функции. 
PM MAIL   Вверх
ivanychhh
Дата 14.2.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Цитата(ivanychhh @ 13.2.2012,  14:06)
Знаю что надо использовать CryptMsgControl(.., CMSG_CTRL_DEL_SIGNER, ..), но что -то ни как недопойму, какие параметры надо давать этой функции.

Решил задачку. 

Вот пример функции для отзыва соподписи.

Код


bool DeCosignMessage(   CRYPT_DATA_BLOB *pCosignedMessageBlob  )
{
    bool fReturn = false;
    //BYTE *pbDecodedMessage = NULL;

    
    LONG lSigners = CryptGetMessageSignerCount(
        MY_ENCODING_TYPE, 
        pCosignedMessageBlob->pbData, 
        pCosignedMessageBlob->cbData);
    if(-1 == lSigners)
    {
        MyHandleError(TEXT("CryptGetMessageSignerCount failed."));
        return false;
    }
    HCRYPTMSG hMsg = NULL;
    if(!(hMsg = CryptMsgOpenToDecode(
        MY_ENCODING_TYPE,
        0,
        0,
        NULL,
        NULL,
        NULL)))
    {
        MyHandleError(TEXT("CryptMsgOpenToDecode failed."));
        return false;
    }
    if(!(CryptMsgUpdate(
        hMsg,
        pCosignedMessageBlob->pbData,
        pCosignedMessageBlob->cbData,
        TRUE)))
    {
        MyHandleError(TEXT("CryptMsgUpdate failed."));
        return false;
    }

    int index=0; // !!!! Удаляю первую подпись !!!!

    //--- Удаляю первого подписанта  --- 
    if (!CryptMsgControl(hMsg,0, CMSG_CTRL_DEL_SIGNER,&index))
    {
        MyHandleError(TEXT("CMSG_CTRL_DEL_SIGNER failed."));
        
    }

    // получаю исправленую подпись


    free(pCosignedMessageBlob->pbData);
    pCosignedMessageBlob->pbData = NULL;
    pCosignedMessageBlob->cbData = 0;
    if(CryptMsgGetParam(
        hMsg,
        CMSG_ENCODED_MESSAGE,
        0,
        NULL,
        &pCosignedMessageBlob->cbData))
    {
        _tprintf(TEXT("The size for the encoded BLOB is %d.\n"),pCosignedMessageBlob->cbData);        
    }
    else
    {
        MyHandleError(TEXT("Sizing of cbSignerInfo failed."));
        return false;
    }
    

    if(!(pCosignedMessageBlob->pbData = 
        (BYTE*)malloc(pCosignedMessageBlob->cbData)))
    {
        MyHandleError(
            TEXT("Memory allocation error while cosigning."));
        return false;
    }

    // Get the cosigned message BLOB.
    if(CryptMsgGetParam(
        hMsg,
        CMSG_ENCODED_MESSAGE,
        0,
        pCosignedMessageBlob->pbData,
        &pCosignedMessageBlob->cbData))
    {
        _tprintf(TEXT("The message was cosigned successfully. \n"));
        
        // pbSignedMessageBlob now contains the signed BLOB.
        /*goto exit_VerifyCosignedMessage;*/
    }
    else
    {
        MyHandleError(TEXT("Sizing of cbSignerInfo failed."));
        fReturn = true; //goto exit_VerifyCosignedMessage;
    }
    
     // смотрю сколько подписантов осталось.
    LONG lSigners1 = CryptGetMessageSignerCount(
        MY_ENCODING_TYPE, 
        pCosignedMessageBlob->pbData, 
        pCosignedMessageBlob->cbData);
    
    if(0 == lSigners1)
    {
        MessageBox(NULL,"Нет подписантов.", "Ошибка!!!!", MB_OK    );
    }
    if(hMsg)
    {
        CryptMsgClose(hMsg);
    }
     


    return fReturn;
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.