SysJames
SysJames

Reputation: 431

Cipher: failed to reserve an envelope space

I am attempting to encrypt/decrypt a SQLite database via FireDAC in a Delphi XE7 application running on Windows 7 (64 bit).

The code looks like this:

Procedure TMain.ActionBtnClick(Sender: TObject);
Begin
If ActionBtn.Caption = 'Encrypt' Then
   Begin
   SetPassword;
   FDSQLiteSecurity.SetPassword;
   End
Else
   FDSQLiteSecurity.RemovePassword;
SetStatus;
End;

Procedure TMain.DBNamePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
Begin
If OpenDialog.Execute Then
   Begin
   DBName.Text := OpenDialog.FileName;
   SetStatus;
   End;
End;

Procedure TMain.FormClose(Sender: TObject; Var Action: TCloseAction);
Var
   Reg: TRegistry;
Begin
Reg := TRegistry.Create;
Try
   Reg.OpenKey('\SQLiteSecurity', True);
   Reg.WriteString('Database', DBName.Text);
Finally
   Reg.CloseKey;
   Reg.Free;
End;
End;

Procedure TMain.FormShow(Sender: TObject);
Var
   Reg: TRegistry;
Begin
DBStatus.Caption := '';
Reg := TRegistry.Create;
Try
   Reg.OpenKey('\SQLiteSecurity', True);
   If Reg.ValueExists('Database') Then
      Begin
      DBName.Text := Reg.ReadString('Database');
      SetStatus;
      End;
Finally
   Reg.CloseKey;
   Reg.Free;
End;
End;

Procedure TMain.SetPassword;
Var
   s: String;
Begin
FDSQLiteSecurity.Database := DBName.Text;
BEK(s);
FDSQLiteSecurity.Password := s;
End;

Procedure TMain.SetStatus;
Begin
DBStatus.Caption := FDSQLiteSecurity.CheckEncryption;
If DBStatus.Caption = '<unencrypted>' Then
   ActionBtn.Caption := 'Encrypt'
Else
   ActionBtn.Caption := 'Decrypt';
End;

When trying to encrypt, at the line that reads "FDSQLiteSecurity.SetPassword;", I get the following error message:

[FireDAC][Phys][SQLite] ERROR: Cipher: failed to reserve an envelope space.

I have tried to find the meaning of this error message without success. Does anyone know what the error message from SQLite is trying to tell me?

Upvotes: 3

Views: 529

Answers (1)

moskito-x
moskito-x

Reputation: 11958

TFDSQLiteSecurityOptions FireDAC.Phys.SQLite.TFDSQLiteSecurity.Options

Have you set option soSetLargeCache ?

Use the Options property to specify the database encryption options.

Due to current SQLite encryption limitation the SetPassword / ChangePassword / RemovePassword calls will fail, if the database has blob fields with a value size greater than 1 DB page, and the database does not fit into the SQLite cache.

If soSetLargeCache is set, then SetPassword / ChangePassword / RemovePassword automatically set the cache size greater than the DB size, to fit the database into the memory in full.

If the DB size is greater than the accessible system memory, then the corresponding call fails.

Upvotes: 1

Related Questions