home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / FileVault_2107143242008.psc / FileVaultViewer / clsAES.cls
Text File  |  2008-03-16  |  144KB  |  2,494 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 = "clsAES"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. ' This is a stripped down version of cRijndael - Advanced Encryption Standard (AES) Class
  15. ' by John Korejwa  <korejwa@tiac.net> 09 / July / 2006 Version:   1.0
  16. ' All comments from this point on are orignal authors
  17. '--------------------------------------------------------------------
  18. Option Explicit
  19. Public Status As String
  20.  
  21. 'Title:     cRijndael - Advanced Encryption Standard (AES) Class
  22. 'Author:    John Korejwa  <korejwa@tiac.net>
  23. 'Filename:  Rijndael.cls
  24. 'Date:      09 / July / 2006
  25. 'Version:   1.0
  26.  
  27. 'Usage:
  28. 'Create an instance of the class, set the cipher key, encrypt/decrypt to your heart's content
  29.  
  30.  
  31. #Const SUPPORT_LEVEL = 2     'Default=0
  32. 'SUPPORT_LEVEL = 0 [AES Compliant]   Blocksize = 128                        Keysize = 128, 192, 256
  33. 'SUPPORT_LEVEL = 1 [Common Sizes ]   Blocksize = 128, 192, 256              Keysize = 128, 192, 256
  34. 'SUPPORT_LEVEL = 2 [  All Sizes  ]   Blocksize = 128, 160, 192, 224, 256    Keysize = 128, 160, 192, 224, 256
  35.  
  36. #Const COMPILE_CONSTANTS = 0 'Default=0
  37. 'COMPILE_CONSTANTS = 0 [Fast compile, small exe size]  Calculate tables during Class initialization
  38. 'COMPILE_CONSTANTS = 1 [Fast run time initialization]  Compile tables of constants
  39.  
  40.  
  41. 'These are arrays of constants.  They are initialized with the Class and do not change.
  42. Private Te0(255)      As Long
  43. Private Te1(255)      As Long
  44. Private Te2(255)      As Long
  45. Private Te3(255)      As Long
  46. Private Te4(255)      As Long
  47.  
  48. Private Td0(255)      As Long
  49. Private Td1(255)      As Long
  50. Private Td2(255)      As Long
  51. Private Td3(255)      As Long
  52. Private Td4(255)      As Long
  53.  
  54. #If SUPPORT_LEVEL Then
  55. Private rco(28)       As Long
  56. #Else
  57. Private rco(9)        As Long
  58. #End If
  59.  
  60. 'Key schedule arrays
  61. Private Nr            As Long 'Number of rounds [For 128 bit block, Nr = {10, 12, 14} for 128, 192, 256 bit cipher key]
  62. #If SUPPORT_LEVEL Then
  63. Private fkey(119)     As Long 'Nb*(Nr + 1)
  64. Private rkey(119)     As Long 'Nb*(Nr + 1)
  65. #Else
  66. Private fkey(59)      As Long 'Nb*(Nr + 1)
  67. Private rkey(59)      As Long 'Nb*(Nr + 1)
  68. #End If
  69.  
  70. 'For file encryption, this is the maximum amount of memory (in bytes) allowed for file data
  71. Private Const MaxFileChunkSize As Long = 4000000
  72.  
  73. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  74.  
  75.  
  76. 'Decryption Key Scheduler.  Calculate rkey() decryption keys based on fkey() and Nr.
  77. 'Nb is the number of 32 bit units in the block size.
  78. Private Sub CreateDecryptionKeys(Nb As Long)
  79.     Dim i    As Long
  80.     Dim j    As Long
  81.     Dim k    As Long
  82.     Dim s(3) As Byte
  83.  
  84.     'Invert the order of the round keys
  85.     i = 0
  86.     j = Nb * Nr
  87.     For k = 0 To Nr
  88.         CopyMemory rkey(i), fkey(j), Nb * 4&
  89.         i = i + Nb
  90.         j = j - Nb
  91.     Next k
  92.  
  93.     'Apply the inverse MixColumn transform to all round keys except the first and the last
  94.     For i = Nb To Nb * Nr - 1
  95.         CopyMemory s(0), rkey(i), 4&
  96.         rkey(i) = Td0(Te4(s(0)) And &HFF&) Xor _
  97.                   Td1(Te4(s(1)) And &HFF&) Xor _
  98.                   Td2(Te4(s(2)) And &HFF&) Xor _
  99.                   Td3(Te4(s(3)) And &HFF&)
  100.     Next i
  101. End Sub
  102.  
  103.  
  104. 'Key Scheduler. Expand the cipher key into the encryption key schedule.
  105. 'pass(0 ... n-1) contains the cipher key, where n = {16, 20, 24, 28, 32} , depending on KeyBits.
  106. 'If SUPPORT_LEVEL is non-zero, you must specify BlockBits for the block size you will be using.
  107. 'Returns zero on success.
  108. #If SUPPORT_LEVEL Then
  109. Public Function SetCipherKey(Pass() As Byte, KeyBits As Long, BlockBits As Long) As Long
  110. #Else
  111. Public Function SetCipherKey(Pass() As Byte, KeyBits As Long) As Long
  112. #End If
  113.     Dim i    As Long
  114.     Dim j    As Long
  115.     Dim s(3) As Byte
  116.  
  117. #If SUPPORT_LEVEL Then
  118.     Select Case BlockBits
  119.     Case 128
  120. #End If
  121.  
  122.     '128 bit block size
  123.     Select Case KeyBits
  124.     Case 128
  125.         i = 4
  126.         CopyMemory fkey(0), Pass(0), 4& * i
  127.         For j = 0 To 9
  128.             CopyMemory s(0), fkey(i - 1), 4&
  129.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  130.                                   Xor (Te4(s(3)) And &HFF0000) _
  131.                                   Xor (Te4(s(2)) And &HFF00&) _
  132.                                   Xor (Te4(s(1)) And &HFF&) _
  133.                                   Xor rco(j)
  134.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  135.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  136.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  137.             i = i + 4
  138.         Next j
  139.         Nr = 10
  140. 'Debug.Assert i = (Nr + 1) * 4
  141. #If SUPPORT_LEVEL = 2 Then
  142.     Case 160
  143.         i = 5
  144.         j = 0
  145.         CopyMemory fkey(0), Pass(0), 4& * i
  146.         Do
  147.             CopyMemory s(0), fkey(i - 1), 4&
  148.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  149.                                   Xor (Te4(s(3)) And &HFF0000) _
  150.                                   Xor (Te4(s(2)) And &HFF00&) _
  151.                                   Xor (Te4(s(1)) And &HFF&) _
  152.                                   Xor rco(j)
  153.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  154.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  155.             If j = 8 Then Exit Do
  156.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  157.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  158.             i = i + 5
  159.             j = j + 1
  160.         Loop
  161.         Nr = 11
  162. 'Debug.Assert i + 3 = (Nr + 1) * 4
  163. #End If
  164.     Case 192
  165.         i = 6
  166.         j = 0
  167.         CopyMemory fkey(0), Pass(0), 4& * i
  168.         Do
  169.             CopyMemory s(0), fkey(i - 1), 4&
  170.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  171.                                   Xor (Te4(s(3)) And &HFF0000) _
  172.                                   Xor (Te4(s(2)) And &HFF00&) _
  173.                                   Xor (Te4(s(1)) And &HFF&) _
  174.                                   Xor rco(j)
  175.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  176.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  177.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  178.             If j = 7 Then Exit Do
  179.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  180.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  181.             i = i + 6
  182.             j = j + 1
  183.         Loop
  184.         Nr = 12
  185. 'Debug.Assert i + 4 = (Nr + 1) * 4
  186. #If SUPPORT_LEVEL = 2 Then
  187.     Case 224
  188.         i = 7
  189.         CopyMemory fkey(0), Pass(0), 4& * i
  190.         For j = 0 To 6
  191.             CopyMemory s(0), fkey(i - 1), 4&
  192.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  193.                                   Xor (Te4(s(3)) And &HFF0000) _
  194.                                   Xor (Te4(s(2)) And &HFF00&) _
  195.                                   Xor (Te4(s(1)) And &HFF&) _
  196.                                   Xor rco(j)
  197.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  198.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  199.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  200.             CopyMemory s(0), fkey(i + 3), 4&
  201.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  202.                                       Xor (Te4(s(2)) And &HFF0000) _
  203.                                       Xor (Te4(s(1)) And &HFF00&) _
  204.                                       Xor (Te4(s(0)) And &HFF&)
  205.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  206.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  207.             i = i + 7
  208.         Next j
  209.         Nr = 13
  210. 'Debug.Assert i = (Nr + 1) * 4
  211. #End If
  212.     Case 256
  213.         i = 8
  214.         j = 0
  215.         CopyMemory fkey(0), Pass(0), 4& * i
  216.         Do
  217.             CopyMemory s(0), fkey(i - 1), 4&
  218.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  219.                                   Xor (Te4(s(3)) And &HFF0000) _
  220.                                   Xor (Te4(s(2)) And &HFF00&) _
  221.                                   Xor (Te4(s(1)) And &HFF&) _
  222.                                   Xor rco(j)
  223.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  224.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  225.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  226.             If j = 6 Then Exit Do
  227.             CopyMemory s(0), fkey(i + 3), 4&
  228.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  229.                                       Xor (Te4(s(2)) And &HFF0000) _
  230.                                       Xor (Te4(s(1)) And &HFF00&) _
  231.                                       Xor (Te4(s(0)) And &HFF&)
  232.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  233.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  234.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  235.             i = i + 8
  236.             j = j + 1
  237.         Loop
  238.         Nr = 14
  239. 'Debug.Assert i + 4 = (Nr + 1) * 4
  240.     Case Else
  241.         Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  242.         SetCipherKey = 1
  243.         Exit Function
  244.     End Select
  245.     CreateDecryptionKeys 4
  246.  
  247. #If SUPPORT_LEVEL Then
  248. #If SUPPORT_LEVEL = 2 Then
  249.     Case 160
  250.  
  251.     '160 bit block size
  252.     Select Case KeyBits
  253.     Case 128
  254.         i = 4
  255.         CopyMemory fkey(0), Pass(0), 4& * i
  256.         For j = 0 To 13
  257.             CopyMemory s(0), fkey(i - 1), 4&
  258.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  259.                                   Xor (Te4(s(3)) And &HFF0000) _
  260.                                   Xor (Te4(s(2)) And &HFF00&) _
  261.                                   Xor (Te4(s(1)) And &HFF&) _
  262.                                   Xor rco(j)
  263.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  264.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  265.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  266.             i = i + 4
  267.         Next j
  268.         Nr = 11
  269. 'Debug.Assert i = (Nr + 1) * 5
  270.     Case 160
  271.         i = 5
  272.         CopyMemory fkey(0), Pass(0), 4& * i
  273.         For j = 0 To 10
  274.             CopyMemory s(0), fkey(i - 1), 4&
  275.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  276.                                   Xor (Te4(s(3)) And &HFF0000) _
  277.                                   Xor (Te4(s(2)) And &HFF00&) _
  278.                                   Xor (Te4(s(1)) And &HFF&) _
  279.                                   Xor rco(j)
  280.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  281.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  282.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  283.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  284.             i = i + 5
  285.         Next j
  286.         Nr = 11
  287. 'Debug.Assert i = (Nr + 1) * 5
  288.     Case 192
  289.         i = 6
  290.         j = 0
  291.         CopyMemory fkey(0), Pass(0), 4& * i
  292.         Do
  293.             CopyMemory s(0), fkey(i - 1), 4&
  294.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  295.                                   Xor (Te4(s(3)) And &HFF0000) _
  296.                                   Xor (Te4(s(2)) And &HFF00&) _
  297.                                   Xor (Te4(s(1)) And &HFF&) _
  298.                                   Xor rco(j)
  299.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  300.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  301.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  302.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  303.             If j = 9 Then Exit Do
  304.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  305.             i = i + 6
  306.             j = j + 1
  307.         Loop
  308.         Nr = 12
  309. 'Debug.Assert i + 5 = (Nr + 1) * 5
  310.     Case 224
  311.         i = 7
  312.         CopyMemory fkey(0), Pass(0), 4& * i
  313.         For j = 0 To 8
  314.             CopyMemory s(0), fkey(i - 1), 4&
  315.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  316.                                   Xor (Te4(s(3)) And &HFF0000) _
  317.                                   Xor (Te4(s(2)) And &HFF00&) _
  318.                                   Xor (Te4(s(1)) And &HFF&) _
  319.                                   Xor rco(j)
  320.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  321.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  322.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  323.             CopyMemory s(0), fkey(i + 3), 4&
  324.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  325.                                       Xor (Te4(s(2)) And &HFF0000) _
  326.                                       Xor (Te4(s(1)) And &HFF00&) _
  327.                                       Xor (Te4(s(0)) And &HFF&)
  328.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  329.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  330.             i = i + 7
  331.         Next j
  332.         Nr = 13
  333. 'Debug.Assert i = (Nr + 1) * 5
  334.     Case 256
  335.         i = 8
  336.         j = 0
  337.         CopyMemory fkey(0), Pass(0), 4& * i
  338.         Do
  339.             CopyMemory s(0), fkey(i - 1), 4&
  340.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  341.                                   Xor (Te4(s(3)) And &HFF0000) _
  342.                                   Xor (Te4(s(2)) And &HFF00&) _
  343.                                   Xor (Te4(s(1)) And &HFF&) _
  344.                                   Xor rco(j)
  345.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  346.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  347.             If j = 8 Then Exit Do
  348.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  349.             CopyMemory s(0), fkey(i + 3), 4&
  350.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  351.                                       Xor (Te4(s(2)) And &HFF0000) _
  352.                                       Xor (Te4(s(1)) And &HFF00&) _
  353.                                       Xor (Te4(s(0)) And &HFF&)
  354.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  355.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  356.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  357.             i = i + 8
  358.             j = j + 1
  359.         Loop
  360.         Nr = 14
  361. 'Debug.Assert i + 3 = (Nr + 1) * 5
  362.     Case Else
  363.         Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  364.         SetCipherKey = 1
  365.         Exit Function
  366.     End Select
  367.     CreateDecryptionKeys 5
  368. #End If
  369.     Case 192
  370.  
  371.     '192 bit block size
  372.     Select Case KeyBits
  373.     Case 128
  374.         i = 4
  375.         j = 0
  376.         CopyMemory fkey(0), Pass(0), 4& * i
  377.         Do
  378.             CopyMemory s(0), fkey(i - 1), 4&
  379.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  380.                                   Xor (Te4(s(3)) And &HFF0000) _
  381.                                   Xor (Te4(s(2)) And &HFF00&) _
  382.                                   Xor (Te4(s(1)) And &HFF&) _
  383.                                   Xor rco(j)
  384.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  385.             If j = 18 Then Exit Do
  386.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  387.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  388.             i = i + 4
  389.             j = j + 1
  390.         Loop
  391.         Nr = 12
  392. 'Debug.Assert i + 2 = (Nr + 1) * 6
  393. #If SUPPORT_LEVEL = 2 Then
  394.     Case 160
  395.         i = 5
  396.         j = 0
  397.         CopyMemory fkey(0), Pass(0), 4& * i
  398.         Do
  399.             CopyMemory s(0), fkey(i - 1), 4&
  400.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  401.                                   Xor (Te4(s(3)) And &HFF0000) _
  402.                                   Xor (Te4(s(2)) And &HFF00&) _
  403.                                   Xor (Te4(s(1)) And &HFF&) _
  404.                                   Xor rco(j)
  405.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  406.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  407.             If j = 14 Then Exit Do
  408.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  409.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  410.             i = i + 5
  411.             j = j + 1
  412.         Loop
  413.         Nr = 12
  414. 'Debug.Assert i + 3 = (Nr + 1) * 6
  415. #End If
  416.     Case 192
  417.         i = 6
  418.         CopyMemory fkey(0), Pass(0), 4& * i
  419.         For j = 0 To 11
  420.             CopyMemory s(0), fkey(i - 1), 4&
  421.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  422.                                   Xor (Te4(s(3)) And &HFF0000) _
  423.                                   Xor (Te4(s(2)) And &HFF00&) _
  424.                                   Xor (Te4(s(1)) And &HFF&) _
  425.                                   Xor rco(j)
  426.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  427.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  428.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  429.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  430.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  431.             i = i + 6
  432.         Next j
  433.         Nr = 12
  434. 'Debug.Assert i = (Nr + 1) * 6
  435. #If SUPPORT_LEVEL = 2 Then
  436.     Case 224 '(Nr+1)*Nb/Nk  (when to exit)
  437.         i = 7
  438.         CopyMemory fkey(0), Pass(0), 4& * i
  439.         For j = 0 To 10
  440.             CopyMemory s(0), fkey(i - 1), 4&
  441.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  442.                                   Xor (Te4(s(3)) And &HFF0000) _
  443.                                   Xor (Te4(s(2)) And &HFF00&) _
  444.                                   Xor (Te4(s(1)) And &HFF&) _
  445.                                   Xor rco(j)
  446.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  447.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  448.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  449.             CopyMemory s(0), fkey(i + 3), 4&
  450.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  451.                                       Xor (Te4(s(2)) And &HFF0000) _
  452.                                       Xor (Te4(s(1)) And &HFF00&) _
  453.                                       Xor (Te4(s(0)) And &HFF&)
  454.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  455.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  456.             i = i + 7
  457.         Next j
  458.         Nr = 13
  459. 'Debug.Assert i = (Nr + 1) * 6
  460. #End If
  461.     Case 256
  462.         i = 8
  463.         j = 0
  464.         CopyMemory fkey(0), Pass(0), 4& * i
  465.         Do
  466.             CopyMemory s(0), fkey(i - 1), 4&
  467.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  468.                                   Xor (Te4(s(3)) And &HFF0000) _
  469.                                   Xor (Te4(s(2)) And &HFF00&) _
  470.                                   Xor (Te4(s(1)) And &HFF&) _
  471.                                   Xor rco(j)
  472.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  473.             If j = 10 Then Exit Do
  474.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  475.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  476.             CopyMemory s(0), fkey(i + 3), 4&
  477.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  478.                                       Xor (Te4(s(2)) And &HFF0000) _
  479.                                       Xor (Te4(s(1)) And &HFF00&) _
  480.                                       Xor (Te4(s(0)) And &HFF&)
  481.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  482.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  483.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  484.             i = i + 8
  485.             j = j + 1
  486.         Loop
  487.         Nr = 14
  488. 'Debug.Assert i + 2 = (Nr + 1) * 6
  489.     Case Else
  490.         Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  491.         SetCipherKey = 1
  492.         Exit Function
  493.     End Select
  494.     CreateDecryptionKeys 6
  495.  
  496. #If SUPPORT_LEVEL = 2 Then
  497.     Case 224
  498.  
  499.     '224 bit block size
  500.     Select Case KeyBits
  501.     Case 128
  502.         i = 4
  503.         j = 0
  504.         CopyMemory fkey(0), Pass(0), 4& * i
  505.         Do
  506.             CopyMemory s(0), fkey(i - 1), 4&
  507.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  508.                                   Xor (Te4(s(3)) And &HFF0000) _
  509.                                   Xor (Te4(s(2)) And &HFF00&) _
  510.                                   Xor (Te4(s(1)) And &HFF&) _
  511.                                   Xor rco(j)
  512.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  513.             If j = 23 Then Exit Do
  514.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  515.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  516.             i = i + 4
  517.             j = j + 1
  518.         Loop
  519.         Nr = 13
  520. 'Debug.Assert i + 2 = (Nr + 1) * 7
  521.     Case 160
  522.         i = 5
  523.         j = 0
  524.         CopyMemory fkey(0), Pass(0), 4& * i
  525.         Do
  526.             CopyMemory s(0), fkey(i - 1), 4&
  527.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  528.                                   Xor (Te4(s(3)) And &HFF0000) _
  529.                                   Xor (Te4(s(2)) And &HFF00&) _
  530.                                   Xor (Te4(s(1)) And &HFF&) _
  531.                                   Xor rco(j)
  532.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  533.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  534.             If j = 18 Then Exit Do
  535.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  536.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  537.             i = i + 5
  538.             j = j + 1
  539.         Loop
  540.         Nr = 13
  541. 'Debug.Assert i + 3 = (Nr + 1) * 7
  542.     Case 192
  543.         i = 6
  544.         j = 0
  545.         CopyMemory fkey(0), Pass(0), 4& * i
  546.         Do
  547.             CopyMemory s(0), fkey(i - 1), 4&
  548.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  549.                                   Xor (Te4(s(3)) And &HFF0000) _
  550.                                   Xor (Te4(s(2)) And &HFF00&) _
  551.                                   Xor (Te4(s(1)) And &HFF&) _
  552.                                   Xor rco(j)
  553.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  554.             If j = 15 Then Exit Do
  555.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  556.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  557.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  558.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  559.             i = i + 6
  560.             j = j + 1
  561.         Loop
  562.         Nr = 13
  563. 'Debug.Assert i + 2 = (Nr + 1) * 7
  564.     Case 224
  565.         i = 7
  566.         CopyMemory fkey(0), Pass(0), 4& * i
  567.         For j = 0 To 12
  568.             CopyMemory s(0), fkey(i - 1), 4&
  569.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  570.                                   Xor (Te4(s(3)) And &HFF0000) _
  571.                                   Xor (Te4(s(2)) And &HFF00&) _
  572.                                   Xor (Te4(s(1)) And &HFF&) _
  573.                                   Xor rco(j)
  574.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  575.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  576.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  577.             CopyMemory s(0), fkey(i + 3), 4&
  578.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  579.                                       Xor (Te4(s(2)) And &HFF0000) _
  580.                                       Xor (Te4(s(1)) And &HFF00&) _
  581.                                       Xor (Te4(s(0)) And &HFF&)
  582.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  583.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  584.             i = i + 7
  585.         Next j
  586.         Nr = 13
  587. 'Debug.Assert i = (Nr + 1) * 7
  588.     Case 256
  589.         i = 8
  590.         j = 0
  591.         CopyMemory fkey(0), Pass(0), 4& * i
  592.         Do
  593.             CopyMemory s(0), fkey(i - 1), 4&
  594.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  595.                                   Xor (Te4(s(3)) And &HFF0000) _
  596.                                   Xor (Te4(s(2)) And &HFF00&) _
  597.                                   Xor (Te4(s(1)) And &HFF&) _
  598.                                   Xor rco(j)
  599.             If j = 12 Then Exit Do
  600.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  601.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  602.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  603.             CopyMemory s(0), fkey(i + 3), 4&
  604.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  605.                                       Xor (Te4(s(2)) And &HFF0000) _
  606.                                       Xor (Te4(s(1)) And &HFF00&) _
  607.                                       Xor (Te4(s(0)) And &HFF&)
  608.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  609.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  610.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  611.             i = i + 8
  612.             j = j + 1
  613.         Loop
  614.         Nr = 14
  615. 'Debug.Assert i + 1 = (Nr + 1) * 7
  616.     Case Else
  617.         Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  618.         SetCipherKey = 1
  619.         Exit Function
  620.     End Select
  621.     CreateDecryptionKeys 7
  622. #End If
  623.  
  624.     Case 256
  625.  
  626.     '256 bit block size
  627.     Select Case KeyBits
  628.     Case 128
  629.         i = 4
  630.         CopyMemory fkey(0), Pass(0), 4& * i
  631.         For j = 0 To 28
  632.             CopyMemory s(0), fkey(i - 1), 4&
  633.             fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
  634.                                   Xor (Te4(s(3)) And &HFF0000) _
  635.                                   Xor (Te4(s(2)) And &HFF00&) _
  636.                                   Xor (Te4(s(1)) And &HFF&) _
  637.                                   Xor rco(j)
  638.             fkey(i + 1) = fkey(i - 3) Xor fkey(i)
  639.             fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
  640.             fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
  641.             i = i + 4
  642.         Next j
  643.         Nr = 14
  644. 'Debug.Assert i = (Nr + 1) * 8
  645. #If SUPPORT_LEVEL = 2 Then
  646.     Case 160
  647.         i = 5
  648.         CopyMemory fkey(0), Pass(0), 4& * i
  649.         For j = 0 To 22
  650.             CopyMemory s(0), fkey(i - 1), 4&
  651.             fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
  652.                                   Xor (Te4(s(3)) And &HFF0000) _
  653.                                   Xor (Te4(s(2)) And &HFF00&) _
  654.                                   Xor (Te4(s(1)) And &HFF&) _
  655.                                   Xor rco(j)
  656.             fkey(i + 1) = fkey(i - 4) Xor fkey(i)
  657.             fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
  658.             fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
  659.             fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
  660.             i = i + 5
  661.         Next j
  662.         Nr = 14
  663. 'Debug.Assert i = (Nr + 1) * 8
  664. #End If
  665.     Case 192
  666.         i = 6
  667.         CopyMemory fkey(0), Pass(0), 4& * i
  668.         For j = 0 To 18
  669.             CopyMemory s(0), fkey(i - 1), 4&
  670.             fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
  671.                                   Xor (Te4(s(3)) And &HFF0000) _
  672.                                   Xor (Te4(s(2)) And &HFF00&) _
  673.                                   Xor (Te4(s(1)) And &HFF&) _
  674.                                   Xor rco(j)
  675.             fkey(i + 1) = fkey(i - 5) Xor fkey(i)
  676.             fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
  677.             fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
  678.             fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
  679.             fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
  680.             i = i + 6
  681.         Next j
  682.         Nr = 14
  683. 'Debug.Assert i = (Nr + 1) * 8
  684. #If SUPPORT_LEVEL = 2 Then
  685.     Case 224
  686.         i = 7
  687.         j = 0
  688.         CopyMemory fkey(0), Pass(0), 4& * i
  689.         Do
  690.             CopyMemory s(0), fkey(i - 1), 4&
  691.             fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
  692.                                   Xor (Te4(s(3)) And &HFF0000) _
  693.                                   Xor (Te4(s(2)) And &HFF00&) _
  694.                                   Xor (Te4(s(1)) And &HFF&) _
  695.                                   Xor rco(j)
  696.             If j = 16 Then Exit Do
  697.             fkey(i + 1) = fkey(i - 6) Xor fkey(i)
  698.             fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
  699.             fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
  700.             CopyMemory s(0), fkey(i + 3), 4&
  701.             fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
  702.                                       Xor (Te4(s(2)) And &HFF0000) _
  703.                                       Xor (Te4(s(1)) And &HFF00&) _
  704.                                       Xor (Te4(s(0)) And &HFF&)
  705.             fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
  706.             fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
  707.             i = i + 7
  708.             j = j + 1
  709.         Loop
  710.         Nr = 14
  711. 'Debug.Assert i + 1 = (Nr + 1) * 8
  712. #End If
  713.     Case 256
  714.         i = 8
  715.         CopyMemory fkey(0), Pass(0), 4& * i
  716.         For j = 0 To 13
  717.             CopyMemory s(0), fkey(i - 1), 4&
  718.             fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
  719.                                   Xor (Te4(s(3)) And &HFF0000) _
  720.                                   Xor (Te4(s(2)) And &HFF00&) _
  721.                                   Xor (Te4(s(1)) And &HFF&) _
  722.                                   Xor rco(j)
  723.             fkey(i + 1) = fkey(i - 7) Xor fkey(i)
  724.             fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
  725.             fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
  726.             CopyMemory s(0), fkey(i + 3), 4&
  727.             fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
  728.                                       Xor (Te4(s(2)) And &HFF0000) _
  729.                                       Xor (Te4(s(1)) And &HFF00&) _
  730.                                       Xor (Te4(s(0)) And &HFF&)
  731.             fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
  732.             fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
  733.             fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
  734.             i = i + 8
  735.         Next j
  736.         Nr = 14
  737. 'Debug.Assert i = (Nr + 1) * 8
  738.     Case Else
  739.         Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
  740.         SetCipherKey = 1
  741.         Exit Function
  742.     End Select
  743.     CreateDecryptionKeys 8
  744.  
  745.     Case Else
  746.         Err.Raise 1, , "cRijndael.SetCipherKey - Illegal BlockBits Value"
  747.         SetCipherKey = 1
  748.         Exit Function
  749.     End Select
  750. #End If
  751. End Function
  752.  
  753. #If SUPPORT_LEVEL Then
  754. Private Function SetCipherKeyString(PassPhrase As String, KeyBits As Long, BlockBits As Long) As Long
  755.     Dim Pass() As Byte
  756.  
  757.     Pass = StrConv(PassPhrase, vbFromUnicode)
  758.     ReDim Preserve Pass(31)
  759.     SetCipherKeyString = SetCipherKey(Pass, KeyBits, BlockBits)
  760. End Function
  761. #Else
  762. Private Function SetCipherKeyString(PassPhrase As String, KeyBits As Long) As Long
  763.     Dim Pass() As Byte
  764.  
  765.     Pass = StrConv(PassPhrase, vbFromUnicode)
  766.     ReDim Preserve Pass(31)
  767.     SetCipherKeyString = SetCipherKey(Pass, KeyBits)
  768. End Function
  769. #End If
  770.  
  771.  
  772. 'Encrypt a 128 bit block.  plaintext(p ... p+15) is input, ciphertext(q ... q+15) is output.
  773. 'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+15) is not allocated.
  774. Private Sub BlockEncrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  775.     Dim i     As Long
  776.     Dim k     As Long
  777.     Dim t0    As Long
  778.     Dim t1    As Long
  779.     Dim t2    As Long
  780.     Dim t3    As Long
  781.     Dim s(15) As Byte
  782.  
  783.     CopyMemory t0, plaintext(p + 0), 4&
  784.     CopyMemory t1, plaintext(p + 4), 4&
  785.     CopyMemory t2, plaintext(p + 8), 4&
  786.     CopyMemory t3, plaintext(p + 12), 4&
  787.     t0 = t0 Xor fkey(0)
  788.     t1 = t1 Xor fkey(1)
  789.     t2 = t2 Xor fkey(2)
  790.     t3 = t3 Xor fkey(3)
  791.     k = 4
  792.  
  793.     For i = 1 To Nr - 1 'Nr is number of rounds
  794.         CopyMemory s(0), t0, 4&
  795.         CopyMemory s(4), t1, 4&
  796.         CopyMemory s(8), t2, 4&
  797.         CopyMemory s(12), t3, 4&
  798.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
  799.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(3)) Xor fkey(k + 1)
  800.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 2)
  801.         t3 = Te0(s(12)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 3)
  802.         k = k + 4
  803.     Next i
  804.  
  805.     'Final round
  806.     CopyMemory s(0), t0, 4&
  807.     CopyMemory s(4), t1, 4&
  808.     CopyMemory s(8), t2, 4&
  809.     CopyMemory s(12), t3, 4&
  810.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
  811.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 1)
  812.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 2)
  813.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 3)
  814.     CopyMemory ciphertext(q + 0), t0, 4&
  815.     CopyMemory ciphertext(q + 4), t1, 4&
  816.     CopyMemory ciphertext(q + 8), t2, 4&
  817.     CopyMemory ciphertext(q + 12), t3, 4&
  818. End Sub
  819.  
  820. 'Decrypt a 128 bit block.  ciphertext(q ... q+15) is input, plaintext(p ... p+15) is output.
  821. 'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+15) is not allocated.
  822. Private Sub BlockDecrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  823.     Dim i     As Long
  824.     Dim k     As Long
  825.     Dim t0    As Long
  826.     Dim t1    As Long
  827.     Dim t2    As Long
  828.     Dim t3    As Long
  829.     Dim s(15) As Byte
  830.  
  831.     CopyMemory t0, ciphertext(q + 0), 4&
  832.     CopyMemory t1, ciphertext(q + 4), 4&
  833.     CopyMemory t2, ciphertext(q + 8), 4&
  834.     CopyMemory t3, ciphertext(q + 12), 4&
  835.     t0 = t0 Xor rkey(0)
  836.     t1 = t1 Xor rkey(1)
  837.     t2 = t2 Xor rkey(2)
  838.     t3 = t3 Xor rkey(3)
  839.     k = 4
  840.  
  841.     For i = 1 To Nr - 1 'Nr is number of rounds
  842.         CopyMemory s(0), t0, 4&
  843.         CopyMemory s(4), t1, 4&
  844.         CopyMemory s(8), t2, 4&
  845.         CopyMemory s(12), t3, 4&
  846.         t0 = Td0(s(0)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 0)
  847.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 1)
  848.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(15)) Xor rkey(k + 2)
  849.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
  850.         k = k + 4
  851.     Next i
  852.  
  853.     'Final round
  854.     CopyMemory s(0), t0, 4&
  855.     CopyMemory s(4), t1, 4&
  856.     CopyMemory s(8), t2, 4&
  857.     CopyMemory s(12), t3, 4&
  858.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 0)
  859.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 1)
  860.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 2)
  861.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
  862.     CopyMemory plaintext(p + 0), t0, 4&
  863.     CopyMemory plaintext(p + 4), t1, 4&
  864.     CopyMemory plaintext(p + 8), t2, 4&
  865.     CopyMemory plaintext(p + 12), t3, 4&
  866. End Sub
  867.  
  868. #If SUPPORT_LEVEL Then
  869. #If SUPPORT_LEVEL = 2 Then
  870. 'Encrypt a 160 bit block.  plaintext(p ... p+19) is input, ciphertext(q ... q+19) is output.
  871. 'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+19) is not allocated.
  872. Private Sub Block160Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  873.     Dim i     As Long
  874.     Dim k     As Long
  875.     Dim t0    As Long
  876.     Dim t1    As Long
  877.     Dim t2    As Long
  878.     Dim t3    As Long
  879.     Dim t4    As Long
  880.     Dim s(19) As Byte
  881.  
  882.     CopyMemory t0, plaintext(p + 0), 4&
  883.     CopyMemory t1, plaintext(p + 4), 4&
  884.     CopyMemory t2, plaintext(p + 8), 4&
  885.     CopyMemory t3, plaintext(p + 12), 4&
  886.     CopyMemory t4, plaintext(p + 16), 4&
  887.     t0 = t0 Xor fkey(0)
  888.     t1 = t1 Xor fkey(1)
  889.     t2 = t2 Xor fkey(2)
  890.     t3 = t3 Xor fkey(3)
  891.     t4 = t4 Xor fkey(4)
  892.     k = 5
  893.  
  894.     For i = 1 To Nr - 1 'Nr is number of rounds
  895.         CopyMemory s(0), t0, 4&
  896.         CopyMemory s(4), t1, 4&
  897.         CopyMemory s(8), t2, 4&
  898.         CopyMemory s(12), t3, 4&
  899.         CopyMemory s(16), t4, 4&
  900.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
  901.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 1)
  902.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(3)) Xor fkey(k + 2)
  903.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 3)
  904.         t4 = Te0(s(16)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 4)
  905.         k = k + 5
  906.     Next i
  907.  
  908.     'Final round
  909.     CopyMemory s(0), t0, 4&
  910.     CopyMemory s(4), t1, 4&
  911.     CopyMemory s(8), t2, 4&
  912.     CopyMemory s(12), t3, 4&
  913.     CopyMemory s(16), t4, 4&
  914.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
  915.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 1)
  916.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 2)
  917.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 3)
  918.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 4)
  919.     CopyMemory ciphertext(q + 0), t0, 4&
  920.     CopyMemory ciphertext(q + 4), t1, 4&
  921.     CopyMemory ciphertext(q + 8), t2, 4&
  922.     CopyMemory ciphertext(q + 12), t3, 4&
  923.     CopyMemory ciphertext(q + 16), t4, 4&
  924. End Sub
  925.  
  926. 'Decrypt a 160 bit block.  ciphertext(q ... q+19) is input, plaintext(p ... p+19) is output.
  927. 'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+19) is not allocated.
  928. Private Sub Block160Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  929.     Dim i     As Long
  930.     Dim k     As Long
  931.     Dim t0    As Long
  932.     Dim t1    As Long
  933.     Dim t2    As Long
  934.     Dim t3    As Long
  935.     Dim t4    As Long
  936.     Dim s(19) As Byte
  937.  
  938.     CopyMemory t0, ciphertext(q + 0), 4&
  939.     CopyMemory t1, ciphertext(q + 4), 4&
  940.     CopyMemory t2, ciphertext(q + 8), 4&
  941.     CopyMemory t3, ciphertext(q + 12), 4&
  942.     CopyMemory t4, ciphertext(q + 16), 4&
  943.     t0 = t0 Xor rkey(0)
  944.     t1 = t1 Xor rkey(1)
  945.     t2 = t2 Xor rkey(2)
  946.     t3 = t3 Xor rkey(3)
  947.     t4 = t4 Xor rkey(4)
  948.     k = 5
  949.  
  950.     For i = 1 To Nr - 1 'Nr is number of rounds
  951.         CopyMemory s(0), t0, 4&
  952.         CopyMemory s(4), t1, 4&
  953.         CopyMemory s(8), t2, 4&
  954.         CopyMemory s(12), t3, 4&
  955.         CopyMemory s(16), t4, 4&
  956.         t0 = Td0(s(0)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 0)
  957.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 1)
  958.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(19)) Xor rkey(k + 2)
  959.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
  960.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 4)
  961.         k = k + 5
  962.     Next i
  963.  
  964.     'Final round
  965.     CopyMemory s(0), t0, 4&
  966.     CopyMemory s(4), t1, 4&
  967.     CopyMemory s(8), t2, 4&
  968.     CopyMemory s(12), t3, 4&
  969.     CopyMemory s(16), t4, 4&
  970.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 0)
  971.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 1)
  972.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 2)
  973.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
  974.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 4)
  975.     CopyMemory plaintext(p + 0), t0, 4&
  976.     CopyMemory plaintext(p + 4), t1, 4&
  977.     CopyMemory plaintext(p + 8), t2, 4&
  978.     CopyMemory plaintext(p + 12), t3, 4&
  979.     CopyMemory plaintext(p + 16), t4, 4&
  980. End Sub
  981. #End If
  982.  
  983. 'Encrypt a 192 bit block.  plaintext(p ... p+23) is input, ciphertext(q ... q+23) is output.
  984. 'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+23) is not allocated.
  985. Private Sub Block192Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  986.     Dim i     As Long
  987.     Dim k     As Long
  988.     Dim t0    As Long
  989.     Dim t1    As Long
  990.     Dim t2    As Long
  991.     Dim t3    As Long
  992.     Dim t4    As Long
  993.     Dim t5    As Long
  994.     Dim s(23) As Byte
  995.  
  996.     CopyMemory t0, plaintext(p + 0), 4&
  997.     CopyMemory t1, plaintext(p + 4), 4&
  998.     CopyMemory t2, plaintext(p + 8), 4&
  999.     CopyMemory t3, plaintext(p + 12), 4&
  1000.     CopyMemory t4, plaintext(p + 16), 4&
  1001.     CopyMemory t5, plaintext(p + 20), 4&
  1002.     t0 = t0 Xor fkey(0)
  1003.     t1 = t1 Xor fkey(1)
  1004.     t2 = t2 Xor fkey(2)
  1005.     t3 = t3 Xor fkey(3)
  1006.     t4 = t4 Xor fkey(4)
  1007.     t5 = t5 Xor fkey(5)
  1008.     k = 6
  1009.  
  1010.     For i = 1 To Nr - 1 'Nr is number of rounds
  1011.         CopyMemory s(0), t0, 4&
  1012.         CopyMemory s(4), t1, 4&
  1013.         CopyMemory s(8), t2, 4&
  1014.         CopyMemory s(12), t3, 4&
  1015.         CopyMemory s(16), t4, 4&
  1016.         CopyMemory s(20), t5, 4&
  1017.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
  1018.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 1)
  1019.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(23)) Xor fkey(k + 2)
  1020.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(22)) Xor Te3(s(3)) Xor fkey(k + 3)
  1021.         t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 4)
  1022.         t5 = Te0(s(20)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 5)
  1023.         k = k + 6
  1024.     Next i
  1025.  
  1026.     'Final round
  1027.     CopyMemory s(0), t0, 4&
  1028.     CopyMemory s(4), t1, 4&
  1029.     CopyMemory s(8), t2, 4&
  1030.     CopyMemory s(12), t3, 4&
  1031.     CopyMemory s(16), t4, 4&
  1032.     CopyMemory s(20), t5, 4&
  1033.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
  1034.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 1)
  1035.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 2)
  1036.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 3)
  1037.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 4)
  1038.     t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 5)
  1039.  
  1040.     CopyMemory ciphertext(q + 0), t0, 4&
  1041.     CopyMemory ciphertext(q + 4), t1, 4&
  1042.     CopyMemory ciphertext(q + 8), t2, 4&
  1043.     CopyMemory ciphertext(q + 12), t3, 4&
  1044.     CopyMemory ciphertext(q + 16), t4, 4&
  1045.     CopyMemory ciphertext(q + 20), t5, 4&
  1046. End Sub
  1047.  
  1048. 'Decrypt a 192 bit block.  ciphertext(q ... q+23) is input, plaintext(p ... p+23) is output.
  1049. 'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+23) is not allocated.
  1050. Private Sub Block192Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1051.     Dim i     As Long
  1052.     Dim k     As Long
  1053.     Dim t0    As Long
  1054.     Dim t1    As Long
  1055.     Dim t2    As Long
  1056.     Dim t3    As Long
  1057.     Dim t4    As Long
  1058.     Dim t5    As Long
  1059.     Dim s(23) As Byte
  1060.  
  1061.     CopyMemory t0, ciphertext(q + 0), 4&
  1062.     CopyMemory t1, ciphertext(q + 4), 4&
  1063.     CopyMemory t2, ciphertext(q + 8), 4&
  1064.     CopyMemory t3, ciphertext(q + 12), 4&
  1065.     CopyMemory t4, ciphertext(q + 16), 4&
  1066.     CopyMemory t5, ciphertext(q + 20), 4&
  1067.     t0 = t0 Xor rkey(0)
  1068.     t1 = t1 Xor rkey(1)
  1069.     t2 = t2 Xor rkey(2)
  1070.     t3 = t3 Xor rkey(3)
  1071.     t4 = t4 Xor rkey(4)
  1072.     t5 = t5 Xor rkey(5)
  1073.     k = 6
  1074.  
  1075.     For i = 1 To Nr - 1 'Nr is number of rounds
  1076.         CopyMemory s(0), t0, 4&
  1077.         CopyMemory s(4), t1, 4&
  1078.         CopyMemory s(8), t2, 4&
  1079.         CopyMemory s(12), t3, 4&
  1080.         CopyMemory s(16), t4, 4&
  1081.         CopyMemory s(20), t5, 4&
  1082.         t0 = Td0(s(0)) Xor Td1(s(21)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 0)
  1083.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(22)) Xor Td3(s(19)) Xor rkey(k + 1)
  1084.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(23)) Xor rkey(k + 2)
  1085.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
  1086.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 4)
  1087.         t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 5)
  1088.         k = k + 6
  1089.     Next i
  1090.  
  1091.     'Final round
  1092.     CopyMemory s(0), t0, 4&
  1093.     CopyMemory s(4), t1, 4&
  1094.     CopyMemory s(8), t2, 4&
  1095.     CopyMemory s(12), t3, 4&
  1096.     CopyMemory s(16), t4, 4&
  1097.     CopyMemory s(20), t5, 4&
  1098.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 0)
  1099.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 1)
  1100.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 2)
  1101.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
  1102.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 4)
  1103.     t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 5)
  1104.     CopyMemory plaintext(p + 0), t0, 4&
  1105.     CopyMemory plaintext(p + 4), t1, 4&
  1106.     CopyMemory plaintext(p + 8), t2, 4&
  1107.     CopyMemory plaintext(p + 12), t3, 4&
  1108.     CopyMemory plaintext(p + 16), t4, 4&
  1109.     CopyMemory plaintext(p + 20), t5, 4&
  1110. End Sub
  1111.  
  1112. #If SUPPORT_LEVEL = 2 Then
  1113. 'Encrypt a 224 bit block.  plaintext(p ... p+27) is input, ciphertext(q ... q+27) is output.
  1114. 'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+27) is not allocated.
  1115. Private Sub Block224Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1116.     Dim i     As Long
  1117.     Dim k     As Long
  1118.     Dim t0    As Long
  1119.     Dim t1    As Long
  1120.     Dim t2    As Long
  1121.     Dim t3    As Long
  1122.     Dim t4    As Long
  1123.     Dim t5    As Long
  1124.     Dim t6    As Long
  1125.     Dim s(27) As Byte
  1126.  
  1127.     CopyMemory t0, plaintext(p + 0), 4&
  1128.     CopyMemory t1, plaintext(p + 4), 4&
  1129.     CopyMemory t2, plaintext(p + 8), 4&
  1130.     CopyMemory t3, plaintext(p + 12), 4&
  1131.     CopyMemory t4, plaintext(p + 16), 4&
  1132.     CopyMemory t5, plaintext(p + 20), 4&
  1133.     CopyMemory t6, plaintext(p + 24), 4&
  1134.     t0 = t0 Xor fkey(0)
  1135.     t1 = t1 Xor fkey(1)
  1136.     t2 = t2 Xor fkey(2)
  1137.     t3 = t3 Xor fkey(3)
  1138.     t4 = t4 Xor fkey(4)
  1139.     t5 = t5 Xor fkey(5)
  1140.     t6 = t6 Xor fkey(6)
  1141.     k = 7
  1142.  
  1143.     For i = 1 To Nr - 1 'Nr is number of rounds
  1144.         CopyMemory s(0), t0, 4&
  1145.         CopyMemory s(4), t1, 4&
  1146.         CopyMemory s(8), t2, 4&
  1147.         CopyMemory s(12), t3, 4&
  1148.         CopyMemory s(16), t4, 4&
  1149.         CopyMemory s(20), t5, 4&
  1150.         CopyMemory s(24), t6, 4&
  1151.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(19)) Xor fkey(k + 0)
  1152.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(23)) Xor fkey(k + 1)
  1153.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(27)) Xor fkey(k + 2)
  1154.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(22)) Xor Te3(s(3)) Xor fkey(k + 3)
  1155.         t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(26)) Xor Te3(s(7)) Xor fkey(k + 4)
  1156.         t5 = Te0(s(20)) Xor Te1(s(25)) Xor Te2(s(2)) Xor Te3(s(11)) Xor fkey(k + 5)
  1157.         t6 = Te0(s(24)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(15)) Xor fkey(k + 6)
  1158.         k = k + 7
  1159.     Next i
  1160.  
  1161.     'Final round
  1162.     CopyMemory s(0), t0, 4&
  1163.     CopyMemory s(4), t1, 4&
  1164.     CopyMemory s(8), t2, 4&
  1165.     CopyMemory s(12), t3, 4&
  1166.     CopyMemory s(16), t4, 4&
  1167.     CopyMemory s(20), t5, 4&
  1168.     CopyMemory s(24), t6, 4&
  1169.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 0)
  1170.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 1)
  1171.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(27)) And &HFF000000) Xor fkey(k + 2)
  1172.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 3)
  1173.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(26)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 4)
  1174.     t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(25)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 5)
  1175.     t6 = (Te4(s(24)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 6)
  1176.     CopyMemory ciphertext(q + 0), t0, 4&
  1177.     CopyMemory ciphertext(q + 4), t1, 4&
  1178.     CopyMemory ciphertext(q + 8), t2, 4&
  1179.     CopyMemory ciphertext(q + 12), t3, 4&
  1180.     CopyMemory ciphertext(q + 16), t4, 4&
  1181.     CopyMemory ciphertext(q + 20), t5, 4&
  1182.     CopyMemory ciphertext(q + 24), t6, 4&
  1183. End Sub
  1184.  
  1185. 'Decrypt a 224 bit block.  ciphertext(q ... q+27) is input, plaintext(p ... p+27) is output.
  1186. 'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+27) is not allocated.
  1187. Private Sub Block224Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1188.     Dim i     As Long
  1189.     Dim k     As Long
  1190.     Dim t0    As Long
  1191.     Dim t1    As Long
  1192.     Dim t2    As Long
  1193.     Dim t3    As Long
  1194.     Dim t4    As Long
  1195.     Dim t5    As Long
  1196.     Dim t6    As Long
  1197.     Dim s(27) As Byte
  1198.  
  1199.     CopyMemory t0, ciphertext(q + 0), 4&
  1200.     CopyMemory t1, ciphertext(q + 4), 4&
  1201.     CopyMemory t2, ciphertext(q + 8), 4&
  1202.     CopyMemory t3, ciphertext(q + 12), 4&
  1203.     CopyMemory t4, ciphertext(q + 16), 4&
  1204.     CopyMemory t5, ciphertext(q + 20), 4&
  1205.     CopyMemory t6, ciphertext(q + 24), 4&
  1206.     t0 = t0 Xor rkey(0)
  1207.     t1 = t1 Xor rkey(1)
  1208.     t2 = t2 Xor rkey(2)
  1209.     t3 = t3 Xor rkey(3)
  1210.     t4 = t4 Xor rkey(4)
  1211.     t5 = t5 Xor rkey(5)
  1212.     t6 = t6 Xor rkey(6)
  1213.     k = 7
  1214.  
  1215.     For i = 1 To Nr - 1 'Nr is number of rounds
  1216.         CopyMemory s(0), t0, 4&
  1217.         CopyMemory s(4), t1, 4&
  1218.         CopyMemory s(8), t2, 4&
  1219.         CopyMemory s(12), t3, 4&
  1220.         CopyMemory s(16), t4, 4&
  1221.         CopyMemory s(20), t5, 4&
  1222.         CopyMemory s(24), t6, 4&
  1223.         t0 = Td0(s(0)) Xor Td1(s(25)) Xor Td2(s(22)) Xor Td3(s(15)) Xor rkey(k + 0)
  1224.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(26)) Xor Td3(s(19)) Xor rkey(k + 1)
  1225.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(23)) Xor rkey(k + 2)
  1226.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(27)) Xor rkey(k + 3)
  1227.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(3)) Xor rkey(k + 4)
  1228.         t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(7)) Xor rkey(k + 5)
  1229.         t6 = Td0(s(24)) Xor Td1(s(21)) Xor Td2(s(18)) Xor Td3(s(11)) Xor rkey(k + 6)
  1230.         k = k + 7
  1231.     Next i
  1232.  
  1233.     'Final round
  1234.     CopyMemory s(0), t0, 4&
  1235.     CopyMemory s(4), t1, 4&
  1236.     CopyMemory s(8), t2, 4&
  1237.     CopyMemory s(12), t3, 4&
  1238.     CopyMemory s(16), t4, 4&
  1239.     CopyMemory s(20), t5, 4&
  1240.     CopyMemory s(24), t6, 4&
  1241.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(25)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 0)
  1242.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(26)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 1)
  1243.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 2)
  1244.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(27)) And &HFF000000) Xor rkey(k + 3)
  1245.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 4)
  1246.     t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 5)
  1247.     t6 = (Td4(s(24)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 6)
  1248.     CopyMemory plaintext(p + 0), t0, 4&
  1249.     CopyMemory plaintext(p + 4), t1, 4&
  1250.     CopyMemory plaintext(p + 8), t2, 4&
  1251.     CopyMemory plaintext(p + 12), t3, 4&
  1252.     CopyMemory plaintext(p + 16), t4, 4&
  1253.     CopyMemory plaintext(p + 20), t5, 4&
  1254.     CopyMemory plaintext(p + 24), t6, 4&
  1255. End Sub
  1256. #End If
  1257.  
  1258. 'Encrypt a 256 bit block.  plaintext(p ... p+31) is input, ciphertext(q ... q+31) is output.
  1259. 'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+31) is not allocated.
  1260. Private Sub Block256Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1261.     Dim i     As Long
  1262.     Dim k     As Long
  1263.     Dim t0    As Long
  1264.     Dim t1    As Long
  1265.     Dim t2    As Long
  1266.     Dim t3    As Long
  1267.     Dim t4    As Long
  1268.     Dim t5    As Long
  1269.     Dim t6    As Long
  1270.     Dim t7    As Long
  1271.     Dim s(31) As Byte
  1272.  
  1273.     CopyMemory t0, plaintext(p + 0), 4&
  1274.     CopyMemory t1, plaintext(p + 4), 4&
  1275.     CopyMemory t2, plaintext(p + 8), 4&
  1276.     CopyMemory t3, plaintext(p + 12), 4&
  1277.     CopyMemory t4, plaintext(p + 16), 4&
  1278.     CopyMemory t5, plaintext(p + 20), 4&
  1279.     CopyMemory t6, plaintext(p + 24), 4&
  1280.     CopyMemory t7, plaintext(p + 28), 4&
  1281.     t0 = t0 Xor fkey(0)
  1282.     t1 = t1 Xor fkey(1)
  1283.     t2 = t2 Xor fkey(2)
  1284.     t3 = t3 Xor fkey(3)
  1285.     t4 = t4 Xor fkey(4)
  1286.     t5 = t5 Xor fkey(5)
  1287.     t6 = t6 Xor fkey(6)
  1288.     t7 = t7 Xor fkey(7)
  1289.     k = 8
  1290.  
  1291.     For i = 1 To Nr - 1 'Nr is number of rounds
  1292.         CopyMemory s(0), t0, 4&
  1293.         CopyMemory s(4), t1, 4&
  1294.         CopyMemory s(8), t2, 4&
  1295.         CopyMemory s(12), t3, 4&
  1296.         CopyMemory s(16), t4, 4&
  1297.         CopyMemory s(20), t5, 4&
  1298.         CopyMemory s(24), t6, 4&
  1299.         CopyMemory s(28), t7, 4&
  1300.         t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 0)
  1301.         t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(18)) Xor Te3(s(23)) Xor fkey(k + 1)
  1302.         t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(22)) Xor Te3(s(27)) Xor fkey(k + 2)
  1303.         t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(26)) Xor Te3(s(31)) Xor fkey(k + 3)
  1304.         t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(30)) Xor Te3(s(3)) Xor fkey(k + 4)
  1305.         t5 = Te0(s(20)) Xor Te1(s(25)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 5)
  1306.         t6 = Te0(s(24)) Xor Te1(s(29)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 6)
  1307.         t7 = Te0(s(28)) Xor Te1(s(1)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 7)
  1308.         k = k + 8
  1309.     Next i
  1310.  
  1311.     'Final round
  1312.     CopyMemory s(0), t0, 4&
  1313.     CopyMemory s(4), t1, 4&
  1314.     CopyMemory s(8), t2, 4&
  1315.     CopyMemory s(12), t3, 4&
  1316.     CopyMemory s(16), t4, 4&
  1317.     CopyMemory s(20), t5, 4&
  1318.     CopyMemory s(24), t6, 4&
  1319.     CopyMemory s(28), t7, 4&
  1320.     t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 0)
  1321.     t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 1)
  1322.     t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(27)) And &HFF000000) Xor fkey(k + 2)
  1323.     t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(26)) And &HFF0000) Xor (Te4(s(31)) And &HFF000000) Xor fkey(k + 3)
  1324.     t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(30)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 4)
  1325.     t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(25)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 5)
  1326.     t6 = (Te4(s(24)) And &HFF&) Xor (Te4(s(29)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 6)
  1327.     t7 = (Te4(s(28)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 7)
  1328.     CopyMemory ciphertext(q + 0), t0, 4&
  1329.     CopyMemory ciphertext(q + 4), t1, 4&
  1330.     CopyMemory ciphertext(q + 8), t2, 4&
  1331.     CopyMemory ciphertext(q + 12), t3, 4&
  1332.     CopyMemory ciphertext(q + 16), t4, 4&
  1333.     CopyMemory ciphertext(q + 20), t5, 4&
  1334.     CopyMemory ciphertext(q + 24), t6, 4&
  1335.     CopyMemory ciphertext(q + 28), t7, 4&
  1336. End Sub
  1337.  
  1338. 'Decrypt a 256 bit block.  ciphertext(q ... q+31) is input, plaintext(p ... p+31) is output.
  1339. 'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+31) is not allocated.
  1340. Private Sub Block256Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
  1341.     Dim i     As Long
  1342.     Dim k     As Long
  1343.     Dim t0    As Long
  1344.     Dim t1    As Long
  1345.     Dim t2    As Long
  1346.     Dim t3    As Long
  1347.     Dim t4    As Long
  1348.     Dim t5    As Long
  1349.     Dim t6    As Long
  1350.     Dim t7    As Long
  1351.     Dim s(31) As Byte
  1352.  
  1353.     CopyMemory t0, ciphertext(q + 0), 4&
  1354.     CopyMemory t1, ciphertext(q + 4), 4&
  1355.     CopyMemory t2, ciphertext(q + 8), 4&
  1356.     CopyMemory t3, ciphertext(q + 12), 4&
  1357.     CopyMemory t4, ciphertext(q + 16), 4&
  1358.     CopyMemory t5, ciphertext(q + 20), 4&
  1359.     CopyMemory t6, ciphertext(q + 24), 4&
  1360.     CopyMemory t7, ciphertext(q + 28), 4&
  1361.     t0 = t0 Xor rkey(0)
  1362.     t1 = t1 Xor rkey(1)
  1363.     t2 = t2 Xor rkey(2)
  1364.     t3 = t3 Xor rkey(3)
  1365.     t4 = t4 Xor rkey(4)
  1366.     t5 = t5 Xor rkey(5)
  1367.     t6 = t6 Xor rkey(6)
  1368.     t7 = t7 Xor rkey(7)
  1369.     k = 8
  1370.  
  1371.     For i = 1 To Nr - 1 'Nr is number of rounds
  1372.         CopyMemory s(0), t0, 4&
  1373.         CopyMemory s(4), t1, 4&
  1374.         CopyMemory s(8), t2, 4&
  1375.         CopyMemory s(12), t3, 4&
  1376.         CopyMemory s(16), t4, 4&
  1377.         CopyMemory s(20), t5, 4&
  1378.         CopyMemory s(24), t6, 4&
  1379.         CopyMemory s(28), t7, 4&
  1380.         t0 = Td0(s(0)) Xor Td1(s(29)) Xor Td2(s(22)) Xor Td3(s(19)) Xor rkey(k + 0)
  1381.         t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(26)) Xor Td3(s(23)) Xor rkey(k + 1)
  1382.         t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(30)) Xor Td3(s(27)) Xor rkey(k + 2)
  1383.         t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(2)) Xor Td3(s(31)) Xor rkey(k + 3)
  1384.         t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 4)
  1385.         t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 5)
  1386.         t6 = Td0(s(24)) Xor Td1(s(21)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 6)
  1387.         t7 = Td0(s(28)) Xor Td1(s(25)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 7)
  1388.         k = k + 8
  1389.     Next i
  1390.  
  1391.     'Final round
  1392.     CopyMemory s(0), t0, 4&
  1393.     CopyMemory s(4), t1, 4&
  1394.     CopyMemory s(8), t2, 4&
  1395.     CopyMemory s(12), t3, 4&
  1396.     CopyMemory s(16), t4, 4&
  1397.     CopyMemory s(20), t5, 4&
  1398.     CopyMemory s(24), t6, 4&
  1399.     CopyMemory s(28), t7, 4&
  1400.     t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(29)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 0)
  1401.     t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(26)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 1)
  1402.     t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(30)) And &HFF0000) Xor (Td4(s(27)) And &HFF000000) Xor rkey(k + 2)
  1403.     t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(31)) And &HFF000000) Xor rkey(k + 3)
  1404.     t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 4)
  1405.     t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 5)
  1406.     t6 = (Td4(s(24)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 6)
  1407.     t7 = (Td4(s(28)) And &HFF&) Xor (Td4(s(25)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 7)
  1408.     CopyMemory plaintext(p + 0), t0, 4&
  1409.     CopyMemory plaintext(p + 4), t1, 4&
  1410.     CopyMemory plaintext(p + 8), t2, 4&
  1411.     CopyMemory plaintext(p + 12), t3, 4&
  1412.     CopyMemory plaintext(p + 16), t4, 4&
  1413.     CopyMemory plaintext(p + 20), t5, 4&
  1414.     CopyMemory plaintext(p + 24), t6, 4&
  1415.     CopyMemory plaintext(p + 28), t7, 4&
  1416. End Sub
  1417. #End If
  1418.  
  1419.  
  1420. 'Encrypt an arbritrary size array in blocks.  plaintext(0 ... n-1) is input,
  1421. 'ciphertext(0 ... m-1) is output, where m is n padded to a multiple of (BlockBits\8) bytes.
  1422. 'plaintext and ciphertext must be distinct, and ciphertext must be a redimensionable array.
  1423. 'If appendsize is non-zero, a one byte length field is appended to the plaintext
  1424. 'before encrypting so the original length can be retrieved after decryption.
  1425. #If SUPPORT_LEVEL Then
  1426. Private Function ArrayEncrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long, BlockBits As Long) As Long
  1427. #Else
  1428. Private Function ArrayEncrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long) As Long
  1429. #End If
  1430.     Dim i           As Long
  1431.     Dim m           As Long
  1432.     Dim N           As Long
  1433. #If SUPPORT_LEVEL = 0 Then
  1434.     Const BlockSize As Long = 16 'bytes
  1435. #Else
  1436.     Dim BlockSize   As Long
  1437.  
  1438.     Select Case BlockBits
  1439.     Case 128:  BlockSize = 16
  1440.     Case 192:  BlockSize = 24
  1441.     Case 256:  BlockSize = 32
  1442. #If SUPPORT_LEVEL = 2 Then
  1443.     Case 160:  BlockSize = 20
  1444.     Case 224:  BlockSize = 28
  1445. #End If
  1446.     Case Else: Err.Raise 1, , "cRijndael.ArrayEncrypt - Illegal BlockBits value"
  1447.     End Select
  1448. #End If
  1449.  
  1450.     If LBound(plaintext) <> 0 Then Err.Raise 1, , "cRijndael.ArrayEncrypt - plaintext must be zero based array"
  1451.  
  1452.     N = UBound(plaintext) + 1
  1453.     If appendsize = 0 Then
  1454. #If SUPPORT_LEVEL Then
  1455.         m = ((N + BlockSize - 1) \ BlockSize) * BlockSize
  1456. #Else
  1457.         m = (N + BlockSize - 1) And &HFFFFFFF0  'BlockSize=16 specific
  1458. #End If
  1459.         ReDim ciphertext(m - 1)
  1460.     Else
  1461. #If SUPPORT_LEVEL Then
  1462.         m = ((N + BlockSize) \ BlockSize) * BlockSize
  1463. #Else
  1464.         m = (N + BlockSize) And &HFFFFFFF0      'BlockSize=16 specific
  1465. #End If
  1466.         ReDim ciphertext(m - 1)
  1467.         ciphertext(m - 1) = N Mod BlockSize
  1468.     End If
  1469.  
  1470. #If SUPPORT_LEVEL Then
  1471.     Select Case BlockBits
  1472.     Case 128
  1473. #End If
  1474.  
  1475.     For i = 0 To N - BlockSize Step BlockSize
  1476.         BlockEncrypt plaintext, ciphertext, i, i
  1477.     Next i
  1478.  
  1479. #If SUPPORT_LEVEL Then
  1480.     Case 192
  1481.     For i = 0 To N - BlockSize Step BlockSize
  1482.         Block192Encrypt plaintext, ciphertext, i, i
  1483.     Next i
  1484.     Case 256
  1485.     For i = 0 To N - BlockSize Step BlockSize
  1486.         Block256Encrypt plaintext, ciphertext, i, i
  1487.     Next i
  1488. #If SUPPORT_LEVEL = 2 Then
  1489.     Case 160
  1490.     For i = 0 To N - BlockSize Step BlockSize
  1491.         Block160Encrypt plaintext, ciphertext, i, i
  1492.     Next i
  1493.     Case 224
  1494.     For i = 0 To N - BlockSize Step BlockSize
  1495.         Block224Encrypt plaintext, ciphertext, i, i
  1496.     Next i
  1497. #End If
  1498.     End Select
  1499. #End If
  1500.  
  1501.     If (N Mod BlockSize) <> 0 Then CopyMemory ciphertext(i), plaintext(i), N Mod BlockSize
  1502.  
  1503. #If SUPPORT_LEVEL Then
  1504.     Select Case BlockBits
  1505.     Case 128
  1506. #End If
  1507.  
  1508.     If i <> m Then BlockEncrypt ciphertext, ciphertext, i, i
  1509.  
  1510. #If SUPPORT_LEVEL Then
  1511.     Case 192
  1512.     If i <> m Then Block192Encrypt ciphertext, ciphertext, i, i
  1513.     Case 256
  1514.     If i <> m Then Block256Encrypt ciphertext, ciphertext, i, i
  1515. #If SUPPORT_LEVEL = 2 Then
  1516.     Case 160
  1517.     If i <> m Then Block160Encrypt ciphertext, ciphertext, i, i
  1518.     Case 224
  1519.     If i <> m Then Block224Encrypt ciphertext, ciphertext, i, i
  1520. #End If
  1521.     End Select
  1522. #End If
  1523.  
  1524. End Function
  1525.  
  1526. 'Decrypts an array encrypted with the ArrayEncrypt function
  1527. #If SUPPORT_LEVEL Then
  1528. Private Function ArrayDecrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long, BlockBits As Long) As Long
  1529. #Else
  1530. Private Function ArrayDecrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long) As Long
  1531. #End If
  1532.     Dim i           As Long
  1533.     Dim m           As Long
  1534.     Dim N           As Long
  1535. #If SUPPORT_LEVEL = 0 Then
  1536.     Const BlockSize As Long = 16 'bytes
  1537. #Else
  1538.     Dim BlockSize   As Long
  1539.  
  1540.     Select Case BlockBits
  1541.     Case 128:  BlockSize = 16
  1542.     Case 192:  BlockSize = 24
  1543.     Case 256:  BlockSize = 32
  1544. #If SUPPORT_LEVEL = 2 Then
  1545.     Case 160:  BlockSize = 20
  1546.     Case 224:  BlockSize = 28
  1547. #End If
  1548.     Case Else: Err.Raise 1, , "cRijndael.ArrayDecrypt - Illegal BlockBits value"
  1549.     End Select
  1550. #End If
  1551.  
  1552.     If LBound(ciphertext) <> 0 Then Err.Raise 1, , "cRijndael.ArrayDecrypt - ciphertext must be zero based array"
  1553.  
  1554.     N = UBound(ciphertext) + 1
  1555.     If ((N Mod BlockSize) = 0) Then
  1556.         ReDim plaintext(N - 1)
  1557.  
  1558. #If SUPPORT_LEVEL Then
  1559.         Select Case BlockBits
  1560.         Case 128
  1561. #End If
  1562.  
  1563.         For i = 0 To N - BlockSize Step BlockSize
  1564.             BlockDecrypt plaintext, ciphertext, i, i
  1565.         Next i
  1566.  
  1567. #If SUPPORT_LEVEL Then
  1568.         Case 192
  1569.         For i = 0 To N - BlockSize Step BlockSize
  1570.             Block192Decrypt plaintext, ciphertext, i, i
  1571.         Next i
  1572.         Case 256
  1573.         For i = 0 To N - BlockSize Step BlockSize
  1574.             Block256Decrypt plaintext, ciphertext, i, i
  1575.         Next i
  1576. #If SUPPORT_LEVEL = 2 Then
  1577.         Case 160
  1578.         For i = 0 To N - BlockSize Step BlockSize
  1579.             Block160Decrypt plaintext, ciphertext, i, i
  1580.         Next i
  1581.         Case 224
  1582.         For i = 0 To N - BlockSize Step BlockSize
  1583.             Block224Decrypt plaintext, ciphertext, i, i
  1584.         Next i
  1585. #End If
  1586.         End Select
  1587. #End If
  1588.  
  1589.         If appendsize Then
  1590.             If plaintext(N - 1) < BlockSize Then
  1591.                 N = N - BlockSize + plaintext(N - 1)
  1592.                 If N > 0 Then ReDim Preserve plaintext(N - 1)
  1593.             Else
  1594.                 'MsgBox "warning - incorrect length field"
  1595.                 ArrayDecrypt = 1
  1596.             End If
  1597.         End If
  1598.     Else
  1599.         'MsgBox "ciphertext size not a multiple of block size"
  1600.         ArrayDecrypt = -1
  1601.     End If
  1602.  
  1603. End Function
  1604.  
  1605.  
  1606.  
  1607.  
  1608. 'File encryption.  The ciphertext file will be padded to a multiple of (BlockBits\8) bytes.
  1609. 'One byte is appended to the ciphertext to indicate the length of the final block.
  1610. 'FileDecrypt recovers this length field and restores the original plaintext file length.
  1611. 'PlaintextFileName and CiphertextFileName must be distinct, PlaintextFileName must exist,
  1612. 'CiphertextFileName must not exist, etc.  Be sure to do file checking before calling this.
  1613. #If SUPPORT_LEVEL Then
  1614. Public Function FileEncrypt(PlaintextFileName As String, CiphertextFileName As String, BlockBits As Long) As Long
  1615. #Else
  1616. Public Function FileEncrypt(PlaintextFileName As String, CiphertextFileName As String) As Long
  1617. #End If
  1618.     Dim FileNum     As Integer
  1619.     Dim FileNum2    As Integer
  1620.     Dim i           As Long
  1621.     Dim m           As Long 'ciphertext file size
  1622.     Dim N           As Long 'plaintext file size
  1623.     Dim Data()      As Byte
  1624. #If SUPPORT_LEVEL = 0 Then
  1625.     Const BlockSize As Long = 16 'bytes
  1626.     Const MaxBlocks As Long = MaxFileChunkSize \ BlockSize
  1627. #Else
  1628.     Dim BlockSize   As Long
  1629.     Dim MaxBlocks   As Long
  1630.  
  1631.     Select Case BlockBits
  1632.     Case 128:  BlockSize = 16
  1633.     Case 192:  BlockSize = 24
  1634.     Case 256:  BlockSize = 32
  1635. #If SUPPORT_LEVEL = 2 Then
  1636.     Case 160:  BlockSize = 20
  1637.     Case 224:  BlockSize = 28
  1638. #End If
  1639.     Case Else: Err.Raise 1, , "cRijndael.FileEncrypt - Illegal BlockBits value"
  1640.     End Select
  1641.     MaxBlocks = MaxFileChunkSize \ BlockSize
  1642. #End If
  1643.  
  1644.     N = FileLen(PlaintextFileName)
  1645. #If SUPPORT_LEVEL Then
  1646.     m = ((N + BlockSize) \ BlockSize) * BlockSize
  1647. #Else
  1648.     m = (N + BlockSize) And (-BlockSize) 'BlockSize=16 specific
  1649. #End If
  1650.  
  1651.     FileNum = FreeFile
  1652.     Open PlaintextFileName For Binary Access Read As FileNum
  1653.     FileNum2 = FreeFile
  1654.     Open CiphertextFileName For Binary Access Write As FileNum2
  1655.  
  1656.     'For large files, encrypt in pieces no larger than MaxFileChunkSize
  1657.     If m > MaxBlocks * BlockSize Then
  1658.         ReDim Data(MaxBlocks * BlockSize - 1)
  1659.         Do
  1660.             Get #FileNum, , Data
  1661. #If SUPPORT_LEVEL Then
  1662.             Select Case BlockBits
  1663.             Case 128
  1664. #End If
  1665.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1666.                 BlockEncrypt Data, Data, i, i
  1667.             Next i
  1668. #If SUPPORT_LEVEL Then
  1669.             Case 192
  1670.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1671.                 Block192Encrypt Data, Data, i, i
  1672.             Next i
  1673.             Case 256
  1674.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1675.                 Block256Encrypt Data, Data, i, i
  1676.             Next i
  1677. #If SUPPORT_LEVEL = 2 Then
  1678.             Case 160
  1679.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1680.                 Block160Encrypt Data, Data, i, i
  1681.             Next i
  1682.             Case 224
  1683.             For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1684.                 Block224Encrypt Data, Data, i, i
  1685.             Next i
  1686. #End If
  1687.             End Select
  1688. #End If
  1689.             Put #FileNum2, , Data
  1690.             m = m - MaxBlocks * BlockSize
  1691.         Loop While m > MaxBlocks * BlockSize
  1692.     End If
  1693.  
  1694.     'Encrypt the last piece of the file
  1695.     ReDim Data(m - 1)
  1696.     Get #FileNum, , Data
  1697.     Data(m - 1) = N Mod BlockSize
  1698. #If SUPPORT_LEVEL Then
  1699.     Select Case BlockBits
  1700.     Case 128
  1701. #End If
  1702.     For i = 0 To m - BlockSize Step BlockSize
  1703.         BlockEncrypt Data, Data, i, i
  1704.     Next i
  1705. #If SUPPORT_LEVEL Then
  1706.     Case 192
  1707.     For i = 0 To m - BlockSize Step BlockSize
  1708.         Block192Encrypt Data, Data, i, i
  1709.     Next i
  1710.     Case 256
  1711.     For i = 0 To m - BlockSize Step BlockSize
  1712.         Block256Encrypt Data, Data, i, i
  1713.     Next i
  1714. #If SUPPORT_LEVEL = 2 Then
  1715.     Case 160
  1716.     For i = 0 To m - BlockSize Step BlockSize
  1717.         Block160Encrypt Data, Data, i, i
  1718.     Next i
  1719.     Case 224
  1720.     For i = 0 To m - BlockSize Step BlockSize
  1721.         Block224Encrypt Data, Data, i, i
  1722.     Next i
  1723. #End If
  1724.     End Select
  1725. #End If
  1726.     Put FileNum2, , Data
  1727.  
  1728.     Close FileNum
  1729.     Close FileNum2
  1730. End Function
  1731.  
  1732. 'File decryption.
  1733. #If SUPPORT_LEVEL Then
  1734. Public Function FileDecrypt(PlaintextFileName As String, CiphertextFileName As String, BlockBits As Long) As Long
  1735. #Else
  1736. Public Function FileDecrypt(PlaintextFileName As String, CiphertextFileName As String) As Long
  1737. #End If
  1738.     Dim FileNum     As Integer
  1739.     Dim FileNum2    As Integer
  1740.     Dim i           As Long
  1741.     Dim m           As Long 'ciphertext file size
  1742.     Dim N           As Long 'plaintext file size
  1743.     Dim Data()      As Byte
  1744. #If SUPPORT_LEVEL = 0 Then
  1745.     Const BlockSize As Long = 16 'bytes
  1746.     Const MaxBlocks As Long = MaxFileChunkSize \ BlockSize
  1747. #Else
  1748.     Dim BlockSize   As Long
  1749.     Dim MaxBlocks   As Long
  1750.  
  1751.     Select Case BlockBits
  1752.     Case 128:  BlockSize = 16
  1753.     Case 192:  BlockSize = 24
  1754.     Case 256:  BlockSize = 32
  1755. #If SUPPORT_LEVEL = 2 Then
  1756.     Case 160:  BlockSize = 20
  1757.     Case 224:  BlockSize = 28
  1758. #End If
  1759.     Case Else: Err.Raise 1, , "cRijndael.FileDecrypt - Illegal BlockBits value"
  1760.     End Select
  1761.     MaxBlocks = MaxFileChunkSize \ BlockSize
  1762. #End If
  1763.  
  1764.     m = FileLen(CiphertextFileName)
  1765. #If SUPPORT_LEVEL Then
  1766.     If (m = 0) Or ((m Mod BlockSize) <> 0) Then
  1767. #Else
  1768.     If (m = 0) Or ((m And (BlockSize - 1)) <> 0) Then 'BlockSize=16 specific
  1769. #End If
  1770.         'MsgBox "File Size Error - ciphertext file not a multiple of block size"
  1771.         FileDecrypt = 1
  1772.     Else
  1773.         FileNum = FreeFile
  1774.         Open CiphertextFileName For Binary Access Read As FileNum
  1775.         FileNum2 = FreeFile
  1776.         Open PlaintextFileName For Binary Access Write As FileNum2
  1777.  
  1778.         'For large files, decrypt in pieces no larger than MaxFileChunkSize
  1779.         If m > MaxBlocks * BlockSize Then
  1780.             ReDim Data(MaxBlocks * BlockSize - 1)
  1781.             Do
  1782.                 Get #FileNum, , Data
  1783. #If SUPPORT_LEVEL Then
  1784.                 Select Case BlockBits
  1785.                 Case 128
  1786. #End If
  1787.                 For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1788.                     BlockDecrypt Data, Data, i, i
  1789.                 Next i
  1790. #If SUPPORT_LEVEL Then
  1791.                 Case 192
  1792.                 For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1793.                     Block192Decrypt Data, Data, i, i
  1794.                 Next i
  1795.                 Case 256
  1796.                 For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1797.                     Block256Decrypt Data, Data, i, i
  1798.                 Next i
  1799. #If SUPPORT_LEVEL = 2 Then
  1800.                 Case 160
  1801.                 For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1802.                     Block160Decrypt Data, Data, i, i
  1803.                 Next i
  1804.                 Case 224
  1805.                 For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
  1806.                     Block224Decrypt Data, Data, i, i
  1807.                 Next i
  1808. #End If
  1809.                 End Select
  1810. #End If
  1811.                 Put #FileNum2, , Data
  1812.                 m = m - MaxBlocks * BlockSize
  1813.             Loop While m > MaxBlocks * BlockSize
  1814.         End If
  1815.  
  1816.         'Decrypt the last piece of the file
  1817.         ReDim Data(m - 1)
  1818.         Get #FileNum, , Data
  1819. #If SUPPORT_LEVEL Then
  1820.         Select Case BlockBits
  1821.         Case 128
  1822. #End If
  1823.         For i = 0 To m - BlockSize Step BlockSize
  1824.             BlockDecrypt Data, Data, i, i
  1825.         Next i
  1826. #If SUPPORT_LEVEL Then
  1827.         Case 192
  1828.         For i = 0 To m - BlockSize Step BlockSize
  1829.             Block192Decrypt Data, Data, i, i
  1830.         Next i
  1831.         Case 256
  1832.         For i = 0 To m - BlockSize Step BlockSize
  1833.             Block256Decrypt Data, Data, i, i
  1834.         Next i
  1835. #If SUPPORT_LEVEL = 2 Then
  1836.         Case 160
  1837.         For i = 0 To m - BlockSize Step BlockSize
  1838.             Block160Decrypt Data, Data, i, i
  1839.         Next i
  1840.         Case 224
  1841.         For i = 0 To m - BlockSize Step BlockSize
  1842.             Block224Decrypt Data, Data, i, i
  1843.         Next i
  1844. #End If
  1845.         End Select
  1846. #End If
  1847.         'Recover length field
  1848.         If Data(m - 1) < BlockSize Then
  1849.             N = m - BlockSize + CLng(Data(m - 1))
  1850.         Else
  1851. #If SUPPORT_LEVEL Then
  1852.             'MsgBox "warning - incorrect length field in decrypted file." & vbCrLf & "Wrong key, keysize, or blocksize?"
  1853. #Else
  1854.             'MsgBox "warning - incorrect length field in decrypted file." & vbCrLf & "Wrong key or keysize?"
  1855. #End If
  1856.             N = m
  1857.         End If
  1858.         If N > 0 Then
  1859.             ReDim Preserve Data(N - 1)
  1860.             Put FileNum2, , Data
  1861.         End If
  1862.  
  1863.         Close FileNum
  1864.         Close FileNum2
  1865.     End If
  1866. End Function
  1867.  
  1868.  
  1869. Private Sub Class_Initialize()
  1870. #If COMPILE_CONSTANTS = 0 Then
  1871.     Dim i          As Long
  1872.     Dim y          As Byte
  1873.     Dim s(7)       As Byte
  1874.     Dim ib         As Byte
  1875.     Dim ptab(255)  As Byte
  1876.     Dim ltab(255)  As Byte
  1877.  
  1878.     'use 3 as primitive root to generate power and log tables
  1879.     ltab(0) = 0
  1880.     ltab(1) = 0
  1881.     ltab(3) = 1
  1882.     ptab(0) = 1
  1883.     ptab(1) = 3
  1884.     For i = 2 To 255 'ptab(i) = ptab(i - 1) Xor Xtime(ptab(i - 1))
  1885.         If (ptab(i - 1) And &H80) Then
  1886.             ptab(i) = ptab(i - 1) Xor ((ptab(i - 1) And 127) * 2) Xor &H1B
  1887.         Else
  1888.             ptab(i) = ptab(i - 1) Xor (ptab(i - 1) * 2)
  1889.         End If
  1890.         ltab(ptab(i)) = i
  1891.     Next i
  1892.  
  1893.     'affine transformation:- each bit is xored with itself shifted one bit
  1894.     Te4(0) = &H63636363
  1895.     Td4(&H63) = 0
  1896.     For i = 1 To 255
  1897.         y = ptab(255 - ltab(i)) 'multiplicative inverse
  1898.         ib = y
  1899.         If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2 'RotateLeftByte
  1900.         y = y Xor ib
  1901.         If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2
  1902.         y = y Xor ib
  1903.         If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2
  1904.         y = y Xor ib
  1905.         If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2
  1906.         y = y Xor ib Xor &H63
  1907.  
  1908.         s(0) = y
  1909.         s(1) = s(0)
  1910.         s(2) = s(0)
  1911.         s(3) = s(0)
  1912.         CopyMemory Te4(i), s(0), 4&
  1913.  
  1914.         s(0) = i
  1915.         s(1) = s(0)
  1916.         s(2) = s(0)
  1917.         s(3) = s(0)
  1918.         CopyMemory Td4(y), s(0), 4&
  1919.     Next i
  1920.  
  1921.     y = 1
  1922.     For i = 0 To UBound(rco)
  1923.         rco(i) = y
  1924.         If (y And &H80) Then 'y = Xtime(y)
  1925.             y = ((y And 127) * 2) Xor &H1B
  1926.         Else
  1927.             y = y * 2
  1928.         End If
  1929.     Next i
  1930.  
  1931.     'calculate forward and reverse tables
  1932.     For i = 0 To 255
  1933.         y = Te4(i) And &HFF&
  1934.         's(3) = y Xor Xtime(y)
  1935. '        s(0) = Xtime(y)
  1936.         If (y And &H80) Then
  1937.             s(0) = ((y And 127) * 2) Xor &H1B
  1938.             s(3) = y Xor s(0)
  1939.         Else
  1940.             s(0) = y * 2
  1941.             s(3) = y Xor s(0)
  1942.         End If
  1943.         s(2) = y
  1944.         s(1) = y
  1945.         CopyMemory s(4), s(0), 4&
  1946.         CopyMemory Te0(i), s(0), 4&
  1947.         CopyMemory Te1(i), s(3), 4&
  1948.         CopyMemory Te2(i), s(2), 4&
  1949.         CopyMemory Te3(i), s(1), 4&
  1950.         y = Td4(i) And &HFF&
  1951.         If y = 0 Then 'x.y= AntiLog(Log(x) + Log(y))
  1952.             s(3) = 0
  1953.             s(2) = 0
  1954.             s(1) = 0
  1955.             s(0) = 0
  1956.         Else
  1957.             s(3) = ptab((CLng(ltab(&HB)) + CLng(ltab(y))) Mod 255)
  1958.             s(2) = ptab((CLng(ltab(&HD)) + CLng(ltab(y))) Mod 255)
  1959.             s(1) = ptab((CLng(ltab(&H9)) + CLng(ltab(y))) Mod 255)
  1960.             s(0) = ptab((CLng(ltab(&HE)) + CLng(ltab(y))) Mod 255)
  1961.         End If
  1962.         CopyMemory s(4), s(0), 4&
  1963.         CopyMemory Td0(i), s(0), 4&
  1964.         CopyMemory Td1(i), s(3), 4&
  1965.         CopyMemory Td2(i), s(2), 4&
  1966.         CopyMemory Td3(i), s(1), 4&
  1967.     Next i
  1968. #Else
  1969.     Te0(0) = &HA56363C6:   Te0(1) = &H847C7CF8:   Te0(2) = &H997777EE:   Te0(3) = &H8D7B7BF6:   Te0(4) = &HDF2F2FF:    Te0(5) = &HBD6B6BD6:   Te0(6) = &HB16F6FDE:   Te0(7) = &H54C5C591
  1970.     Te0(8) = &H50303060:   Te0(9) = &H3010102:    Te0(10) = &HA96767CE:  Te0(11) = &H7D2B2B56:  Te0(12) = &H19FEFEE7:  Te0(13) = &H62D7D7B5:  Te0(14) = &HE6ABAB4D:  Te0(15) = &H9A7676EC
  1971.     Te0(16) = &H45CACA8F:  Te0(17) = &H9D82821F:  Te0(18) = &H40C9C989:  Te0(19) = &H877D7DFA:  Te0(20) = &H15FAFAEF:  Te0(21) = &HEB5959B2:  Te0(22) = &HC947478E:  Te0(23) = &HBF0F0FB
  1972.     Te0(24) = &HECADAD41:  Te0(25) = &H67D4D4B3:  Te0(26) = &HFDA2A25F:  Te0(27) = &HEAAFAF45:  Te0(28) = &HBF9C9C23:  Te0(29) = &HF7A4A453:  Te0(30) = &H967272E4:  Te0(31) = &H5BC0C09B
  1973.     Te0(32) = &HC2B7B775:  Te0(33) = &H1CFDFDE1:  Te0(34) = &HAE93933D:  Te0(35) = &H6A26264C:  Te0(36) = &H5A36366C:  Te0(37) = &H413F3F7E:  Te0(38) = &H2F7F7F5:   Te0(39) = &H4FCCCC83
  1974.     Te0(40) = &H5C343468:  Te0(41) = &HF4A5A551:  Te0(42) = &H34E5E5D1:  Te0(43) = &H8F1F1F9:   Te0(44) = &H937171E2:  Te0(45) = &H73D8D8AB:  Te0(46) = &H53313162:  Te0(47) = &H3F15152A
  1975.     Te0(48) = &HC040408:   Te0(49) = &H52C7C795:  Te0(50) = &H65232346:  Te0(51) = &H5EC3C39D:  Te0(52) = &H28181830:  Te0(53) = &HA1969637:  Te0(54) = &HF05050A:   Te0(55) = &HB59A9A2F
  1976.     Te0(56) = &H907070E:   Te0(57) = &H36121224:  Te0(58) = &H9B80801B:  Te0(59) = &H3DE2E2DF:  Te0(60) = &H26EBEBCD:  Te0(61) = &H6927274E:  Te0(62) = &HCDB2B27F:  Te0(63) = &H9F7575EA
  1977.     Te0(64) = &H1B090912:  Te0(65) = &H9E83831D:  Te0(66) = &H742C2C58:  Te0(67) = &H2E1A1A34:  Te0(68) = &H2D1B1B36:  Te0(69) = &HB26E6EDC:  Te0(70) = &HEE5A5AB4:  Te0(71) = &HFBA0A05B
  1978.     Te0(72) = &HF65252A4:  Te0(73) = &H4D3B3B76:  Te0(74) = &H61D6D6B7:  Te0(75) = &HCEB3B37D:  Te0(76) = &H7B292952:  Te0(77) = &H3EE3E3DD:  Te0(78) = &H712F2F5E:  Te0(79) = &H97848413
  1979.     Te0(80) = &HF55353A6:  Te0(81) = &H68D1D1B9:  Te0(82) = &H0&:        Te0(83) = &H2CEDEDC1:  Te0(84) = &H60202040:  Te0(85) = &H1FFCFCE3:  Te0(86) = &HC8B1B179:  Te0(87) = &HED5B5BB6
  1980.     Te0(88) = &HBE6A6AD4:  Te0(89) = &H46CBCB8D:  Te0(90) = &HD9BEBE67:  Te0(91) = &H4B393972:  Te0(92) = &HDE4A4A94:  Te0(93) = &HD44C4C98:  Te0(94) = &HE85858B0:  Te0(95) = &H4ACFCF85
  1981.     Te0(96) = &H6BD0D0BB:  Te0(97) = &H2AEFEFC5:  Te0(98) = &HE5AAAA4F:  Te0(99) = &H16FBFBED:  Te0(100) = &HC5434386: Te0(101) = &HD74D4D9A: Te0(102) = &H55333366: Te0(103) = &H94858511
  1982.     Te0(104) = &HCF45458A: Te0(105) = &H10F9F9E9: Te0(106) = &H6020204:  Te0(107) = &H817F7FFE: Te0(108) = &HF05050A0: Te0(109) = &H443C3C78: Te0(110) = &HBA9F9F25: Te0(111) = &HE3A8A84B
  1983.     Te0(112) = &HF35151A2: Te0(113) = &HFEA3A35D: Te0(114) = &HC0404080: Te0(115) = &H8A8F8F05: Te0(116) = &HAD92923F: Te0(117) = &HBC9D9D21: Te0(118) = &H48383870: Te0(119) = &H4F5F5F1
  1984.     Te0(120) = &HDFBCBC63: Te0(121) = &HC1B6B677: Te0(122) = &H75DADAAF: Te0(123) = &H63212142: Te0(124) = &H30101020: Te0(125) = &H1AFFFFE5: Te0(126) = &HEF3F3FD:  Te0(127) = &H6DD2D2BF
  1985.     Te0(128) = &H4CCDCD81: Te0(129) = &H140C0C18: Te0(130) = &H35131326: Te0(131) = &H2FECECC3: Te0(132) = &HE15F5FBE: Te0(133) = &HA2979735: Te0(134) = &HCC444488: Te0(135) = &H3917172E
  1986.     Te0(136) = &H57C4C493: Te0(137) = &HF2A7A755: Te0(138) = &H827E7EFC: Te0(139) = &H473D3D7A: Te0(140) = &HAC6464C8: Te0(141) = &HE75D5DBA: Te0(142) = &H2B191932: Te0(143) = &H957373E6
  1987.     Te0(144) = &HA06060C0: Te0(145) = &H98818119: Te0(146) = &HD14F4F9E: Te0(147) = &H7FDCDCA3: Te0(148) = &H66222244: Te0(149) = &H7E2A2A54: Te0(150) = &HAB90903B: Te0(151) = &H8388880B
  1988.     Te0(152) = &HCA46468C: Te0(153) = &H29EEEEC7: Te0(154) = &HD3B8B86B: Te0(155) = &H3C141428: Te0(156) = &H79DEDEA7: Te0(157) = &HE25E5EBC: Te0(158) = &H1D0B0B16: Te0(159) = &H76DBDBAD
  1989.     Te0(160) = &H3BE0E0DB: Te0(161) = &H56323264: Te0(162) = &H4E3A3A74: Te0(163) = &H1E0A0A14: Te0(164) = &HDB494992: Te0(165) = &HA06060C:  Te0(166) = &H6C242448: Te0(167) = &HE45C5CB8
  1990.     Te0(168) = &H5DC2C29F: Te0(169) = &H6ED3D3BD: Te0(170) = &HEFACAC43: Te0(171) = &HA66262C4: Te0(172) = &HA8919139: Te0(173) = &HA4959531: Te0(174) = &H37E4E4D3: Te0(175) = &H8B7979F2
  1991.     Te0(176) = &H32E7E7D5: Te0(177) = &H43C8C88B: Te0(178) = &H5937376E: Te0(179) = &HB76D6DDA: Te0(180) = &H8C8D8D01: Te0(181) = &H64D5D5B1: Te0(182) = &HD24E4E9C: Te0(183) = &HE0A9A949
  1992.     Te0(184) = &HB46C6CD8: Te0(185) = &HFA5656AC: Te0(186) = &H7F4F4F3:  Te0(187) = &H25EAEACF: Te0(188) = &HAF6565CA: Te0(189) = &H8E7A7AF4: Te0(190) = &HE9AEAE47: Te0(191) = &H18080810
  1993.     Te0(192) = &HD5BABA6F: Te0(193) = &H887878F0: Te0(194) = &H6F25254A: Te0(195) = &H722E2E5C: Te0(196) = &H241C1C38: Te0(197) = &HF1A6A657: Te0(198) = &HC7B4B473: Te0(199) = &H51C6C697
  1994.     Te0(200) = &H23E8E8CB: Te0(201) = &H7CDDDDA1: Te0(202) = &H9C7474E8: Te0(203) = &H211F1F3E: Te0(204) = &HDD4B4B96: Te0(205) = &HDCBDBD61: Te0(206) = &H868B8B0D: Te0(207) = &H858A8A0F
  1995.     Te0(208) = &H907070E0: Te0(209) = &H423E3E7C: Te0(210) = &HC4B5B571: Te0(211) = &HAA6666CC: Te0(212) = &HD8484890: Te0(213) = &H5030306:  Te0(214) = &H1F6F6F7:  Te0(215) = &H120E0E1C
  1996.     Te0(216) = &HA36161C2: Te0(217) = &H5F35356A: Te0(218) = &HF95757AE: Te0(219) = &HD0B9B969: Te0(220) = &H91868617: Te0(221) = &H58C1C199: Te0(222) = &H271D1D3A: Te0(223) = &HB99E9E27
  1997.     Te0(224) = &H38E1E1D9: Te0(225) = &H13F8F8EB: Te0(226) = &HB398982B: Te0(227) = &H33111122: Te0(228) = &HBB6969D2: Te0(229) = &H70D9D9A9: Te0(230) = &H898E8E07: Te0(231) = &HA7949433
  1998.     Te0(232) = &HB69B9B2D: Te0(233) = &H221E1E3C: Te0(234) = &H92878715: Te0(235) = &H20E9E9C9: Te0(236) = &H49CECE87: Te0(237) = &HFF5555AA: Te0(238) = &H78282850: Te0(239) = &H7ADFDFA5
  1999.     Te0(240) = &H8F8C8C03: Te0(241) = &HF8A1A159: Te0(242) = &H80898909: Te0(243) = &H170D0D1A: Te0(244) = &HDABFBF65: Te0(245) = &H31E6E6D7: Te0(246) = &HC6424284: Te0(247) = &HB86868D0
  2000.     Te0(248) = &HC3414182: Te0(249) = &HB0999929: Te0(250) = &H772D2D5A: Te0(251) = &H110F0F1E: Te0(252) = &HCBB0B07B: Te0(253) = &HFC5454A8: Te0(254) = &HD6BBBB6D: Te0(255) = &H3A16162C
  2001.  
  2002.     Te1(0) = &H6363C6A5:   Te1(1) = &H7C7CF884:   Te1(2) = &H7777EE99:   Te1(3) = &H7B7BF68D:   Te1(4) = &HF2F2FF0D:   Te1(5) = &H6B6BD6BD:   Te1(6) = &H6F6FDEB1:   Te1(7) = &HC5C59154
  2003.     Te1(8) = &H30306050:   Te1(9) = &H1010203:    Te1(10) = &H6767CEA9:  Te1(11) = &H2B2B567D:  Te1(12) = &HFEFEE719:  Te1(13) = &HD7D7B562:  Te1(14) = &HABAB4DE6:  Te1(15) = &H7676EC9A
  2004.     Te1(16) = &HCACA8F45:  Te1(17) = &H82821F9D:  Te1(18) = &HC9C98940:  Te1(19) = &H7D7DFA87:  Te1(20) = &HFAFAEF15:  Te1(21) = &H5959B2EB:  Te1(22) = &H47478EC9:  Te1(23) = &HF0F0FB0B
  2005.     Te1(24) = &HADAD41EC:  Te1(25) = &HD4D4B367:  Te1(26) = &HA2A25FFD:  Te1(27) = &HAFAF45EA:  Te1(28) = &H9C9C23BF:  Te1(29) = &HA4A453F7:  Te1(30) = &H7272E496:  Te1(31) = &HC0C09B5B
  2006.     Te1(32) = &HB7B775C2:  Te1(33) = &HFDFDE11C:  Te1(34) = &H93933DAE:  Te1(35) = &H26264C6A:  Te1(36) = &H36366C5A:  Te1(37) = &H3F3F7E41:  Te1(38) = &HF7F7F502:  Te1(39) = &HCCCC834F
  2007.     Te1(40) = &H3434685C:  Te1(41) = &HA5A551F4:  Te1(42) = &HE5E5D134:  Te1(43) = &HF1F1F908:  Te1(44) = &H7171E293:  Te1(45) = &HD8D8AB73:  Te1(46) = &H31316253:  Te1(47) = &H15152A3F
  2008.     Te1(48) = &H404080C:   Te1(49) = &HC7C79552:  Te1(50) = &H23234665:  Te1(51) = &HC3C39D5E:  Te1(52) = &H18183028:  Te1(53) = &H969637A1:  Te1(54) = &H5050A0F:   Te1(55) = &H9A9A2FB5
  2009.     Te1(56) = &H7070E09:   Te1(57) = &H12122436:  Te1(58) = &H80801B9B:  Te1(59) = &HE2E2DF3D:  Te1(60) = &HEBEBCD26:  Te1(61) = &H27274E69:  Te1(62) = &HB2B27FCD:  Te1(63) = &H7575EA9F
  2010.     Te1(64) = &H909121B:   Te1(65) = &H83831D9E:  Te1(66) = &H2C2C5874:  Te1(67) = &H1A1A342E:  Te1(68) = &H1B1B362D:  Te1(69) = &H6E6EDCB2:  Te1(70) = &H5A5AB4EE:  Te1(71) = &HA0A05BFB
  2011.     Te1(72) = &H5252A4F6:  Te1(73) = &H3B3B764D:  Te1(74) = &HD6D6B761:  Te1(75) = &HB3B37DCE:  Te1(76) = &H2929527B:  Te1(77) = &HE3E3DD3E:  Te1(78) = &H2F2F5E71:  Te1(79) = &H84841397
  2012.     Te1(80) = &H5353A6F5:  Te1(81) = &HD1D1B968:  Te1(82) = &H0&:        Te1(83) = &HEDEDC12C:  Te1(84) = &H20204060:  Te1(85) = &HFCFCE31F:  Te1(86) = &HB1B179C8:  Te1(87) = &H5B5BB6ED
  2013.     Te1(88) = &H6A6AD4BE:  Te1(89) = &HCBCB8D46:  Te1(90) = &HBEBE67D9:  Te1(91) = &H3939724B:  Te1(92) = &H4A4A94DE:  Te1(93) = &H4C4C98D4:  Te1(94) = &H5858B0E8:  Te1(95) = &HCFCF854A
  2014.     Te1(96) = &HD0D0BB6B:  Te1(97) = &HEFEFC52A:  Te1(98) = &HAAAA4FE5:  Te1(99) = &HFBFBED16:  Te1(100) = &H434386C5: Te1(101) = &H4D4D9AD7: Te1(102) = &H33336655: Te1(103) = &H85851194
  2015.     Te1(104) = &H45458ACF: Te1(105) = &HF9F9E910: Te1(106) = &H2020406:  Te1(107) = &H7F7FFE81: Te1(108) = &H5050A0F0: Te1(109) = &H3C3C7844: Te1(110) = &H9F9F25BA: Te1(111) = &HA8A84BE3
  2016.     Te1(112) = &H5151A2F3: Te1(113) = &HA3A35DFE: Te1(114) = &H404080C0: Te1(115) = &H8F8F058A: Te1(116) = &H92923FAD: Te1(117) = &H9D9D21BC: Te1(118) = &H38387048: Te1(119) = &HF5F5F104
  2017.     Te1(120) = &HBCBC63DF: Te1(121) = &HB6B677C1: Te1(122) = &HDADAAF75: Te1(123) = &H21214263: Te1(124) = &H10102030: Te1(125) = &HFFFFE51A: Te1(126) = &HFDDA1:) = &H768617: Te0DA96: Te Te1(122) = &HE45C5Cd4Te Te1iTe1(98) = &HAAAA4FE5: ) = &HE(35) 1) 1: T&H6E Te1(1  yC5[ = &H2F2F5E71:  148):  14= &AA: Te1E907)) = 2) =3wBBh &H23Ee1(49) = &09
  2018.   Next 09
  2019.   856A: Te0(87) = &H5B5BB6EDF: Te0n Te1(0A0F0: f0(156) = &H79DEDEA7: TDA(154) 3) =BDA666CC:450A87:  Te (s(1CFor i = t &H57C C C Cr i = t &H&H&H PORT_LEV7C C C Cr= &H76861  Te (s(1yH49CECE87:DA: Te0(F5E71:  1 &HF) = &H791F
  2020.    7C C C Cr i = t 1(11CC:450ptab(i -t959531'e1(92) = &H4A4A94DE:  Te1(93) = &H4C4C98D4:  Te1(94) = &H5858B0E8:  Te1(95) = &HCFCF854A
  2021.     TF95) = &Hs D854A
  2022. 57C C8'76861  T Cr=h= &HB7e1(36) = &H36366C5A:  Te1(37) = &H3F3F7E41:  Te1(38) = &HF7F7F502:  Te1(39) = &HCCCC834F
  2023.     Te1(40) = &H3434685C:  Te1(41) = &HA5A551F4:  Te1(42) = &HE5E5D134:  Te1(43) = &HF1F1F908:  Te1(44) = &H7171E293:  Te1(45) = &HD8D8AB73:  Te1(46) = &H31316253:  Te1tab(39) =Bdael.A40) =  6868D0
  2024. B:  Te0(97) =DA = &H114= &AA: T854 = &H3F3Fv2 = &H57C4C493
  2025.     Te1&H16FBFBED: (A6A657: Te0(198) = &HC7B4B4h54) 3) =BD, 42B4B4h54) 3) =BD, 42B4BFBFBBd4e0(2201D= &HE9AEh&H58C1BloBFBED: (A6A657:  Te15E1(114) = Fe1(123) 5     y = y Xor t) = &H451(44) = &H687949433
  2026. C  Te1(44) = &HB0B
  2027.    5[HE3E3DD3E:  Te1(78) = &H2F2F5E71:  Te1(793) = &HE0&HE3ADA
  2028.     T05F2BhE2E5C:= &DA = &H11 C39D5E: 0A1:) = &H768617: Te0DA96: Te Te1(122) = &HE45C5Cd4Te Te1iTe1(98) = &HAAAA4FE5: ) = &HE(35) 1FAAAA4FE5o TeA1:) = &H768617:
  2029.     m =========  T05h284: T9:  Te1(23) Te15E1(1 A
  2030. 57C C5kr            1(23) TN R82850:(47)  = &H768617:
  2031.    82)      = &Hh9) = &r
  2032. 2Bhe1(7) 18N0 = &H9iC5C Te (s(1CFAAAA4FE59iC5C Fs(1CFor iF4FE59iC5uDF C Cr i =FTe1(10) = &H9iC5C Te (s(1CFAAAA4FE59iC5C Fs(1CFor iF4FE59iC5uDF C Cr i =FTe1(10) = &H9iC5C Te (s(1CFAAAA4FE59iC5C Fs(1CFor iF4FE59iC5uDF C CrCDd4494335h284: T9:(1CF40D9D9A7_ B4h54) 3) =BD, 4 (s(1CFBs(1CFAAAA4FE59iC5C Fs(1CFor i(244) = &HDABFBF65: Te0(245) = &H31E6E6D7: Te) =E59iC5uDAAAA4FEI    = &Hh9DF24FEI    = rETe1(38) =FD:  Te1( k95) = &HsF5D134:  2: Te0(143) = &H957373E6
  2033.     Te0(144) = &HA06060C0: Te0(145) = &H98818119: Te0(146) = &HD14F4F9E: Te0(147) = &H7FDCDCA3: Te0(148) = &H66222244: Te0(149) = &H7E2A2A5D &HFC54F  Te1( k (plaintext) + 1Nze = 3BH5030306:  Te0(214) = &H1F6F6F7:  Te0(215) = &H120E0E1C
  2034.     Teect Case (1C7676EC   1(23) :  Te1tabF3
  2035. C  Teeeeeeeeeeeeeee4F4F9E: 8C1C199: Te0(222) = &H271D1D3A: Te0(223) = &HB99E9E27
  2036.     Te0(06: EBFBED: (AF    Te0(i2y98) = &HCF7) =DA =3
  2037. C  Te45C5Cd4Tee0(222) =8) = &HAafB6969 &HF7F700(222) =8) = &HAafB6969 &HF7F700(222) =8) = &HAafB6969 &HF7F700(2s(1AafB6969 &HFC Te (s(1El(242) = &H80898909: Te0(243pE71:  T359) = &HE2E2DF3D:  Te1(60) p &H27274E6( Te1(13) = &HD7D7B562:  Te10(F5E71:  = &Hh91) = &peNum2
  2038.  
  2039.  C Te1A40) s(1CFAAAA4FE59A: Te0(244(68) 2
  2040. (FE59A: Te0(244(68) 2
  2041. (FE5m2
  2042.  
  2043.  Co(3BF:    p=======35:   Te1(1) = &H7C7CF884:  pH212142C98D4) = &HD75: ) =  Te0(Teeed     If NtF4:  T NtF4:  T 8Step BlockSize
  2044.  Te10E2Btep Bloci11(14) = &HD"14) = &H1F1F3E: Te0(204) d3) = &H7575EA9F
  2045.     Te1(64pppppppppppB52A3F
  2046.     Te1(48) = &H40408:  Te1(47) BD") = &H75A:  Te1(21) = &H5959B2EBj4665:  Te1(51) = &HC3C39D5E56) = &HD0DD"15E1(114C&H1010203:562C
  2047.  
  2048.     Te1(0) = &H6363C  t3 = Td0(s9C8:  Te) = &H8F6EDC:  Tee0(
  2049.  Co(3BF:   B      Case 224
  2050.         For i = 0 To N - BlockSize Step BlockSize
  2051.             Block224Decrypt plaintext, ciphertext, i, i
  2052.         Next i
  2053. #End If
  2054.         End Select
  2055. #End If
  2056.  
  2057.         If appendsize Then
  2058.             If plaintext(N - 1) < BlockSize Then
  2059. F1) < Blo Cr i = thertext, AafB6969 &HF7F700(2s(1AafB6969 &HFC Te (s(1El(242) = &H80898909: Te0(243pE71:  T3595:  TewpE71:  T2Te1A40) s(1CFAAAA4FE59A: Te0(244(68) 2
  2060. (FE59A: Te0(244(68) 2
  2061. 4w &HF7F7078CFNtF4:  TC Te (s(1El( (s(1E i =FTe1- 1) * BlockSize Step BlockSize
  2062.                     BlockDecrypt Data, Data, i, i49)  , i30) = &H7272Ae * B B4h54) 3) =BD, 4 (s(1CFBs(1CFAAAA4FE59iC5C Fs(1CFor i(244) = &HDABFBF65: Te0(245) 4k2B    BlocC&HF) = ext, ciphe878F8EBdHF) = ext, ciphe878F8EBdHF), ciphe87-    (89) =1F3E: Te2A3F
  2063.    0(255u And &HFF255e (s(1El(242846)07871584:  pH212142C98D4) = &HD75: ) =  Te0(TeeeBdD4:  Te1(94) = &H5858B0E8: T98909: w78F8EBdHC Fs(1CFoata, iBdHC Fs(7_ B4  Te1(62, i, i49 68D0
  2064. B:Dyr9 6           CB7C7955 Te0(u (Td4(s(1e0(  Te1(59) = o72) - 1  Te1(85) =  , DataB  Te1(859: w78F8EBdHC Fs(1CFoata, iBdHC Fs(7_ B4 9 = &H1F&HF) = exE59A: Te0(244(68kSize S149) 6:  Te = & &H9l8) 2
  2065. 4w H9l859: w78F8E3&HF) = Bd &HB3B37DCE:  Te1(76) = &H2&HD8D8AB9= &H27147E TDA(154) 3) =BDA666CC:450A87:  Te (s(1CFor i1(100) = &H434386C5: Te1(101) = &H4D4D9AD7: T1(91 = &H4D4D9AD7: T1(8kSize S149) 6:  1194= t g= &HAafB65E1(114) = Fe1(123) 5  : TeCFure to dA201) = &H4D4D9AD7: Te1(102) = &H33336655: Te1(103) = &H8585119  Te (s(E59iC5C Fs(CF3D:  Te1  Te1( EBFBED:CFAs StrinC428: TeFtextFile Fe to dA2:  = &Hh91(123) 5     y = y XorTe0(2449A4:  TC0dF Te1(103m7_ B4  wTe0(97) F7U = & Te1&HB99E9E27F, CipherDEDC12C255 Te0(wipherDED &H2&HTe1(59)w(wipherDE TDA(1(85) =w54) 3) =AiU5F5FH515"      Te1(83) = &HEDEDC12C:  Te1(84) = &H20204060:  Te1(85) = &HFCFCE31F:  Te1(86) = &HB1B179C8:  Te1(87) = &H5B5BB6ED
  2066.     Te1(88) = &H6A6AD4BE:  Te1(89) = &HCBCB8D46:  Te1(90) = &HBEBE67D9") =w54) p1(21) = &122) = &HE45C5Cd4Te Te4D4D9AD7: T1(9U5) 181: :CFAs   Te0e1(115) 1nd &HFF0000)"01) = &H T Cr=h= &HB7e1(3C39D5D5D5D5  Te0hC39D5D6655: T5  Te039D5D6655CFAs   T) = &    8CF
  2067.  
  2068. #If 821F9D: #If 8239D5E: 04 (s(1CF7t:  TeD  Te (s(1yH49CECE87:DA: Te0pplaintext) = &H1F6F6F7:  Te0(21C39D5ECFe = 32
  2069. 5r(21CtF&HF) e1(37)9E: 8C1C199: 0F&HF) e1(3F7E46, t1, 4&
  2070.   "     Cas6wTe0(97wHE45C5Cd1nd &Fypt ciphECFe = 30iphECF50:(47) 35h284:&
  2071.   "   ) = &H8388w5) =  , 0(2s(1AafB6969&HsF5D134:  2: Te0(143hECFe = 30iphECF50:(47) 35h284:&4F
  2072.     Te1(40) = &H3434685C:  Te1(41) = &HA53468587CCFme)
  2073. #If 0  , 0(2s= Fe1(71:  1tab(kF7F502:  Te1(39) = &HCCCC834F
  2074.     Te1(40) =  Te0text, i, iF(N + Blo34:  2: TeeName As Str3:  Te1e1et Data, Data, DA =3
  2075. C  Te45C5Cd4Tee8c(115) 1w5Cd4Tee899E: 8C1C199: 0F&HF) e1(3F7E46, t1, 4&
  2076.   "     Cas6wTe0(97wHE  FileNu(xt i
  2077.       (97) &H1336CF
  2078.  
  2079. #F2FockSize = 2D134:  2HAafB6963k3
  2080.     Te1&H16FBFBED: (A6A657: Te0(198) = &HC7&H58D134F6F6F7:w = &HC7&) 2
  2081. (FEFleChunkS&HC7&) 2
  2082. (FEFleChunk6C199: 0wCF
  2083.  
  2084. #F0phECF(146336CFiC = &HC7&)07879iC5C c7UD854.7244(68F        ) 3) =BD, 4 (s(1CFBsFleChunk = &Hize    Te1&H16FBFBED:  Te1CFA417wHE D59iC5C Fs(1CFor iF4FE59iC5u38119: Te0(0or iF4FE59D854.0  , 0(2s= Fe1: 0A4:  D9: 0F&HMaxBlockAM854A
  2085.    e0(223) (64ppppp2m) = &  Te1&H11   Bloc0p2m) = & H16FB850:(47F i, i
  2086.  4C98D4:  Te1(94) = &H5Bd &HB3B&HE2E2DF3D:  Te1(60) p88Te0(e 192
  2087.  Da(If SUPPORT_L" 2: TeeNrETe1(38) =FD:  TE:  T22) U = & FBlockSizFo:  T48C1C19C1C199 67E46, twC1C19C1Ce
  2088.   099 67E46, (94)(38) =F45C5Cd1(149) 9s97) &H1w1AafB696:  Te1(94) = 9iC53030 CrCDd449433F - 1) * 9s(1ElTe0(14= &HA23) :s(1CFAA        wTe0(97wHE   = &HAafB6969) = 9iC53030(1CFor iF4FE59iC5uDF C CrCDd4494335h284: T9::(1CFE59iCtme)
  2089. #H9iC5Cize    Te1&H16FBFBED:  T4FE58) =494335hckSizD40) s(1CFAAAA4FE59A: Te0(24 T22) 4 iF(N 0(24 T  , 0(2s Xo14) = &H BlockSi iC502s Xo14) =&H9iSi iC5t  Te45120E0E4FE58) =2s= Fe1w6, t1, 4E6 0F&HMawe
  2090.  
  2091.    B6969 herDE = &HA64pppppw  Te1(40HA6&HAafDTe1( k (plaintext) + 1Nze ) = &H Block5B5BB6ED &H5858B0E8: T98909: wu4tme)
  2092. #H9iC5Cize    Te1&H1D0(i2y98) = &HCF7) =DA =3
  2093. Ctext, ci4HC7&) 8) = &ABlock224Decrypt plaintext, ciphertext, i"= &H4D4D T22)4146336me)
  2094. # &H7A&)0787336me)text, ci4HC7CF  'Encry((Data(m - 1) 8C1&HE(37t:  TeD4= &Hiz&HE(37FF7CF  'EncFext, i, 47)7 8C1C199: Te0(222) = &H271D1D3A: Te0(223) = &HB99E9E27
  2095.     TevoB8Cd4Tee0(222) =8) = &HAafB6969 &HF7F700(222) =C5C 0wCF
  2096.  
  2097. #F0pt1&H16F37t:  Te7CF  'Encry((DataHF7F) = 4BcryptEncry((Datg
  2098. #HE45C5Cd = &H7272Ae * B B4h54)  TevoB8C  = &LEVEL ThE4:  T NtF4:  T 8Step27274E6( Te1(13) = &HD7D7B562:  Te10(F5E71:  ) + ertextFleChuhuhuhuhuhu CipStep BloH9l859: , Data,  D134:6336me)
  2099. 10(: Te0(244(68) 2
  2100. (FE5m2
  2101.  
  2102.  Co(3BF:    p====222)676EAd44943tF4:  =2226CF7) =DA =3
  2103. Ctext, Te1(  B69(68)ORT_LEVE2iA: Te0(244(68) 2
  2104. (   If N  Tei1(38) =FD:  Te1( k95) = &HsF5D134:  2: Te0(143) = &H957373E6
  2105. (FE5m2
  2106.  
  2107.  Co(3BF:    p==== &HCBCB8D4CF 224
  2108.   r7_222) =8=8=8=8=8=8=7373E62 Then
  2109.     "5) 1w5CdiU9C8:AA4FE59iF4
  2110. 10(Dd If
  2111.  
  2112.         If appendsi
  2113.  Co(3BF:657: Te0(4) = Fe1(123) 5  : TeCueChuhuhuhuhuhu CipSt
  2114.     ClonhuhuhSt
  2115.     Cl7C7955 T:  Te1  ABCB8D46:07C7955 T: 46:07C799999999999 = &HD68) 2
  2116. (FE5m2
  2117.  
  2118.  Co(3BF:    4
  2119. #H9ize ThepBsFleChun&HCBCB8D46:  Te1(90) =HCBCBckSi t ci4HCt, Aaf30(1CFor i62 TD      CB7C7955 Te0(u (Td4(sypt ciphE&HB3B37D(87) = &3) = &HEDFength fi4F
  2120.     T8) = &99E9E27F, CipherDEDC12u_3BF:   w) =HCBCBA1
  2121.     D0(244(68kSize S149) 6:  Te 42text, Tw5BB6ED &ncry((Dat41D3A:    NexTe45120E0E68) 2D3) =BD, 4 (s(1CFBs(1CFAAAA4H5959B2EA6969 &    Enr42text, Tw5BB6ED &ncry((Dat41D3A:    NexTe45120E0E68) 2D3) =BD, 4 (s(1CFBs(1CFAAAA4H5959B2EA6969 &    Enr42text, Tw5BB6ED &ncry((Dat41D3A:    NexTe45120E0E68) 2D3) =BD, 4 (s(1CFBs(1CFAAAA4H5959B2EA6969 &    Enr42text, Tw5BB6ED &ncry((Dat41D3A:    NexTe45120ECFAA A A A T_LE0(24(N -End A) 2
  2122. FNtF4:E EA6969 &1CFor1D3A:HCBCBckSi t ci4HCt, Aaf30(1CFor i62 TD      CB7C7955 Te0(u (Td4(sypt ciphE&HB3B37D(87) = &3) = &HEDFength fi4F
  2123.     T8) = &99E9E27F, CipherDEDC12u_3BF:   w) =HCBCBA1
  2124.     D0(244(68kSize S149) 6:  Te 42text, Tw5BB6ED &ncry((Dat41D3A:    NexTe45120E0E68) 2D3)     Te13AA A A A T_LE0(24(N -End AD  Te1(859: w78F8EBdHC Fs(1C6AD4B=BD, 4 w = (ib A336CFi0D4B=BD, 4 CFi0D4B=4F
  2125.     TFSUPPORT_2(LEVE2iA:4955 T:= &HAaF:   w) =HFMod BlocHAaF:   w) =s Long
  2126. #If SUPPORT_LEVEL = 0 Then
  2127.     Const BlockSize As Long "&    Enr5FE1e0(  Te1(59) = o72) - 1  Te1(85) =  , DataB  Te1(859: w78F8EBdHC Fs(1CFFE59iC5C7
  2128.   Te1(60) p88Te0(e 192 or keysizUkSiz= &H  Next  11 = &l7C79A, Ciph1&HB99H260 = &l7C79A:  Te0(e 192
  2129. 00 = &l7C79999999 2: TeeNrETe1(38) =FD:  TE:  T22) U = & FB0 Te1&H16r i62 Tt68) 2DC:  Teeeeeeeeeee    CD &H33336655: Te1(103) = &H8192
  2130. 00 = 5E71:  ) nk = &Hize    Te1&H16F8B8rTe0(2449A4:  TC0dF Te1(103m7_ B4  wTe0(97) Fext)1(38) =FD:  Te1DA =3
  2131. C   e0(22leChunkS&HA3A:   ) p1(2p8rTe0(24)
  2132. 106:  4260 =D (s(E59iC5C Fs(CF3D:  Te1  
  2133. 0  Te1(83) = &HEDEDC12C:  Te1(84) = &H202040600:   erDEEVEL TheA61CFAAAA4FE59A: Te0(24 T22) 4 iF(N 0(24 T  , 0(2s Xo14) = &H BlockSi iC502s Xo14) =&H9iSi iC5t  Te45120E0E4FE58) =2s= Fe1w6, t1, 4E6 0058) =2s= FE6 0058)B  C0 0058) =2se0( EBdHF), 0 C0 0058) 2
  2134. 5r204060115)e)
  2135. : #If 8239D5EF#If SUPP98) 2
  2136. (FFhen
  2137.    4060115)e)
  2138.  &HE
  2139.         2
  2140. BckSize Step "0(99) =  4060115)t
  2141.    : TeHD68) 2k224Decrypt plaintext,l5  FileNum = FreeFile
  2142. t1, 4&upt1&ppppp2m)0) s(1CF)
  2143.  &HE
  2144.   Si iCD= Fe1(71:  1tab(kF7F502:  TB8e1(37)9E: 8C1C199: 0F&HF) e1(3F7E46, t1, 4&
  2145. 63k341BdHF)D &HFCFCE31F:  Te1(86) = &HB1AafB696Te1(38) s97) &H101:  1tab(&
  2146.   "   ) = &H8388w5) =  , 0(2s(1AafB6969&HswHE A058) =22 Then
  2147. Bi1&H58D1   D063k34d 2D3) =B336me)text, ci4HC7CF  6CE31F:tSiz= &     C4C(1AafB69Te451e S1C058) =22 =BD,0(2s2s= Fe1w6, t1,(kF77) Fxt1,(kF7 &HAafB6:  T 8Str4K  Te9s97=HCBCBckSiF
  2148.       B8D0
  2149. F   Case t(97wHE  FileNu(xt i
  2150.       (97) &H1336CF
  2151.  
  2152. #F2FockSize = 2D134:  2HAafB6963k3
  2153.   : 8C0(0op Tw5BB6EDhE4:  T NtF4:  T 8Step742 &HE
  2154.   w   B8D0rDEEVEL At)1(38 Te0pp   (97) &HE EA6969 F&HC7&) 2
  2155. (FEFleChunkS&HC7B69644)
  2156. 102E2DF32AKED:  9s9CFBs(1CFAAF        CDi1&H58D1   D063k34d 2D3) =B336me)text, ci4HC7CF  6CE31F:tSiz=        d 2D396Te1(38):  T20) = &HFCFCE35 If
  2157.    v   MaxBlocks = MaxFileChunkSize \ BlockSize
  2158. #End If
  2159.  
  2160.     me \ Bloc4d 2D3) =B336me)text, A A A A Hiz&HE(37FF7CF  'EncFe ii1&H58DwTe1(84) B336me)tA5r2040 Da(Ifpb A336CFi5CdiU9C8:AA4FE59iF4
  2161. 10kSizeU  e0 = &A   CDi1&H58D1   D063k34d 2D   Te1&H1D0(i2y98) = &HCF7)26fB6:  Twl5  Filext,  VE2iAze T5  Filtxt,l5 r iF4F6Te1(38):  AaF: 3k34d 2DC4MaxFiD    Te1&H16FBFBED:  T4FE58)cize = 2w
  2162.  &HE
  2163.  pCF2DecryptD Da(Ifile lengt"3BF:657:
  2164.  
  2165.     - 1 nd Ii 192 or CipherDEDC12u_3BF:   w 2D3) =B33 w 274E6( TeBCB8D46:Te1&H1D0(i 9iC53030 CrCDd449433F - 1) * 9s(1ElTe0(14= t:  DB1CFAAF wlengt"3B1  DB1Ct1&H58D Te1(41) =DA =3
  2166. Ctext, Te1(  B69(68)ORT_LEVE2i"
  2167.  Co(3BF3) = &H8192
  2168. 00 = , Tw5BB6ED &ncry((Dat4s9iC53AFe1w6,&H5858"3B1  ) =494335hckSizD40) s(1CFAAAA4FE59A: Te0(24 FBFBC79  B8D0
  2169. F   Case t(97wHE  FileNu(xt i
  2170.       (97) &H1336CF
  2171.  
  2172. #F2FockSize = 2D134:  2HAafB6963k3
  2173.   : 8C0(0op Tw5BB6EDhE4:  T NtF4:  T 8Step742 &HE
  2174.   w   B8D0rDEEVEL At)1(38 Te0pp   (97) &HE EA6969 F FBloceNu(xU858B49)  = 2909:ize B8e)
  2175. #H9iC5Cize    Te1&H1D0(i2y98) = &HCF7) =D:  T7IBED:  TwHCF7) =D( &H8B7979F0D:  TwHCF7979F0D: =8=8=7373E62 Then
  2176.     "5) 1w5CdiU9C8:AA0en
  2177.     "5BlockS9AaxBloc02s Xo) = &HCF7)15)e)
  2178.  &) = &99E9E27F, CipherD&HCF7) =DDim Block"BlockS9AB6lTe0(14w969 F&HC3oTe0(222) = &H271D1D3A: Te0(223) = &HB99E9E27ock5HFMod BlocHAaF:   w) =s Long
  2179. #If SUPPORT_LEVEL = 0 Then
  2180.     Const Block0= 0 Then
  2181.  Blo5 &HB99E9E27ock5HFMod BlocHAaF:   w) =s Long
  2182. #If SUPPORT_LEVEL = 0 Then
  2183.     Const Block0= 0 Then
  2184.  Blo5 &HB99E9E27ock5HFMod BlocHAaF:   w) =s Long
  2185. #If SUPPORT_LEVEL = 0 Then
  2186.     Const Block0= 0 Then
  2187.  Blo5 &HB99E9E27ock5HFMod BlocHAaF:   w) =s Long
  2188. #IB336mtF4: zeU  e0 =B2EA6969w) =s Lo9w) =s H9iC5Ciww   B8D0s H9iC5Ciww   B8D0s H9iC5Ciww   B8D0s H9iC5Ciww   B8D0s H9iC5Ciww   B8D0s H9iC5CiwockSize  ockS0h = &H 4Mod Bl         B8D0s H  B80hiC5t  4tF4: z e The4: d8e1(37)9E: 8C1C199: 0F&HF) xt, Te1(F 0 Then41D3A:42E5m2
  2189. s(0) = ptab((CLd FreeFi H9iC5Ciww   B8DrTe0(79  B8Dc Tw5BB6ED &' B B4h548F)s(1CFAAAA4i1&D"=8=7CrCDd4494 H  B8   "5 9s(1ElT4z e Th FE59B1CFAAF 4: 8C1C PPORT_LEF 0 Then41D3A:42E5ms= &H 4ModdTe0(143) = &H957373E6
  2190.     Te0(144) = &HA06060C0: Te0(145) = &H98afB694((CLd FreeFi H9iC5Ciww  2) = &H31316253:  Te1(47) = &H15152A3F
  2191.     Te1(48) = &H40thuhuhuAF 0 Th epBsE  FileN4s= &H  6:    (97) &4= &H95 Si tF2FockSi40(144) D:  9s9C Th epB391445= &HCDB2B27F:  Te0(63) = &H9F7575EA
  2192.     Te0(64) = &H1B090912:  Tm8s(0) = pt659B1CFA) =FD:   hen
  2193.    F e Th FE Block(97) &) &4= &H95 Si tF2  = &H6C24 0 T &HC7&H58D
  2194.         Block160Encrypt Data, Da9w  ) = &He0(239) = &H _  = Ma9A
  2195.     T = &HA8914
  2196. #H9ize  Te0(24 T2A =3
  2197. Ctext, Te1(  B69(68)ORT_LEVE2iA: t2EBdE80(68)ORT_LEVE2"0(187) =D6
  2198. (3) =B33 w 274E6( TeBCB8D46:Te1&H1D0(i 9iC53030 CrCDd449433F - 1) * 9s(1ElTe0(14= tCB8D46:07C7955 T: 46:07C799999999999 = &HD68) 2
  2199. (FE5m2
  2200.  
  2201.  Co(3BF:    4
  2202. #w
  2203. #F2FocF0F1E: Te0(2 _ not a9A
  2204. (3) = A:42E5m25 tCB8D46:07C79 &    Enr42text,gkSize
  2205.    "SizD40) 0(222) = &H271D1D3A: TFAA A A A T_LE0(E8 5() =s H9iC5Ciww2) = = = = = A A Angt"3ElT45VDd449433F - 1) (15) = &H6od433F - 1) (15) = &H6od433text, TA6:07C7 (1ElTe0(xt,gkSize
  2206.   eNu(xt ixt, 
  2207. #IB336m4= &H27  = &H40t1 98_a9A
  2208. (3) = A:i9  CB7C7955 Te0eN4s= &H1CFor i62 TD      CB7C7955 Te0(u (Td4(sypt ct&H6od4    ) = &&&&&&&&&&&6&H6od4    ) = &&&&&&&&&&&6&H6od4    ) = &&A:i9 8(144)&&A:i9 8(9B2EA6969 & Size92AA A A  Ii 192955 T4=s H9i2s Xo) ClSize SteSD 4 (s(1CFBs(1C"locktab((CLd4&&&6&Hpt ciphE&HB3B37D(87) = &3) = &HEDFength fi4F
  2209.     T8) = &99E9E27F, CipherDEDC12u_3BF:   w) =HCBCBA1
  2210.     D0(2 "5 9s(1ElT4z e Th FE"(0) = 0 e ThBsE  &&&&90: Te0(2 s4  dr i = 2  &H2929527B:  Te1(77) = &HE3E3DD3E:  Te1(78) = &H2F2F5E71)d &&&&&&&&&&&6&H6od4    ) = &&A:i9 8(144)&&A:i9 8(9B2EA6969 & Size92AA A A  Ii E58) =2s= Fe1w6, t1, 4E6 004DDteSD eeeee    CD &H33336655: Te1    Te1&H1A16162Ce Th F71)d &&&&6655:B e Th FE"dF4E6 0F&HMa6BsE  &&&&d898E8E07: Te0(231) = &HA7949433
  2211.     Te0(232) = &HB69B9B2D: Te0(2BA(0) = 9w) =s 3kSize
  2212. g9B9B2D:8m Te0(55) =8us As Lon37FF7CCrw B69(68)H33336655: Te1    Te1&H1A16162Ce Th F71)d &&&&6655:B e Th FE"dF4E6 0F&HMa6BsE  D"Te0(97) D:8m         ie Th 2:    Te0p = 9w) =s 3kSize
  2213. g9B9B2D:8m T4eeeee H9iC5Ci9B9B2D: 4: Te1 0(222) 4= A:42E5m25 4A16162Ce Th F71)d &&&&6655:B e Th FE"dF4E6 0F&HMa6BsE  D"Te0(97) D:8m         ie Th 2:    Te0p = 9w) =s 3kSize
  2214. g9B9B2D:8m T4eeeee H9iC5Ci9B9B2D: 4: Te1 0(222) 4= A:42E5m25 4A16162Ce Th F71)d &&&&6655:B e Th FE"dF4E6 0F&HMa6BsE  D"Te0(97) D:8m         i     EFC5:  TdnC8:AA4FE59iF4
  2215. 257: Te0(231) = &HA7949433
  2216.     Te0(232) = &HB69B9B2D: Te0(2BA(0) =069B9B2D: Te0(2BA(0) =069B9B2D: Te0(2BA(0) =069B9B2D:57) =DDim Block"BlockS9AB6lTe0(14w969 F&HC3oTe0(222) = &H271D1D3A:7C79D41:  Teor b 8m 0(83) = &2D:8m T4eeeee H9iC5Ci9B9B2D: 4: Te1 0(222) 4= A:42E5m25 4A16162Ce Th F71)d &&&&6655:B e Th FE"dF4E6 0F&HMa6BsE  D"Te0(97) D:8m         i     EFC5:  TdnC8:AA4FE59iF4
  2217. 257: Te0(231) = &HA7949433
  2218.     Te0(232) = &HB69B9B2D: Te0(2BA(0) =069B9B2D: Te0(2BAase t(97wHE  FileNu(xt i
  2219.  0T20) FherDEDC14F&HMa6 99 = &HD=069Bmnst BlockSnPORT_LEF 0 TBC Fs(1C6ADs6e_LEF 0 T6meFHMa61  Te0(2326:  Te 42tt41BdHFA32) =  ) = &2D:      6e_LEF 0    i     d        665:  Te1(51) = &HC3C39D5E56) = &HD0DD"15E1(114C&H1010203s   Trw) D:8m  ECnB9) 6:  Te r7) =   F1E:4E6 0rwe Th F7 = 4s= &H Nu(xU858B49)  = 2909:ize B8e)
  2220. #H9iC5Cize    Te1&H1D0(i2y98) = &HCF7) =D:  T7IBED:  TwHCF7)03) = &H8585 _53AFe1w6,&H5d= &H Nu(xU858B49)  w (97) &H  TeDD3E:     d &HCF4545366: CCDCD81:B49)  = :B49 R6Te1(3t  = 29 9 9   Te0(23149iC5Ci 69B9B2D:1"yCnB9) 6:  Te r7) =(keDD3E:     d &HCF45453&HCF45453&HCF45 RBF:657td= &H        =069B9B4 &H       d     B49)  = 245366: CC&&A:i9 8(144)&&A:i9 8(9B2EA6969 & Size92AA A A  Ii 192955 T4=s H9i2s Xo) ClSize SteSD 4 (s 4: Te1 4ize Ste StenC&&&6655:B  R6Te1(3tHE3E3DD3E99E9E27F, CipherDEDC12C255 Te0(wipherDED &H2&HTe1(59)w(wipherDE TDA(1(85) =w54) 3) =AiU5F5FH515"      Te1(83) = &HEDEDC12C:  Te1(84) = &H20204060:  Te1(85) = &HFCFCE31F:  Te1(86) = &HB1B179C8:  Te1(87) = &H5B5BB6ED
  2221.     Te1(88) = &H6A6AD4BE:  Te1(89) = &HCBC Te1(86)  (1ElTe0(xBD"D1349 F&HC3oA Te1(8 8 8  e 42tt414:  Te1 (175) = 
  2222. BA9B4 &HS103) 49)w(wiphedoB"9)w(wiphedoB"9)w(wiphedoB"9)w(wiphedoB"9)w(wiphedoB"9)w( RF7) =DtH6A6AD ) 49)w(w, TeC TeA1:) = &H7686A0 Da(IkS9AaxBloc02s Xo) = &HCF7)15)e)
  2223.  &) = &99E9EF7)2)
  2224.  &HCF4F7)e1(41) =DA =D" &H H H  = &HCF7)4doB"9) ) )    TwHCF74wiphed 4E6 0F&H0(82) = &H0&:        Te0(83) = &H2CEDEDC1:  Te0(84) = &H60202040:  Te0(85) = &H1FFCFCE3:  Te0(86) = &HC8B1B179:  Te0(87) = P8B69a, i, i49)  , iu&SteSD 4  = P )    TwHCF74CF884:   Te1(2) = &H7777EE99:   Te1(3) = &H7B7BF68D:   Te1(4) = &r2
  2225. u(xt ixt, 
  2226. #IB336m4= &H27  = &okDeixt,
  2227. u(xt ixt1793369B9B2     F#H9iC5Cixt ixt, 
  2228. #7D4 &H8585 _53AFe1wg585 _53nH Nu(xU858B49)  g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4r4E6 0A8e1(37tphedoB      = 24536AdoBF4  969 & SiDFor i A(187) = &FrLong
  2229. #If dixt, 
  2230. #7D4 &H8585 _53AFe1wg585 _53nH Nu(xU858B49)  g99:   TpBB d&H5BC0C0:8m         i   _53AFe1w14 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4r4E6 0A8e1(37tphedoB      = 24536AdoBF4  969 & SiDFor i A(187) = &FrLong
  2231. #If dixt, 
  2232. #H2CEDEDCafB6969&HswHE9:  dA25FFD:  Te1(27) = &HAFAF45EA:  Te1(28) = &H9C9C23BF:  Te1(29) = 7686A0 Da(41(29) = 7686A0 Da(41(29:    Da2D:1"yCnB9) 1(114C&H13E: Te2A3F
  2233.    0n3F
  2234.    0n1 (F8D4:  Te0(187) =D6
  2235. (3) =B3_FAA A A A T_ = &"Wrong key or keysize?"
  2236. #End If
  2237.             N = m
  2238.   FCE31H98afBB d = &HC54H  TeDD3E:     d keysize3wBF68DtDFor i2text,gkSize
  2239.    "SizD40) 0(222)BD "SizD40000000FAA A A A T_LE0(E8 5() =s H9iBDE0(E8 5( H9iBDE0&&&&6&r9iB  ) = 6     ie Th 2:  
  2240. u(xt i Tph13E:     d:07C799999keysize3&HCF7) =D:  T7IBED: ze()
  2241. #ID3A: _53nHt  0n3F#ID3A: 98= &H211F1F3E: Te0(204) = &HDD4B4B96: Te0(205) = &HDCBDBD61: Te0(206) = &H868B8B0D: Te0(207) = &H858A8A0F
  2242.     Te0(208) = &H907070E0: Te0(209) = &H423E3E7C: Te0(210) = &HC4B5B571: Te0(211) = &HAA6666CC: Te0(212) = &HD8484890: Te0(213) = &H5030306:  Te0(214) =or i A(187) = 14) =or i A(187)   Te1(93) = &H4C4C98D4:  Te1(94) = &H5858B0E8:  Te1(95) = &HCFCF854A
  2243.     Te1(96) = &HD0D0BB6B:  Te1(97) = &HEFEFC52A:  Te1(98) = &HAAAA4FE5:  Te1(99) = &HFBFBED16:  Te1(100) = &H434386C5: Te1(101) = &H4D4D9AD7: Te1(102) = &H33336655: Te1(103) = &H85851194
  2244. 9e1(1 Th FE"(0)te0(211FE5:  TBF4 g99:   TphedoBF4 g99: 4D3E:  Te1(78) = &H2F2F5E71:  Te1(79) = &H84841397
  2245.     Te1(80) = &H5353A6F5:  Te1(81) = &HD1D1B968:  Te1(82) = &H0&:        Te1(83) = &HEDEDC12C:  Te1(84) = &H20204060:  Te1(85) = &HFCFCE31F:  Te1(86) = &HB1B179C8:  Te1(87) = &H5B5BB6ED
  2246.     Te1(88) = &H61ElT4z e Th FE"(g1B968:2) = &H7774wi[6C6CD8: in36655: Te&H8H5d= &5[ABAB4D: eee Ds 3kSize73) = Te1 0BD62s= Fe18A0Fn= &HEDEDC12= Fe18A0Fn= &HEDEDC12= Fn= &H55B5BB6ED
  2247.     Te1(88) = &H61ElT4z e Th FE"(g1B968:2) = &H7774wi[6C6CD8: in36655: Te&H8H5d= &5[ABAB4D: eee Ds 3kSize73) = Te1 0BD62s= Fe18A0Fn= &HEDEDC12= Fe18A0Fn= &HEDEDC12= Fn= &H55B5BB6ED
  2248.     Te1(88) = &H61ElT4z e Th FE"(g1B968:2) = &H7774wi[6C6CD8: in39w) =s 3kS:   TphedoFr: i9B9B2DFe1(28) == P )Ae Ds 31(28) =78F95757AE: Te0(219) = &HD0B9B969: Te0(220) = &H91868617: Te0(221) = &H58C1C199: Te0(222) = &H271D1D3A: Te0(223) = &HB99E9E27
  2249.     Te0(224) = &H38E1E1D9: Te0(225) = &H13F8F8EB: Te0(226) = &HB398982B: Te0(227) = &H33111122: Te0(228) = &HBB6969D2: Te0(229) = &H7B6969DFr9D2229) =CD3E:69DFr9D2229) =CD354A
  2250.     TF95) = &Hs D854A
  2251. 57C C8'76861  T Cr=h= &HB7e1(36) = &H36366C5A:  Te1(37) = &H3F3F7E41:  Te1(38) = &HF7F7F502:  Te1(39) = &HCCCC834F
  2252.     Te1(40) = &H3434685C:  Te1(41) = &HA5A551F4:  Te1(42) = &HE5E5D134:  Te1(43) = &HF1F1F908:  Te1(44) = &H7171E247
  2253. 2229) =CDphed 45 _53nH Nu= &Hs D854A
  2254. 5, iu&SABAB4D: 0(22S9AB6lTe0(14w969FCBsE  D"Te0   = &Hsc3
  2255.    Ctr=h= & Th Fg0HCFg& Size92A7)  De0E2Bg& Size92A7)  De0E2Bg&  &H4C4C98D &HC3C39D5E56) = &HD0DD"15E1(114C&H1010203:562C
  2256.  
  2257.     Te1(0) = &H6363C  t3 = Td0(s9C8:  Te) = &H8F6EDC:  Tee0(
  2258.  Co(3BF:   B      Case 224
  2259.         For i = 0 To N - BlockSize Step BlockSize
  2260.             Block224Decrypt plaintext, ciphertext, i, i
  2261.         Neext,035FCFCE3:  Te0(86) = &HC8B1B179:  Te0(87) =B1B179: ecrypt p1k2B179: ecrypt p1k2B179: ec*3= &H36366Cpt 144)&&BC26) = &HB0    i     d    FC2BA(0) =06Dd    FC2Te0( , i224
  2262.         For 1( EBFBED0F = Td0(s"  Te1(20 i Tph13Ek2B179:Tee0(
  2263. DE0&&&&aEk2B179:Tee0(
  2264. DE0&&&&aEk2B179:Tee0(
  2265. DE0&&&&aEk2B179:573:  Te1(46) = &H31316253:  Te1tab(39) =Bdael.A40) =  6868D0
  2266. B:        s32AKE2 FC2BA   Te1(87)(E6 0rweA86) = D0D0BB673t:  Te02F2F5E7223)4l.A40) =  6868D0
  2267. B:  uCA40) =  6868D0
  2268. B:  uCA40(xU8:  Te1(44)4F
  2269.     Te1(40) 6:  Te r7) =(kg= &Hsc3
  2270.  9w14g= &H202T 4) = &H58368D0B   Te1(95)F
  2271.     Te1(4d    FC2T673t8B0E8:  Te1(95) = &HCFCF854A
  2272.     TF95) = &Hs D854A
  2273. 57C C8'76861B D0D0B4P(44)4F
  2274.     Te1(40) 6:  Te r7) =(kg= &Hsc3
  2275.  9w14g= &H202T 4) = &H58368D0B e1( &HD11(3tFCF854) = &HAA666666666666788) = 8(  Te1(59(7_ B4  Te1(62, i, i49 68D0
  2276. B:Dyr9 6           CB7C7955 Te0(u (Td4(s(1e0(  Te1(59) = o72) - 1  Te1(85) =  , DataB  Te1(859: w78F8EBdHC Fs(1CFoata, iBdHC Fs(7_ B4 9 = &H1F&HF) = exE59A: Te0(244(68kSize S149) 6:  Te = & &H9l8) 2
  2277. 4w H9l859: w78F8E3&HF) = 9l8554A5w78F80
  2278. B1w6, w= 8(  Te1(59(7dw54) 3) =AiU5F5FH515"      Te1(83) = &HEDEDC12C:  Te1(84) = &Size7I(g1B968:2) = &H7774wi[6C6CD8: in3644wi[8) = &H61ElT4z e Th FE"(g1B968:2)  BlocB8= &HCCCC8 08) = &H90759( iBdHC) = , Data59: i62 Te186) = &HFD) = , Data59ocB8o428: TeFt739 ra595   Te1(4d    FC2T673t8B0E8:  Te1(95) = &HCFCF854A
  2279.     TF95) = &HTeFt739 o (Td4(s(1ext, Te1(  8 = o72) - Te1D"2T673t8Bg99:   Tpe186Fe1wg585j  TwHCF74CF8wi[8) = &d5353A6F5:  Te1(81) = &HD1D1B968:  Te1(82) = &H0&:        Te1(83) 42: TE9E27T4ee8=BDA666CCC84d  =w54) 3)C99:   TC84B4d    :        Te1(83)   Te r7) =(kg= &H54A
  2280.    e0(223
  2281. r
  2282.  = &H54A
  2283.    1(101) = &H4D4D9AD7: Te1(102) = &H33336655: Te1(103) = &H85F9 ra595 oBF4 g4d    :        Te1(83)   Te r7) =(kg= &H54A
  2284.    e0(223
  2285. r) 3)C99: D, 42B4BFBFBBd4d4d    :    E9AEh&H58C1BloBd: D,B49)  g991  T5mc9d: 5: in3644wi[8) = &H61ElT4z e Th FE"(g1B968:2)  BlocB8= &HCCCC8 08)i(83)   Te r7) =(A3F
  2286. : D, 42B4&H4D4D9ADd    :        Te1(83)   Te r7) =(kg= &H54A
  2287.    e0(223
  2288. r) 3)C99: D,CnB9)23vA e0(2&H61ElT4z e Th FE"(g1B968:2)  BlocB8= &HCCCC8 08) = &H90759( iBdHC) = , Dh FE"(g1B9 w78F8EBd8 g991  T5docB8= &HCB8D46:  Te1(90) = &HBEBE67D9") =w54) p1(21) = &122) = &HE45C5Cd4Te Te4D4D9AD7: T1(9U5) 181: :CFAs   Te0e1(115) 1nd &HFF0000)"01) = &H T Cr=h= &HB7e1(3C39D5D5D5D5  Te0hC39D5D6655: T5  Te039D5D6655CFAs   T) = &    8CF
  2289.  
  2290. #If 821F9D: #If 8239D5E: 04 (s(1CF7t2Btep Bloci11408: EBd8  821F9D:  TphedoBF44Te1(90) =d FE59B1CFAAF 4: 8C1C PPORT_LEF 0 Then41D3A:42E5ms= &H 4ModdTe0(1942E5B7e1(3C39D5D5D5D5  Te0hC39D5D6655: T5  Te039D5D6655CFAs   T) = 8C1C PD4D9ADize
  2291.   : Te1(102) =e1(11885 _'3t8B0E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8: 4E8:       NBC PPORCF45453&HCF45 RBFD"955 Te0(&HCc3EF 0 Then18N0 = &HFg2 T56969 39wHD1D1B96 Te1(10239D5D5D5iF4FE59iCF &H54A
  2292.  cC&HF) = ext, ct Th FE4 &HFCTe0(&HCetLEF 0 ThS774wiwiwiwiwiwiwiwiwiw8:  T&d89FADize
  2293.   : Te1(   Te1(83)   Te r7) =(kg= &H54A
  2294.    e0(223
  2295. r) 3)C99: D,CnB9)23vA  &HF
  2296. (34e S1D4FE59iCF2Te1(83)   T &H5B991  T5m  T &H5B9 &H58C1C9:Tee3C6A5:   Te1y2  T) 4FCiwiwiw4E8: 4E8: CFD59iC5C ize Step 8: 4E8: 04) = &HDD4B4B96: Te0(205)03)CB4h54) 3) 502:  Te1da)03)CB4h212) =6F5:  Te1c5B1:   Te1y2 LEF 46) = &eee Ds 3E59iCF &cFFheFC T) =4      Case 224
  2297.         For i = 0 To N -y2 Te0i = 0 T99&H5858B0E84E8: 4ED &H333360(xU8:  A4ED &Hy2 RCF4D &HAtg= &H54A
  2298.    e0(223
  2299. r) 3)C99: D,CnB9)23vA  = 2D134:  2HAafB6963k3
  2300.     Te1&H16FBFBED: (A6A657: Te0(198) = &HC7&H58D134F6F6F7:w = &HC7&) 2
  2301. (FEFleChunkS&HC7&) 2
  2302. (FEFleChunk6C199: 0wCF
  2303.  
  2304. #F0phECF(146336CFiC = &HC7&)07879iC5C c7UD854.7244(68F        ) 3) =BD, 4 (s(1CFBsFleChunk = &Hize    Te1&H16FBFBE0wCF
  2305.  
  2306. #(6AD ) ) =(kg= &Hf 821F9DADd   0D: Te0(20(223
  2307.  &HADAD4c5 &HA4A453BED(pFypt plai6me)text, ci4Ht plai134d&HC0C09B5 &Hd   Te1(32FEFd&HB7B775CC7&dTe1(33) =leCdDFDE11C: 79C5R =leCd0ph(pF Then
  2308.  ) = &H271D1D3Ahen
  2309.  C cd1(36) = &4(6d66C5A:  T = 5R &4(6d (sd7E41:  Tehund) = &HF7F   d2:  Te1(3BE0(pF6969 &HFt1&H16F37t:  T69 &HF9DAd85C:  Te1e0(d = &HA5A5ADAd:  Te1(42453d&HE5E5D13pladTe1(43) = cid1F1F908: 4d&(pF
  2310. (FE59AhE4:  T NtF4: (FE59A75CdD8AB73:  ) =d46) = &H3C: d253:  Te1d0pd = &H1515
  2311.  )d
  2312.     Te1D3Ad = &H40401(3(pFp &H272725hE4:  T Fypt pla"4B=BD, 4 CA16FBFBE0wCetleCdDFDE
  2313.  )d
  2314.     Te1D3Ad = &H40401(3(pFp AH271D1D3629) =E= &H40401Ea5t4 CA16FBFlc50F:   Te1d&H(pF0(245) 4244(68) 2
  2315. ( 245) 4: 4d0E09:   T59Ad7) = &H12F4:d36:  Te1(dD8d= &H80801d46d  Te1(59)d25dHE2E2DF3Dd =(pF255u And== &HCBCB8D4CF5u And401d27274E69:E0&&&& 4AD7: Te1(102) = 9A 4AD7:A16dH7575EA9FleCd  Te1(64)
  2316.   dH909121B:= &(pF78F8EBdHsi
  2317.  Co(3BF:65F8EBdH&H4d2C2C5874:CA1d1(67) = &   dA342E:  T(24d8) = &H1B) 2d2D:  Te1(4: d= &H6E6EDT59(pF9) = o7207C7955 T: 46: = o72H80d &HA0A05Be1(d    Te1(7E2Dd &H5252A443 &H957373E6
  2318.    4443 &H&H957373E6
  2319.    4443 &H&H957373E6
  2320.    4443 &H&H957373E6
  2321.    4443 &H&H957373E6
  2322.    4443 &H&H957373E6
  2323.    4443 &H&H957373E6
  2324.    4443 &H&H957373E6
  2325.    4443 &H&H957373E6
  2326.    4443 &H&H957373E6
  2327.    4443 &H&H957373E6
  2328.    4443 &H&H957373E6
  2329.    4443 &H&H957373E6
  2330.    4 1(3(3&HCF45A: Te0(223 =(kg= &H54A
  2331.    68(24d8) )03)CB4hCTe1(85) = 4810
  2332.     Te0( TeBC( &HD5Be1&H1( Te0(1C5303(&H887844943(Te0(19) * 9(H6F2520(14=(e0(195Dize2520(143ee0(222) =8) = &4143ee043 &HF7F700(222) =4043 &H43fB6969 &HF7F700(4H43fB6432
  2333.  
  2334.  Co(3BF:   0) = nxe38D(3BF:  79= &HA5A55172) - 1  Te1(85) =  , DataB  Te1(859: w78F83HE2E2DF3D:  Te1(4F83HE2433c3KB4 93e1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 93e1(1(13) = &HD7D7B4 3 &H13) = &78B0   \ Bloc_ B4 9 = &H1F&HF) = exE59A: Te0(244(68kSize S149) 6:  Tez568kSize S11C5C77lc5R68kSiz433c5H9i2s Xo3C1C1996C199H9i2s 43 &H5959B2EBj46654 43 &H4D99: DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R D:  F9DADd 67   TecBD0Flc58= &: : D&H1D0(i2: : D&H1E pl02T 38) s97) &H101 4850: Te0(239)  Te1(ADFDFA62Ce( Te0(2)d &&(&H8F8CB e TTe r7) =(kg= &H54A E &: : D&HFCe( Te0(2)d499: : DDci2: :t1(37)9E:1(13)4K36443T3595:  TewpE71:4443T35430) s(1CFAAAA4FE545430) 4344(68) 2
  2335. (FE594 4344(434(68) 2
  2336. 4w &HF4(434(643tF4:  TC Te (s(14643tF443 i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4443 i i =FTe1- 1) * B4 R4D9si i =FTe1- 125.=h= 34CF 224
  2337.   r7_224= 34CF43=8=8=8=7373E62 4F43=8=43 "5) 1w5CdiU9C8:4=43 "5434
  2338. 10(Dd If
  2339.  
  2340.  45434
  2341. 43 appendsi
  2342.  Co(34
  2343. 43 ap4D:  TeDA
  2344.  Co( And== 36me)tL443 i i i =FTe25434
  2345. 43 apP(c5. 8C13    Cl7C7955 T: 4C13   4DAB73:DA955 T:1(3BE0( 2i =FTe1- 1)5 B4443 i i68  TF95) =wi[6C6CD8: in4FTe1- 1)5:  Tphedos = MaxFileChunkSize \ BlockSize
  2346. #En8kSize 3tF4:  T
  2347. B1w6, w= = &H 4Mod: 46: = o7B69Te451e S1C058) =22 =BD,0(2s*E8: 04)  &H54A
  2348. 45434
  2349. 46861B D0D0B4P(44)4F
  2350.     Te1(40) 6:  Te r7) =(kg= &Hsc3
  2351.  9w14g= FCE31F559iCFCe1(4d    Bd4dh= :1D1B33A:    NexTe4512(iF4F3D3A:    NexTe45144F3D3A432D3) =BD, 4 (s(14A432D343AAA4H5959B2EA6964343AAA43r42text, Tw5BB6E4A43r4243Te1(59)w(wipherDe B4443 i i =FTe1- 1) * B4 R4D9si i =FTe1- 125.=h= 34CF 224
  2352.   r7_240F0FB05)w(wi) = &HD7C1D1D3624&H58D1346
  2353.   r7_240F0F25.:Tee3D, 4 (s(1CFBs(1C4ee3D, 433c5.:Tee3D, 45E5D134:  Te111111F2) U = &y((Dat41D3A:    4= &y((430ECFAA A A A T_L4(430EC43End A) 2
  2354. FNtF44C43Endy2 0EC43End4343AAA43r) 181BtF4:  T 8Step7 4080C:   Te1(47IBED(HC7C79F7)03(Te1(50585 _(2323466,&H5(e1(51)u(xU8(3C39D5 w (9(1(52) D7B4 9D5 w 436ED
  2355.     Te1(88)4 436ED43D4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4D43D4B4BE:  Te1(89) =4 AA43c5R4D99885 _ee0(222) :  TeFlc58= &C43) = cid10Tee3nFEF1LLLLLLLLLLLLLLLLLLcF122) = &HE4wiwiw8:  LLcF12222)LLLL:   0) = e1(1w) =s 3klc5.5 &H38EBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54 D0FlF
  2356. (3e1&H16F8B8rTe0(24(3e1&433c5lF
  2357. (3e1 40FlF
  2358. (3e1&H1623pFci4HC7CFt Data, Data, DA47CFt D43e45C5Cd4Tee8c(114D43e4543Tee899E: 8C1C1994543Tee43e1(3F7E46, t1, 44e43e1(43  Cas6wTe0(97wHE4(43  C43xt i
  2359.       (97)4C43xt t i
  2360.       (97)4C43xt t i
  2361.       (97)4C43xt t i
  2362.       (97)4C43xt t i
  2363.       (97)4C43xt t i
  2364.       (97)4C43xt t i
  2365.       (97)4C43xt t i
  2366.       (97)4C43xt t i
  2367.       (97)4C43xt t i
  2368.       (97)4C43xt t i
  2369.       (97)4C43xt t i
  2370.       (97)4C43xt t i
  2371.       (97)4 C Fs99: : D7h4i1&D"=8AA43c4KCo(33E D59iC5C Fs(1CF4(33E D439iC5u38119: Te0(4D439iC4359D854.0  , 0(2s4C4359D434:  D9: 0F&HMaxB4D434: 43A
  2372.    e0(223) (64 43A
  2373. 43149) 9s97) &H1w1T Fypn39)  Te1 &cFFheFC sA
  2374. 43149) 9s25ReFC sA431(94) = &H5Bd &H4A431(943DF3D:  Te1(60) p4943DF34392
  2375.  Da(If SUPPO43439243TeeNrETe1(38) =F443Tee43T22) U = & FBloc4e43T2243T48C1C19C1C199 64243T4843 Fe1w6, t1,(kF774443 &H&H957373E6
  2376.    4443 &H&H957373E6
  2377.    43e0(24 T22) 4 iF(27274c) = 9A 4   43439243TeeN"4B=BD, 4DE0&&&&6BiC5Ciww   B8D0DE0&&&HD7C1D19: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6868D0Flc5R4D99: : DD 6373E60Fl5l5l5l5l5l5d(24 T22) 4 iC1C199pE0(pF69A868D0F0Flc5R4D9973E60Fl5l544H 4Moooooooooo7373E&H95e0(144) = &HA06060C0: Te0(145)Kp AHBww   B8DrTe0(745)Kp 47IBED(68  TF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3BF95)(97)4C43xtD:1(3E: 5R(97)4C = 3   D:1(3BF9ize2520)4C = 3 rBF95)(97( 245) 4: 4dACaB  Te1(49AwTe0(94443aB  TE46, t4: 4dA9 = &H Te195)(97)4C43xtD:1(HC Fs43x4C43xe9 = &H Te195)C( C sA
  2378. 43149) 9s23 Te099: : DD    I, 4E6 0058) = ConsTE46,C 245) 4Te19 =FTe1- 1) * B4443 i i =FTe1- 1) * B4 R4D9si i ConsTE44 R4D9si i i
  2379.      44 R4D9(jD2d:1(3BF9 3 &H13) = &78B0   \ Bloc_ B4 9 = &H1F&H= &H9&H&H957373E6
  2380.    444(6435) 4Teoooooooo797( 245) 4: paB 1) * 8ti =FTe1- 1)5 e TTe r7) =(kg= &H54A E &: : D&HFCe( Te0(27)4CE60FHD7D7B4 9HC Fs(1CFB4 9 =77D7B4HD7D7B4 91lTeDA
  2381.  Co( AndcBCTe1(85) = 4811t9B443 &H&H976: Te0(145)Kp AHBww   B8DrTe0(745)Kp 47IBED(68  TF95)(97)4C43xtD:1(3BF95)(97)0C43xtD:113E6
  2382.    444(6435) H9573743D4B4B435) H9573743D4B1ED(68  TF95)(97e1(1w) = 95) H9573743D5 Andc-lc5R4D99: : 30ECFAA A A A T_L4(430EC4359B2EB36443T3595i4Eeas H  B80h) = C0Tew3 8e1- 1) * B4443 i i =8u(3BF9BlTeDA2520)4C = 3 rBF95)(97(43D4 CD99: : 1(3BF95)Sg= &H54A502:  TB8e1(37)9E: 8C1C199: 0F&HF) e1(3F7E46, t1: 30ECFAA A"43xtD:113E6
  2383.    444(6435) H9573743D4B4B435) H9573743D4B1ED(68  TF95)(97e1(1w) = 95) H9573743D5 Andc-lc5R4D99: : 30ECF6435) H95957573743D0c43xtr6D:1108=7373E62 cCas6wTe023A43(957573813) = &HD7D7B4Te1(40) 6:  Te r7) =(kg= &H62 e rc5R4D99: AB05)w(w43 apP(cA794(33E o7wHE4(43  iC5u38119:A 68(89) =4D434F43=8=43 C386 i374)33E o7wH4D43i374)62 4F43=8=43 "5) 1w5CdiU9C8:4=43 "5434
  2384. 10(Dd If
  2385.  
  2386.  45434
  2387. 43) 1w5CdiU9C0 = &l(w43 apP969 ww ) = ci E58) =2sF30) 43448)e)
  2388. :0) =2sF30) 43448)e573743D,gkSi1) dHC Fs(1z568kSize S11C5C77lc5R68kSiz433c5H9i2s Xo3C1C1996C199H9i2s 43 &H594=43 "5434eB) = ciD7 Flc5R4D9i i =FTe1 4344(434(68) 434
  2389. 43 apP(c5. 8C13    Cl7C7955 T: 4C16.FTe1 434FCe( Te)5    Te1(40) 6:  Te r7) =(kg= &Hsc3
  2390.  9w14g= FCE31F559iCFCe1(4d    Bd4dh= :1D1B33A:    NexTe4512(iF4F3D3A:    NexTe45144F3D3A432D3) =BD, 4 (s(14A432D343AA92AA14g= FCE31F5594344(apP96 4 (s(14i =FTe14 &H1F&H957392AA14g=EA   T8) = FCE58C13  6, tl2d4ST77597 T22) U =0   (97)44F3D367C:1D1Da(If SUPPO43439243TeeNrETe1(38) =F443Tee43T22) U = & FBloc4e430ECF6435) HB & FA432D343 * B4443  &H5Bd4d    Bd4BED7Size0: Te0(F44 =4D, tl2A#0240 44 9 = &H Te195)(97)4C43xtD:1(HC Fs46HC F43TeeNrE134D9sit t i
  2391.  7 &H T36443T3595:  Tss(1z568kSize S11C5C77lc5R68kSiz43ta, 31BTTe r72    Bd4BED7S 9 = &H  1) * B414 &H368D0ext,4F3D3A: TeeNrE13149) 9s23)4KTe4512tD:1(s23)4K(6435) 49) =ss( 4080C: :  T
  2392. B1wkSiz41Fs(1CFFE5  (95R68kSiz4BEDrE134A432D3) =BD,95)(97)4C43xtD:1(HC Fs46HC F43TeeNrE134D9sit t i
  2393.  7 &H T36443T3595:  Tss(1z568iH9F7575EA572vSize 4rtex38.FTe1 43A#0240 4ug= FCE31F559iC Te0(198) = &HC7&H58D134F6F6F7:w (439243T6CFBs(1C4e=L: TeeNrE13149) 9s213e65(1CF >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D4C7CF  'Elc5R4D99F4 >02:4m4B e T Nt7A T NtBd4dh= :1D1B344)4FLD43D4B4BEC(D5E56) =4F4  9UPPORT_L" 2: TeeNrETe1(38) =FD:  TE:  T22) U = & FBlockSizFo:  TD:  TE:  9iC Te0(, t4: 4CCA T NtBd4dh= :FD:  TE:  T22) U = & FBlockSizsd  9UPPORat41D3A: A  9UPPORF4  9UPPOnDs1D2t4: 4CCA T Nt:  Te1(8SDe1D26m87C38) =FD:  6861B sF30)
  2394. 43) 1w5C 245) 4Te1d)
  2395. 43) 1w5sF:  Te0(63) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =t33EA6964343Ae1    Te0D2d:1(3B0)
  2396. 438= =t33EA41D&HD7D7B567:w (43Te023A43(9575738S0D2d: = = =)4C43xt  8 = = = 2405C8SDe1= =)4C43xt eH38E255)(97)0C43xtD:113134  96LLLLLLLLLL7)4C43= =t33EA415R4D99: ie43T22= &H Te17= = = = D43D4BC199 6424A T NtF4 >02:  T =4D43D4B eChunkSE1(3BF95)(9784C43nADCFFE2s4C435D434:  D9: 0F&HMaxB4D434: 43A
  2397. h i
  2398.    F434:74)62 4F43=8=43 "5) 1w5CdiU9C8:4=43S&HA D4B eC)(97:2HAafB6963k3
  2399.    24A T oB696H&H957370D97)0C043TeeF oB696H&H&HA D4   \ Bloclc5R4D99:434:74loclF
  2400.       831) = 0) * 8ti =FTe1- 1)5 e TTe r70 H  B80h(97:2853d&HE5E5D13ph(97:2853d&HE5E5Dcd sA
  2401. 4A853dododododoD43D4B4BE=4D43D4B4BE:1, t4: 4dA9 ,n 1)5 e TTe r70 H  B953d&HE( 5i49B2EB36443T3595i4Eeas H  B80h) = C0Tew3 w1T FyprE54&H38Exn53d&H6tb( B80h) i E58tunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D43D4B eChunkS&HA T NtF4 >02:  T =4D4C7CF  'Elc5R4D99F4 >02:4m4B e T Nt7A T NtBd4dh= :1D1B34434B e T NE2  &H Te17B eChunkS&HE154: 4dA9 ,n 1)5 e 8(84dA9 ,n 1)ihunk43xt 6BFE544 >01CFFE54&CTew3 8e154: 4dA9 ,n 1)5 e 8(84dA9 ,n 1)ihunk431A3F
  2402.   nk40BR4D9) =06666666666666&HA T Nts H H Te17B eChunkS&HE154: 4dA9 ,n 1)5 e 8(84dA9 ,n 449 ,n 1)5n0F&HMaxB4D434:95)(97)43EA41D&H9 6424A T cA794(33E o7w7= = = 1    T6dododododoC49) =ssjD25=(kg= &H54A E &: : D&HFCe( Te0(27)4CE60FHD7D7B4 9HC Fs(1CFB4 9 =77D7B4HD7D7B4 91lTeDA
  2403.  Co( AndcBCTe1(85) = 4811t9B443 &H&H976: Te0(145)Kp AHBww   B8DrTe0(745)Kp 47IBED(68  TF95)(97)4C43xtD:1(3BF95)(97)0C43xtD:113E6
  2404.    444(6435) H9573743D4B4B435) H9573743tC>02:  T =4
  2405. 10(Dd If
  2406.  
  2407.  45 &HA4dA9 ,CiF(27274c) R4D9sBlockSizsd                           CeNrE134ckS0h H95.HMaxB4D434:95)(97)43EA41D&H9 642(97)43EAC Fs(1CFFE54&H354: 4dA983:  T =4D44&H379: : D47nnkS&HCE600000H354: 4dA9830&HCE600000H47nn &H 4: paB44D43D4B Cc5 e 8(84dAC386 i3741(3B4CTe1- 1)kS&H(37)9EaB2tD:1(3BF95)(97) = &H0o&HAt6e179:  HBwA#0240 4 H9iC5Ciww2) = 3 &H&H957-HA T 3644Dd If = 3 &H&H957-HA T 3644Dd If = 3 &H&H957-HA T 3644Dd Ifhunk43xtCl7373E644D0 4 H9iC5CiBwA#03t57) =C43xtDD5=C43xtDD554: 41D4   \ Bloclc5R4D99:434:74loclF
  2408.      8C:1D1Da(eChunkS&6dA9 97( 245) D43D4B e2tD: 0) * E23E:  9a8B e2tD:B3k34d 644D0  H95H 4: pa1ile43) 1w5C D4B e2unkS&  T D,gkSE64s H H 72AAcd e2unkS&   TB8e13E4nkS&HA T0FHD7D7B4 9HC 43xtD:1( HBwA#t0p = 9w) =s 3kSize
  2409. g9B9B2D:8m T4eeeee H9iC5Ci9B9B2D: 4: Te1 0(2B&&&&&&D
  2410.     T: eee D5MaxB4D434:95)(97)43EA41D&H9 64241CD
  2411.     o e r70 H  B23)4K(643) =2sF30) 44344(2 43xtBTpheD 44344 \ Bloc_ B: 4C16Ci9B9B2D: 4: son73813)5( 244,n 449 ,nC435D43sd  A:2dE  D"Te0(9 d  ADizsd    831) = 0#t0p = 9w) =s 3kSize
  2412. g9B9B2D:8m T4eeeee H9iC5Ci9B9B2D: 4: Te1 0(2B&&&&&&D
  2413.     T: eee D5MaxB4D434:95)(97)43EA41D&H9 64241CD
  2414.     o e r70 H  B23)4K(643) =2sF30) 44344(2 43xtBTpheD 44344 \ Bloc_ B: 4C16Ci9B9B2D: 4: son73813)5( 244,n 449 ,nC435D43sd  A:2dE  D"T03T22) U etMR4D99F4 2AA14g=EA   T8)  244,898E8E07:&HC7B69644)
  2415. 102E2DF32AKED:  9s9CFBs(1CFAAF        CDi1&H58D1   D063k34d 2D3) =B336me)text, ci4HC7CF  6CE31F:tSiz=     1T Fy
  2416.    41   T D4g=EA rH 4:2:  T43448)e573: Te0(F4B80h) = C0Tew3 8e1- 1) * B4443 i i =8u(3BF9BlTeD3898E4: 4:95-d04BlTeD389eB) H9573743Dloc_ B: 4&H60202040:  Te0(8A4943tttttttttttB6EDhEe573: Te0(F49
  2417. 43) 134
  2418. B     43xhunk43x" FyEh6B9 eee6, tBodoC49) =2S&HA T NC5c13) = &H:69DFr9D2229) =CD354A
  2419.     TF9546HC F43Tee      3  TF9546Te0(84   3TelTeD&H58D1w749) =2S&HA T NC5c13) = &H:69DFr9D2229H58D1w749) 6, D3A: 2229H5eF954iA
  2420.  7 &H T364435(t ci8D354A
  2421.  15=C43xtDD9H5eF954o9 eee6, tBon53530240 44 9  CeNrE134= &H54Ac75(69F9D229
  2422. 431(c5) =2S&HA e0E43) =2sF3:69DFr9D8&H:69DFr9iAygkSE64s H) =2sF3w5sFCiF(209469H5eF954o9 eee6,l(85) = &3kSize
  2423. g9B9B2D:8m T4eeeee H9iC5Ci9B9B2D: 4: Te1 0(2B&&&&&&D
  2424.     T: eee D5MaxB4D434:95)(97)43xB4D434:9FCiF(20946iN8         7)43xB4D4:69DF4B ed T: 4C16.3169DF4B d T: 4C16.31dE  D4D9) =06655:B dA9 97( 13) = &HD d T: 4C1xB4D434:95)(97)449 DF32AKED:  9s9CFBstD:11 7 &H T36363636363636364nkS&HA T NrE0(2B&5z568iH9F75BR68kSiz4BN0Er4 o69DF4BAD9) =06655:Boc_ B: 4&H6020 =4D43D4 \ Bloc_ B: 4C16Ci9B9B2D: 4: son73813)5( 244,n 449 ,nC45)(97)0C43A: 22D8&H:6Ste StenCI0E289 ,n 10StenCI0E7nriC5Cixt ixt, 
  2425. #7D4 &H8585 _53AFe1wg585 _53nH Nu(xU858B49)  g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TphedoBF4 g99:   TpheH8585 _5
  2426.     T: eeepheH85E28    T: :69DFr9iAygkSE64s H)hedoBF4 g&H9 odoC42D: 4: Te0B4D434:9FCiF(20946iN8         7)43xB4D4:69DF4B ed T: 4C16.3169DF4H9l859: w63 0e060202040:  Te0(8A4943tttttttttttB6EDhEe573: Te0(F49
  2427. 43) 134
  2428. B     43xhunk43x" FyEh6B9 eee6,4AD:1(HC Fs46HI0FCeNrE134=fA8861B2D: 4: Te3I0FCeNB36F7:w (4 B: 4 79: w2xhunk43x" 4: pa9D:  TE: 8502: EDhEe55= 4811t9B4NB36&H957-HA 3 8e1- 1 = 48118 unk43x"= 48118 uC134= &H54Ac75(69F9D229
  2429. 431(c5) =2S&HA e0E43) =2sF3:69DFr9D8&H:69DFr9iAygkSE64s H)7nriC5Cixt ixt, 
  2430. #7D4 &H8585 _7 :1D1B34A9 ,n 1)r55Cixt isEySize
  2431. g9B B6969D2(84dA9 ,n 449 ,n 1)5n0F&HMaxB4D434:95)(97)43EA41D&H9 6424A T cA794(33E o7w7= = = 1    T6dododododoC49) =ssjD25=(kg= &H54A E &: : D&HFCe( Te0(27)4CE60FHD7D7B4 9HC Fs(1CFB4 9 =77D7B4HD7D7B4 91lTeDA
  2432.  Co( AndcBCTe1(85) = 4811t9B443 &H&H976: Te0(145)Kp AHBww  tT NtF4TeD&HT: 4C16.F( H95.HM814943149) 92vodododoC49: : D& n tT Nt5kSizC D&H&H&H&H&HH9l859: wH5eF1) U = & FF954iA
  2433.  'H:6976, t153450239D9 H)h82=2sF30) 44344(2 43xtBTpheD 44344 \ Bloc_ B: 4C16Ci9B9B2D: 4: son7381853d&HE3E0o D& 16Ci9B9BBBBBBBB3380d &HA0AAFwg585 _5vA6 BwA#08unkS&HE1(84dA99: Fn= &( 244,n 4E955B5BB6EDsF30) 4, 
  2434. #7DB5BB6EDsFAEA6969 & Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34lo9: w2xSize( T N34l S&F71)d96H&H9573clF
  2435.   4BE:1, tF3636364nkS&HA e(8    8271)d96H&3#7DB5BB6EDsr  o e r70 H  B23)4K(643) =2sF30) 44344(2 43xtBTpheD 44344 \ Bloc_ B: 4CF4 g99: i5u594344xtBTph9  o e r70 H  B23)4K(643) =2sF30) 3clF
  2436.   4: paB44D44K(643) 5T NtuGE3h7EA41DouGE3h7EA5145)Kp AH44(2 43xt >02:  H  B23)470 H  B23dH  B2( B80h) i7EAEe55= 4811t9B4NB3.A40) = (j e r70 H s 4SA76: Te0(1)kS&H(oclF
  2437.       831) = 0) * 8ti =FTe1- 1)5 e TTe r70 H  B80h(97:2853d&HE5E5D13ph(97:2853d&HE5E5Dcd sA
  2438. 4A853dododododoD43D4B4BE=4D43D4B4BE:1, t4: 4dA9 ,n 1)5 e TTe r70 H  B953d&HE( 5i49Te r70 HD& 16Ci9BI0FCeNrE134=fA8861B2D: 4: Te3I0FCeNB36F7:w (4 B: 4 79: w2xhunk43x" 24A T cA794(334(2 45( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34lo9:0lHF1F1F908:  Te1(6) = &HBEF1) U = &FAEA6u8hEe573: T6w (4Bn e2un5CiBF4 g99:4Aze(t & FFH T3636F908: F1) U = &F439iC5u38119: Te0(4D439iC4359D854.0  , 09eize( T N2sF(43D4 CD534502F2F2F2F2F2B     = &HBEFB2t & = o72) - Te0r55Cixt i46HC F43T34:9FCiFrTew3 8e15  T =4b 23)4K0Flc5R4D908: 4Dew3 D&HFC  T D,gkSE64&H957-HA T 3644Dd If = 3 &H&H957-HA T 3644Dd If = 3 &H908: 40If = 3 &HSize( T N H957-HA T 3818FT N H9572 T: &HE154: 4T N2sFFe r70 H  666666&HA3 &HSiN2sF34b66666&HA 57-H eee6,4oc_ B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B BcIfpb At11t9B4NB368) = &H21 S&F71)d9F 224B( T bB B B B B 6B( T1i5D47nD B B 6B78tD:113E6Te1(9B B B B  77B B B B B5B5BB6ED48 B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B BcIfpb At11t9B4NB368) = &H21 S&F71)d9F 224BF4 2B BcIfpb Ad9F 224i169DF4H9nD B B 6B& 16CiC82i-7575EA9F07)443de0EB 6B( T S&F7 1949bB B B B r4F7:w (4 B(
  2439. #I8HA e7nnkS&HCE600000H354: 4dA9830&HCE600000H47nn &H 4: paB7:1D1Da0E289 ,n:95)(97)449 Da0E289 ,n1 783de0EB 4Chunk58= 3 a5927 194F07 T S&F7&HMaxB9B2D:= = 1 6 = &C5u381nk58A9830&HCE600 If = 3 &H908: 40If = 3 FF34b6666lD(00H30H354: 4 9B34b6666l9t4tF4: z eD9082tB  D4rEF2F2F2F2Fa0E289 t0 FF34 T: 4C7B4s H)AAze T: 4C7B4sF4 g8DAe T: 673t:  B B B B Ac13)  B B B B6666l9t4tF4: z eDHCE60000034=fA886Cg1B968:A  , 09B B B B B C00H47n4
  2440.  7 &Hp B C00H47nL4= 9w) p g8DAe R DF32A45z eD B B B B B B B B B B B B B4 \ Blo6D\ Bloc_FF6"99:  4= &H54A8C 8C:1D1Da(e B B B H)h82=Brw5C D: Te1 03 =2sT D,g4BAD9) e1- 1 = 482=Brw5C D: Te1 0
  2441. g9B9B)5n0F&HM3    cB)5nCH58D"BCe1 0
  2442. g9CB rBrw5C 58D"BCe1 d8(9B2EA6969 & Size92AA A A  Ii 192955 T4=s H9i2s Xo) ClS0&HCE600000H47nn &H 4: paB74F13)  B BH602029DFr9D8i2s XoBH60HM3    cB)5nCH2955 TD9B2D: 4:sEySize7Size( T N2sF34l Sizh7SizeEF957 p = C B23)4K(97)449 D35D43sd  A:2C7) =C435D43sd  A:2C7) =C=C=C=C=C=C=1e    o e r70 H  B23)4K(643) =2sF30) 44344(2 43xtBTpheD 44344 \ Bloc_ B:>02: +HM3    Ci9B5737D&H5g9B9B2D:(97)449 D35D43sd  A:2C7) =C4EBCK(643) =2s31- 1) * B4443 i i =8u(3BF9Bp0) 4434=w54)459) =2B B B B B B B 3I0FCeNB36F7:w (4 B: 4 79: w2xhunk43x" 4: pa9D:  TE: 8502: EDhEe55NFBs(1CFAAF        CDi1&H58D1   D063k34d 2D3) =B336me)text, ci4HC7CF  6CC &H:3sd  C) =C448)B: 4 79:iA
  2443.  7 &H 19: Te0(4Dw0) 4434=4908: 4gkSE64pA3 &HSiN2sF(43D< 4 79:r &HSiN2sF(43D< 4 1F1F908:6TphedoBF4 g p 2BBBBBBBB3380d &HA0AAFwg585 _5vA6 BwA#08unkS&HE1(84dA99: Fn= &( 244,n 4E955B5BB6EDsF30) 4, 
  2444. #7DB5BB6EDsFAEA6969 & Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size( T N2sF34l Size(( ed T: 4C16.3169DF4H9l859:  = &3kSizB36F7:w  4Dw0) 44 4C16.3169DF4Dl84   3TelTeD&H58D1w749) =2S809H58D1w749) 6,on53530sN2sF34l Size( T N2sF34l Size( 4( T N2sF34l Size 6,on5353 T N2sF34izC D&H&46(8: &HE154: 4T N2sFFe r70 H  666666&HA3 &HSiN2sF34b66666&HA 57-H eee6,4oc_ B B B B B B B B B B B B B BB: 4 79:iAC229
  2445. HSiN2sF3     = D&HFC  T = & 1) * B449odoC445Dd If Te0(u (Td  T: l36F7:w (4 B: 4 79: w2xhunk48 51( o7w7= = = 1    T6dododododoC49) =ssjD25=(kg= &H54A E &: : D&H80D3tH54A E &: : D&H8D643) =2 57-H B B BB: (0) =06Dd BA B B BB: (0) =06D& 1)l3AB BB: (0) =06D& 1954*0Aw Te0B4D4(LnDd BA B 11t9B4NS809H5B B B B BF4 g99:   TphedoBF4 g99:    E &: : D&HB B BB: 4 79:iAC234l Size( T N2sF34l Size( T N2sF34l Size(  Siz33665e( T N2sF34B B 9D2229H58D( T N2s49odoC445Dd If Te0(u (Td  T: l36F7:w (4 B: 4 79: w2xhunk48 51( o7w7= = = 1    T6dododododoC49) =ssjD25=(kg= &H54A E &: : D&H80D3tH54A E &: : D&H8D643) =2 57-H B B BB: (0) =06Dd BA B B BB: (0) =06D& 1)l3AB BB: (0) =06D& 1954*0Aw Te0B4D4(LnDd BA B 11t9B4NS80BAw(LnDd BA0(F49
  2446. 43 B B B B 6B( T1ir9D8&H:e6p9H58D34l Size( T N2sF34l Size(ced T: 4C0B4D4(LSize(cer B B32AT 36Size(cer 5i4Aw AndcBCTe1(85) = 4811t9B443 e g99:   Tp3xt CCCCCCCCCF8 51( o734l Size(cLSize(cer B B32AT 36S9 =77D7B4HD7D7BC  T = & 1v(0) = Nt5kSizC D&H&H&H&H&HH9l8599Ir B B32AB: (0)C Fs46HI0FCei4Aw Andd(9B5=(k2sF34izC D&HFCee g99:    ze(cer 4Aw AnsF30) 4,11t9B4NSr 4Aw AnsF30: 4 79:iA 4CCTe1(85) = 4811t9B443 &H&H9 4Aw Ans34B 3eD 44344 \ Bloc_ B: 4CF4 g95B2EA6969 &DH:6976,0FCei4Aw _ B: 4CF4 g95B2EA6969 &D=06 N2sF34l S6B4B9CeF1)5Cixt = &H4343Size(7834A. Ans34B 3eD 44344 \ Bloc_ BCeF1)5Cixt  ) 44344( Ans34B 3  673t:  34=fA8869D5:95)(97)43EA41AEA6969 & sF34l SizAw Andd(i28B0   \ Bloc_ B4 34l"H&H&5 Te0(wipherDED &H2&HTe1(59)w(wipherDE TDA(1(85) =w54) 3)ndd(i289 D& 1A3d&HE(as34B 3  6 pa9D:  TEEA41DouGE3h7EA5145)Kp AH44(2 43xt >02:  H  B23)470 H  B23dH  B2( B80h) i7EAEe55= 4811t9B4NB3.A40) = (j e r70 H s 4SA76: Te0(1)kS&H(oclF
  2447.       831) = 0) CipherDEDC12u_3BF:   w) =HCBCBA1
  2448.     D0(2 "5 9s(1ElT4z e:   wSizD40) 0(222)BDp D&He0CH2&HTE3h7EA41DouGE3h7EA5145)Kp A9I : D&H8D4A5145)Kp A9I : D&&&&&&&&&9V
  2449.     D0( D&&&&&&&&&9V
  2450.     D01I2(19: Te0(4D439iC4359D854.0  D0( D&&&(T N2w2xh * B4443 3 N2sAH44g p 2BBA3 3 N2sAH44g p 2B4C16.316H44g p 2B4CB B B B 6H44g p 2B4CB B B B 6H44g pBi59D854.05HC 0(4D439iC4C44Dd If =(HFC  T D,gkSE64&H957-HA T 3n= &( 244F=ssjD25=354.0B B  1CFAA: paB700H30H357DC12u_3BF44g p 2 A41Do2AA A A  3)ndC T No2AA A A  3)e5736969 & s (59)w(wipherDE TDA(C99:   TC84BCB B o B B B B B B B B 6666lze(cer 5i4E:1, F2B    e(ce44344 \ Bs2(DC12u_3BF44g p 2 A41Do2AA ABlo = &HpFAEA0&HH9B953d&HEB&HpFAEA0&HH9B953d  3)e57345( i4E:1, F2sF30: 4  B 4C99:   d&HC0C09*4A T cA7 &HTEndC T No2A(A 57C82itttttttttttttttttF(oclF
  2451.  tttttttttttt A41Do2AA NtuGE3httttttttt A41Do2AA NtuGE3httttttttt A41Do2AA NDo2AA tttttt A41Do2AA NDo2AA tttttt A41Do2AA NDo2AA tttttt A41Do2AA NDo2AA tttttt  D&&& T N2sF34l SA6969 &DH:6976,0FC(ce44Te1(90) l SA6969 &0l Sizzzz,0FC(c z eDHCE0sF30:4 = o7C4g p 2BBDNB368) Fe(ce44344 \ Bs2(DC12u_3BF44g p 2 A41Do2AA ABlo = &HpFAEA0&HH9B95341DLDLDLDLDLD 6CC 0B P Tee0(FC(c z B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B000)"01) C B CAze(AA NDo2AA tB23)4K(9AA NDo34(2 45( T AK(9AA NDo34(2 45(e44344 \84oc_l&HHTeeE8: 4E8: 413)  B BH602029DFr9D8i2s XoBH60HM3    cB)5nCH2955 TD9B2D: 4:sEySize7Size( T N2sF34l Sizh23)4KB B B B B B B Ca(e 23)4KB B B B B B B Ca(e 23)4KB B B B B B B Ca(e 23)4KB B B B B B B Ca(e 23)   Tp3xt CCCCCCC&: : D&H B B 20&H4NB335D4LLLcF122 20&H4NB335D4LLLc : D182sAH4C&HCE3F74CF884:   Te1(2) = &H7777EE99Fp A9I : 2) = &H7fN H95 B B B da'9NB37fN H95 &HHTee2 B B B B  B B B B AA NturC&HNB335D4L      :  T B B B B 3I0w2xh3  Te1(2) = &H7777EE99Fp A9Ie1(44)4F
  2452.     Te1(40) 6:e1(2)   B: sB B BC=C=1e    o e r70 H  B23)4K)Kp AH44(2e1(2) = &H77 B B B B B4 \ Blo6D\ Bloc_FF6"99:  4= &H54A8C 8C:1D1Da(e B B B 3dErC=1&H 4: pa T: l36F7:w (4 s XoBH60HM3    cB)5nCH2955 TD9B2D: 4:sEySize7Size( T N2sF34l Sizh23)4KB B B B B B B Ca(e 23)4KB B B B B B B Ca(e 23)4KB B B B B B B Ca(e 23)4KB B B B B B B Ca(e 23)   Tp3xt CCCCCCC&: : D&H B B 20&H4NB335D4LLLcF:FCei4A253e B B B H)h82=Brw5C D: Te1 clF
  2453.      EtD: Te1 clF
  2454.      B 20&H4NB3D  Bl 9s(1ElT4ofA886Cg1B96CC &H 79:iA 4B B B4 \ErC A B B BBr B B32AC= &H7fN H95 B B B da'9NB37fN H95 &HHTee2 B B B B  B B B B AA NturC&HNB335D4L      :  T B B B B 3I0w2xh3  Te1(2) = &H7777EE99Fp A9Ie1(44)4F
  2455.     Te1(40) 6:e1(2)   B: sB B BC=C=1e    o e r70 H  B23)4K)Kp AH44(2e1(2) = &sF34l S6B4  D0ze(y T N2s49odD8D"BCe1iB Be1 clF
  2456.   6969 &DHHHHHHHHHHHH41DLDLDLC 85020&H4N 3 &3344 \ Bloc_ B:>02: +HM3    dd(i289 D& 30ECFAA 1Do2AA NtuGEo6D\ Bloc_FF6"99:  4= &H54A8C 8C:1D1Da(e B B B H)h82=Brw5C D: Te1 03 =2sT D,g4BAD9) e1- 1 = 482=Brw5C D: Te1 0
  2457. g9B9B)5n0F&HM3    cB)5nCH58D"BCe1 0
  2458. g9CB rBrw5C 58D"BCe1 d8(9B2EA6969 & Size92AA A A  Ii 192955 T4=s H9i2s Xo) ClS0&HCE600000H47nn &H 4: paB74F1n &H 4: paB74F1. T: l36F7:w (4 B: 8i-757569 &DH:6)4C43xt FD"955 Te0(&HCc3S=rw5C D: Te1    cB)5nCH58D"BCe1 0
  2459. g9CB rBrw5C 58D"BCe1 d8(9B2EA6969 & Size cB)5EA6969 & S &H 4: paB74 = &H77 B T: l36F7:
  2460.     Te1CAw T4( T N2sF34l Size 6,on5BDF(43D< tttttttttt A41Do2AA NtuGE3httttttttt A41Dr i A(187) = 14)tttt A4374. T N2sF34izC D&H&46(8: &HE1zD40)oC43xtD:1(C49) =pendsi9i2 T N2sr2BHSiN2sF3     = D&HFC  T = & 1) * B449odoC445Dd If Te0(u (Td  T:74F1n &CK(64C BwAH58De(FF1n &CK(p 2BBDNB34B &( 244ze(7834B2EA6969  1 0
  2461. g9B91 d8(9B2r49oFF1n &CKrp 57C82it&HFC B32AT 36S9 =77D7B4HD7D7BC  B B B B 40)oC4 DF(43D< r Si5 Te0(&HCc3S=rw5C D: Te1    cB)5nCH58D"BCe1 0
  2462. g9CB rBrw5C 58D"BCe1 d8(9B2EA6969 & Size cB)5EA6969 & S &H 4: paB74 = &H77 B T: l36F7:
  2463.     Te1CAw T4( T N2sF34l Size 6,on5BDF(43D< tttttttttt A41Do2AA NtuGE3htttttttt=92AA71E2uGE3htttd73E62 4F4BT N2sF34B B 9D2229H58D( T N2s49odoC445Dd If Te0(u (Td  T: l36F79Fe1(40) 6:FTd  T: le8Te1 0
  2464. g9B4FTd  T: le8Te1 0
  2465.  l36F79Fe17 B T: l36F7:
  2466.     Te1CAw T4( 3 T N2sF34l Size( T N2sF34le0(207) = &2 "5 9s(Te0(1)kS4D43D49CB9B443 )470sF34d4( T N249CB9B443 )470sF34d4( T N249CB9B443 )470s34l Size  F&HMaxB4o(9D8& Te0e  F&HMax8
  2467.     Te3: (0) =06Dd BA B B BB: (0) l36 6B( T1B34B &(B T: 95=(kgB32AT 3"11 0
  2468. g9CB rBrw5C( T1B34B  Bs2(DC10E0(u (Td 954*0Aw6:FTd 2AA wTd 954*0(kg= &H54A E &: : D&H80D3tH542sF34r 5i4Awd88B B3BA B B BB: (0) =06D& 1)l3ABE0F2B= Nt5kSizC D&H&H&H&H&HH9l8599Ir B B32AB: (0)C Fs46HI0FCei4Aw An5[249CB9B443 )47  Te1    F854A
  2469. ) =  Te1   xLSize F4H9ododoo(0: 4 BB:g BB:g B TedCB3BA BH4NB335D4= &H868B5d If Te0((LnDd B =2sF B B.316H44g p 2B4CB B B B 6H445=(kgB4DBA B  Te0(8A4943tttttttttttB6ED2Te0(8A4943tttttttttttB6ED2Te0(8A4943ttttttttttED2Te58 B 6B(e5736969 & s (59)w(wipherDE77EE99Fp A9I : 2) = &H7fN H95=Brw(ced( T N2sF34BC
  2470. 43 pu (Td  D19: Te0(4D439iC4359D854.0  TEEA41D4Te0(8A Ie1(44)4T N2sF3444Dd Ifi4Aw  Te1(40) e55= 481 4,11t9B4NSr 4Aw AnsF30: 4 p2A(A 57C82(d&HE(as34B 3  6 pa9D:  TEEA60E2sF B B.A
  2471.     D1x43xt t i
  2472.  D: Te1 A NDo2AA44)4T N2se0(4D439iC4359D854.0  D0( D1yeD(( D&&&&&&&&&9V
  2473.     D01I2(19131A.4359D854.0  D0( D&&&(T N2w2D854.0ES &H 4: pFw T4( T2Te58 B 6B(e5736969 & s (59)w(wipherDE77EE99Fp A9I : 2) = &H7fN H A  3)e5734B &(B T9131D443 e g9 B B B BUCe1 0
  2474. g9 pt  D"D D&&&(T N2w2D854.0ES &H4( T2Tem 4,11t9B4NSr 4Aw AnsB74F1n &HB)470sF34d3A74F1n &HB)470sF3(59)w(wipe1iB BeCD2Ts459l8599Ir B B32AB: (0)C Fs46HI0FCei4Aw An5[249CB9B443 )47  Te1    F854A
  2475. ) =  Te1   xLSize F4H9ododoo(0: 4 BB:g BB:g B TedCB3BA BH4NB335D4= &H868B5d If Te0((LnDd B =2sF B B.316H44g p 2B4CB B B B 6H445=(kgB4DBA B  Te0(8A4943tttttttttttB6ED2Te0(8A4943ttttttttttF =06Dd BDg B T B BS&H(A tB2&H4tttttt gHpFAEF(T N2w2D84oc_l18b(68) 2
  2476. ( 245) 45: &HE1zD4039( 245) 45: &HE1zD4031313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131.HTee2 B B B B  B B B B AA N4560202040:   T DttttF&H4E445=(kg3xh3  TeD(HEB&HpFAEA0&HH9B953d  3)e579CB9B443 )470sF34d4( T79CB9BtuGE37D9iC4359D82AA71E2uGE3A 3)C994313131 t  D"D DAr B AA N45 B Cs (59)w(wiph3FA45 B Cs (59)w(wip0e 3(wiph3FA4(3httttttttt A41Do2AA NDo2AA'y
  2477.  D: Te1F=77D7B4HB B B B B000)"01) C B CAze(AA NDo2AA tB23)4K(9AA NDo34(2 45( T AK(9AA NDo34(2 45(8) (59)w(wip0eA ND3(8) (59)w(wip0eA ND3(8) (59 2B4CB B B B 6H44444444444444444444444444) ClS0&HCE600000H47nn 9EMax81D0(i2: : D&H1E x81D0(i2:n &HD(3xt CCCCCCC&: : D&H B B 20&1845=(kg3xh3  T B000)"l969 &0l 31313CA tt B B5(8) (5913180(8A4943444444444444Ce1(9clFt A42(DC12u831313131604(3httttttttt A41Do2AA NDo2AA'yoBH60H&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1CFFE54&H38EBEBdHC Fs(1C D& 30EC43D< ttt4d   4e 23B4  D0000H47nn 0H&H38EBEBlhtttd73E62 4F4BT N2sF34B B0(4D439iC4b9sF34B B0(4D439iC43) =F9sF34B ClS0&HCE600000H47nn 9EMax81D0(E60000 B 20&yd4( T D: Te1 0
  2478. g9F79Fe1(   EtD: TeD: Te1 0457575l969 &0l 31313F79Fe1(   E02029DFr9D8i2s XoBH60HM3    3 N2sAH44g p13CA tt 7nn 0H)4K(9AA NAT 36S9 =77D7B4HD7D7BC36S9 Be 23)3xt FD"96:FTd  Te45nn 0H&H38E B B5(8s6969 9 9  (3xt131313N: 30ECF643t i
  2479. FB 20&yd4eDHCE080T 36S9 =77D7B47nn &H 4: paB74F1n &H 4: paB74F1. T: l36F&H38EBnzD40)oC43xtAc_FF6"9NB37fNB4 \969 77D7B4HD7D7BC36S9 Be 23)3xtD7BC36SR Bloc_0
  2480. FB 20e0(u (TAR BlocF7nn &D(u (TAR5C D: 45Eve45nn7oD7B47nn &H 4: paB74F1n &H 4: paB74D&H80D3tHF7:w (4 0 77D7B4HDB335(e 886Cg1B0A NDo2AA BC36S9ee    o4sF4 g8DAC98DS9ee eDHCEBe 444444444484D&H80D3tHF7:w (4 0 77D7B4HDB335(eI(g1.4359D854.0  D0( D&&&(T N2w2D854.0ES &H 4: pFw T4( T2A000H47nn &H 4: paB74F1n &H 4: paB74F1. T:8
  2481. e 2B4 \ Blo6P44g p 2B4CB B B B d4 p 2B4- B B B B o93D< tttttttttt A41Do2AA NtuGE3httttttttt A41DttttE3htttd4000H47n36F7: B B B B B Ca(e 23)   Tp3xt CCCCCCC&: : D&H t A4Do34(2 44 BBr B B32AC= &H7fN H95 B B B da'9NB37fN H95 0: Te0(144943ttttfN H95i2&B32AC= &A6F7: Btt A41Do2AA NtuGE(1ElT4of7n36F7: B 73743tC>BiB Ben47: B 7T: eee D5MaO9BCe1 d8(9B2EA6969 & Size cB)5EA6969 & S &H 4 F4H9oize cB)5d4 B B A4d8(9B2EA6969 & Size cB)5EA6969 & S &H 4 F4H9oize cB)5d4 B B A4d8(9B2EA6969 & Size cB)5EA6969 & SA4)tttt943ttt4e 23B4  D0000H 0(1449436969 u (TAR Bl7D7B4HDC(LnDd B =2E600000H47nn49odB443 )e0(144943ttttfN H95i2&B32AC= &A6F7: Btt A41Do2AA NtuGE(1s (59)w( & S &HEAA NtuGE(1s (59)w( & S &HEAA NtuGE(1s (59)w( & NtuG5u0'D, 42B4&H4D4D9ADd  8'29H58D(C49) 03 C98DSFrH58D(C49) 03 C981D0(i2: :LH4D4D9AD"BCe1 0rttt A41Dr i A(187)81D  BUCe1 013131r Te1 0
  2482. g9B9B)5n0F&HM3    cB)5nCH58D"BCe1 0
  2483. g91   o9CH58D"BCe1 0
  2484. g91 n0F&HM3  H58D(C40A1 n0F&HM3  H58D( B CsoC498Te1  TeD: Te3tttDS946(8: B B 9D24Te Te4D4D9AD7: T1(9U5) 181: :CFAsTAR BloNtuGE(1s (59)w( &rw5C 58D"BCe1 d8(9B2EA6969 & Size cB)5EA6969BtuGE37D9i&H&H9 4Aw Ans34DB2EA69 BDg B T B (doC445Dd If Te0(u (Td  T:74AD9i&F69  D&HTAR B3CB4i&F69  D&HTAR B3C A41Dr iC43o9HTAR B3C A41Dr iCD74Aw Ans39"l90) 6:  Tf Te0(u (T 3"11 0
  2485. g9CB rB8D"B)FA71E2uGE8D3    cBo(u (T 3"11 0
  2486. g9CB rB8D"B)FA71E2uGE8D3   9)FA71E2uGE8D3   9oBH60H&H38EBEBdHC Fs(1CFFE54&H3899g1B9667zd1CFHM3  H587B4HDB335(e 886Cg1B0A NDo2AA BC36S9ee    o4sF4 g8DAC98DS9.58D"BCe1 0
  2487. g9CB rBrw5C 58D"  9)FA71E2uGu (Td  T:74AD9i&F62uGu (Td  T:74AD906or7_240F0FB05)w(wi) = &HD7C1D1D3624&H58D1346
  2488.   r7_240F0F25.:Tee32AB:  :1D1B33ABBdHC Fs(1C7nn &H 4: paB7:1D1Da0E289 ,n:95)(97)449 Da0E289 ,n1 783de0EB 4Chunk58= 3 a5927 194F07 T S&F7&HMaxB9B2D:= = 1 = &H&H&46(8ed7rB3&H868B5d If Te0((LnDd B =2s4DCCr((LnDd B =2s4DCCr*A"  9)FA71E2uGu (Td  T:74AD9i&F62uGu (Td  T:74AD906or7_240F0FB05)w(wi) = &HD7C1D1D3624&H58D1346
  2489.   r7_240F0F25.:Tee32AB:  :1D1B33ABBdHC Fs(1C7nn &H 4: paB7:1D1Da0E289 ,n:95)(97)449 Da0E289 ,n1 783de0EB 4Chunk58= 3 a5927 194F07 T S&F7&HMaxB9B2D:= = 1 = &9D:  TEEA60E2sF B B.A
  2490.     Dn = &9D:(&H7fN H A  3)e5734B &(B T917:1D1Da0E281Do2AA NtuGE(1s (59)w( N2sF34(289 ,n:951 t  D"D54e1   xd73 77D7B4HDB335(eI(g1.4359D854.0  D0( D&&&(T N2w2D854.0ES 5(eI(g1.NtuGE(8 2D3) =B3sF B B3
  2491.     Te1(4p47  9 Be 29ECF64 H A  3))D1Da0EHE1zD40313131313131313131316i4&H4D4.854.0  D0( D&&&(T N2w2D854.H( 2454 34l"H&H&5 Te0(wipherDED &H2&HTe1(59)w(wipherDE TDA(1(85) =w54) 3)ndd(i289 D& 1A3d&HE(as34B 3  6 pa9D:  TEEA41DouGE3h7EA5145)Kp AH44(2 43xt >02:  H  B23)470 H  B23dH  B2( B: (0) =06Dd BA B B2AB: (06Dd BA B B2AB: (0/470 H 4NB33
  2492. g9CB r64359D)5nCH58e1 05)    Tp3xt CCCCCC=D4444444444444) ClS0&HCE600000H47nn 9EMa((LnDd F1(6497nn 9EMa((LnDd F1 95F7: B 737FTd 2AA wTd 954*0(kg= &H54AAAAAAj4l"H&4(8A494&H54AAAAAD &H2&4Dd BDg4CB B B 41Dou2
  2493. ( 245) 45: &HE1zD4039( 0 )w( & S : &HE.CB3BCB9Bc
  2494.   rF&H 4  S :B B B4FB 3  6 p737FTd = &Da0E281DDFAEA0&H:9i&H&H9  13131D< ttttt&H2kgB4Ce1 8&H54AAAAAD &H2&44g p AK(9AA B B B 41DB&H2&485) =w54B 41DB&H2&485) =wEB31313131tuGE(8 2dC B CAze(AA NDo2AA tB23)4K7459 & SC8 B 7:1D1Da0EFF64 H A  ssjD25=(kg= &H54AEB 20&yd4( T 4(2 45(M9D854.0 3&HE14F1n &H4( 0000043&HE14F1n &H4( g1.4359D-de58 B 6B(B6ED2Te57C82(00.D7B4HDB335(eI(g1.4359D854.0  , 09Bf7n