📄 sha256managed.cls
字号:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "SHA256Managed"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
' CopyRight (c) 2006 Kelly Ethridge
'
' This file is part of VBCorLib.
'
' VBCorLib is free software; you can redistribute it and/or modify
' it under the terms of the GNU Library General Public License as published by
' the Free Software Foundation; either version 2.1 of the License, or
' (at your option) any later version.
'
' VBCorLib is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU Library General Public License for more details.
'
' You should have received a copy of the GNU Library General Public License
' along with Foobar; if not, write to the Free Software
' Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
'
' Module: SHA256Managed
'
''
' Provides services to compute the SHA-256 hash value.
'
' @remarks The SHA-256 algorithm is implemented in Visual Basic.
' <p>Details can be found at http://csrc.nist.gov/CryptoToolkit/tkhash.html</p>
' @see HashAlgorithm
'
Option Explicit
Implements IObject
Implements HashAlgorithm
Implements ICryptoTransform
Implements SHA256
Implements IHashAlgorithm
Private mBase As HashAlgorithmBase
Private mW(0 To 79) As Long
Private mK(0 To 63) As Long
Private mState(0 To 7) As Long
''
' Returns if this service provider can be reused to transfrom more data.
'
' @return Always returns True.
'
Public Property Get CanReuseTransform() As Boolean
CanReuseTransform = True
End Property
''
' Returns if this transform can operate on multiple blocks at once.
'
' @return Always returns True.
'
Public Property Get CanTransformMultipleBlocks() As Boolean
CanTransformMultipleBlocks = True
End Property
''
' Returns the computed hash.
'
' @return A 32-byte array containing the hash value.
' @remarks The TransformFinalBlock must be called before accessing
' this property or an InvalidOperationException will be thrown.
'
Public Property Get Hash() As Byte()
Hash = mBase.Hash
End Property
''
' Returns the size of the computed hash.
'
' @return Always returns 256 bits.
'
Public Property Get HashSize() As Long
HashSize = 256
End Property
''
' Returns the input block size this transform can work on.
'
' @return Always returns 1.
' @remarks When calling the TransformBlock method, the InputCount must be zero or a multiple of this value.
'
Public Property Get InputBlockSize() As Long
InputBlockSize = 1
End Property
''
' Returns the output block size this transform can produce.
'
' @return Always returns 1.
'
Public Property Get OutputBlockSize() As Long
OutputBlockSize = 1
End Property
''
' Releases any resources.
'
Public Sub Clear()
Call mBase.Clear
End Sub
''
' Computes a hash value for a source in a single pass.
'
' @param Source This can be either a Byte array or any Stream compatible object.
' @param Index The starting index in the Byte array. This is ignored for Stream objects.
' @param Count The number of bytes in the array to be computed. This is ignored for Stream objects.
' @return A 32-byte hash value.
' @remarks If a Stream object is passed in, then the stream is continuously read and the hash calculated until
' there is no more data left to read from the stream.
'
Public Function ComputeHash(ByRef Source As Variant, Optional ByRef Index As Variant, Optional ByRef Count As Variant) As Byte()
ComputeHash = mBase.ComputeHash(Source, Index, Count)
End Function
''
' Resets the hashing algorithm to start again.
'
Public Sub Initialize()
Erase mW
mState(0) = &H6A09E667
mState(1) = &HBB67AE85
mState(2) = &H3C6EF372
mState(3) = &HA54FF53A
mState(4) = &H510E527F
mState(5) = &H9B05688C
mState(6) = &H1F83D9AB
mState(7) = &H5BE0CD19
Call mBase.Initialize
End Sub
''
' Computes the hash for the specified block of data.
'
' @param InputBuffer The data to compute the hash from.
' @param InputOffset The starting index in the input data to compute the hash.
' @param InputCount The number of bytes to compute the hash from.
' @param OutputBuffer The array to place the input buffer bytes in.
' @param OutputOffset The starting index to beging copying the bytes to.
' @return The number of bytes processed.
' @remarks The OutputBuffer will contain the same data as the InputBuffer. No hash values are placed in the OutputBuffer.
' <p>If the OutputBuffer is a Null Array, or is the same array as the InputBuffer and the OutputOffset equals the InputOffset, then nothing is copied, however, the hash is still computed
' on the InputBuffer data.</p>
' <p>The TransformFinalBlock needs to be called to finish computing the hash, this method alone cannot compute the entire hash.</p>
'
Public Function TransformBlock(ByRef InputBuffer() As Byte, ByVal InputOffset As Long, ByVal InputCount As Long, ByRef OutputBuffer() As Byte, ByVal OutputOffset As Long) As Long
TransformBlock = mBase.TransformBlock(InputBuffer, InputOffset, InputCount, OutputBuffer, OutputOffset)
End Function
''
' Computes the final hash value.
'
' @param InputBuffer The final block of data to compute the hash for.
' @param InputOffset The index in the InputBuffer to begin computing data.
' @param InputCount The number of bytes to be processed.
' @return Returns the section of the InputBuffer that was processed.
' @remarks This does not return the computed hash value. A copy of the data that was
' process is returned. To retrieve the hash value, call the Hash property.
'
Public Function TransformFinalBlock(ByRef InputBuffer() As Byte, ByVal InputOffset As Long, ByVal InputCount As Long) As Byte()
TransformFinalBlock = mBase.TransformFinalBlock(InputBuffer, InputOffset, InputCount)
End Function
''
' This function determines if the value passed in is the same
' as the current object instance. Meaning, are the Value and
' this object the same object in memory.
'
' @param Value The value to compare against this instance.
' @return Returns True if the values are the same.
'
Public Function Equals(ByRef Value As Variant) As Boolean
Equals = Object.Equals(Me, Value)
End Function
''
' Returns a psuedo-unique number used to help identify this
' object in memory. The current method is to return the value
' obtained from ObjPtr. If a different method needs to be impelmented
' then change the method here in this function.
'
' @return Returns a number identifing this instance.
'
Public Function GetHashCode() As Long
GetHashCode = ObjPtr(CUnk(Me))
End Function
''
' Returns a string representation of this object instance.
' The default method simply returns the application name
' and class name in which this class resides.
'
' @return Returns a string representation of this instance.
'
Public Function ToString() As String
ToString = Object.ToString(Me, App)
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Private Helpers
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Function HashFinal(ByRef Buffer() As Byte, ByVal BufferCount As Long, ByVal MessageLength As Currency) As Byte()
Buffer(BufferCount) = &H80
BufferCount = BufferCount + 1
Dim Size As Long
Size = IIf(BufferCount > 56, 128, 64)
Dim FinalBuffer() As Byte
ReDim FinalBuffer(0 To Size - 1)
Call CopyMemory(FinalBuffer(0), Buffer(0), BufferCount)
Dim i As Long
With AsOByteArr(MessageLength * 0.0008@)
For i = 0 To 7
FinalBuffer(Size - i - 1) = .Bytes(i)
Next i
End With
Call Transform(FinalBuffer, 0)
If Size = 128 Then Call Transform(FinalBuffer, 64)
Dim Ret() As Byte
ReDim Ret(31)
For i = 0 To 7
AsLong(Ret(i * 4)) = SwapEndian(mState(i))
Next i
HashFinal = Ret
End Function
Private Sub Transform(ByRef Bytes() As Byte, ByVal Index As Long)
If InIDE Then
Call TransformIDE(Bytes, Index)
Else
Call TransformNative(Bytes, Index)
End If
End Sub
''
' Runs in the IDE.
'
Private Sub TransformIDE(ByRef Bytes() As Byte, ByVal Index As Long)
Dim i As Long
For i = 0 To 15
mW(i) = SwapEndian(AsLong(Bytes(Index)))
Index = Index + 4
Next i
Dim s0 As Long
Dim s1 As Long
For i = 16 To 63
s0 = RRotate(mW(i - 15), 7) Xor RRotate(mW(i - 15), 18) Xor Helper.ShiftRight(mW(i - 15), 3)
s1 = RRotate(mW(i - 2), 17) Xor RRotate(mW(i - 2), 19) Xor Helper.ShiftRight(mW(i - 2), 10)
mW(i) = Helper.UAdd(Helper.UAdd(Helper.UAdd(mW(i - 16), s0), s1), mW(i - 7))
Next i
Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
Dim f As Long
Dim g As Long
Dim h As Long
Dim T1 As Long
Dim Maj As Long
Dim T2 As Long
Dim Ch As Long
a = mState(0)
b = mState(1)
c = mState(2)
d = mState(3)
e = mState(4)
f = mState(5)
g = mState(6)
h = mState(7)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -