home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD8730882000.psc / KeyGen / server / crypto.cls next >
Encoding:
Visual Basic class definition  |  2000-08-04  |  22.7 KB  |  715 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "crypto"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16.  
  17.  
  18. Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (phProv As Long, pszContainer As String, pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
  19. Private Declare Function CryptCreateHash Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal HKEY As Long, ByVal dwFlags As Long, phHash As Long) As Long
  20. Private Declare Function CryptDeriveKey Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal hBaseData As Long, ByVal dwFlags As Long, phKey As Long) As Long
  21. Private Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long
  22. Private Declare Function CryptDestroyKey Lib "advapi32.dll" (ByVal HKEY As Long) As Long
  23. Private Declare Function CryptEncrypt Lib "advapi32.dll" (ByVal HKEY As Long, ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbData As String, pdwDataLen As Long, ByVal dwBufLen As Long) As Long
  24. Private Declare Function CryptDecrypt Lib "advapi32.dll" (ByVal HKEY As Long, ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbData As String, pdwDataLen As Long) As Long
  25. Private Declare Function CryptExportKey Lib "advapi32.dll" (ByVal HKEY As Long, ByVal hExpKey As Long, ByVal dwBlobType As Long, ByVal dwFlags As Long, ByVal pbData As String, pdwDataLen As Long) As Long
  26. Private Declare Function CryptGenKey Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal dwFlags As Long, phKey As Long) As Long
  27. Private Declare Function CryptGetProvParam Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwParam As Long, pbData As Any, pdwDataLen As Long, ByVal dwFlags As Long) As Long
  28. Private Declare Function CryptGetUserKey Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwKeySpec As Long, phUserKey As Long) As Long
  29. Private Declare Function CryptHashData Lib "advapi32.dll" (ByVal hHash As Long, ByVal pbData As String, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
  30. Private Declare Function CryptReleaseContext Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwFlags As Long) As Long
  31. Private Declare Function CryptSignHashA Lib "advapi32.dll" (ByVal hHash As Long, ByVal dwKeySpec As Long, ByVal sDescription As String, ByVal dwFlags As Long, ByVal pbSignature As String, pdwSigLen As Long) As Long
  32. Private Declare Function CryptVerifySignatureA Lib "advapi32.dll" (ByVal hHash As Long, ByVal pbSignature As String, ByVal dwSigLen As Long, ByVal hPubKey As Long, ByVal sDescription As String, ByVal dwFlags As Long) As Long
  33.  
  34.  
  35. Private Const MAX_PATH = 260
  36. Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
  37. Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long
  38.  
  39. Private Declare Function GetLastError Lib "kernel32" () As Long
  40. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  41. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  42. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  43. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  44.   
  45. Private Declare Sub CpyMemValAdrFromRefAdr Lib "kernel32" Alias "RtlMoveMemory" (ByVal hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  46. Private Declare Sub CpyMemRefAdrFromValAdr Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Any, ByVal cbCopy As Long)
  47.  
  48. Private Const GMEM_MOVEABLE = &H2
  49. Private Const GMEM_ZEROINIT = &H40
  50. Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
  51.      
  52. Private Const MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0"
  53. Private Const PROV_RSA_FULL = 1
  54. Private Const CRYPT_NEWKEYSET = &H8
  55.  
  56. Private Const CRYPT_MACHINE_KEYSET = &H20
  57. Private Const CRYPT_MACHINE_NEWKEYSET = CRYPT_MACHINE_KEYSET Or CRYPT_NEWKEYSET
  58.  
  59. Private Const PP_CONTAINER = 6
  60. Private Const AT_KEYEXCHANGE = 1
  61. Private Const AT_SIGNATURE = 2
  62.  
  63. Private Const SIMPLEBLOB = 1
  64.  
  65. Private Const ALG_CLASS_DATA_ENCRYPT = 24576
  66. Private Const ALG_CLASS_HASH = 32768
  67. Private Const ALG_TYPE_ANY = 0
  68. Private Const ALG_TYPE_BLOCK = 1536
  69. Private Const ALG_TYPE_STREAM = 2048
  70. Private Const ALG_SID_RC2 = 2
  71. Private Const ALG_SID_RC4 = 1
  72. Private Const ALG_SID_MD5 = 3
  73. Private Const CALG_MD5 = ((ALG_CLASS_HASH Or ALG_TYPE_ANY) Or ALG_SID_MD5)
  74. Private Const CALG_RC2 = ((ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK) Or ALG_SID_RC2)
  75. Private Const CALG_RC4 = ((ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_STREAM) Or ALG_SID_RC4)
  76.  
  77. Private Const NTE_NO_KEY As Long = -2146893811  '0x8009000DL
  78. Private Const NTE_BAD_SIGNATURE As Long = -2146893818
  79. Private Const CFB_BUSY = 0
  80. Private Const CFB_READY = 1
  81. Private Const CFB_VALID = 2
  82.  
  83. Private Const ENCRYPT_ALGORITHM = CALG_RC4
  84. Private Const ENCRYPT_BLOCK_SIZE = 1
  85. Private Const CRYPT_EXPORTABLE = 1
  86.  
  87. Private sInBuffer As String
  88. Private sOutBuffer As String
  89. Private sPassword As String
  90. Private sSignature As String
  91. Private lStatus As Long
  92. Private sLastError As String
  93. Private lKEYSET As Long
  94.  
  95.  
  96.  
  97. Public Property Get InBuffer() As String
  98.   InBuffer = sInBuffer
  99. End Property
  100.  
  101. Public Property Let InBuffer(vNewValue As String)
  102.   sInBuffer = vNewValue
  103. End Property
  104.  
  105. Public Property Get LastError() As String
  106.   LastError = sLastError
  107. End Property
  108.  
  109. Public Property Get OutBuffer() As String
  110.   OutBuffer = sOutBuffer
  111. End Property
  112.  
  113. Public Property Get Signature() As String
  114.   Signature = sSignature
  115. End Property
  116.  
  117. Public Property Let Signature(vNewValue As String)
  118.   sSignature = vNewValue
  119. End Property
  120.  
  121. Public Sub Sign()
  122.   'Create a signature for Inbuffer and place in Signature
  123.    
  124.   Dim sContainer As String
  125.   Dim sDescription As String
  126.   Dim sProvider As String
  127.   Dim lHCryptprov As Long
  128.   Dim lHHash As Long
  129.   Dim lResult As Long
  130.   Dim lSignatureLen As Long
  131.  
  132. On Error GoTo ErrSign
  133.      
  134.   'switch Status property
  135.   lStatus = CFB_BUSY
  136.    
  137.   'init Signature property
  138.   sSignature = ""
  139.    
  140.   sLastError = ""
  141.    
  142.   'Get handle to the default provider.
  143.   sContainer = vbNullChar
  144.   sProvider = MS_DEF_PROV & vbNullChar
  145.    
  146.   lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)
  147.   If Not (lResult = 0) Then
  148.     sLastError = "Error " & CStr(GetLastError) & " during CryptAcquireContext!"
  149.     GoTo ReleaseHandles:
  150.   End If
  151.    
  152.   'Create a hash object.
  153.   lResult = CryptCreateHash(lHCryptprov, CALG_MD5, 0, 0, lHHash)
  154.   If Not (lResult = 0) Then
  155.     sLastError = "Error " & CStr(GetLastError) & " during CryptCreateHash!"
  156.     GoTo ReleaseHandles:
  157.   End If
  158.    
  159.   lResult = CryptHashData(lHHash, sInBuffer, Len(sInBuffer), 0)
  160.   If Not (lResult = 0) Then
  161.     sLastError = "Error " & CStr(GetLastError) & " during CryptHashData!"
  162.     GoTo ReleaseHandles:
  163.   End If
  164.    
  165.   'Sign hash object.
  166.   'Determine size of signature.
  167.   sDescription = vbNullChar
  168.   lResult = CryptSignHashA(lHHash, AT_SIGNATURE, sDescription, 0, sSignature, lSignatureLen)
  169.    
  170.   sSignature = String(lSignatureLen, vbNullChar)
  171.    
  172.   'Sign hash object (with signature key).
  173.   lResult = CryptSignHashA(lHHash, AT_SIGNATURE, sDescription, 0, sSignature, lSignatureLen)
  174.   If Not (lResult = 0) Then
  175.     sLastError = "Error " & CStr(GetLastError()) & " during CryptSignHash"
  176.     GoTo ReleaseHandles:
  177.   End If
  178.    
  179. ReleaseHandles:
  180.   'Destroy hash object.
  181.   If lHHash Then lResult = CryptDestroyHash(lHHash)
  182.   'Release provider handle.
  183.   If lHCryptprov Then lResult = CryptReleaseContext(lHCryptprov, 0)
  184.    
  185.   'switch Status property
  186.   lStatus = CFB_READY
  187.    
  188. Exit Sub
  189.    
  190. ErrSign:
  191.   sLastError = "ErrSign " & Error$
  192.   GoTo ReleaseHandles
  193. End Sub
  194.  
  195. Public Sub Validate()
  196.   'Validate InBuffer with Signature and assign Status with result
  197.   Dim bValid As Boolean
  198.   Dim sContainer As String
  199.   Dim sDescription As String
  200.   Dim sProvider As String
  201.   Dim lDataLen As Long
  202.   Dim lDataPoint As Long
  203.   Dim lHCryptprov As Long
  204.   Dim lHHash As Long
  205.   Dim lResult As Long
  206.   Dim lSignatureLen As Long
  207.   Dim lHCryptKey As Long
  208.  
  209.   ReDim aByteData(0) As Byte
  210.    
  211. On Error GoTo ErrValidate
  212.  
  213.   'switch Status property
  214.   lStatus = CFB_BUSY
  215.    
  216.   sLastError = ""
  217.    
  218.   'init internal valid flag
  219.   bValid = True
  220.    
  221.   'Get handle to the default provider.
  222.   sContainer = vbNullChar
  223.   sProvider = MS_DEF_PROV & vbNullChar
  224.   lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)
  225.   If Not (lResult = 0) Then
  226.     bValid = False
  227.     sLastError = "Error " & CStr(GetLastError) & " during CryptAcquireContext!"
  228.     GoTo ReleaseHandles:
  229.   End If
  230.    
  231.   'Create a hash object.
  232.   lResult = CryptCreateHash(lHCryptprov, CALG_MD5, 0, 0, lHHash)
  233.   If Not (lResult = 0) Then
  234.     bValid = False
  235.     sLastError = "Error " & CStr(GetLastError) & " during CryptCreateHash!"
  236.     GoTo ReleaseHandles:
  237.   End If
  238.    
  239.   'Add data to hash object.
  240.   lResult = CryptHashData(lHHash, sInBuffer, Len(sInBuffer), 0)
  241.   If Not (lResult = 0) Then
  242.     bValid = False
  243.     sLastError = "Error " & CStr(GetLastError) & " during CryptHashData!"
  244.     GoTo ReleaseHandles:
  245.   End If
  246.    
  247.   'Determine size of signature.
  248.   'sDescription = vbNullChar
  249.   'lResult = CryptSignHashA(lHHash, AT_SIGNATURE, sDescription, 0, 0, lSignatureLen)
  250.    
  251.   'Get handle to signature key.
  252.   lResult = CryptGetUserKey(lHCryptprov, AT_SIGNATURE, lHCryptKey)
  253.   If Not (lResult = 0) Then
  254.     bValid = False
  255.     sLastError = "Error " & CStr(GetLastError) & " during CryptGetUserKey!"
  256.     GoTo ReleaseHandles:
  257.   End If
  258.    
  259.   lSignatureLen = Len(sSignature)
  260.    
  261.   'Verify signature.
  262.   lResult = CryptVerifySignatureA(lHHash, sSignature, lSignatureLen, lHCryptKey, sDescription, 0)
  263.   If Not (lResult = 0) Then
  264.     If GetLastError = NTE_BAD_SIGNATURE Then
  265.       bValid = False
  266.       GoTo ReleaseHandles:
  267.     Else
  268.       bValid = False
  269.       sLastError = "Error " & CStr(GetLastError) & " during CryptVerifySignature!"
  270.       GoTo ReleaseHandles:
  271.     End If
  272.   End If
  273.  
  274. ReleaseHandles:
  275.   'Release signature key.
  276.   If lHCryptKey Then lResult = CryptDestroyKey(lHCryptKey)
  277.   'Destroy hash object.
  278.   If lHHash Then lResult = CryptDestroyHash(lHHash)
  279.   'Release provider handle.
  280.   If lHCryptprov Then lResult = CryptReleaseContext(lHCryptprov, 0)
  281.       
  282.   Select Case bValid
  283.     Case True
  284.       lStatus = CFB_VALID
  285.     Case Else
  286.       lStatus = CFB_READY
  287.   End Select
  288.  
  289. Exit Sub
  290.  
  291. ErrValidate:
  292.   sLastError = "ErrValidate " & Error$
  293.   Resume
  294.  
  295. End Sub
  296.  
  297. Public Sub Encrypt()
  298.   'Encrypt InBuffer into OutBuffer
  299.    
  300.   Dim lHExchgKey As Long
  301.   Dim lHCryptprov As Long
  302.   Dim lHHash As Long
  303.   Dim lhKey As Long
  304.   Dim lResult As Long
  305.   Dim sContainer As String
  306.   Dim sProvider As String
  307.   Dim sCryptBuffer As String
  308.   Dim lCryptLength As Long
  309.   Dim lCryptBufLen As Long
  310.    
  311.   sLastError = ""
  312.    
  313.   If sInBuffer = "" Then Exit Sub
  314.    
  315.   On Error GoTo ErrEncrypt
  316.    
  317.   'switch Status property
  318.   lStatus = CFB_BUSY
  319.    
  320.   'Get handle to the default provider
  321.   sContainer = vbNullChar
  322.   sProvider = vbNullChar
  323.   sProvider = MS_DEF_PROV & vbNullChar
  324.   lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)
  325.   sLastError = sLastError & lResult & "-"
  326.   
  327.   If (lResult = 0) Then
  328.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptAcquireContext!"
  329.     GoTo Done
  330.   End If
  331.    
  332.   'Create a hash object.
  333.   lResult = CryptCreateHash(lHCryptprov, CALG_MD5, 0, 0, lHHash)
  334.   sLastError = sLastError & lResult & "-"
  335.   If (lResult = 0) Then
  336.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptCreateHash!"
  337.     GoTo Done
  338.   End If
  339.     
  340.   'Hash in the password data.
  341.   lResult = CryptHashData(lHHash, sPassword, Len(sPassword), 0)
  342.   sLastError = sLastError & lResult & "-"
  343.    
  344.   If (lResult = 0) Then
  345.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptHashData!"
  346.     GoTo Done
  347.   End If
  348.     
  349.   'Derive a session key from the hash object.
  350.   lResult = CryptDeriveKey(lHCryptprov, ENCRYPT_ALGORITHM, lHHash, 0, lhKey)
  351.   sLastError = sLastError & lResult & "-"
  352.   If (lResult = 0) Then
  353.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptDeriveKey!"
  354.     GoTo Done
  355.   End If
  356.    
  357.   'Destroy the hash object.
  358.   lResult = CryptDestroyHash(lHHash)
  359.   sLastError = sLastError & lResult & "-"
  360.    
  361.   lHHash = 0
  362.    
  363.   'Prepare a string buffer for the CryptEncrypt function
  364.   lCryptLength = Len(sInBuffer)
  365.   lCryptBufLen = lCryptLength * 2
  366.   sCryptBuffer = String(lCryptBufLen, vbNullChar)
  367.   LSet sCryptBuffer = sInBuffer
  368.    
  369.   'Encrypt data
  370.   lResult = CryptEncrypt(lhKey, 0, 1, 0, sCryptBuffer, lCryptLength, lCryptBufLen)
  371.   sLastError = sLastError & lResult & "-"
  372.   If (lResult = 0) Then
  373.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptEncrypt!"
  374.   End If
  375.    
  376.   sOutBuffer = Mid$(sCryptBuffer, 1, lCryptLength)
  377.      
  378. Done:
  379.  
  380.   'Destroy session key.
  381.   If (lhKey) Then lResult = CryptDestroyKey(lhKey)
  382.    
  383.   'Release key exchange key handle.
  384.   If lHExchgKey Then CryptDestroyKey (lHExchgKey)
  385.    
  386.   'Destroy hash object.
  387.   If lHHash Then CryptDestroyHash (lHHash)
  388.    
  389.   'Release provider handle.
  390.   If lHCryptprov Then lResult = CryptReleaseContext(lHCryptprov, 0)
  391.    
  392.   'switch Status property
  393.   lStatus = CFB_READY
  394.    
  395. Exit Sub
  396.  
  397. ErrEncrypt:
  398.   sLastError = "ErrEncrypt " & Error$
  399.   Resume
  400.  
  401. End Sub
  402.  
  403.  
  404. Public Sub Decrypt()
  405.  
  406.   'Decrypt InBuffer into OutBuffer
  407.   Dim lHExchgKey As Long
  408.   Dim lHCryptprov As Long
  409.   Dim lHHash As Long
  410.   Dim lhKey As Long
  411.   Dim lResult As Long
  412.    
  413.   Dim sContainer As String
  414.   Dim sProvider As String
  415.    
  416.   Dim sCryptBuffer As String
  417.   Dim lCryptBufLen As Long
  418.   Dim lCryptPoint As Long
  419.    
  420.   Dim lPasswordPoint As Long
  421.   Dim lPasswordCount As Long
  422.        
  423.   sLastError = ""
  424.        
  425.   If sInBuffer = "" Then Exit Sub
  426.      
  427. On Error GoTo ErrDecrypt
  428.  
  429.   'switch Status property
  430.   lStatus = CFB_BUSY
  431.            
  432.   'Init sOutBuffer
  433.   sOutBuffer = ""
  434.    
  435.   'Get handle to the default provider.
  436.   sContainer = vbNullChar
  437.   sProvider = vbNullChar
  438.   sProvider = MS_DEF_PROV & vbNullChar
  439.    
  440.   lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)
  441.   sLastError = sLastError & lResult & "-"
  442.   If (lResult = 0) Then
  443.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptAcquireContext!"
  444.     GoTo Done
  445.   End If
  446.    
  447.   'Create a hash object.
  448.   lResult = CryptCreateHash(lHCryptprov, CALG_MD5, 0, 0, lHHash)
  449.   sLastError = sLastError & lResult & "-"
  450.   If (lResult = 0) Then
  451.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptCreateHash!"
  452.     GoTo Done
  453.   End If
  454.    
  455.   'Hash in the password data.
  456.   lResult = CryptHashData(lHHash, sPassword, Len(sPassword), 0)
  457.   sLastError = sLastError & lResult & "-"
  458.   If (lResult = 0) Then
  459.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptHashData!"
  460.     GoTo Done
  461.   End If
  462.        
  463.   'Derive a session key from the hash object.
  464.   lResult = CryptDeriveKey(lHCryptprov, ENCRYPT_ALGORITHM, lHHash, 0, lhKey)
  465.   sLastError = sLastError & lResult & "-"
  466.   If (lResult = 0) Then
  467.     sLastError = sLastError & "Error " & CStr(GetLastError) & " during CryptDeriveKey!"
  468.     GoTo Done
  469.   End If
  470.    
  471.   'Destroy the hash object.
  472.   lResult = CryptDestroyHash(lHHash)
  473.   sLastError = sLastError & lResult & "-"
  474.   lHHash = 0
  475.    
  476.   'Prepare sCryptBuffer for CryptDecrypt
  477.   lCryptBufLen = Len(sInBuffer) * 2
  478.   sCryptBuffer = String(lCryptBufLen, vbNullChar)
  479.   LSet sCryptBuffer = sInBuffer
  480.    
  481.   'Decrypt data
  482.   lResult = CryptDecrypt(lhKey, 0, 1, 0, sCryptBuffer, lCryptBufLen)
  483.   If (lResult = 0) Then
  484.     sLastError = "Error " & CStr(GetLastError) & " during CryptDecrypt!"
  485.     GoTo Done
  486.   End If
  487.    
  488.   'Apply decrypted string from sCryptBuffer to private buffer for OutBuffer property
  489.   sOutBuffer = Mid$(sCryptBuffer, 1, lCryptBufLen / 2)
  490.  
  491. Done:
  492.  
  493.   'Destroy session key.
  494.   If (lhKey) Then lResult = CryptDestroyKey(lhKey)
  495.    
  496.   'Release key exchange key handle.
  497.   If lHExchgKey Then lResult = CryptDestroyKey(lHExchgKey)
  498.    
  499.   'Destroy hash object.
  500.   If lHHash Then lResult = CryptDestroyHash(lHHash)
  501.    
  502.   'Release provider handle.
  503.   If lHCryptprov Then lResult = CryptReleaseContext(lHCryptprov, 0)
  504.    
  505.   'switch Status property
  506.   lStatus = CFB_READY
  507.    
  508. Exit Sub
  509.  
  510. ErrDecrypt:
  511.   sLastError = "ErrDecrypt " & Error$
  512.   GoTo Done
  513.  
  514. End Sub
  515.  
  516. Public Property Get Status() As Long
  517.   Status = lStatus
  518. End Property
  519.  
  520. ' Initialize Crypto Object from Computer installed CryptoAPI
  521. Public Function InitUser() As Long
  522.   Dim lHCryptprov As Long
  523.   Dim lHCryptKey As Long
  524.   Dim avProviderData(1000) As Byte
  525.   Dim lProviderDataAddress As Long
  526.   Dim lProviderDataLen As Long
  527.   Dim lDataSize As Long
  528.    
  529.   Dim lResult As Long
  530.   Dim sContainer As String
  531.   Dim sProvider As String
  532.   Dim sUserName As String
  533.   Dim lPoint As Long
  534.    
  535.   Dim lMemHandle As Long
  536.   Dim lReturn As Long
  537.   Dim lError As Long
  538.    
  539.   Dim sBuffer As String
  540.    
  541.   On Error GoTo ErrInitUser
  542.   'prepare string buffers
  543.    
  544.   sContainer = vbNullChar
  545.   sProvider = MS_DEF_PROV & vbNullChar
  546.    
  547.   sLastError = ""
  548.   lKEYSET = 0
  549.    
  550.   'Attempt to acquire a handle to the default key container (HKEY_CURRENT_USER).
  551.   lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)
  552. 'Stop:
  553. lResult = 0 'THIS IS FOR TEST ONLY (MACHINE_KEY_SET)
  554.    
  555.   sLastError = sLastError & lResult & "-"
  556.   If (lResult = 0) Then
  557.     lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET)
  558. 'Stop:
  559. lResult = 0 'THIS IS FOR TEST ONLY (MACHINE_KEY_SET)
  560.     sLastError = sLastError & lResult & "-"
  561.   End If
  562.    
  563.   If (lResult = 0) Then
  564.     'Create default key container (HKEY_CURRENT_USER).
  565.     'GHE 1999/10/05: The following mechanism tries to use registry
  566.     '   in HKEY_LOCAL_MACHINE instead of HKEY_CURRENT_USER
  567.     '   Usage: when not logged on interactively
  568.     '   Is implemented in NT4 SP2 or higher
  569.  
  570.     'GHE: Try to get the container (HKEY_LOCAL_MACHINE)
  571.     lKEYSET = CRYPT_MACHINE_KEYSET
  572.     lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)
  573.     sLastError = sLastError & lResult & "-"
  574.   End If
  575.          
  576.   If (lResult = 0) Then
  577.     'GHE: Try to create the container (HKEY_LOCAL_MACHINE)
  578.     lResult = CryptAcquireContext(lHCryptprov, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, CRYPT_MACHINE_NEWKEYSET)
  579.     sLastError = sLastError & lResult & "-"
  580.   End If
  581.    
  582.   If (lResult = 0) Then
  583.     lError = GetLastError
  584.     sLastError = sLastError & "Error creating key container! [" _
  585.         & CStr(lError) & "] " & GetSystemMessageText(lError)
  586.     Exit Function
  587.   End If
  588.        
  589.   'Get name of default key container.
  590.   lProviderDataLen = Len(avProviderData(0)) * (UBound(avProviderData) + 1)
  591.    
  592.   lResult = CryptGetProvParam(lHCryptprov, PP_CONTAINER, avProviderData(0), lProviderDataLen, lKEYSET)
  593.   sLastError = sLastError & lResult & "-"
  594.   If (lResult = 0) Then
  595.     lError = GetLastError
  596.     sLastError = sLastError & "Error getting user name!  [" _
  597.         & CStr(lError) & "] " & GetSystemMessageText(lError)
  598.     avProviderData(0) = 0
  599.     Exit Function
  600.   End If
  601.      
  602.   'Get sUserName from avProviderData()
  603.   lPoint = LBound(avProviderData)
  604.   While lPoint <= UBound(avProviderData)
  605.     If avProviderData(lPoint) <> 0 Then
  606.       sUserName = sUserName & Chr$(avProviderData(lPoint))
  607.     Else
  608.       lPoint = UBound(avProviderData)
  609.     End If
  610.     lPoint = lPoint + 1
  611.   Wend
  612.   sLastError = sLastError & sUserName & "-"
  613.      
  614.   'Attempt to get handle to signature key
  615.   lResult = CryptGetUserKey(lHCryptprov, AT_SIGNATURE, lHCryptKey)
  616.   sLastError = sLastError & lResult & "-"
  617.    
  618.   If (lResult = 0) Then
  619.     lError = GetLastError
  620.     If lError = NTE_NO_KEY Then
  621.        
  622.       lResult = CryptGenKey(lHCryptprov, AT_SIGNATURE, 0, lHCryptKey)
  623.       sLastError = sLastError & lResult & "-"
  624.        
  625.       If (lResult = 0) Then
  626.         sLastError = sLastError & "Error during CryptGenKey! [" _
  627.             & CStr(lError) & "] " & GetSystemMessageText(lError)
  628.         Exit Function
  629.       Else
  630.         lResult = CryptDestroyKey(lHCryptprov)
  631.         sLastError = sLastError & lResult & "-"
  632.       End If
  633.     Else
  634.       sLastError = sLastError & "Error during CryptGetUserKey! [" _
  635.           & CStr(lError) & "] " & GetSystemMessageText(lError)
  636.       Exit Function
  637.     End If
  638.   End If
  639.  
  640.   'Attempt to get handle to exchange key
  641.   lResult = CryptGetUserKey(lHCryptprov, AT_KEYEXCHANGE, lHCryptKey)
  642.   sLastError = sLastError & lResult & "-"
  643.   If (lResult = 0) Then
  644.     lError = GetLastError
  645.     If lError = NTE_NO_KEY Then
  646.       lResult = CryptGenKey(lHCryptprov, AT_KEYEXCHANGE, 0, lHCryptKey)
  647.       lError = GetLastError
  648.       If Not (lResult = 0) Then
  649.         sLastError = sLastError & "Error during CryptGenKey!  [" _
  650.             & CStr(lError) & "] " & GetSystemMessageText(lError)
  651.         Exit Function
  652.       Else
  653.         lResult = CryptDestroyKey(lHCryptprov)
  654.         sLastError = sLastError & lResult & "-"
  655.       End If
  656.     Else
  657.       sLastError = sLastError & "Error during CryptGetUserKey! [" _
  658.           & CStr(lError) & "] " & GetSystemMessageText(lError)
  659.       Exit Function
  660.     End If
  661.   End If
  662.    
  663.   'release handle to provider
  664.   lResult = CryptReleaseContext(lHCryptprov, 0)
  665.   sLastError = sLastError & lResult & "-"
  666.   InitUser = True
  667.  
  668. Exit Function
  669.  
  670. ErrInitUser:
  671.   sLastError = sLastError & "ErrInitUser " & Error$
  672.   Resume
  673.  
  674. End Function
  675.  
  676. Private Sub Class_Initialize()
  677.   InitUser
  678.         frmMain.SetIndicators 2, COLOR_BUSY
  679. End Sub
  680.  
  681. Public Property Get Password() As String
  682.     Password = sPassword
  683. End Property
  684.  
  685. Public Property Let Password(vNewValue As String)
  686.     sPassword = vNewValue
  687. End Property
  688.  
  689. Private Function GetSystemMessageText(msgID As Long) As String
  690.   'Function Incapsulating FormatMessage API call for system errors
  691.   Dim ret As Long
  692.   Dim sBuff As String
  693.     
  694.   sBuff = Space$(MAX_PATH)
  695.   ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, _
  696.                       0&, msgID, 0&, _
  697.                       sBuff, Len(sBuff), 0&)
  698.     
  699.   sBuff = Left$(sBuff, ret)
  700.   If ret Then
  701.       GetSystemMessageText = sBuff
  702.   Else
  703.       GetSystemMessageText = "(Unknown error)"
  704.   End If
  705. End Function
  706.  
  707.  
  708.  
  709.  
  710. Private Sub Class_Terminate()
  711.       frmMain.SetIndicators 2, COLOR_OK
  712. End Sub
  713.  
  714.  
  715.