Solved

DCPCrypt thread issues

Posted on 2008-10-30
4
887 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:
ciuly earned 500 total points
Comment Utility
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
Comment Utility
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:ciuly
Comment Utility
>> 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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

744 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

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now