| ||||
| ||||
Уважаемые боги шифрования, проблемма в следующем: После вызова функции 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; Спасибо всем, кто решится помочь. | ||||
Ответы: | ||||
| ||||
Вообще то pSignPara^.HashAlgorithm.pszObjId должен быть как раз szOID_CP_GOST_R3411, т.к. там задается алгоритм хэша а не подписи. | ||||
| ||||
Хотите верьте, хотите нет, но это ровным счетом ни на что не повлияло. Все осталось как прежде... | ||||
| ||||
А это может помочь /*--------------------------------------------------------------------*/ /* Установим параметры*/ /* Обязательно ныжно обнулить все поля структуры. */ /* Иначе это может привести к access violation в функциях CryptoAPI*/ /* В примере из MSDN это отсутствует*/ memset(¶m, 0, sizeof(CRYPT_SIGN_MESSAGE_PARA)); param.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA); | ||||