'-------------------------------------------------------------------------------- ' FAST SHA1 CALCULATION BASED ON MS ADVAPI32.DLL BY CRYPTOMAN ' ' BASED ON SHA256 EXAMPLE BY RICHARD T. RUSSEL AUTHOR OF LBB ' ' http://lbb.conforums.com/ ' ' VERIFY CORRECTNESS BY http://www.fileformat.info/tool/hash.htm ' '-------------------------------------------------------------------------------- print sha1$("Rosetta Code") end X$="1234567890ABCDEF" dat$ = pack$(X$) print "SPEED TEST" for i=1 to 20 t1=time$("ms") print sha1$(dat$) t2=time$("ms") print "calculated in ";t2-t1;" ms" next end function sha1$(message$) HP.HASHVAL = 2 CRYPT.NEWKEYSET = 48 PROV.RSA.AES = 24 buffer$ = space$(128) PROVRSAFULL = 1 ALGCLASSHASH = 32768 ALGTYPEANY = 0 ALGSIDMD2 = 1 ALGSIDMD4 = 2 ALGSIDMD5 = 3 ALGSIDSHA1 = 4 ALGOSHA1 = ALGCLASSHASH OR ALGTYPEANY OR ALGSIDSHA1 struct temp, v as long open "ADVAPI32.DLL" for dll as #advapi32 calldll #advapi32, "CryptAcquireContextA", temp as struct, _ 0 as long, 0 as long, PROV.RSA.AES as long, _ 0 as long, re as long hprov = temp.v.struct calldll #advapi32, "CryptCreateHash", hprov as long, _ ALGOSHA1 as long, 0 as long, 0 as long, _ temp as struct, re as long hhash = temp.v.struct l = len(message$) calldll #advapi32, "CryptHashData", hhash as long, message$ as ptr, _ l as long, 0 as long, re as long temp.v.struct = len(buffer$) calldll #advapi32, "CryptGetHashParam", hhash as long, _ HP.HASHVAL as long, buffer$ as ptr, _ temp as struct, 0 as long, re as long calldll #advapi32, "CryptDestroyHash", hhash as long, re as long calldll #advapi32, "CryptReleaseContext", hprov as long, re as long close #advapi32 for i = 1 TO temp.v.struct sha1$ = sha1$ + right$("0" + dechex$(asc(mid$(buffer$,i))), 2) next end function function pack$(x$) for i = 1 TO len(x$) step 2 pack$ = pack$ + chr$(hexdec(mid$(x$,i,2))) next end function