Hello jNizM, thanks again for these functions. Is it so important to have separate functions for every algorithm? Is that for performance? I've combined all of my hashing needs into 4 functions. These functions are working but I intend to tidy them further. Thanks.
Code: Select all
;==================================================
;based on bcrypt_sha1_file() by jNizM
;AHK_CNG/src/hash/win7 at master · jNizM/AHK_CNG · GitHub
;https://github.com/jNizM/AHK_CNG/tree/master/src/hash/win7
;vAlg e.g. MD2,MD4,MD5,SHA1,SHA256,SHA384,SHA512
;note: doesn't handle CRC-32
;CNG Algorithm Identifiers - Windows applications | Microsoft Docs
;https://docs.microsoft.com/en-gb/windows/desktop/SecCNG/cng-algorithm-identifiers
JEE_FileGetHashBCrypt(vPath, vAlg, vDoLoadFree:=1)
{
local
static BCRYPT_OBJECT_LENGTH := "ObjectLength"
static BCRYPT_HASH_LENGTH := "HashDigestLength"
if InStr(vAlg, "-")
vAlg := StrReplace(vAlg, "-")
hAlgo := cbHashObject := cbResult := cbHash := hHash := 0
if vDoLoadFree && !(hBCRYPT := DllCall("LoadLibrary", "str", "bcrypt.dll", "ptr"))
return
if (NT_STATUS := DllCall("bcrypt\BCryptOpenAlgorithmProvider", "ptr*", hAlgo, "ptr", &vAlg, "ptr", 0, "uint", 0) != 0)
return
if (NT_STATUS := DllCall("bcrypt\BCryptGetProperty", "ptr", hAlgo, "ptr", &BCRYPT_OBJECT_LENGTH, "uint*", cbHashObject, "uint", 4, "uint*", cbResult, "uint", 0) != 0)
return
if (NT_STATUS := DllCall("bcrypt\BCryptGetProperty", "ptr", hAlgo, "ptr", &BCRYPT_HASH_LENGTH, "uint*", cbHash, "uint", 4, "uint*", cbResult, "uint", 0) != 0)
return
VarSetCapacity(pbHashObject, cbHashObject, 0)
if (NT_STATUS := DllCall("bcrypt\BCryptCreateHash", "ptr", hAlgo, "ptr*", hHash, "ptr", &pbHashObject, "uint", cbHashObject, "ptr", 0, "uint", 0, "uint", 0) != 0)
return
if !(oFile := FileOpen(vPath, "r", "UTF-8"))
return
oFile.Seek(0)
while (vBytesRead := oFile.RawRead(vData, 0x40000))
if (NT_STATUS := DllCall("bcrypt\BCryptHashData", "ptr", hHash, "ptr", &vData, "uint", vBytesRead, "uint", 0) != 0)
return
oFile.Close()
VarSetCapacity(pbHash, cbHash, 0)
if (NT_STATUS := DllCall("bcrypt\BCryptFinishHash", "ptr", hHash, "ptr", &pbHash, "uint", cbHash, "uint", 0) != 0)
return
hash := ""
Loop, % cbHash
hash .= Format("{:02x}", NumGet(pbHash, A_Index - 1, "uchar"))
DllCall("bcrypt\BCryptDestroyHash", "ptr", hHash)
DllCall("bcrypt\BCryptCloseAlgorithmProvider", "ptr", hAlgo, "uint", 0)
if vDoLoadFree
DllCall("FreeLibrary", "ptr", hBCRYPT)
return hash
}
;==================================================
JEE_BinGetHashBCrypt(vAddr, vSize, vAlg, vDoLoadFree:=1)
{
local
static BCRYPT_OBJECT_LENGTH := "ObjectLength"
static BCRYPT_HASH_LENGTH := "HashDigestLength"
if InStr(vAlg, "-")
vAlg := StrReplace(vAlg, "-")
hAlgo := cbHashObject := cbResult := cbHash := hHash := 0
if vDoLoadFree && !(hBCRYPT := DllCall("LoadLibrary", "str", "bcrypt.dll", "ptr"))
return
if (NT_STATUS := DllCall("bcrypt\BCryptOpenAlgorithmProvider", "ptr*", hAlgo, "ptr", &vAlg, "ptr", 0, "uint", 0) != 0)
return
if (NT_STATUS := DllCall("bcrypt\BCryptGetProperty", "ptr", hAlgo, "ptr", &BCRYPT_OBJECT_LENGTH, "uint*", cbHashObject, "uint", 4, "uint*", cbResult, "uint", 0) != 0)
return
if (NT_STATUS := DllCall("bcrypt\BCryptGetProperty", "ptr", hAlgo, "ptr", &BCRYPT_HASH_LENGTH, "uint*", cbHash, "uint", 4, "uint*", cbResult, "uint", 0) != 0)
return
VarSetCapacity(pbHashObject, cbHashObject, 0)
if (NT_STATUS := DllCall("bcrypt\BCryptCreateHash", "ptr", hAlgo, "ptr*", hHash, "ptr", &pbHashObject, "uint", cbHashObject, "ptr", 0, "uint", 0, "uint", 0) != 0)
return
if (NT_STATUS := DllCall("bcrypt\BCryptHashData", "ptr", hHash, "ptr", vAddr, "uint", vSize, "uint", 0) != 0)
return
VarSetCapacity(pbHash, cbHash, 0)
if (NT_STATUS := DllCall("bcrypt\BCryptFinishHash", "ptr", hHash, "ptr", &pbHash, "uint", cbHash, "uint", 0) != 0)
return
hash := ""
Loop, % cbHash
hash .= Format("{:02x}", NumGet(pbHash, A_Index - 1, "uchar"))
DllCall("bcrypt\BCryptDestroyHash", "ptr", hHash)
DllCall("bcrypt\BCryptCloseAlgorithmProvider", "ptr", hAlgo, "uint", 0)
if vDoLoadFree
DllCall("FreeLibrary", "ptr", hBCRYPT)
return hash
}
;==================================================
;based on CRC32_File() by jNizM
;however, the output is uppercase/no '0x'/always 8 characters
;AHK_Scripts/src/hash_checksum at master · jNizM/AHK_Scripts · GitHub
;https://github.com/jNizM/AHK_Scripts/tree/master/src/hash_checksum
;get CRC-32 hash value, read file in chunks - AutoHotkey Community
;https://autohotkey.com/boards/viewtopic.php?f=5&t=31329
;Wine API: RtlComputeCrc32
;https://source.winehq.org/WineAPI/RtlComputeCrc32.html
JEE_FileGetHashCRC32(vPath)
{
local
if !(oFile := FileOpen(vPath, "r", "UTF-8"))
return
oFile.Seek(0)
vHash := 0
while (vBytesRead := oFile.RawRead(vData, 0x40000))
vHash := DllCall("ntdll\RtlComputeCrc32", UInt,vHash, Ptr,&vData, Int,vBytesRead, UInt)
oFile.Close()
return Format("{:08X}", vHash)
}
;==================================================
JEE_BinGetHashCRC32(vAddr, vSize, vDoLoadFree:=1)
{
local
vHash := 0
vHash := DllCall("ntdll\RtlComputeCrc32", UInt,vHash, Ptr,vAddr, Int,vSize, UInt)
return Format("{:08X}", vHash)
}
;==================================================