ripemd160

Pure Haskell RIPEMD-160, HMAC-RIPEMD160 (docs.ppad.tech/ripemd160).
git clone git://git.ppad.tech/ripemd160.git
Log | Files | Refs | README | LICENSE

commit 84eaa4264fe5e638004ea42d2dedbc2d12b1df91
parent d703a7a58bad51f8271cfb9b1731e37c05202eeb
Author: Jared Tobin <jared@jtobin.io>
Date:   Sun, 22 Jun 2025 13:06:40 +0400

lib: vertical integration

Diffstat:
Mflake.lock | 32++++++++++++++++++++++++++++++++
Mflake.nix | 16++++++++++++++--
Mppad-ripemd160.cabal | 2+-
Mtest/Main.hs | 19++++++++++++-------
4 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/flake.lock b/flake.lock @@ -34,6 +34,37 @@ "type": "github" } }, + "ppad-base16": { + "inputs": { + "flake-utils": [ + "ppad-base16", + "ppad-nixpkgs", + "flake-utils" + ], + "nixpkgs": [ + "ppad-base16", + "ppad-nixpkgs", + "nixpkgs" + ], + "ppad-nixpkgs": [ + "ppad-nixpkgs" + ] + }, + "locked": { + "lastModified": 1741625558, + "narHash": "sha256-ZBDXRD5fsVqA5bGrAlcnhiu67Eo50q0M9614nR3NBwY=", + "ref": "master", + "rev": "fb63457f2e894eda28250dfe65d0fcd1d195ac2f", + "revCount": 24, + "type": "git", + "url": "git://git.ppad.tech/base16.git" + }, + "original": { + "ref": "master", + "type": "git", + "url": "git://git.ppad.tech/base16.git" + } + }, "ppad-nixpkgs": { "inputs": { "flake-utils": "flake-utils", @@ -64,6 +95,7 @@ "ppad-nixpkgs", "nixpkgs" ], + "ppad-base16": "ppad-base16", "ppad-nixpkgs": "ppad-nixpkgs" } }, diff --git a/flake.nix b/flake.nix @@ -7,11 +7,18 @@ url = "git://git.ppad.tech/nixpkgs.git"; ref = "master"; }; + ppad-base16 = { + type = "git"; + url = "git://git.ppad.tech/base16.git"; + ref = "master"; + inputs.ppad-nixpkgs.follows = "ppad-nixpkgs"; + }; flake-utils.follows = "ppad-nixpkgs/flake-utils"; nixpkgs.follows = "ppad-nixpkgs/nixpkgs"; }; - outputs = { self, nixpkgs, flake-utils, ppad-nixpkgs }: + outputs = { self, nixpkgs, flake-utils, ppad-nixpkgs + , ppad-base16 }: flake-utils.lib.eachDefaultSystem (system: let lib = "ppad-ripemd160"; @@ -19,8 +26,13 @@ pkgs = import nixpkgs { inherit system; }; hlib = pkgs.haskell.lib; + base16 = ppad-base16.packages.${system}.default; + hpkgs = pkgs.haskell.packages.ghc981.extend (new: old: { - ${lib} = old.callCabal2nixWithOptions lib ./. "--enable-profiling" {}; + ppad-base16 = base16; + ${lib} = old.callCabal2nixWithOptions lib ./. "--enable-profiling" { + ppad-base16 = new.ppad-base16; + }; }); cc = pkgs.stdenv.cc; diff --git a/ppad-ripemd160.cabal b/ppad-ripemd160.cabal @@ -41,8 +41,8 @@ test-suite ripemd160-tests build-depends: aeson , base - , base16-bytestring , bytestring + , ppad-base16 , ppad-ripemd160 , tasty , tasty-hunit diff --git a/test/Main.hs b/test/Main.hs @@ -121,8 +121,13 @@ cmp_hmac_lazy msg key (BL.fromStrict -> put) pec = testCase msg $ do let out = B16.encode (RIPEMD160.hmac_lazy key put) assertEqual mempty pec out +decodeLenient :: BS.ByteString -> BS.ByteString +decodeLenient bs = case B16.decode bs of + Nothing -> error "bang" + Just b -> b + hmv1_key :: BS.ByteString -hmv1_key = B16.decodeLenient "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" +hmv1_key = decodeLenient "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" hmv1_put :: BS.ByteString hmv1_put = "Hi There" @@ -140,25 +145,25 @@ hmv2_pec :: BS.ByteString hmv2_pec = "dda6c0213a485a9e24f4742064a7f033b43c4069" hmv3_key :: BS.ByteString -hmv3_key = B16.decodeLenient "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +hmv3_key = decodeLenient "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" hmv3_put :: BS.ByteString -hmv3_put = B16.decodeLenient "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" +hmv3_put = decodeLenient "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" hmv3_pec :: BS.ByteString hmv3_pec = "b0b105360de759960ab4f35298e116e295d8e7c1" hmv4_key :: BS.ByteString -hmv4_key = B16.decodeLenient "0102030405060708090a0b0c0d0e0f10111213141516171819" +hmv4_key = decodeLenient "0102030405060708090a0b0c0d0e0f10111213141516171819" hmv4_put :: BS.ByteString -hmv4_put = B16.decodeLenient "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" +hmv4_put = decodeLenient "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" hmv4_pec :: BS.ByteString hmv4_pec = "d5ca862f4d21d5e610e18b4cf1beb97a4365ecf4" hmv5_key :: BS.ByteString -hmv5_key = B16.decodeLenient "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c" +hmv5_key = decodeLenient "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c" hmv5_put :: BS.ByteString hmv5_put = "Test With Truncation" @@ -167,7 +172,7 @@ hmv5_pec :: BS.ByteString hmv5_pec = "7619693978f91d90539ae786500ff3d8e0518e39" hmv6_key :: BS.ByteString -hmv6_key = B16.decodeLenient "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +hmv6_key = decodeLenient "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" hmv6_put :: BS.ByteString hmv6_put = "Test Using Larger Than Block-Size Key - Hash Key First"