© 2008 W.Ehrhardt Last update Sep. 07, 2008
Home CRC/Hash Crypto Misc. Info Links Deutsch

CRC / HASH / HMAC

Here you find a few Pascal / Delphi source and binary files related to CRC, hash, and HMAC calculations. All files can be used and distributed under this license, the original template of the zlib/libpng license can be found here: zlib-license.

Before downloading any software from this site please read this legal notice.

The basic routines in crc_hash_2008-09-07.zip can be compiled with most current Pascal (TP 5/5.5/6, BP 7, VP 2.1, FPC 1.0/2.0/2.2) and Delphi versions (tested with V1 up to V7/9/10).


Last changes: 
Since Feb. 2006 there is a new Hash/HMAC architecture: Hash descriptor records allow a simple and uniform HMAC implementation for all hash algorithms; the key derivation functions can use all supported hash algorithms. A separate short introduction gives some more information about the Hash/HMAC units and procedures.

Since May 2008 the cryptographic hash and HMAC routines support messages with arbitrary bit lengths.


The basic routines were slightly improved in the previous versions, but optimizing seems to be black magic. The cycles/times are heavily dependent on CPU, cache, compiler, code position, etc. For example: if the SHA256 loop is unrolled, the calculation slows down for about 40% on one machine (1.8GHz P4, D6, Win98), but is about 15% faster on another (AMD 2600+, D5, Win98). In the archive sha256unroll.zip you can find some snippets related to SHA256 loop unrolling.

With the test program T_SpeedA and the high resolution timer from hrtimer you can measure the CPU cycles per byte (Cyc/B) and the processing rate in MB/s (note that the CPU frequency is determined dynamically). Here are the values for Delphi/FPC on Win98 with Pentium 4 / 1.8 GHz using a blocksize of 50000 bytes (Std: standard routines with BASM, PP: Pure Pascal with inline for D10 and FPC2.2 -O3):

D3/Std D3/Std D6/Std D6/PP D10/PP FPC/PP
Name MB/s Cyc/B Cyc/B Cyc/B Cyc/B Cyc/B
CRC16 206.37 8.7 8.8 34.4 27.6 45.6
CRC24 185.48 9.7 9.7 31.0 27.5 43.0
CRC32 287.27 6.2 6.4 18.7 19.7 22.8
FCRC32 406.65 4.4 4.5 20.0 18.7 18.9
Adler32 400.05 4.5 5.1 4.7 3.8 8.4
CRC64 95.33 18.8 18.7 96.4 98.2 64.8
eDonkey 212.36 8.4 8.4 8.4 8.6 21.6
MD4 214.93 8.3 8.4 8.4 8.4 20.1
MD5 155.54 11.5 11.6 11.6 11.7 31.7
RMD160 55.00 32.6 33.1 33.1 32.0 92.9
SHA1 51.04 35.1 36.7 40.0 36.3 45.2
SHA224 30.35 59.1 58.9 72.3 53.1 55.2
SHA256 30.79 58.2 58.1 72.1 52.1 54.7
SHA384 10.06 178.3 213.7 214.3 213.3 205.8
SHA512 10.06 178.3 213.1 213.6 214.3 201.0
Whirlpool 17.60 101.9 132.3 132.4 102.8 101.0

MD4, eDonkey/eMule: For files/messages with a multiple of 9728000 bytes the eDonkey and eMule hashes are different; the ed2k unit always calculates both digests. The demo programs and the FAR plugin display both values if they are different.

Int64 support for SHA384/512:  Unfortunately there are conflicting processor specific results: on a P4 / 1.8GHz the speed decreases to 83% of the longint speed (Cyc/B increase from 174 to 209). For a Celeron 500MHz the speed increases more than 30%, the Cyc/B decrease from 146 (longint) to 111 (Int64). In the source Int64 is default for D4+ and FPC (conditional define UseInt64 in SHA512.PAS)

BASM16 table alignment: Because some BASM16 implementations use 32 bit access to 32 bit tables, these tables should be dword aligned for optimal speed. But the 16 bit compilers support byte or word alignment only! Therefore the defines from the align.inc include file allow to generate dummy words, which align the tables to 32 bit boundaries. This feature is implemented for CRC24 ... CRC64; if more than one of these units are used, it may be necessary to iterate the alignment procedure.

Rocksoft™ Model CRC Algorithm: The crcmodel unit is a Pascal implementation of Ross William's parameterized model CRC algorithm described in A Painless Guide to CRC Error Detection Algorithms. Most of the usual CRC algorithms with polynomials up to degree 32 can be modeled by this unit. The crcm_cat unit has predefined parameter records for more than 30 CRC algorithms, most of them adapted from Greg Cook's Catalogue of Parameterised CRC Algorithms, more references are listed in the unit header. The GUI demo program tcrc16 interactively calculates and displays the results from all CRC16 algorithms for hex and string input.


Pure Pascal versions: The archive ppch_2008-05-21.zip contains pure Pascal versions of the basic routines without BASM. The units in the archive are replacements for the standard source. The main purpose is to supply sources for more portable code (e.g. for Linux/ARM). Consequently the code layout is for FPC without asm, but it can be compiled with Delphi 4+. The new std.inc defines {$asmmode intel} if compiled with FPC for CPUI386; if the compiler complains about asm code, this definition should be deleted.

PPCH is based on the standard 32 bit code, some time critical functions are inline (available for FPC2 and D9+). The new CRC routines are significantly slower than the standard sources (see table), but the Hash function speeds are not so uniform (especially remarkable are the differences for D10 and FPC2.2).

Special thanks goes to Nicola Lugato who asked for the pure Pascal units and tested the first versions on his ARM/Linux machine.

Please note: The PPCH source still assumes little-endian target platforms. Serious requesters for big-endian should send a mail, and should be willing to do some tests and bug reports.


CRC/Hash demo programs

Last changes:  CCH V0.81 and GCH 0.72.5 with SHA512/384 bugfix for file sizes above 512MB, CCH optionally performs self tests.

The archive chksum_src_2007-10-05.zip contains Pascal source files demonstrating the use of the CRC and hash units. The command line demo tool CCH.EXE can be compiled with all current Pascal and Delphi versions, with Virtual Pascal and BP 7 you can build a dual OS program running as a 16 bit EXE under DOS and as a 32 bit console application supporting long file names under Win32 (use make_cch.bat). GCH.EXE is a simple Win32 GUI demo application for Delphi 2..7/9/10  (Screenshot). Input files can be given as command line parameters. The compiled exe files are in chksum_bin_2007-10-05.zip.

For recompilation you need the sources from crc_hash_2008-09-07.zip.


FAR manager plugin

The basic routines are used in the CRC/Hash plugin (Screenshot) for the popular FAR manager:

Last changes:  Version 1.17 from HashCRC117.zip fixes a SHA512/384 bug for file sizes above 512MB.

Special thanks goes to Dmitry Yerokhin who contributed Russian translations of the .hlp and .lng files.

The source code for the plugin can be downloaded here: HashCRC117_Src.zip. To rebuild the DLL file, Virtual Pascal 2.1 or Delphi 2+ is required, as well as the source code of the basic CRC/hash routines (plugins.pas from the FAR manager distribution is included).

History: Version 1.2 splits the SHA256 output to avoid truncation, is compiled with Virtual Pascal, and the calculation can be cancelled with Esc. Version 1.3 comes with an English .lng file and a new Delphi Esc check. New in version 1.4 are CRC64 and Adler32. Plugin version 1.6 has SHA224, SHA384, and SHA512 support and displays only the calculated values (no N/A for unchecked functions), there is an average speedup of about 40% compared to V1.5.

Version 1.7 has configurable HEX/Base64 and upper/lower case HEX display, it can be compiled without errors with D4..D7/9. The base routines are more than 20% faster than V1.6 (improved code and built with Delphi3). Values are normally displayed LSB first, CRC16, CRC32, Adler32 are shown as MSB HEX strings (indicator M in separator line, L otherwise) if the config option Strict LSB is not checked. V1.7.1 is the release with the SHA512 bugfixes.

Version 1.8 has two additional buttons, the results can be written to a file (name of the processed file with an appended extension .chf) or copied to the clipboard.

Version 1.9 supports multi file mode: If the plugin is invoked with several files selected in the active panel the configured CRCs and hash digests are calculated for all selected files and the results are written to a text file (in a format similar to that of CCH). The file name can be edited in an input box, a new config option controls whether I/O error will be written to the result file.

Version 1.10 from supports the V3.0 Whirlpool hash and uses the numbers of lines of the FAR console to prevent the output from overflowing the dialog window. Vers. 1.11 uses the new hash architecture and supports RIPEMD-160, V1.12 adds support for the CRC24 used in (Open)PGP and GnuPG.

Version 1.13 results from a cooperation with Giovanni Drusian. It introduces a special MD5 processing for Portable Executable (PE) files, that is useful for detecting and classifying malware. A new configuration option controls the writing of the complete file paths to the results files or clipboard. V1.14 fixed the Whirlpool bug for file sizes above 512MB, V1.15 contains a fix to avoid the Delphi eof/4GB bug. V1.16 supports the MD4 and eDonkey/eMule hash algorithms and has a new configuration dialog layout.

Old source code versions (V1.1 .. V1.16) are available in this solid RAR archive: HashCRC_OldSource.zip

Home CRC/Hash Crypto Misc. Links Deutsch