проверка подписи на cptumar

Автор sudv, 21 Август 2012, 15:03:15

« предыдущая тема - следующая тема »

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

Вниз

sudv

Добрый день. Помогите пожалуйста разобраться с вопросами.

в примере "Проверка подписи" проверяется подпись для sha1RSA?
ключ key.bin как получить из Windows имея ключи pkcs12_sign.p12?
Как проверить подпись сформированую с ключом Гост?
(Алгоритм хеширования ГОСТ 34.311. Алгоритм подписи ГОСТ 34.310.)

пример :


//------------------------------------------------------------------------------
// Tumar CSP
// Copyright (c) 2011 Scientific Lab. Gamma Technologies. All rights reserved.
// SDK
// Verify Signature
//------------------------------------------------------------------------------
#include "ex_util.h"
//------------------------------------------------------------------------------
unsigned char key[1024],tbs[2048],sig[1024];
//------------------------------------------------------------------------------
void inv_copy(unsigned char *dest, const unsigned char *src, int n) {
int i;
unsigned char c;
if (dest!=src) for(i=0;i<n;i++) dest[i]=src[n-i-1];
else for(i=0;i<n/2;i++) {c=dest[i]; dest[i]=src[n-i-1]; dest[n-i-1]=c;}
}
//------------------------------------------------------------------------------
int main(void)
{
int code;
HCRYPTPROV hProv=0;
HCRYPTHASH hHash;
HCRYPTKEY  hKey;
DWORD szk,szs,szt;

// Загружаем криптопровайдер
code=LoadTumarCSP((char*)CSP_LIB); if (code) {printf("Load CSP error: %d\n",code); return 1;}
//
// Загружаем key
if (getFileLen("key.bin",   &szk)) {printf("getFileLen error\r\n"); return 1;}
if (readFile  ("key.bin",key,szk)) {printf("readFile error\r\n");   return 1;}
// Загружаем sig
if (getFileLen("sig.bin",   &szs)) {printf("getFileLen error\r\n"); return 1;}
if (readFile  ("sig.bin",sig,szs)) {printf("readFile error\r\n");   return 1;}
// Загружаем tbs
if (getFileLen("tbs.bin",   &szt)) {printf("getFileLen error\r\n"); return 1;}
if (readFile  ("tbs.bin",tbs,szt)) {printf("readFile error\r\n");   return 1;}
//
// Создаем контекст CSP
if (!CPAcquireContext(&hProv,NULL,CRYPT_VERIFYCONTEXT,NULL)) {
printf("CPAcquireContext Error: %0X\n",GetLastErrorCSP(0));
return 1;
}
// Создеем хэш-объект
if (!CPCreateHash(hProv,CALG_SHA_160,0,0,&hHash)) {
printf("CPCreateHash Error: %0X\n",GetLastErrorCSP(hProv));
return 1;
}
// Хэшируем данные
if (!CPHashData(hProv,hHash,tbs,szt,0)) {
printf("CPHashData Error: %0X\n",GetLastErrorCSP(hProv));
return 1;
}
// Устанавливаем ключ для проверки ЭЦП
if (!CPImportKey(hProv,key,szk,0,0,&hKey)) {
printf("CPImportKey Error: %0X\n",GetLastErrorCSP(hProv));
return 1;
}

inv_copy(sig,sig,(int)szs);

// Проверяем подпись
if (!CPVerifySignature(hProv,hHash,sig,szs,hKey,NULL,0)) {
printf("CPVerifySignature Error: %0X\n",GetLastErrorCSP(hProv));
return 1;
}
//
CPDestroyHash(hProv,hHash);
// Закрываем контекст CSP
CPReleaseContext(hProv,0);
printf("OK\n");
return 0;
}
//------------------------------------------------------------------------------


sudv

в примере также используется функция GetLastErrorCSP.
Где можно взять эту функцию?

Sergey

Добрый день.
Чтобы проверить подпись ГОСТ необходимо вместо CALG_SHA_160 использовать CALG_TGR3411.
Функция GetLastErrorCSP имеет вид:
DWORD GetLastErrorCSP(HCRYPTPROV hProv)
{
  DWORD lastError=0;
DWORD len = sizeof(DWORD);
  cpGetProvParamByte(hProv, PP_LAST_ERROR, &lastError, &len, 0);
return lastError;
}

sudv

Спасибо.
А какой шаблон у cpGetProvParamByte(hProv, PP_LAST_ERROR, &lastError, &len, 0);
чему равен параметр PP_LAST_ERROR
есть ли эта функция в libcertex-csp.so.5.2.v.5.0.11.0?

Эта функция очень нужна так как CPCreateHash возвращает 0. А в документации она не описана.

Sergey

неправильно написал название функции не cpGetProvParamByte а cpGetProvParam
Значение всех констант должно быть в cptumar.h
PP_LAST_ERROR имеет значение 55


sudv

вызываю CPAcquireContext, она выполняется успешно.
выводя на экран
CPAcquireContext : 1
CPAcquireContext : 2
CPAcquireContext : 3
CPAcquireContext : 4
CPAcquireContext : armni
CPAcquireContext : url2prof = 0

вызываю CPCreateHash
она возвращает 0
CPGetProvParam при вызове также возвращает 0 и код ошибки 0.

может ли такое быть?

Sergey

Слишком мало информации можно посмотреть фрагмент кода от CPAcquireContext  до CPCreateHash

sudv

получилось!  8)

RUN CPAcquireContext( OUTPUT phProv, pszcontainer, {&CRYPT_VERIFYCONTEXT}, PVTableProvStruc, OUTPUT ret-val).

   hprov = GET-LONG (PHPROV,1).

   MESSAGE "hprov CPAcquireContext" hprov ret-val
      VIEW-AS ALERT-BOX INFO BUTTONS OK.

   /* Создеем хэш-объект {&CALG_CPGR3411} */
   RUN CPCreateHash(hProv , {&CALG_TGR3411} , 0 , 0 , OUTPUT phHash , OUTPUT ret-val).
   hHash = GET-LONG (phHash,1).


оказалось что не правильно определили размер ссылки на phProv, было 4 надо 8 и вместо GET-LONG нужно GET-INT64.

А почему в AIX при вызове CPAcquireContext выводится на экран:
AcquireContext : 1
CPAcquireContext : 2
CPAcquireContext : 3
CPAcquireContext : 4
CPAcquireContext :
CPAcquireContext : url2prof = 0

а в HP-UX нет?

sudv

а что такое ключ key.bin?
как его получить из Windows имея ключи pkcs12_sign.p12?

Евгений

22 Август 2012, 22:46:23 #9 Последнее редактирование: 22 Август 2012, 22:50:28 от Евгений
Цитата: sudv от 22 Август 2012, 20:21:31
а что такое ключ key.bin?
как его получить из Windows имея ключи pkcs12_sign.p12?

*.bin - формат ключевого контейнера Tumar.
Имея ключи *.p12 можно получить *.bin следующим образом:
- создать произвольный профайл: имя профайла - key, параметр устройства хранения - C:\ , имя контейнера - key, сохранить (чтобы узнать подробнее о создании профайла см. электронную справку, вызвав ее нажатием клавиши F1 в окне конфигуратора ТУМАР-CSP под Windows);
- в списке профайлов выделить созданный профайл key;
- перетащить файл *.p12, используя Drag-and-drop, в нижнее окно конфигуратора (в список ключей);
- в открывшемся окне с запросом о создании ключевого контейнера и импорте в него ключа нажать "Да", ввести пароль на импортируемый ключевой контейнер *.p12 и нажать "ОК", в окне "Ключ импортирован" нажать "ОК".

Результат: в каталоге C:\ будет создан ключевой контейнер key.bin, содержащий те же данные, что и в *.p12.

Евгений

Цитата: sudv от 22 Август 2012, 20:05:51
А почему в AIX при вызове CPAcquireContext выводится на экран:
AcquireContext : 1
CPAcquireContext : 2
CPAcquireContext : 3
CPAcquireContext : 4
CPAcquireContext :
CPAcquireContext : url2prof = 0

а в HP-UX нет?

Сборка под AIX - тестовая, содержит отладочную информацию.

sudv

Большое спасибо Евгений.

А можно файлы  генерить программно?
или вместо Key.bin использовать файлы key.cer полученные через оснастку windows?

Sergey

Можно поступить проще и использовать ключи в формате .p12 (.pfx) вместо .bin, т.к. криптопровайдер поддерживает все форматы как на windows так и на Unix системах.

sudv

Спасибо Сергей.

А зачем в примере вызывается inv_copy(sig,sig,(int)szs);  ?
Если у меня есть подпись в двоичном виде, я же могу передать ее целиком в функцию, а судя по функции она первую половину подписи копирует во вторую.

Sergey

Добрый день.

Проверку подписи мы рекомендуем делать в 2 прохода:
1. Проверять подпись как есть (Если подпись была сделана критопровайдером TumarCSP).
2. Если подпись не проверилась,  то выполнить переворачивание подписи и ее повторная проверка (Если подпись была сделана каким нибудь другим криптопровайдером).

Вверх