14.08.2006 14:06:10CryptSignHash не заполняет pbSignature Ответов: 3
Андрей Федоров
Помогите разобраться с проблемой.

При подписании хеша фи-ей CryptSignHash параметр pbSignature не заполняется, хотя если использовать стандартный MS криптопровайдер(выбрать другой сертификат), то заполняется.
Никакой ошибки не происходид - результат выполнения: true.

Я сравнивал область памяти под подпись до вызова и после. Поскольку она не изменяется, я решил, что ф-ия не заполняет pbSignature

P.S.
Я пишу плагин для подписания документа, поэтому вызов происходит в среде плагина.
 
Ответы:
14.08.2006 14:48:31Kirill Sobolev
Если бы Вы фрагмент кода привели было бы проще помочь.
А параметр pdwSigLen меняется?
14.08.2006 14:55:45Андрей Федоров
Код взят из примера. И если не в плагине, то работает. Как я уже говорил он и в плагине работает, но со стандартным MS криптопрвайдером.

Размер подписи я получаю нормально, и первый и второй раз там 64.

Вот код. Плагин пишется для Acrobat, поэтому для выделения памяти там используется ASmalloc, которая по описанию ничем не отличается от malloc. Хотя использвать malloc нельзя, Acrobat выдает exception.

Еще раз повторю, что ф-ия выполняется без ошибок.



if(!CryptSignHash(
hHash,
dwKeySpec,
NULL,
0,
NULL,
&sSize))
{
sprintf(buf,"CryptSignHash. LastError=[%d][%x]", GetLastError(), GetLastError());
traceMessage(buf);
}

ASUns8 * pbSignature = (ASUns8 *) ASmalloc(128);
if(pbSignature == NULL)traceMessage("pbSignature ASmalloc FAILED");

if(!CryptSignHash(
hHash, //HCRYPTHASH hHash,
dwKeySpec, //DWORD dwKeySpec,
NULL, //LPCTSTR sDescription,
0, //DWORD dwFlags,
pbSignature, //BYTE* pbSignature,
&sSize//DWORD* pdwSigLen
))
{
sprintf(buf,"CryptSignHash. LastError=[%d][%x]", GetLastError(), GetLastError());
traceMessage(buf);
}
14.08.2006 14:57:52Андрей Федоров
Размер памяти в примере 128 - это я от бесисходности написал.
на самом деле там sSize стоит.