Solved

DCPCrypt thread issues

Posted on 2008-10-30
4
888 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

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…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
With the power of JIRA, there's an unlimited number of ways you can customize it, use it and benefit from it. With that in mind, there's bound to be things that I wasn't able to cover in this course. With this summary we'll look at some places to go…
Many functions in Excel can make decisions. The most simple of these is the IF function: it returns a value depending on whether a condition you describe is true or false. Once you get the hang of using the IF function, you will find it easier to us…

863 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

23 Experts available now in Live!

Get 1:1 Help Now