© 2016 W.Ehrhardt Last update May 01, 2016
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_2016-05-01.zip can be compiled with most current Pascal (TP 5/5.5/6, BP 7, VP 2.1, FPC 1.0/2.0-2.6/3.x) and Delphi versions (tested with V1-7/9/10/12/17-18).


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. Since May 2008 the cryptographic hash and HMAC routines support messages with arbitrary bit lengths and in Aug. 2015 the integration of SHA3 forces a change of THashContext.

A separate short introduction gives some more information about the Hash/HMAC units and procedures.


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).

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.7 GHz using a blocksize of 50000 bytes (Std: standard routines with BASM, PP or 64: Pure Pascal with inline for D18 and FPC2.6.4 -O3, 64-bit on Win7/64 Core i3-2350M):

D3/Std D3/Std D6/Std D6/PP FPC/PP FPC-64 D18-64
Name MB/s Cyc/B Cyc/B Cyc/B Cyc/B Cyc/B Cyc/B
CRC16 201.02 8.4 8.5 33.2 44.1 16.3 14.7
CRC24 180.08 9.4 9.4 29.8 35.1 15.2 14.2
CRC32 277.58 6.1 6.1 18.0 24.6 15.3 14.2
FCRC32 391.17 4.3 4.3 19.3 18.5 5.8 5.5
Adler32 381.90 4.4 4.5 4.6 8.1 2.2 2.0
CRC64 93.11 18.2 18.2 93.2 59.3 11.4 10.3
eDonkey 208.08 8.1 8.1 8.1 19.6 7.0 8.2
MD4 209.64 8.1 8.1 8.1 20.1 7.1 8.2
MD5 150.65 11.3 11.2 11.2 11.1 10.5 10.5
RMD160 53.15 31.9 31.8 31.8 99.6 28.9 27.9
SHA1 51.03 33.2 37.9 41.3 52.4 25.9 18.5
SHA224 29.93 56.6 59.9 50.6 62.2 45.6 34.5
SHA256 30.26 56.0 60.0 50.9 62.9 45.5 34.6
SHA384 9.78 173.3 205.7 206.2 194.9 28.5 25.3
SHA512 9.78 173.3 205.9 206.2 194.7 28.6 25.3
SHA512/224 9.75 173.9 205.6 206.2 195.2 28.5 25.3
SHA512/256 9.78 173.3 205.7 206.3 195.3 28.5 25.3
Whirlpool 17.17 98.7 98.7 98.6 98.5 65.7 58.2
SHA3-224 15.36 110.3 110.8 110.7 120.9 23.4 22.5
SHA3-256 14.54 116.5 118.7 117.4 127.0 24.7 23.8
SHA3-384 11.18 151.6 151.9 150.3 158.3 32.3 31.0
SHA3-512 7.76 218.4 212.0 211.2 220.2 46.5 44.7

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.

Units SHA5_224 and SHA5_256: In March 2012 NIST released the new Secure Hash Standard FIPS 180-4. It defines (among others) two additional secure hash algorithms SHA-512/224 and SHA-512/256. These are designed like SHA384, using the compression function of SHA512 but different IVs. NIST quote: SHA-512/224 and SHA-512/256 may be more efficient alternatives to SHA-224 and SHA-256, respectively, on platforms that are optimized for 64-bit operations. (See the 64-bit columns in the table). My Pascal implementations use the standard SHA512 and are now fully integrated in CRC/Hash package; symbols for the new algorithms are defined in the general hash unit, specific hash and HMAC units are available.

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.

Pure Pascal versions: The source archive contains pure Pascal versions of the basic routines without BASM (formerly published in a separate archive). The main purpose is to supply sources for more portable code (e.g. for Linux/ARM); consequently the code layout is for FPC with int64 and without asm, but it can be compiled with Delphi 4+. Pure Pascal routines are invoked if the symbol PurePascal is defined: {$define PurePascal}, forced for BIT64. For 32-bit systems the PP CRC routines are significantly slower than the standard sources (see table), but the Hash function speeds are not so uniform. The pure Pascal routines are 64-bit compatible (tested with D17+ and FPC 2.6+ on Win64). Special thanks goes to Nicola Lugato who asked for the pure Pascal units and tested the first versions on his ARM/Linux machine.

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 (local HTML version). 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 60 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 programs tcrc16/tcrc32 interactively calculate and display the results from all crcm_cat CRC16/CRC32 algorithms for hex and string input, SRP16 searches CRC16 Rocksoft parameters for given data; the archive chksum_bin_2015-08-23.zip includes the EXE files.

Blue Midnight Wish: An experimental version of Blue Midnight Wish hash function is included in the archive bmw_2009-10-12.zip. BMW is one of the fastest algorithms of the second round of the SHA3 contest, it was not advanced to the third (and final) round. Only the 224 and 256 bit versions are implemented, because the 384/512 bit versions have internal state vectors with lengths greater than the current maximum length in the hash unit. Also included in the archive are the HMAC functions (unit HMACBMW).


Keccak, SHA-3, and SHAKE

On Oct. 2, 2012 NIST announced Keccak, designed by Guido Bertoni, Joan Daemen, Michaël Peeters, and Gilles Van Assche, as the winner of the SHA-3 Cryptographic Hash Algorithm Competition. The archive keccak_2013-01-07.zip contains my original Pascal/Delphi Keccak implementation using the SHA-3 NIST API: arbitrary length bit sequences are allowed for the messages to be hashed, the supported digest lengths are 224, 256, 384, 512 bits, and arbitrary length byte output.

Right now, there are two basic code variants of Keccak-f[1600]: The first with 32-bit interleaving and rotate instructions coded inline in 32+ bit PurePascal or inline functions for 16-bit compilers; the second uses 64-bit data types and rotations. However, the 64-bit code is faster than 32-bit only if compiled for a 64-bit CPU and executed on a 64-bit OS! With {$define USE_MMXCODE} in unit sha3.pas newer 32-bit compilers can use MMX code (the relative performance change depends on CPU and algorithm; actually there are two include files, the one contributed by Eric Grange is the default, it is faster than that from Anna Kaliszewicz and payl on all tested systems).

In August 2015 NIST published the Standard SHA3 / FIPS202, which describes the hash functions SHA3-224/256/384/512 (related but not identical to the Keccak functions) and the XOF (eXtendable Output) functions SHAKE128/256. The CRC/Hash archive crc_hash_2016-05-01.zip contains the implementation of the new functions based on my Keccak routines. Unfortunately NIST also changed the bit order in bytes; therefore the SHA-3 unit has a separate function SHA3_FinalBit_LSB to process the final trailing LSB bits. The included test programs verify my implementation against the NIST test examples and the updated test vectors from the Keccak team.


CRC/Hash demo programs

Last changes:  SHA-3 algorithms in GCH and CCH

The archive chksum_src_2015-08-23.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/12/17-18  (Screenshot). Input files can be given as command line parameters.

The GUI demo programs tcrc16/tcrc32 interactively calculate and display the results from all crcm_cat CRC16/CRC32 algorithms for hex and string input (Screenshot).

The GUI program SRP16 searches CRC16 Rocksoft parameters for given data / CRC sets with many options (Screenshot). The core routine processes Poly / Init ranges with additional combinations of refin, refout, and xorout values.

Compiled exe files within an SFX installer are in chksum_bin_2015-08-23.zip, for recompilation you need the sources from crc_hash_2016-05-01.zip.


FAR manager plugin

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

Important information:  Version 1.17 from HashCRC117.zip is the last version available. It fully supports FAR 1.70, and it works with later versions of FAR but may be there are some unicode issues with file names etc - the hash values of the (binary) file contents are always correct. The development is suspended until the return of reliable English documentation and usable Pascal support files, even in the latest stable and nightly builds there are no English Encyclopedia files and the FarEng.hlp contains more than 30% cyrillic(?) gibberish.

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. Version 1.17 fixes a SHA512/384 bug for file sizes above 512MB.

Home CRC/Hash Crypto Misc. Links Deutsch