Skip to content

ppad-tech/ripemd160

Repository files navigation

ripemd160

A pure Haskell implementation of RIPEMD-160 and HMAC-RIPEMD160 on strict and lazy ByteStrings.

Usage

A sample GHCi session:

  > :set -XOverloadedStrings
  >
  > -- import qualified
  > import qualified Crypto.Hash.RIPEMD160 as RIPEMD160
  >
  > -- 'hash' and 'hmac' operate on strict bytestrings
  >
  > let hash_s = RIPEMD160.hash "strict bytestring input"
  > let hmac_s = RIPEMD160.hmac "strict secret" "strict bytestring input"
  >
  > -- 'hash_lazy' and 'hmac_lazy' operate on lazy bytestrings
  > -- but note that the key for HMAC is always strict
  >
  > let hash_l = RIPEMD160.hash_lazy "lazy bytestring input"
  > let hmac_l = RIPEMD160.hmac_lazy "strict secret" "lazy bytestring input"
  >
  > -- results are always unformatted 160-bit (20-byte) strict bytestrings
  >
  > import qualified Data.ByteString as BS
  >
  > BS.take 10 hash_s
  "=\211\211\197]\NULJ\223n\223"
  > BS.take 10 hmac_l
  "\154\248\145[\196\ETX\f\ESC\NULs"
  >
  > -- you can use third-party libraries for rendering if needed
  > -- e.g., using ppad-base16:
  >
  > import qualified Data.ByteString.Base16 as B16
  >
  > B16.encode hash_s
  "3dd3d3c55d004adf6edf9e11cb01f9ac9c56441f"
  > B16.encode hmac_l
  "9af8915bc4030c1b007323c8531b3129d82f50bd"

Documentation

Haddocks (API documentation, etc.) are hosted at docs.ppad.tech/ripemd160.

Performance

The aim is best-in-class performance for pure, highly-auditable Haskell code.

Current benchmark figures on my M4 Silicon MacBook Air look like (use cabal bench to run the benchmark suite):

  benchmarking ppad-ripemd160/RIPEMD160 (32B input)/hash
  time                 244.2 ns   (244.0 ns .. 244.4 ns)
                       1.000 R²   (1.000 R² .. 1.000 R²)
  mean                 244.5 ns   (244.4 ns .. 244.7 ns)
  std dev              522.8 ps   (355.8 ps .. 868.0 ps)

  benchmarking ppad-ripemd160/HMAC-RIPEMD160 (32B input)/hmac
  time                 836.1 ns   (835.3 ns .. 837.0 ns)
                       1.000 R²   (1.000 R² .. 1.000 R²)
  mean                 836.6 ns   (835.6 ns .. 837.4 ns)
  std dev              3.105 ns   (2.474 ns .. 4.117 ns)

Compile with the 'llvm' flag for maximum performance.

Security

This library aims at the maximum security achievable in a garbage-collected language under an optimizing compiler such as GHC, in which strict constant-timeness can be challenging to achieve.

The RIPEMD-160 functions pass the vectors present in the official spec, and the HMAC-RIPEMD160 functions pass all vectors found contained in RFC2286.

If you discover any vulnerabilities, please disclose them via security@ppad.tech.

Development

You'll require Nix with flake support enabled. Enter a development shell with:

$ nix develop

Then do e.g.:

$ cabal repl ppad-ripemd160

to get a REPL for the main library.

About

Pure Haskell RIPEMD-160, HMAC-RIPEMD160

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published