23.09.2004 14:24:22Помогите подписать сообщение (CryptSignMessage) Ответов: 3
Павел
Уважаемые боги шифрования, проблемма в следующем:
После вызова функции CryptSignMessage GetLastError возвращает ошибку 2148073504 = h80090020 (Внутренняя ошибка).
Если же вызов функции проходит, то подпись не проверяется. Если же вызывать CryptSignAndEncryptMessage с теми же параметрами, все шифруется нормально.
С чеим это может быть связано?
Вот процедура, кот. я выполняю:

//Открывыаем файл
AssignFile(f, aInFileName);
AssignFile(DestF, aOutFileName);
Reset(F);
Rewrite(DestF);
dwCount:= FileSize(f);
GetMem(pbBuffer, dwCount);

BlockRead(f, pbBuffer^, dwCount);
//Заполняем pSignPara
pSignPara^.dwMsgEncodingType:= PKCS_7_ASN_ENCODING;
pSignPara^.pSigningCert:= aCertContext;
pSignPara^.HashAlgorithm.pszObjId:= szOID_CP_GOST_R3411_R3410EL;//szOID_CP_GOST_R3411;
pSignPara^.HashAlgorithm.Parameters.cbData:= 0;
pSignPara^.pvHashAuxInfo:= nil;
pSignPara^.cMsgCert:= 0; // Не включаем сертификаты в подписанное сообщение
pSignPara^.rgpMsgCert:= nil;
pSignPara^.cAuthAttr:= 0;
pSignPara^.dwInnerContentType:= 0;
pSignPara^.cMsgCrl:= 0;
pSignPara^.cUnauthAttr:= 0;
pSignPara^.dwFlags:= 0;
pSignPara^.pvHashAuxInfo:= nil;
pSignPara^.rgAuthAttr:= nil;
pSignPara^.cbSize:= SizeOf(CRYPT_SIGN_MESSAGE_PARA);
//Получаем длину зашифрованных данных
dwEncryptedCount:= 0;
CryptSignMessage(pSignPara,
false,//true,
1,
@pbBuffer,
@dwCount,
nil,
dwEncryptedCount);
GetMem(pbEncryptedBuffer, dwEncryptedCount);

//Подписываем
if CryptSignMessage(pSignPara,
false,//true,
1,
@pbBuffer,
@dwCount,
pbEncryptedBuffer,
dwEncryptedCount)

then begin
result:= true;
BlockWrite(DestF, pbEncryptedBuffer^, dwEncryptedCount);
end;

Спасибо всем, кто решится помочь.
 
Ответы:
24.09.2004 16:47:28Kirill Sobolev
Вообще то pSignPara^.HashAlgorithm.pszObjId должен быть как раз szOID_CP_GOST_R3411, т.к. там задается алгоритм хэша а не подписи.
24.09.2004 17:21:13Павел
Хотите верьте, хотите нет, но это ровным счетом ни на что не повлияло. Все осталось как прежде...
24.09.2004 17:44:07kure
А это может помочь

/*--------------------------------------------------------------------*/
/* Установим параметры*/

/* Обязательно ныжно обнулить все поля структуры. */
/* Иначе это может привести к access violation в функциях CryptoAPI*/
/* В примере из MSDN это отсутствует*/
memset(&param, 0, sizeof(CRYPT_SIGN_MESSAGE_PARA));
param.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);