Автор Тема: формирование подписи с использованием cptumar.dll  (Прочитано 30622 раз)

0 Пользователей и 1 Гость просматривают эту тему.

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
Добрый день.
В документации есть код который формирует Signed PKCS-7 message:

// Создеем хэш-объект
if (!CPCreateHash(hProv,CALG_TGR3411,0,0,&hHash)) {
printf("CPCreateHash Error: %0X\n",GetLastErrorCSP(hProv));
return 1;
}
// Хэшируем данные
if (!CPHashData(hProv,hHash,(BYTE*)Data_for_sign,strlen(Data_for_sign),0)) {
printf("CPHashData Error: %0X\n",GetLastErrorCSP(hProv));
return 1; 
}
// Формируем PKCS7
len=sizeof(WBuf);
if (!CPSignHash(hProv,hHash,AT_SIGNATURE,NULL,CRYPT_SIGN_PKCS7|PKCS7_BASE64_ENCODING,WBuf,&len)) {
printf("CPSignHash Error: %0X\n",GetLastErrorCSP(hProv));   
return 1;
}
// Сохраняем результат

writeFile(PKCS7S_FILE,WBuf,len);
А если я хочу только получить подпись сообщения по ГОСТ, что в этом коде нужно заменить?

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Добрый день.

А если я хочу только получить подпись сообщения по ГОСТ, что в этом коде нужно заменить?

Для этого необходимо передать флаг 0 вместо CRYPT_SIGN_PKCS7|PKCS7_BASE64_ENCODING

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
Большое спасибо Сергей за ответ.

Появился такой вопрос
Пытаюсь перед формированием подписи загрузить сертификат с приватным ключом, защищенный паролем.
делаю это функией CPImportKey, и не пойму куда ей передать пароль для сертификата.

без пароля она естетственно не загружает сертификат.

Подскажите пожалуйста.

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Добрый день.

В каком формате пытаетесь загрузить сертификат в функцию CPImportKey?

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
В формате *.p12 и pfx

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Для загрузки pfx (p12) файлов необходимо использовать функцию CPAcquireContext.
Функция CPImportKey не предназначена для этого.

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
CSP_PROF = "имя сертификата"
CPAcquireContext(&hProv,(char*)CSP_PROF,0,NULL)
выдает ошибку 8009001d : Provider DLL failed to initialize correctly

Это наверное что файл запаролен?
Мне на юникс нужно вытащить в каком либо виде секретный ключь, чтоб с его помощью сформировать подпись.
помогите пожалуйста  :-[

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
навсякий случай ключи, можнет в них чтото не то?
пароль: 6nhokm

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Для загрузки ключей с паролем можно воспользоваться функцией:
int createURL(char *name, char *dev, char *user, char *pass, char *param, char *cont, int alg_exch, int alg_sign, char *profile){
  ContInfoEx *contInfoEx = NULL;
  DWORD cbData = 0;
  HCRYPTPROV hProv = 0;

  contInfoEx = new ContInfoEx;
  if (!contInfoEx) {
return 1;
  }
  memset(contInfoEx, 0, sizeof(ContInfoEx));
  strcpy(contInfoEx->name, name);
  strcpy(contInfoEx->dev, dev);
  strcpy(contInfoEx->user, user);
  strcpy(contInfoEx->pass, pass);
  strcpy(contInfoEx->param, param);
  strcpy(contInfoEx->cont, cont);
  contInfoEx->alg_exch = alg_exch;
  contInfoEx->alg_sign = alg_sign;
  cbData = sizeof(ContInfoEx);
  if(!CPAcquireContext(&hProv, NULL, CRYPT_VERIFYCONTEXT, NULL)){
delete contInfoEx;
return 2;
  }
  if(!CPGetProvParam(hProv, PP_PROF_TO_URL, (BYTE *)contInfoEx, &cbData, 0)){
delete contInfoEx;
CPReleaseContext(hProv, 0);
return 3;
  }
  strcpy(profile, contInfoEx->Url);
  delete contInfoEx;
  CPReleaseContext(hProv, 0);
  return 0;
}
Пример работы данной функции:
HCRYPTPROV hProv = 0;
char profile[512];
LoadTumarCSP(NULL);
int retCode = createURL("myprofile", "file", "test1priv", "6nhokm", "c:\\key\\", "pfx", 0xA045, 0xAA3A, profile);
if(retCode==0){
if(!CPAcquireContext(&hProv, profile, 0, NULL)){
  printf("error load key \n");
}else{
  printf("profile load \n");
          CPReleaseContext(hProv, 0);
        }
}

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
Большое списибо Сергей за функцию.
tInfoEx = new ContInfoEx; создает класс ContInfoEx, боюсь что эту строчку будет нельзя перевести на 4gl.

Может есть какой нибуть способ убрать пароль с сертификата вообще?
Этот сертификат будет лежать на сервере, в недоступном другим месте.

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Re: формирование подписи с использованием cptumar.dll
« Ответ #10 : 11 Октябрь 2012, 13:17:22 »
ContInfoEx - это структура.
Можно создать в tumarCSP контейнер bin без пароля и импортировать в него ключ и сертификат из PKCS#12 файла.
На Unix системах его можно потом будет загружать передовая вместо профайла полный путь к контейнеру.

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
Re: формирование подписи с использованием cptumar.dll
« Ответ #11 : 11 Октябрь 2012, 17:28:27 »
Спасибо Сергей.

сформировал бинарный контейнер по рекомендациям. смотрю сертификат из конфигуратора и не вижу там секретного ключа.
положил этот сертификат на юникс:

вызываю функцию CPAcquireContext, передаю ей полный путь "/home/sudv/0176078/2/sudv.bin" она не отрабатывает и возвращает ошибку
0x8009001DL Provider DLL failed to initialize correctly.
Причем если заведомо передаю неправильный путь, получаю тоже эту ошибку.
Теперь непонятно, толь контейнер не находит, толи в контейнере самом проблема, приватный ключ не видно.
Контейнер приложил.
Может путь как нибуть еще нужно отформатировать?

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Re: формирование подписи с использованием cptumar.dll
« Ответ #12 : 11 Октябрь 2012, 17:41:00 »
В контейнере содержится ключ и сертификат.
Ошибка 0x8009001 (Access denied) означает что у пользователя запускающего программу не хватает прав.
Необходимо проверить что у пользователя из под которого запускается программа есть права на чтение каталога /TumarCSP
и права на чтение и запись файла /TumarCSP/etc/cptumar.conf
или права на conf файл должны быть выставлены примерно так:
-rw-rw-rw- 1 root root 42 Mar  1  2012 /TumarCSP/etc/cptumar.conf

sudv

  • Постоялец
  • ***
  • Сообщений: 130
    • Просмотр профиля
Re: формирование подписи с использованием cptumar.dll
« Ответ #13 : 11 Октябрь 2012, 18:19:29 »
я думаю что на сервере нет каталога TumarCSP, мы положили под ноги библиотеку переданную на УЦ.
Я понял для юникса инсталятора как такового нет.
А сам контейнер доступен для чтения и для записи.

А где эта папка должна быть в принципе?

Sergey

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 639
    • Просмотр профиля
Re: формирование подписи с использованием cptumar.dll
« Ответ #14 : 12 Октябрь 2012, 08:36:23 »
Для полного функционирования криптопровайдера TumarCSP его необходимо установить.
Инсталятор TumarCSP есть под все платформы на которых он работает.