CryptoAPI problem

From
Gennady Porev (2:550/4.1)
To
All
Date
2002-12-27T13:13:27Z
Area
SU.WINDOWS.NT.PROG
Hi, All!

Вот, осваиваю я CryptoAPI. Конекст берётся, ключ генерится, publickey blob берётся (надо для другой части), криптовать буфер не хочет :((( Что я не так делаю?

=== Cut ===
{$APPTYPE CONSOLE}
program CrypDemo;

uses Windows, SysUtils;

CONST LibName = 'AdvAPI32.dll';
      PROV_NAME = 'Microsoft Base Cryptographic Provider v1.0'; // MS_DEF_PROV
      PROV_TYPE = 1; // RSA_FULL

      CRYPT_VERIFYCONTEXT      = $F0000000;
      CRYPT_MACHINE_KEYSET     = $00000020;
      CRYPT_SILENT             = $00000040;
      CRYPT_NO_SALT            = $00000010;
      PUBLICKEYBLOB            = $00000006;
      ALG_CLASS_KEY_EXCHANGE   = 5 shl 13;
      ALG_TYPE_RSA             = 2 shl 9;
      ALG_SID_RSA_ANY          = 0;
      CALG_RSA_KEYX            = (ALG_CLASS_KEY_EXCHANGE or ALG_TYPE_RSA or ALG_SID_RSA_ANY);

function CryptAcquireContext(
var phProv : THandle;pszContainer,pszProvider : PChar;dwProvType : DWord;dwFlags : DWord
) : BOOL; stdcall external LibName name 'CryptAcquireContextA';

function CryptReleaseContext(
hProv : THandle;dwFlags : DWord
) : BOOL; stdcall external LibName name 'CryptReleaseContext';

function CryptGenKey(
hProv  : THandle;ALG_ID : DWord;dwFlags : DWord;var hKey : THandle
) : BOOL; stdcall external LibName name 'CryptGenKey';

function CryptDestroyKey(
hKey : THandle
) : BOOL; stdcall external LibName name 'CryptDestroyKey';

function CryptExportKey(
hKey : THandle;hExpKey : THandle;dwBlobType : DWord;dwFlags : DWord;Data : Pointer;var dwDataLen : DWord
) : BOOL; stdcall external LibName name 'CryptExportKey';

function CryptEncrypt(
hKey : THandle;hHash : THandle;Final : Bool;dwFlags : DWord;Data : Pointer;var dwDataLen : DWord;dwBufLen : DWord
) : BOOL; stdcall external LibName name 'CryptEncrypt';

const BufSize = $80;

VAR R : Bool;
    Hcsp,HKey : THandle;
    BlobSize : DWord;
    Blob : AnsiString;
    Buffer : AnsiString;
    DataLen : DWord;

begin
 R:=CryptAcquireContext(Hcsp,nil,PROV_NAME,PROV_TYPE,CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET or CRYPT_SILENT);
 Writeln(R);
 R:=CryptGenKey(Hcsp,CALG_RSA_KEYX,CRYPT_NO_SALT,HKey);
 Writeln(R);
 BlobSize:=0;
 R:=CryptExportKey(HKey,0,PUBLICKEYBLOB,0,nil,BlobSize);
 Writeln(R);
 Writeln('BlobSize is ',BlobSize);
 SetLength(Blob,BlobSize);
 R:=CryptExportKey(HKey,0,PUBLICKEYBLOB,0,Pointer(Blob),BlobSize);
 Writeln(R);
 SetLength(Buffer,BufSize);
 FillChar(Pointer(Buffer)^,BufSize,'-');
 Buffer[1]:='+';
 DataLen:=1;
> R:=CryptEncrypt(HKey,0,True,0,Pointer(Buffer),DataLen,BufSize);
> // Вот в этом месте показывает FALSE, хотя я вроде бы всё сделал как в
> МСДНе написано 8-((.
 Writeln(R);
 R:=CryptDestroyKey(HKey);
 Writeln(R);
 R:=CryptReleaseContext(Hcsp,0);
 Writeln(R);
 Readln;
end.
=== Cut ===

* Разослано также в SU.WINDOWS.PROG
* Разослано также в SU.WINDOWS.NT.PROG

 Relax -=- Gennady -=- icq: 13031700

--- GoldED/W32 3.0.1
 * Origin: WatchCat-UA (2:550/4.1)