Solved

DCPCrypt thread issues

Posted on 2008-10-30
4
895 Views
Last Modified: 2009-12-16
I have a very simple function in a DLL.  My problem is that the DLL will get an exception every once in a while.  The exception is "Invalid Pointer".  I get this error when I am calling the DLL from 2 different threads.  Is DCPCrypt thread-safe and can I do to insure I am using DCPCrypt correctly.
function SHA1(aInputStr: PChar;
              var aHash: PChar): Integer; stdcall;
var
  tHash      : TDCP_sha1;
  sHash      : string;
  sHex       : string;
  Digest     : array of Byte;
  i          : integer;
 
begin
  if (State <> READY) and (State <> PUST_IN_PROGRESS) then begin
    // Error - DLL is in an invalid state to perform this operation
    Result := 1;
    Exit;
  end;
  try
    tHash  := TDCP_sha1.Create(nil);
    try
      tHash.Init;
      tHash.UpdateStr(StrPas(aInputStr));
      // Generate the Hash
      SetLength(Digest, tHash.HashSize div 8);
      tHash.Final(Digest[0]);
      sHash := '';
      for i := 0 to Length(Digest) - 1 do begin
        sHex := IntToHex(Digest[i], 2);
        sHash := sHash + sHex;
      end;
 
      if (Get_Memory(Pointer(aHash), Length(sHash))) then begin
        // return the CipherText
        StrPCopy(aHash, sHash);
        Result := 0;
      end else begin
        Result := 2;
        LogInfo('SHA1: ', 'Error allocating memory');
      end;
    finally
      tHash.Free;
    end;
  except
    on E: Exception do begin
      State  := SHA1_HASH_EXCEPTION;
      Result := 2;
      LogInfo('SHA1_HASH_EXCEPTION:', E.Message );
    end;
  end;
end;

Open in new window

0
Comment
Question by:rayman3411
  • 2
4 Comments
 
LVL 28

Accepted Solution

by:
2266180 earned 500 total points
ID: 22852506
I don't know about DCPCrypt but if it's not thread safe, you can fix that pretty easily like this:

assuming your funciton is declared like this:

function SHA1(aInputStr: PChar;
              var aHash: PChar): Integer; stdcall; external 'yourdll.dll';

you will make another function named

function sha1_(aInputStr: PChar; var aHash: PChar): Integer; // youc an choose any name you want, this is just an example
begin
  cs.acquire;
  try
    result:=sha1(aInputStr, aHash);
  finally
    cs.release;
  end;
end;

and declare a global variable like:

implementation

uses SyncObjs;

var cs:TCriticalSection;

.. functions here, including sha1_ ...

initialization
  cs:=TCriticalSection.Create;

finalization
  freeandnil(cs);

end.// end of unit

and then replace all your sha1 calls with sha1_
same goes for any other function which uses the same dll
0
 
LVL 45

Expert Comment

by:aikimark
ID: 22855594
ciuly

DCPcrypt - Delphi Cryptography Package (open source / MIT licensed)
http://www.cityinthesky.co.uk/cryptography.html

I haven't found anyone discussing whether it is thread-safe or not.

Is it possible that he needs
   tHash.Free;
in the EXCEPT clause of the (nested) TRY statements?
0
 
LVL 28

Expert Comment

by:2266180
ID: 22857827
>> in the EXCEPT clause of the (nested) TRY statements?

NEVER. trhe except clause executes only on exception. the finally clause executes EVERY time. correct way is
create resource
try
  use resource
finally
  destroy resource
end;

PS: I don't have time to dig in the DCPcrypt source to check.
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

808 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question