Subject | KeyCallback function not passing Callback argument properly |
---|---|
Author | |
Post date | 2018-07-25T19:11:58Z |
Hello,
I am trying to create a KeyHolderPlugin using the Delphi API for Firebird. I am running Firebird version 3.0.3 on for an x64 installation of Windows. I have been steadily working through the OOAPI documentation, and so far I have learned a great deal about how to interact with Firebird through Delphi.
So far, I have used Delphi to create a DBCrypt plugin as well as a KeyHolder plugin, modelled after the examples provided in the Firebird installation (which are written in C++). I am able to use my CryptKeyHolder plugin to pass key values to Firebird from an external config file. I would like to be able to pass the key value from an application instead of from a config file.
My understanding of this process is as follows. First, we call setDbCryptCallback() from the application, with an argument of a type that implements the ICryptKeyCallback interface. In my code, this type is called TCryptKey. Calling setDbCryptCallback() passes the TCryptKey object into the KeyHolder plugin's keyCallback() function. The actual callback is then be performed from inside keyCallback() by calling TCryptKey.callback(). Please correct me if this understanding is incorrect.
My problem is this: upon calling setDbCryptCallback() with a TCryptKey object, the TCryptKey object's callback() function is not properly called from the keyCallback() function. (I know this to be the case, because I have debug code that writes to a file when TCryptKey.callback() gets accessed, and it is not showing up.)
Sample code:
{ TCryptKey definition in the application}
TCryptKey = class(ICryptKeyCallbackImpl)
public
// ICryptKeyCallback implementation
function callback(dataLength: Cardinal; data: Pointer; bufferLength: Cardinal; buffer: Pointer): Cardinal; override;
end;
function TCryptKey.callback(dataLength: Cardinal; data: Pointer; bufferLength: Cardinal; buffer: Pointer): Cardinal;
var
k : Byte;
begin
debugLog('TCryptKey.callback: entered'); // this line is not being printed to debug file
if (bufferLength > 0) and Assigned(buffer) then begin
k := 13; // I want to pass in a key value of 13 from the application
CopyMemory(buffer, @k, 1); // DEMO - key is a single byte
Result := 1;
end;
end;
{ We call setDbCryptCallback with a TCryptKey object somewhere in the application }
FCryptKey := TCryptKey.Create;
prov.setDbCryptCallback(st, FCryptKey); // prov and st are already assigned
{ keyCallback function in the KeyHolder DLL file }
function TMyKeyHolder.keyCallback(status: IStatus; callback: ICryptKeyCallback): Integer;
begin
debugLog('TMyKeyHolder.keyCallback: entered'); // this line is printed to debug file
if Assigned(callback) then begin
Result := callback.callback(0, nil, 1, @FKey); // should be calling FCryptKey.callback()
debugLog('TMyKeyHolder.keyCallback: result of callback.callback: ' + IntToStr(Result)); // this line is printing a 0 when it should print a 1
end;
end;
Any insight on this matter would be greatly appreciated - I have been trying to figure this out for weeks with no success.
- Nick