Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
Добрый день, код следующий Цитата: function TCryptoFile.DecryptPKCS(iEncryptedFileStream:TMemoryStream; iCertIDStr:string; oFileStream:TMemoryStream):integer; var vFSCertID:TFSCertificateID; vDecryptInfo:CRYPT_DECRYPT_MESSAGE_PARA; pFSCertContext:PPCCERT_CONTEXT; hBufCertStore:HCERTSTORE; vDecryptedFileSize:DWORD; begin //Заполняем структуру vDecryptInfo hBufCertStore:=CertOpenSystemStore(0, 'MY'); try FillChar(vDecryptInfo, SizeOf(CRYPT_DECRYPT_MESSAGE_PARA), #0); vDecryptInfo.cbSize:=SizeOf(CRYPT_DECRYPT_MESSAGE_PARA); vDecryptInfo.dwMsgAndCertEncodingType:=cCertEncodingType; vDecryptInfo.cCertStore:=1; vDecryptInfo.rghCertStore:=@hBufCertStore; CryptDecryptMessage(@vDecryptInfo, iEncryptedFileStream.Memory, iEncryptedFileStream.Size, nil, @vDecryptedFileSize, nil); oFileStream.Size:=vDecryptedFileSize; pFSCertContext:=nil; if CryptDecryptMessage(@vDecryptInfo, iEncryptedFileStream.Memory, iEncryptedFileStream.Size, oFileStream.Memory, @vDecryptedFileSize, pFSCertContext) then Result:=0 else Result:=1; //API гдето косячит 2 раза разный размер данных выбирает поэтому будем править топором oFileStream.Size:=vDecryptedFileSize; vFSCertID:=TFSCertificateID.Create; try // vFSCertID.FillByContext(pFSCertContext^); // if (vFSCertID.Encode64ID <> iCertIDStr) then // Result:=3; except vFSCertID.Free; raise; end; vFSCertID.Free; except CertCloseStore(hBufCertStore, 0); raise; end; CertCloseStore(hBufCertStore, 0); end;
Шифрует и дешифрует сообщение без ошибок (если не считать странного косяка, с возвращением сообщений разной длинны). Но напрочь отказывается возвращать контекст сертификата, которым было дешифровано сообщение, после срабатывания функции, pFSCertContext так и остается nil. Может натыкались на такого рода ошибку, подскажите пожалуйста, где косяк? Отредактировано пользователем 2 декабря 2009 г. 18:13:44(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
А так: Код:pFSCertContext:PCCERT_CONTEXT;
...
CryptDecryptMessage(@vDecryptInfo, iEncryptedFileStream.Memory, iEncryptedFileStream.Size, oFileStream.Memory, @vDecryptedFileSize, @pFSCertContext)
Цитата://API гдето косячит 2 раза разный размер данных выбирает поэтому будем править топором Нигде не косячит, это поведение описано в MSDN Цитата:Note When processing the data returned in the pbDecrypted buffer, applications must use the actual size of the data returned. The actual size can be slightly smaller than the size of the buffer specified in pcbDecrypted on input. On input, buffer sizes are usually specified large enough to ensure that the largest possible output data will fit in the buffer. On output, the DWORD is updated to the actual size of the data copied to the buffer. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
Спасибо, нашел свой косяк, он был достаточно глупым
Я сначала обнулял указатель pFSCertContext:=nil; потом передавал его в функцию, она естественно воспринимала его как nil и не возвращала контекст.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close