1212{-# LANGUAGE ScopedTypeVariables #-}
1313{-# LANGUAGE TypeApplications #-}
1414{-# LANGUAGE TypeInType #-}
15+ {-# LANGUAGE OverloadedStrings #-}
1516
1617module System.Nix.Internal.Hash where
1718
18- import qualified Crypto.Hash.MD5 as MD5
19- import qualified Crypto.Hash.SHA1 as SHA1
20- import qualified Crypto.Hash.SHA256 as SHA256
21- import qualified Data.ByteString as BS
22- import qualified Data.ByteString.Char8 as BSC
23- import Data.Bits (xor )
24- import qualified Data.ByteString as BS
25- import qualified Data.ByteString.Lazy as BSL
26- import qualified Data.Hashable as DataHashable
27- import Data.Kind (Type )
28- import Data.List (foldl' )
29- import Data.Proxy (Proxy (Proxy ))
30- import qualified Data.Text as T
31- import qualified Data.Text.Encoding as T
32- import qualified Data.Vector as V
33- import Data.Word (Word8 )
19+ import qualified Crypto.Hash.MD5 as MD5
20+ import qualified Crypto.Hash.SHA1 as SHA1
21+ import qualified Crypto.Hash.SHA256 as SHA256
22+ import qualified Data.ByteString as BS
23+ import qualified Data.ByteString.Base16 as Base16
24+ import qualified Data.ByteString.Char8 as BSC
25+ import Data.Bits (xor )
26+ import qualified Data.ByteString as BS
27+ import qualified Data.ByteString.Lazy as BSL
28+ import qualified Data.Hashable as DataHashable
29+ import Data.Kind (Type )
30+ import Data.List (foldl' )
31+ import Data.Monoid
32+ import Data.Proxy (Proxy (Proxy ))
33+ import Data.Text (Text )
34+ import qualified Data.Text as T
35+ import qualified Data.Text.Encoding as T
36+ import qualified Data.Vector as V
37+ import Data.Word (Word8 )
3438import GHC.TypeLits
3539
3640-- | A tag for different hashing algorithms
@@ -45,6 +49,18 @@ data HashAlgorithm' n
4549 | Truncated n (HashAlgorithm' n )
4650 deriving (Eq , Show )
4751
52+ class HashAlgoText a where
53+ algoString :: Proxy a -> Text
54+
55+ instance HashAlgoText 'MD5 where
56+ algoString (Proxy :: Proxy 'MD5) = " md5"
57+
58+ instance HashAlgoText 'SHA1 where
59+ algoString (Proxy :: Proxy 'SHA1) = " sha1"
60+
61+ instance HashAlgoText 'SHA256 where
62+ algoString (Proxy :: Proxy 'SHA256) = " sha256"
63+
4864type HashAlgorithm = HashAlgorithm' Nat
4965
5066-- | Types with kind @HashAlgorithm@ may be a @HasDigest@ instance
@@ -80,8 +96,11 @@ hashLazy :: forall a.HasDigest a => BSL.ByteString -> Digest a
8096hashLazy bsl =
8197 finalize $ foldl' (update @ a ) (initialize @ a ) (BSL. toChunks bsl)
8298
99+ digestText32 :: forall a . HashAlgoText a => Digest a -> T. Text
100+ digestText32 d = algoString (Proxy :: Proxy a ) <> " :" <> printAsBase32 d
83101
84-
102+ digestText16 :: forall a . HashAlgoText a => Digest a -> T. Text
103+ digestText16 (Digest bs) = algoString (Proxy :: Proxy a ) <> " :" <> T. decodeUtf8 (Base16. encode bs)
85104
86105-- | Convert any Digest to a base32-encoded string.
87106-- This is not used in producing store path hashes
0 commit comments