home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / Build_tabl2224976152012.psc / clsRandom.cls < prev   
Text File  |  2012-06-12  |  18KB  |  354 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 = "cPrng"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. ' ***************************************************************************
  17. ' Module:        clsRandom - a cryptographic random number generator
  18. '                (Pseudo Random Number Generator using Microsoft's CryptoAPI)
  19. '
  20. ' Description:   CryptGenRandom gets its randomness, also known as
  21. '                entropy, from many sources in Windows, including
  22. '                the following:
  23. '
  24. '                - The current process ID (GetCurrentProcessID).
  25. '                - The current thread ID (GetCurrentThreadID).
  26. '                - The ticks since boot (GetTickCount).
  27. '                - The current time (GetLocalTime).
  28. '                - Various high-precision performance counters
  29. '                      (QueryPerformanceCounter).
  30. '                - A Message Digest 4 (MD4) hash of the userÆs environment
  31. '                      block, which includes username, computer name, and
  32. '                      search path. MD4 is a hashing algorithm that creates
  33. '                      a 128-bit message digest (16 bytes) from input data
  34. '                      to verify data integrity.
  35. '                - High-precision internal CPU counters, such as RDTSC,
  36. '                      RDMSR, RDPMC.
  37. '                - Low-level system information, such as idle time, kernel
  38. '                      time, interrupt times, commit limit, page read count,
  39. '                      cache read count, nonpaged pool allocations, alignment
  40. '                      fixup count, operating system lookaside information.
  41. '                - [Optional] User defined data as extra seed data. I created
  42. '                      a routine named CreateExtraSeed() to generate a unique
  43. '                      hex data string as my optional data.  A good example
  44. '                      is used in BuildRndData() routine.
  45. '
  46. '                Such information is added to a buffer, which is hashed using
  47. '                MD4 and used as the key to modify the user-provided buffer
  48. '                using RC4.  (Refer to the CryptGenRandom() documentation in
  49. '                the Platform SDK)  The result is a cryptographic random
  50. '                number value.
  51. '
  52. ' References:    Randomize Statement Doesn't Re-initialize Rnd Function
  53. '                "To re-initialize the random-number generator, use the Rnd
  54. '                function with a value of -1 and then use the Randomize
  55. '                statement with the value you want to use as the seed value
  56. '                for the Rnd function."
  57. '                http://support.microsoft.com/default.aspx?scid=kb;en-us;120587
  58. '
  59. '                VBA's Pseudo Random Number Generator
  60. '                http://www.noesis.net.au/prng.php
  61. '
  62. '                Visual Basic Language Reference Rnd Function
  63. '                http://msdn2.microsoft.com/en-us/library/f7s023d2(VS.71).aspx
  64. '
  65. '                Mark Hutchinson article:
  66. '                An Examination of Visual Basic's Random Number Generation
  67. '                http://www.15seconds.com/issue/051110.htm
  68. '
  69. '                INFO: How Visual Basic Generates Pseudo-Random Numbers for
  70. '                the RND Function
  71. '                http://support.microsoft.com/kb/231847/en-us
  72. '
  73. '                RND and RANDOMIZE Alternatives for Generating Random Numbers
  74. '                http://support.microsoft.com/kb/28150/EN-US/
  75. '
  76. ' ===========================================================================
  77. '    DATE      NAME / eMAIL
  78. '              DESCRIPTION
  79. ' -----------  --------------------------------------------------------------
  80. ' 15-FEB-2004  Kenneth Ives  kenaso@tx.rr.com
  81. ' 10-Sep-2008  Kenneth Ives  kenaso@tx.rr.com
  82. '              Updated CreateExtraSeed() in determining the toggle method.
  83. ' 25-Sep-2008  Kenneth Ives  kenaso@tx.rr.com
  84. '              Rewrote GetRndValue() routine.  Thanks to Alfred Hellmⁿller
  85. '              for seeing the shortcomings of using the Visual Basic RND()
  86. '              function.
  87. ' 03-Oct-2008  Kenneth Ives  kenaso@tx.rr.com
  88. '              Removed some obsolete data.
  89. ' 12-Oct-2008  Kenneth Ives  kenaso@tx.rr.com
  90. '              Added additional range testing in GetRndValue() routine.
  91. ' 01-Nov-2008  Kenneth Ives  kenaso@tx.rr.com
  92. '              - Modified logic for obtaining a valid value in GetRndValue()
  93. '                routine.
  94. '              - Added static variable in CreateExtraSeed() routine to hold
  95. '                a carryover data string.
  96. '              - Fixed bug in BuildWithinRange() routine in loading a hex
  97. '                array and testing for valid return formats.
  98. ' 17-Mar-2009  Kenneth Ives  kenaso@tx.rr.com
  99. '              - Added EmptyCollection() routine to properly empty a
  100. '                collection object.
  101. '              - Updated CombSort() routine.
  102. '              - Updated documentation in ReshuffleData() and NonRepeatingNbrs()
  103. '                routines.
  104. ' 14-Apr-2009  Kenneth Ives  kenaso@tx.rr.com
  105. '              Updated CreateExtraSeed() and RndSeed() routines.
  106. ' 02-Nov-2009  Kenneth Ives  kenaso@tx.rr.com
  107. '              Corrected a potential overflow in alternate calculation in
  108. '              CreateExtraSeed() routine.
  109. ' 10-Feb-2010  Kenneth Ives  kenaso@tx.rr.com
  110. '              Thanks to Alfred Hellmⁿller for bringing to my attention the
  111. '              need to update GetProviderHandle() routine.
  112. '              - Rewrote GetProviderHandle() routine to test for availability
  113. '                of Advanced Encryption Standard (AES) hash functionality.
  114. '              - Added HashSelection() routine.
  115. '              - Updated CreateHash() routine to access SHA2 hash family.
  116. ' 03-Mar-2010  Kenneth Ives  kenaso@tx.rr.com
  117. '              - Updated CreateHash() and HashSelection() routines.
  118. '              - Updated documentation in this module and associated text
  119. '                files.
  120. ' 08-May-2010  Kenneth Ives  kenaso@tx.rr.com
  121. '              - Rewrote ReshuffleData() and CreateExtraSeed() routines.
  122. '              - Updated CombSort(), RndSeed() and RemoveDupes() routines.
  123. '              - Added ReverseArrayData() routine.  Called by CombSort().
  124. '              - Removed some obsolete code.
  125. ' 24-Jul-2010  Kenneth Ives  kenaso@tx.rr.com
  126. '              - Modifed and documented ConvertDataToHex(), HashSelection(),
  127. '                CreateHash(), BuildRndData() routines
  128. '              - Added boolean property AES_Ready()
  129. ' 10-Dec-2010  Kenneth Ives  kenaso@tx.rr.com
  130. '              - Updated selection of data to seed VB random number generator
  131. '                in CreateExtraSeed() routine.
  132. '              - Updated evaluation of input data in NonRepeatingNbrs()
  133. '                routine.
  134. ' 02-Mar-2011  Kenneth Ives  kenaso@tx.rr.com
  135. '              - Added boolean flag parameter to RndSeed() routine.
  136. '              - Updated CreateExtraSeed() routine.  Added reference
  137. '                to API GetTickCount()
  138. ' 18-May-2011  Kenneth Ives  kenaso@tx.rr.com
  139. '              Rewrote RndSeed() routine.
  140. ' 25-Aug-2011  Kenneth Ives  kenaso@tx.rr.com
  141. '              - Added property CompareMethod() to determine type of data
  142. '                comparison.
  143. '              - Updated RemoveDupes() routine to use CompareMethod()
  144. '                property.
  145. ' 20-Oct-2011  Kenneth Ives kenaso@tx.rr.com
  146. '              Increased maximum number of mixing iterations in ReshuffleData()
  147. '              routine.
  148. ' 30-Dec-2011  Kenneth Ives  kenaso@tx.rr.com
  149. '              - Updated CreateExtraSeed() routine.
  150. '              - Bug fix in GetRndValue() routine.
  151. '              - Added optional parameter, blnCreateExtraSeed, to BuildRndData()
  152. '                and BuildWithinRange() routines.
  153. ' 26-Mar-2012  Kenneth Ives  kenaso@tx.rr.com
  154. '              Deleted RemoveTrailingNulls() routine from this module.
  155. ' 10-May-2012  Kenneth Ives  kenaso@tx.rr.com
  156. '              Updated ReshuffleData() and CreateExtraSeed() routines.
  157. ' ***************************************************************************
  158. Option Explicit
  159.  
  160. ' ***************************************************************************
  161. ' Constants
  162. ' ***************************************************************************
  163.   Private Const MODULE_NAME            As String = "clsRandom"
  164.   Private Const KB_4                   As Long = &H1000&            '  4096
  165.   Private Const KB_64                  As Long = &H10000            '  65536
  166.   Private Const MAX_INT                As Long = &H7FFF&            '  32767
  167.   Private Const MAX_LONG               As Long = &H7FFFFFFF         '  2147483647
  168.   Private Const MIN_LONG               As Long = &H80000000         ' -2147483648
  169.   Private Const GB_4                   As Double = (2# ^ 32)        '  4294967296  (== 4.2 Gig)
  170.   Private Const MAX_DWORD              As Double = (2# ^ 32) - 1    '  4294967295  (unsigned long int)
  171.   Private Const DBL_LOW                As Double = 0.000000000001
  172.   Private Const DBL_HIGH               As Double = (1.999999999998 / MAX_DWORD)  ' 0.000000000465661287415694
  173.   
  174.   ' Microsoft Hash constants
  175.   Private Const HP_HASHVAL             As Long = 2
  176.   Private Const ALG_CLASS_HASH         As Long = &H8000&     ' Used by all hashes (32768)
  177.   Private Const ALG_TYPE_ANY           As Long = 0           ' Used by all hashes
  178.   Private Const ALG_SID_MD2            As Long = 1           ' 16 byte hashed return length
  179.   Private Const ALG_SID_MD4            As Long = 2           ' 16 byte hashed return length
  180.   Private Const ALG_SID_MD5            As Long = 3           ' 16 byte hashed return length
  181.   Private Const ALG_SID_SHA1           As Long = 4           ' 20 byte hashed return length
  182.   Private Const ALG_SID_SHA_256        As Long = 12          ' 32 byte hashed return length
  183.   Private Const ALG_SID_SHA_384        As Long = 13          ' 48 byte hashed return length
  184.   Private Const ALG_SID_SHA_512        As Long = 14          ' 64 byte hashed return length
  185.   Private Const CALG_MD2               As Long = &H8001&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2 (32769)
  186.   Private Const CALG_MD4               As Long = &H8002&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4 (32770)
  187.   Private Const CALG_MD5               As Long = &H8003&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5 (32771)
  188.   Private Const CALG_SHA1              As Long = &H8004&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1 (32772)
  189.   Private Const CALG_SHA_256           As Long = &H800C&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA_256 (32780)
  190.   Private Const CALG_SHA_384           As Long = &H800D&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA_384 (32781)
  191.   Private Const CALG_SHA_512           As Long = &H800E&     ' ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA_512 (32782)
  192.   ' Microsoft Provider type constants
  193.   Private Const PROV_RSA_FULL          As Long = 1           ' Provider type ID
  194.   Private Const PROV_RSA_AES           As Long = 24          ' AES Provider type ID
  195.   Private Const CRYPT_NEWKEYSET        As Long = &H8         ' For creating a generic provider handle
  196.   Private Const CRYPT_VERIFYCONTEXT    As Long = &HF0000000  ' -268435456
  197.   ' Verify provider names
  198.   ' HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\
  199.   Private Const MS_DEFAULT_PROV        As String = "Microsoft Base Cryptographic Provider v1.0"
  200.   Private Const MS_ENHANCED_PROV       As String = "Microsoft Enhanced Cryptographic Provider v1.0"
  201.   Private Const MS_ENH_RSA_AES_PROV    As String = "Microsoft Enhanced RSA and AES Cryptographic Provider"
  202.   Private Const MS_ENH_RSA_AES_PROV_XP As String = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"
  203.  
  204. ' ***************************************************************************
  205. ' Type Structures
  206. ' ***************************************************************************
  207.   Private Type CARRYOVER_DATA
  208.       Value1 As Long
  209.       Value2 As Long
  210.   End Type
  211.  
  212. ' ***************************************************************************
  213. ' Enumerations
  214. ' ***************************************************************************
  215.   Public Enum enumPRNG_ReturnFormat
  216.       ePRNG_ASCII           ' 0
  217.       ePRNG_HEX             ' 1
  218.       ePRNG_HEX_ARRAY       ' 2
  219.       ePRNG_BYTE_ARRAY      ' 3
  220.       ePRNG_LONG_ARRAY      ' 4
  221.       ePRNG_DBL_ARRAY       ' 5
  222.   End Enum
  223.  
  224.   Public Enum enumPRNG_HashAlgorithm
  225.       ePRNG_MD2             ' 0
  226.       ePRNG_MD4             ' 1
  227.       ePRNG_MD5             ' 2
  228.       ePRNG_SHA1            ' 3
  229.       ePRNG_SHA256          ' 4
  230.       ePRNG_SHA384          ' 5
  231.       ePRNG_SHA512          ' 6
  232.   End Enum
  233.  
  234.   Public Enum enumPRNG_Compare
  235.       ePRNG_CaseSensitive   ' 0 - Exact byte match
  236.       ePRNG_IgnoreCase      ' 1 - Uppercase/Lowercase considered same
  237.   End Enum
  238.  
  239. ' ***************************************************************************
  240. ' API Declares
  241. ' ***************************************************************************
  242.   ' This is a rough translation of the GetTickCount API. The
  243.   ' tick count of a PC is only valid for the first 49.7 days
  244.   ' since the last reboot.  When you capture the tick count,
  245.   ' you are capturing the total number of milliseconds elapsed
  246.   ' since the last reboot.  The elapsed time is stored as a
  247.   ' DWORD value. Therefore, the time will wrap around to zero
  248.   ' if the system is run continuously for 49.7 days.
  249.   Private Declare Function GetTickCount Lib "kernel32" () As Long
  250.               
  251.   ' The CryptCreateHash function initiates the hashing of a stream of
  252.   ' data. It creates and returns to the calling application a handle
  253.   ' to a CSP hash object. This handle is used in subsequent calls to
  254.   ' CryptHashData and CryptHashSessionKey to hash session keys and
  255.   ' other streams of data.
  256.   Private Declare Function CryptCreateHash Lib "advapi32.dll" _
  257.           (ByVal hProv As Long, ByVal algid As Long, _
  258.           ByVal hKey As Long, ByVal dwFlags As Long, _
  259.           ByRef phHash As Long) As Long
  260.  
  261.   ' The CryptHashData function adds data to a specified hash object.
  262.   ' This function and CryptHashSessionKey can be called multiple
  263.   ' times to compute the hash of long or discontinuous data streams.
  264.   Private Declare Function CryptHashData Lib "advapi32.dll" _
  265.           (ByVal hhash As Long, ByVal pbData As String, _
  266.           ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
  267.  
  268.   ' The CryptGetHashParam function retrieves data that governs the
  269.   ' operations of a hash object. The actual hash value can be
  270.   ' retrieved by using this function.
  271.   Private Declare Function CryptGetHashParam Lib "advapi32.dll" _
  272.           (ByVal hhash As Long, ByVal dwParam As Long, _
  273.           ByVal pbData As String, pdwDataLen As Long, _
  274.           ByVal dwFlags As Long) As Long
  275.  
  276.   'The CryptDestroyHash function destroys the hash object referenced
  277.   ' by the hHash parameter. After a hash object has been destroyed,
  278.   ' it can no longer be used.  The destrt governs Long) A31847/en-us
  279. '
  280. '                RND and RANDOMIZECo  The a ha     h object ulLes 
  281. an be called multiplet0(.e  A,
  282. '
  283. 'aong847/en-us
  284. 'Pc_I3i   r, _
  285.     pBP object ulLes 
  286. an be 5,
  287. '
  288. 'ao *******
  289. '
  290. 'aong847/en-us
  291. 'Pc_I3i   r, _
  292.     pBP object ulLes 
  293. an be 5,
  294. '
  295. 'ao
  296.  11,g
  297.  
  298.   ' The CryT ng th4 ' 3puuuuuuuu
  299.  11,g
  300.  
  301.   ' The CryT ng th4 ' 3puuuuuuuu
  302.  11,g
  303.  
  304.  847s Long
  305.       aongEn,g    4"puuuuuuuu
  306.  11,g
  307. pC1,g
  308. pC1,g
  309. p   http://s ' 0
  310.   = &H8000&
  311.   ' since the last reL    since the last reL    since the last reL ulLes 
  312. ansf--   htdo-BisGE ID
  313.   
  314. '            rg' si
  315. iplet0(.e  A,
  316. 's 7/eA================/A         opm   fNcreL    since tollowing:
  317. '
  318. ' -aso@tx. ===============.governs Long) A31847/en-us
  319. 'nreL   gbh.
  320. '           s
  321.   ' i  s
  322. rg' si
  323. iplet0(.e  A,
  324. 's 7/eA================/A    =G=========/A         opm   fNcreL  uguaC1-Flagso object referenreRpe7HashParapoAa
  325. pryptG        rg' si
  326. iplet0(.e  A,
  327. 's 7/eA=========== objectM+m5
  328. '  opm   fNcre       ppm  coarapoAa       opm   f1re       ppm  coaram
  329. 'Pc_I3i  lebmlue can be
  330.  +      7 ' by the hHash paramereaual Ba7HashP the hHash paramereaual Ba7HashP the hHash CIfong, ByVal dwParam As Long, _
  331.           ByVal pbDAa 
  332.      es Xctiple oe ' dat  ePRNG_h ByVr-aco   ppm  coaram
  333. 'iTunction uÆ As LoaAa  tiTunctioP hash o ulLesEe      aongEn  ro5rt
  334. o7 7/eA=======n8mmhe CryT ngCesEe   Ee      aongEn  ro5rt
  335. o7 7/eA=======n8mmhe CryT ngCesEe   EyecTbp   rg'mhe.e  A,(v===n8mmh7/eA===nrnwsh paramereaual Ba7HashP the shP,'Pg,'ao *******
  336. '
  337. 'tb/en-us
  338.     es Xctn/en(aHPn-usns         - [Othe hHmNon(aHPn6dGm0Nh
  339.  Ivecs
  340. rg'.tg(aHPn-usns         - [OthepuGm0NNcre       ppm  coarapoAa
  341.   ' tick count of a PC is only valid for the first 49.7 days
  342.   ' since the last reboM7net0(.e  cy8continuo's 7/e====c,g    4"puuuuuuuu.e  A,\0      -p0l.sms.scre   ====c,g  =/A         opm   fNcreL    since tollowing:
  343. '
  344. ' -aso@tx. ===============.governs LonwNXctn/en(aHPn-usns     =/A    RAYh1.ntation in this mC     '(  sincteHash(),pcop  ' by 44p0l.sms.screa be 5,20r-nyXRqas  eououx,CA    1yVrcYOg' si
  345. iplet0(. Thid as a
  346. eVrcYOg' si
  347. iplet0(. Thintation in this mC     '(  in thif3r2cl.ys
  348.  Cyaeani'       TiNG_MD5odi://www.1i'       TiNG_MD5odturing a== 4.2o re' to hash sessionosi
  349. iplet0(. Thid as a
  350. eVrcYOg' si
  351. iplet0(. v=/A         opm   fNcreL  hs< specified2O,dCombSort(se /nxKennetyT ngCes|HPI_is   ppm  coaram
  352. 'Pc_I3i  lebmlue can be
  353.  +   specified2O,d opm0ombSonu.s      -p0l.sms.scre   ====c,p3pSeL  hsDDsu dara
  354. eVrces|Hare ===arA2sIes2P