Discussion:
CryptAcquireContext/advapi32.dll - Run Time Error 87 application-defined or object-defined error
(too old to reply)
t***@yahoo.com
2005-02-17 03:46:54 UTC
Permalink
I have a block of code that encrypts passwords before storing them it
an access database. It works fine on my pc, however on my client they
get the following error on the last line of code when entering a
password.

Error - "run-time error '87' application-defined or object-defined
error"

Code Where Error is generated is the last line -
If lRes = 0 Then Err.Raise Err.LastDllError

I call the function using a simple call
txtUSERPWD_hash = HashString(txtUSERPWD)

Any idea why this is not working? I am assuming it may have something
to do with the way the pc is locked down.

I either need to fix this or come up with a differnt encryption scheme.
Thanks in advance..



Function HashString( _
ByVal Str As String, _
Optional ByVal Algorithm As HashAlgorithm = MD5) As String

'' THIS IS THE PASSWORD CRYPTO MODULE

Dim hCtx As Long
Dim hHash As Long
Dim lRes As Long
Dim lLen As Long
Dim lIdx As Long
Dim abData() As Byte


lRes = CryptAcquireContext(hCtx, vbNullString, _
vbNullString, PROV_RSA_FULL, 0)
If lRes <> 0 Then
lRes = CryptCreateHash(hCtx, Algorithm, 0, 0, hHash)
If lRes <> 0 Then
lRes = CryptHashData(hHash, ByVal Str, Len(Str), 0)
If lRes <> 0 Then
lRes = CryptGetHashParam(hHash, HP_HASHSIZE, lLen, 4, 0)
If lRes <> 0 Then
ReDim abData(0 To lLen - 1)
lRes = CryptGetHashParam(hHash, HP_HASHVAL, abData(0),
lLen, 0)
If lRes <> 0 Then
HashString = StrConv(abData, vbUnicode)
End If
End If
End If
CryptDestroyHash hHash
End If
End If
CryptReleaseContext hCtx, 0
If lRes = 0 Then Err.Raise Err.LastDllError


End Function
'-----------------------<< end code >>-----------------------



-----
The other block of code that has the delcare statements
Private Declare Function CryptAcquireContext Lib "advapi32.dll" _
Alias "CryptAcquireContextA" ( _
ByRef phProv As Long, _
ByVal pszContainer As String, _
ByVal pszProvider As String, _
ByVal dwProvType As Long, _
ByVal dwFlags As Long) As Long


Private Declare Function CryptReleaseContext Lib "advapi32.dll" ( _
ByVal hProv As Long, _
ByVal dwFlags As Long) As Long


Private Declare Function CryptCreateHash Lib "advapi32.dll" ( _
ByVal hProv As Long, _
ByVal Algid As Long, _
ByVal hKey As Long, _
ByVal dwFlags As Long, _
ByRef phHash As Long) As Long


Private Declare Function CryptDestroyHash Lib "advapi32.dll" ( _
ByVal hHash As Long) As Long


Private Declare Function CryptHashData Lib "advapi32.dll" ( _
ByVal hHash As Long, _
pbData As Any, _
ByVal dwDataLen As Long, _
ByVal dwFlags As Long) As Long


Private Declare Function CryptGetHashParam Lib "advapi32.dll" ( _
ByVal hHash As Long, _
ByVal dwParam As Long, _
pbData As Any, _
pdwDataLen As Long, _
ByVal dwFlags As Long) As Long


Private Const PROV_RSA_FULL = 1


Private Const ALG_CLASS_HASH = 32768


Private Const ALG_TYPE_ANY = 0


Private Const ALG_SID_MD2 = 1
Private Const ALG_SID_MD4 = 2
Private Const ALG_SID_MD5 = 3
Private Const ALG_SID_SHA1 = 4


Enum HashAlgorithm
md2 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2
md4 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4
MD5 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5
SHA1 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
End Enum


Private Const HP_HASHVAL = 2
Private Const HP_HASHSIZE = 4
MNC
2005-02-17 16:49:27 UTC
Permalink
Had exactly the same problem - try this sorted it for me >

Firstly change
Private Const PROV_RSA_FULL = 1
to
Private Const PROV_RSA_FULL as Long = 1

Add a definition of :

Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000

Then change the call to CryptAcquireContext from
Post by t***@yahoo.com
lRes = CryptAcquireContext(hCtx, vbNullString, _
vbNullString, PROV_RSA_FULL, 0)
To
Post by t***@yahoo.com
lRes = CryptAcquireContext(hCtx, vbNullString, _
vbNullString, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)

Seems that when the exe is running it does not cast the Constants to
longs correctly.

Hope this helps,

Mark

Loading...