Как правильно инициализировать кодек во время выполнения (Turbo Power Lock Box 3)?

Я использую следующую процедуру для кодирования потока.

procedure SaveEncodedStream(Strm:TStream; LicFileName:String);
var
   C:TCodec;
    CL:TCryptographicLibrary;
    Sg:TSignatory;
    KFS,DFS:TFileStream;
    Dir:String;
begin
   CL:=TCryptographicLibrary.Create(nil);
   C:=TCodec.Create(nil);
  SG:=TSignatory.Create(nil);

   Dir :=  ExtractFilePath(ParamStr(0));
   KFS:=TFileStream.Create(Dir+PublicKeyFile,fmOpenRead);
   DFS:=TFileStream.Create(LicFileName,fmCreate);

  try
  C.CryptoLibrary:=CL;
  C.BlockCipherId := 'native.RSA';
  C.ChainModeId := 'native.CBC';
  C.AsymetricKeySizeInBits := 1024;
  SG.Codec:=C;
  SG.LoadKeysFromStream(KFS,[partPublic]);
  C.EncryptStream(Strm,DFS);
 finally
  CL.Free;
  C.Free;
  SG.Free;
  KFS.Free;
  DFS.Free;
 end;
end;

И получить ошибку "Неправильный режим" на

C.EncryptStream(Strm,DFS); вызов

Войдя в код, я обнаружил, что он даже не пытается загрузить ключи, поскольку кодек не инициализирован. Когда я размещаю компоненты на форме - все работает. Но мне не нужны форма или DataModule.

1 ответ

Решение

Не нашли решение избавиться от DataModule. Похоже, компонентам нужен один для правильной инициализации. В качестве обходного пути я создал глобальный модуль данных со всеми компонентами, настроенными в режиме разработки. Я использую этот модуль в SaveEncodedStream так:

uses 
  ... EncryptDataModule;
 ...
var 
   BeenHere:Boolean = false;
 ...
procedure SaveEncodedStream(Strm:TStream; LicFileName:String);
 var
   KFS,DFS:TFileStream;
   Dir:String;
begin

   Dir :=  ExtractFilePath(ParamStr(0));
   KFS:=TFileStream.Create(Dir+PublicKeyFile,fmOpenRead);
   DFS:=TFileStream.Create(LicFileName,fmCreate);

   try
    DataModule.SG.LoadKeysFromStream(KFS,[partPublic]);
    if BeenHere then DataModule.C.Reset;  
    DataModule.C.EncryptStream(Strm,DFS);
    BeenHere:=true; 
  finally
   KFS.Free;
   DFS.Free;
  end;
end;
Другие вопросы по тегам