Jump to content

Recommended Posts

Posted (edited)

Here is my GUI wrapper for the hashing functions in TheXman's excellent CryptoNG UDF, which implements some of Microsoft's Cryptography API: Next Generation (CNG) Win32 API functions. Comments and suggestions are welcome!

Many thanks to TheXman for his comments on earlier versions of this script.

; GUI wrapper for TheXMan's CryptoNG hashing functions
; CLD rev. 2020-10-03

#include "CryptoNG.au3"
#include <ButtonConstants.au3>
#include <FontConstants.au3>
#include <GUIConstants.au3>
#include <MsgBoxConstants.au3>

AutoItSetOption("MustDeclareVars", 1)

Global $sDefaultAlg = "SHA256"
Global $aHashAlgs = _CryptoNG_EnumAlgorithms($CNG_BCRYPT_HASH_OPERATION)
Global $sHashAlgs = "", $sAlg = "(none)"
For $i = 0 To UBound($aHashAlgs) - 1
    If $aHashAlgs[$i] <> $sDefaultAlg And Not StringInStr($aHashAlgs[$i], "AES") Then
        $sHashAlgs &=  $aHashAlgs[$i] & "|"
    Else
        ContinueLoop
    EndIf
Next
$sHashAlgs = StringTrimRight($sHashAlgs, 1)

Global $sProviders = "", $sSelectedProvider = ""
Global $aHashProv = _CryptoNG_EnumRegisteredProviders()
For $i = 0 To UBound($aHashProv) - 1
    $sProviders &= $aHashProv[$i] & "|"
Next
$sProviders = StringTrimRight($sProviders, 1)

Global $sInput = "", $vOutput = "", $bErr = 0
Global $bHMAC = 0, $sHMACpw = ""
Global $vSalt = "", $iIters = 0, $iDKeyBitLen = 0

Global $sKeyBitLens = "", $iX = 7
For $i = 8 To 64
    $sKeyBitLens &= String($i * 8) & "|"
Next
$sKeyBitLens = StringTrimRight($sKeyBitLens, 1)

; GUI interface
; -------------
Global $hgHHr = GUICreate("CryptoNG Hasher", 965, 455, -1, -1, $WS_EX_APPWINDOW)
GUISetFont(10, $FW_SEMIBOLD, $GUI_FONTNORMAL, "", $hgHHr, $ANTIALIASED_QUALITY)
GUICtrlCreateLabel("Hash type", 25, 10, 110, 20)
Global $hgAlg = GUICtrlCreateCombo("SHA256", 25, 35, 110, 25, -1, $ES_RIGHT)
GUICtrlSetData($hGAlg, $sHashAlgs, "")

GUICtrlCreateLabel("Provider", 150, 10, 160, 20)
Global $hgProv = GUICtrlCreateCombo("default", 150, 35, 355, 25)
GUICtrlSetData($hgProv, $sProviders, "")

Global $hgHMACch = GUICtrlCreateCheckBox("HMAC", 515, 35, 85, 25)
GUICtrlSetState($hgHMACch, $GUI_UNCHECKED)
GUICtrlCreateLabel("pw: ", 600, 35, 25, 25)
Global $hgHMACpw = GUICtrlCreateInput("", 635, 35, 300, 25)
GUICtrlSetState($hgHMACpw, $GUI_DISABLE)

GUICtrlCreateLabel("Input: ", 25, 75, 40, 20)
Global $hgStrIn = GUICtrlCreateEdit("", 25, 100, 910, 60, $WS_VSCROLL+$ES_AUTOVSCROLL)
GUICtrlSetState($hgStrIn, $GUI_ENABLE+$GUI_FOCUS)
GUICtrlSetData($hgStrIn, "")

Global $hgStrB = GUICtrlCreateRadio("string", 25, 165, 75, 25)
Global $hgFnmB = GUICtrlCreateRadio("filename", 110, 165, 100, 25)
Global $hgPBKB = GUICtrlCreateRadio("password (PBKDF2)", 215, 165, 190, 25)
GUICtrlSetState($hgStrB, $GUI_ENABLE + $GUI_CHECKED)
GUICtrlSetState($hgFnmB, $GUI_ENABLE + $GUI_UNCHECKED)
GUICtrlSetState($hgPBKB, $GUI_ENABLE + $GUI_UNCHECKED)
GUICtrlCreateLabel("salt: ", 45, 200, 30, 25)
Global $hgPBKDFisalt = GUICtrlCreateInput("", 85, 200, 260, 25)
GUICtrlCreateLabel("key bit length: ", 355, 200, 120, 25)
Global $hgPBKDFikyln = GUICtrlCreateCombo("", 475, 200, 60, 25)
GUICtrlSetData($hgPBKDFikyln, $sKeyBitLens, "")
GUICtrlCreateLabel("iterations: ", 550, 200, 135, 25)
Global $hgPBKDFiiter = GUICtrlCreateInput("", 650, 200, 110, 25)
GUICtrlSetState($hgPBKDFisalt, $GUI_DISABLE)
GUICtrlSetState($hgPBKDFikyln, $GUI_DISABLE)
GUICtrlSetState($hgPBKDFiiter, $GUI_DISABLE)

GUICtrlCreateLabel("Hash copied to clipboard:", 25, 250, 220, 20)
Global $hgBiOut = GUICtrlCreateEdit("", 25, 280, 910, 60,  $WS_VSCROLL+$ES_AUTOVSCROLL)
GUICtrlSetState($hgBiOut, $GUI_ENABLE)

Global $hgStart = GUICtrlCreateButton("HASH", 375, 363, 85, 40, $BS_DEFPUSHBUTTON)
GUICtrlSetState($hgStart, $GUI_ENABLE)

Global $hgClear = GUICtrlCreateButton("Clear form", 480, 363, 100, 40)
GUICtrlSetState($hgClear, $GUI_ENABLE)

GUISetState(@SW_SHOW, $hgHHr)

While 1
    Switch GUIGetMsg()

        Case $hgAlg
            $sAlg = GUICtrlRead($hgAlg)

        Case $hgHMACch
            If GUICtrlRead($hgHMACch) = $GUI_CHECKED Then
                GUICtrlSetState($hgHMACpw, $GUI_ENABLE)
            Else
                GUICtrlSetState($hgHMACpw, $GUI_DISABLE)
            EndIf
            GUICtrlSetState($hgStrIn, $GUI_FOCUS)

        Case $hgStrB
            If GUICtrlRead($hgStrB) = $GUI_CHECKED Then
                GUICtrlSetState($hgPBKDFisalt, $GUI_DISABLE)
                GUICtrlSetState($hgPBKDFikyln, $GUI_DISABLE)
                GUICtrlSetState($hgPBKDFiiter, $GUI_DISABLE)
            Else
                GUICtrlSetState($hgPBKDFisalt, $GUI_ENABLE)
                GUICtrlSetState($hgPBKDFikyln, $GUI_ENABLE)
                GUICtrlSetState($hgPBKDFiiter, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($hgStrIn, $GUI_FOCUS)

        Case $hgFnmB
            If GUICtrlRead($hgFnmB) = $GUI_CHECKED Then
                GUICtrlSetState($hgPBKDFisalt, $GUI_DISABLE)
                GUICtrlSetState($hgPBKDFikyln, $GUI_DISABLE)
                GUICtrlSetState($hgPBKDFiiter, $GUI_DISABLE)
            Else
                GUICtrlSetState($hgPBKDFisalt, $GUI_ENABLE)
                GUICtrlSetState($hgPBKDFikyln, $GUI_ENABLE)
                GUICtrlSetState($hgPBKDFiiter, $GUI_ENABLE)
            EndIf
            GUICtrlSetState($hgStrIn, $GUI_FOCUS)

        Case $hgPBKB
            If GUICtrlRead($hgPBKB) = $GUI_CHECKED Then
                GUICtrlSetState($hgPBKDFisalt, $GUI_ENABLE)
                GUICtrlSetState($hgPBKDFikyln, $GUI_ENABLE)
                GUICtrlSetState($hgPBKDFiiter, $GUI_ENABLE)
            Else
                GUICtrlSetState($hgPBKDFisalt, $GUI_DISABLE)
                GUICtrlSetState($hgPBKDFikyln, $GUI_DISABLE)
                GUICtrlSetState($hgPBKDFiiter, $GUI_DISABLE)
            EndIf
            GUICtrlSetState($hgStrIn, $GUI_FOCUS)

        Case $hgStart
            If Not GUICtrlRead($hgStrIn) Then
                GUICtrlSetState($hgStrIn, $GUI_FOCUS)
                ContinueLoop
            EndIf
            GUICtrlSetData($hgBiOut, "")
            $sAlg = GUICtrlRead($hgAlg)
            If Not $sAlg Then
                MsgBox(0, @ScriptName, "Select a hash type")
                GUICtrlSetState($hgAlg, $GUI_FOCUS)
                ContinueLoop
            EndIf
            $sSelectedProvider = GUICtrlRead($hgProv)
            If Not $sSelectedProvider Or $sSelectedProvider = "default" Then $sSelectedProvider = Default

            If GUICtrlRead($hgHMACch) = $GUI_CHECKED Then
                $bHMAC = 1
                $sHMACpw = GUICtrlRead($hgHMACpw)
                If Not $sHMACpw Then
                    MsgBox($MB_ICONINFORMATION, @ScriptName, "Missing HMAC password")
                    GUICtrlSetState($hgHMACpw, $GUI_FOCUS)
                    ContinueLoop
                EndIf
            EndIf

            $sInput = GUICtrlRead($hgStrIn)
            If Not $sInput Then ContinueLoop

            If GUICtrlRead($hgPBKB) = $GUI_CHECKED Then
                $vSalt = GUICtrlRead($hgPBKDFisalt)
                $iIters = GUICtrlRead($hgPBKDFiiter)
                $iDKeyBitLen = GUICtrlRead($hgPBKDFikyln)
            EndIf

            $bErr = 0
            If GUICtrlRead($hgStrB) = $GUI_CHECKED Then
                $vOutPut = _CryptoNG_HashData($sAlg, $sInput, $bHMAC, $sHMACpw, $sSelectedProvider)
                If @error Then $bErr = 1
            ElseIf GUICtrlRead($hgFnmB) = $GUI_CHECKED Then
                If FileExists($sInput) Then
                    $vOutPut = _CryptoNG_HashFile($sAlg, $sInput, $bHMAC, $sHMACpw, $sSelectedProvider)
                    If @error Then $bErr = 1
                Else
                    MsgBox($MB_ICONINFORMATION, @ScriptName, "File """ & $sInput & """ does not exist!")
                    GUICtrlSetState($hgStrIn, $GUI_FOCUS)
                    ContinueLoop
                EndIf
            ElseIf GUICtrlRead($hgPBKB) = $GUI_CHECKED Then
                If Not $vSalt Then
                    MsgBox($MB_ICONINFORMATION, @ScriptName, "Missing salt")
                    GUICtrlSetState($hgPBKDFisalt, $GUI_FOCUS)
                    ContinueLoop
                EndIf                   
                If Not $iDKeyBitLen Then
                    MsgBox($MB_ICONINFORMATION, @ScriptName, "Missing key bit length")
                    GUICtrlSetState($hgPBKDFiiter, $GUI_FOCUS)
                    ContinueLoop
                EndIf
                If Not $iIters Then
                    MsgBox($MB_ICONINFORMATION, @ScriptName, "Missing number of iterations")
                    GUICtrlSetState($hgPBKDFiiter, $GUI_FOCUS)
                    ContinueLoop
                EndIf
                $vOutPut = _CryptoNG_PBKDF2($sInput, $vSalt, $iIters, $iDKeyBitLen, $sAlg, $sSelectedProvider)
                If @error Then $bErr = 1
            Else
                ContinueLoop
            EndIf

            If $bErr Then
                MsgBox($MB_ICONINFORMATION, @ScriptName, _CryptoNG_LastErrorMessage())
                GUICtrlSetState($hgStrIn, $GUI_FOCUS)
            EndIf
            If $vOutPut Then ClipPut($vOutPut)
            GUICtrlSetData($hgBiOut, $vOutPut)
            Sleep(50)
            Send("{home}")
            GUICtrlSetState($hgStrIn, $GUI_FOCUS)
            $sAlg = ""
            $sInput = ""
            $bHMAC = 0
            $sHMACpw = ""
            $sSelectedProvider = ""
            $vSalt = ""
            $iIters = ""
            $iDKeyBitLen = 0 

        Case $hgClear
            GUICtrlSetData($hgStrIn, "")
            GUICtrlSetData($hgBiOut, "")
            GUICtrlSetState($hgStrIn, $GUI_FOCUS)

        Case $GUI_EVENT_CLOSE
            GUISetState(@SW_HIDE, $hgHHr)
            Exit
    EndSwitch
WEnd

Exit
;

 

 

Edited by CarlD

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...