As atonement for the recent MD5 release, and since I seem to perversely enjoy bumming numeric Common Lisp code, I’ve put together an implementation of the newly announced SHA-3, i.e. the algorithm formerly known as Keccak.
The package should be portable across nearly1 all ANSI
compliant CL implementations with specialized versions tuned for
implementations that offer unboxed 64bit arithmetic, unboxed 32bit
arithmetic and for implementations with efficient fixnum arithmetic
(requiring fixnums that can represent
(unsigned-byte 16)). Especially
the 64 and 32bit implementations have been mostly optimized for SBCL
and CMU CL. For those implementations, digests with a 1024 bit-rate
(and 288 bit digest output) can be generated in between 30 (64bit
SBCL) to around 100 (32bit CMU CL) cycles/byte on an i7-640M; whereas
optimized C/assembler implementations reach around 12 to 50
cycles/byte on 64/32 bit Intel hardware. The reason for the
discrepancy probably lies in missing peephole and dependency
optimizations in the SBCL/CMU CL compiler backend, which I might look
at in a future release.
Many thanks go to the Keccak Team (Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche, cf. http://keccak.noekeon.org) for their algorithm and excellent documentation and reference implementations.
- Currently there is no version of the code that would work for CL
implementations that have the smallest allowable fixnum size, which
(signed-byte 16), not
(unsigned-byte 16)as required by the 16bit version in the package. I’m not aware of such a CL implementation, and in any case this could be easily fixed, at the cost of some code clarity and/or performance.