Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Gorilka  
#1 Оставлено : 2 декабря 2009 г. 17:57:43(UTC)
Gorilka

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Kirill Sobolev  
#2 Оставлено : 2 декабря 2009 г. 20:04:01(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.
Техническую поддержку оказываем тут
Наша база знаний
Offline Gorilka  
#3 Оставлено : 2 декабря 2009 г. 21:03:35(UTC)
Gorilka

Статус: Активный участник

Группы: Участники
Зарегистрирован: 08.07.2009(UTC)
Сообщений: 31

Спасибо, нашел свой косяк, он был достаточно глупым

Я сначала обнулял указатель
pFSCertContext:=nil;
потом передавал его в функцию, она естественно воспринимала его как nil и не возвращала контекст.
Offline Gorilka  
#4 Оставлено : 3 декабря 2009 г. 17:50:56(UTC)
Gorilka

Статус: Активный участник

Группы: Участники
Зарегистрирован: 08.07.2009(UTC)
Сообщений: 31

[как обычно, надо было еще немного подумать, вопрос снят ))]

Отредактировано пользователем 3 декабря 2009 г. 17:58:55(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.