News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

MD5 from CSP

Started by MichaelW, June 05, 2010, 10:12:01 AM

Previous topic - Next topic

MichaelW


;==============================================================================
    include \masm32\include\masm32rt.inc
    include \masm32\include\advapi32.inc
    includelib \masm32\lib\advapi32.lib
;==============================================================================

    ALG_CLASS_HASH  equ 4 SHL 13
    ALG_TYPE_ANY    equ 0
    ALG_SID_MD5     equ 3
    CALG_MD5        equ ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_MD5

    ;------------------------------------------------------------
    ; This and similar probably require Windows XP SP3 or later:
    ;------------------------------------------------------------

    ALG_SID_SHA_256 equ 12
    CALG_SHA_256    equ ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_SHA_256

;==============================================================================
    .data
        hProv     dd 0
        hHash     dd 0
        dwDataLen dd 0
        szSample  db "The quick brown fox jumps over the lazy dog",0
    .code
;==============================================================================
start:
;==============================================================================

    ;----------------------------------------------------------------------
    ; Acquire a context handle for a cryptographic service provider (CSP).
    ;----------------------------------------------------------------------

    invoke CryptAcquireContext, ADDR hProv,
                                NULL,
                                NULL,
                                PROV_RSA_FULL,
                                CRYPT_VERIFYCONTEXT
    .IF eax == 0
        print LastError$(),13,10
    .ENDIF

    ;------------------------------------------------------------------
    ; Create an empty hash object that will use the desired algorithm.
    ;------------------------------------------------------------------

    invoke CryptCreateHash, hProv, CALG_MD5, 0, 0, ADDR hHash
    .IF eax == 0
        print LastError$(),13,10
    .ENDIF

    ;-----------------------
    ; Hash the sample data.
    ;-----------------------

    invoke CryptHashData, hHash, ADDR szSample, SIZEOF szSample - 1, 0
    .IF eax == 0
        print LastError$(),13,10
    .ENDIF

    ;-----------------------------------------------------
    ; Get the required buffer size and allocate a buffer.
    ;-----------------------------------------------------

    invoke CryptGetHashParam, hHash, HP_HASHVAL, NULL, ADDR dwDataLen, 0
    .IF eax == 0
        print LastError$(),13,10
    .ENDIF
    print str$(dwDataLen),13,10
    mov edi, alloc(dwDataLen)

    ;----------------------
    ; Get the hash value.
    ;----------------------

    invoke CryptGetHashParam, hHash, HP_HASHVAL, edi, ADDR dwDataLen, 0
    .IF eax == 0
        print LastError$(),13,10
    .ENDIF

    ;------------------------------------------------
    ; Display the sample and the correct hash value.
    ;------------------------------------------------

    print ADDR szSample, 13,10
    print "9e107d9d372bb6826bd81d3542a419d6",13,10

    ;----------------------------------
    ; Display the returned hash value.
    ;----------------------------------

    xor ebx, ebx
    .WHILE ebx < dwDataLen
        movzx edx, BYTE PTR [edi+ebx]
        invoke crt_printf, cfm$("%02x"), edx
        inc ebx
    .ENDW
    print chr$(13,10)

    ;--------------------------
    ; Destroy the hash object.
    ;--------------------------

    invoke CryptDestroyHash, hHash

    ;---------------------------------
    ; Release the CSP context handle.
    ;---------------------------------

    invoke CryptReleaseContext, hProv, 0

    ;------------------
    ; Free the buffer.
    ;------------------

    free edi

    inkey "Press any key to exit..."
    exit
;==============================================================================
end start

eschew obfuscation