Статус: Участник
Группы: Участники
Зарегистрирован: 11.01.2008(UTC) Сообщений: 22 Откуда: Санкт-Петербург
|
После длительных мучений установил CSP версии 3.6 триальный. используя указанный ниже код, пытаюсь сделать криптование некоторой строки. Контейнер с сертификатом находится на носителе типа дискета. Криптование в два этапа вызова функции CryptEncryptMessage прошло на "ура". Декриптование ломается на втором вызове, то есть первый (для определения размера декриптованногого буфера) срабатывает и дает размер буфера, а второй (выделен жирным шрифтом) ломается с Access Violation. C чем это может быть связано? Цитата: try if not CryptAcquireContext(@hProv, 'MAKUSHEV', nil, ProvType, 0) then begin exit; end;
hSystemStore := CertOpenSystemStore(0, 'MY');
encType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; myCert := 'Mik'; pCert := CertFindCertificateInStore(hSystemStore, encType, 0, CERT_FIND_SUBJECT_STR, myCert, nil);
new(pMsgPara); ZeroMemory(pMsgPara, SizeOf(pMsgPara^)); with pMsgPara^ do begin cbSize := SizeOf(pMsgPara^); dwMsgEncodingType := encType; ContentEncryptionAlgorithm.pszObjId := CertAlgIdToOID(CALG_RC4); hCryptProv := hProv; end;
test := '1234567890';
arCertContext := TMemoryStream.Create; arCertContext.SetSize(arCertContext.Size + SizeOf(Pointer)); TPointerList(arCertContext.Memory^)[0] := PCCERT_CONTEXT(pCert);
ret := CryptEncryptMessage(pMsgPara, 1, arCertContext.Memory, PByte(PChar(test)), length(test), nil, @BufSize);
if ret then begin pbEncBlob := StrAlloc(BufSize); ret := CryptEncryptMessage(pMsgPara, 1, arCertContext.Memory, PByte(PChar(test)), length(test), PByte(pbEncBlob), @BufSize); end else showMessage(GetCryptError(GetLastError));
if ret then begin AssignFile(F, 'c:\111'); Reset(F, 1); BlockWrite(F, pbEncBlob^, BufSize, BufSize); CloseFile(F); end;
new(pMsgPara2); ZeroMemory(pMsgPara2, SizeOf(pMsgPara2^)); with pMsgPara2^ do begin cbSize := SizeOf(pMsgPara2^); dwMsgAndCertEncodingType := encType; cCertStore := 1; rghCertStore := hSystemStore; end;
ret := CryptDecryptMessage(pMsgPara2, PByte(pbEncBlob), BufSize, nil, @ResBufSize, nil);
if ret then begin pbDecBlob := StrAlloc(ResBufSize); ret := CryptDecryptMessage(pMsgPara2, PByte(pbDecBlob) {PByte(pbEncBlob)}, BufSize, PByte(pbDecBlob), @ResBufSize, nil); if not ret then showMessage(GetCryptError(GetLastError)); end else showMessage(GetCryptError(GetLastError));
|