Skip to content

Commit ce0b360

Browse files
Ericson2314sorki
andcommitted
Replace SomeNamedDigest with DSum HashAlgo Digest
Co-Authored-By: Richard Marko <[email protected]>
1 parent 747225c commit ce0b360

File tree

7 files changed

+44
-48
lines changed

7 files changed

+44
-48
lines changed

cabal.project

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@ packages:
22
./hnix-store-core/hnix-store-core.cabal
33
./hnix-store-remote/hnix-store-remote.cabal
44

5+
-- till https://github.com/obsidiansystems/dependent-sum/pull/80
6+
allow-newer:
7+
dependent-sum:some
8+
59
package hnix-store-remote
610
flags: +build-readme +io-testsuite

hnix-store-core/hnix-store-core.cabal

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ library
8787
, containers
8888
, constraints-extras
8989
, data-default-class
90+
, dependent-sum > 0.7
91+
, dependent-sum-template > 0.1.1 && < 0.2
9092
, generic-arbitrary < 1.1
9193
-- Required for cryptonite low-level type convertion
9294
, memory

hnix-store-core/src/System/Nix/Hash.hs

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ module System.Nix.Hash
1313
, NamedAlgo(..)
1414
, algoToText
1515
, textToAlgo
16-
, SomeNamedDigest(..)
1716
, mkNamedDigest
1817

1918
, mkStorePathHash
@@ -22,13 +21,17 @@ module System.Nix.Hash
2221
, encodeDigestWith
2322
, decodeDigestWith
2423

24+
, algoDigestBuilder
2525
, digestBuilder
2626
) where
2727

2828
import Crypto.Hash (Digest, HashAlgorithm, MD5(..), SHA1(..), SHA256(..), SHA512(..))
2929
import Data.ByteString (ByteString)
3030
import Data.Constraint.Extras (Has(has))
3131
import Data.Constraint.Extras.TH (deriveArgDict)
32+
import Data.Dependent.Sum (DSum((:=>)))
33+
import Data.GADT.Compare.TH (deriveGEq, deriveGCompare)
34+
import Data.GADT.Show.TH (deriveGShow)
3235
import Data.Kind (Type)
3336
import Data.Some (Some(Some))
3437
import Data.Text (Text)
@@ -81,13 +84,16 @@ data HashAlgo :: Type -> Type where
8184
HashAlgo_SHA256 :: HashAlgo SHA256
8285
HashAlgo_SHA512 :: HashAlgo SHA512
8386

87+
deriveGEq ''HashAlgo
88+
deriveGCompare ''HashAlgo
89+
deriveGShow ''HashAlgo
8490
deriveArgDict ''HashAlgo
8591

8692
algoToText :: forall t. HashAlgo t -> Text
8793
algoToText x = has @NamedAlgo x (algoName @t)
8894

89-
_hashAlgoValue :: HashAlgo a -> a
90-
_hashAlgoValue = \case
95+
hashAlgoValue :: HashAlgo a -> a
96+
hashAlgoValue = \case
9197
HashAlgo_MD5 -> MD5
9298
HashAlgo_SHA1 -> SHA1
9399
HashAlgo_SHA256 -> SHA256
@@ -101,44 +107,20 @@ textToAlgo = \case
101107
"sha512" -> Right $ Some HashAlgo_SHA512
102108
name -> Left $ "Unknown hash name: " <> Data.Text.unpack name
103109

104-
-- | A digest whose 'NamedAlgo' is not known at compile time.
105-
data SomeNamedDigest = forall a . NamedAlgo a => SomeDigest (Digest a)
106-
107-
instance Arbitrary SomeNamedDigest where
110+
instance Arbitrary (DSum HashAlgo Digest) where
108111
arbitrary = oneof
109-
[ SomeDigest @MD5 <$> arbitrary
110-
, SomeDigest @SHA1 <$> arbitrary
111-
, SomeDigest @SHA256 <$> arbitrary
112-
, SomeDigest @SHA512 <$> arbitrary
112+
[ (HashAlgo_MD5 :=>) <$> arbitrary
113+
, (HashAlgo_SHA1 :=>) <$> arbitrary
114+
, (HashAlgo_SHA256 :=>) <$> arbitrary
115+
, (HashAlgo_SHA512 :=>) <$> arbitrary
113116
]
114117

115-
instance Show SomeNamedDigest where
116-
show sd = case sd of
117-
SomeDigest (digest :: Digest hashType) ->
118-
Data.Text.unpack $ "SomeDigest"
119-
<> " "
120-
<> algoName @hashType
121-
<> ":"
122-
<> encodeDigestWith NixBase32 digest
123-
124-
instance Eq SomeNamedDigest where
125-
(==) (SomeDigest (a :: Digest aType))
126-
(SomeDigest (b :: Digest bType))
127-
= algoName @aType == algoName @bType
128-
&& encodeDigestWith NixBase32 a == encodeDigestWith NixBase32 b
129-
130-
instance Ord SomeNamedDigest where
131-
(<=) (SomeDigest (a :: Digest aType))
132-
(SomeDigest (b :: Digest bType))
133-
= algoName @aType <= algoName @bType
134-
&& encodeDigestWith NixBase32 a <= encodeDigestWith NixBase32 b
135-
136-
-- | Make @SomeNamedDigest@ based on provided SRI hash name
118+
-- | Make @DSum HashAlgo Digest@ based on provided SRI hash name
137119
-- and its encoded form
138120
mkNamedDigest
139121
:: Text -- ^ SRI name
140122
-> Text -- ^ base encoded hash
141-
-> Either String SomeNamedDigest
123+
-> Either String (DSum HashAlgo Digest)
142124
mkNamedDigest name sriHash =
143125
let (sriName, h) = Data.Text.breakOnEnd "-" sriHash in
144126
if sriName == "" || sriName == name <> "-"
@@ -154,13 +136,10 @@ mkNamedDigest name sriHash =
154136
<> " "
155137
<> name
156138
where
157-
mkDigest h = case name of
158-
"md5" -> SomeDigest <$> decodeGo MD5 h
159-
"sha1" -> SomeDigest <$> decodeGo SHA1 h
160-
"sha256" -> SomeDigest <$> decodeGo SHA256 h
161-
"sha512" -> SomeDigest <$> decodeGo SHA512 h
162-
_ -> Left $ "Unknown hash name: " <> Data.Text.unpack name
163-
decodeGo :: forall a . NamedAlgo a => a -> Text -> Either String (Digest a)
139+
mkDigest h =
140+
textToAlgo name
141+
>>= \(Some a) -> has @HashAlgorithm a $ fmap (a :=>) $ decodeGo a h
142+
decodeGo :: HashAlgorithm a => HashAlgo a -> Text -> Either String (Digest a)
164143
decodeGo a h
165144
| size == base16Len = decodeDigestWith Base16 h
166145
| size == base32Len = decodeDigestWith NixBase32 h
@@ -181,7 +160,7 @@ mkNamedDigest name sriHash =
181160
<> Data.Text.pack (show [base16Len, base32Len, base64Len])
182161
where
183162
size = Data.Text.length h
184-
hsize = Crypto.Hash.hashDigestSize a
163+
hsize = Crypto.Hash.hashDigestSize (hashAlgoValue a)
185164
base16Len = hsize * 2
186165
base32Len = ((hsize * 8 - 1) `div` 5) + 1;
187166
base64Len = ((4 * hsize `div` 3) + 3) `div` 4 * 4;
@@ -227,3 +206,10 @@ digestBuilder digest =
227206
<> ":"
228207
<> Data.Text.Lazy.Builder.fromText
229208
(System.Nix.Hash.encodeDigestWith NixBase32 digest)
209+
210+
-- | Builder for @DSum HashAlgo Digest@s
211+
algoDigestBuilder :: DSum HashAlgo Digest -> Builder
212+
algoDigestBuilder (a :=> d) =
213+
Data.Text.Lazy.Builder.fromText (System.Nix.Hash.algoToText a)
214+
<> ":"
215+
<> Data.Text.Lazy.Builder.fromText (encodeDigestWith NixBase32 d)

hnix-store-core/src/System/Nix/StorePath/Metadata.hs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ module System.Nix.StorePath.Metadata
66
, StorePathTrust(..)
77
) where
88

9+
import Crypto.Hash (Digest)
10+
import Data.Dependent.Sum (DSum)
911
import Data.HashSet (HashSet)
1012
import Data.Set (Set)
1113
import Data.Time (UTCTime)
1214
import Data.Word (Word64)
1315
import GHC.Generics (Generic)
1416

15-
import System.Nix.Hash (SomeNamedDigest)
17+
import System.Nix.Hash (HashAlgo)
1618
import System.Nix.Signature (NarSignature)
1719
import System.Nix.ContentAddress (ContentAddress)
1820

@@ -38,7 +40,7 @@ data Metadata a = Metadata
3840
deriverPath :: !(Maybe a)
3941
, -- TODO should this be optional?
4042
-- | The hash of the nar serialization of the path.
41-
narHash :: !SomeNamedDigest
43+
narHash :: !(DSum HashAlgo Digest)
4244
, -- | The paths that this path directly references
4345
references :: !(HashSet a)
4446
, -- | When was this path registered valid in the store?

hnix-store-remote/hnix-store-remote.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,11 @@ library
8080
, containers
8181
, cryptonite
8282
, data-default-class
83+
, dependent-sum > 0.7 && < 1
8384
, text
8485
, time
8586
, network
86-
, nix-derivation >= 1.1.1 && <2
87+
, nix-derivation >= 1.1.1 && < 2
8788
, mtl
8889
, unordered-containers
8990
, hnix-store-core >= 0.7 && <0.8

hnix-store-remote/src/System/Nix/Store/Remote.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ module System.Nix.Store.Remote
3030
, module System.Nix.Store.Remote.Types
3131
) where
3232

33+
import Data.Dependent.Sum (DSum((:=>)))
3334
import Data.HashSet (HashSet)
3435
import Data.Map (Map)
3536
import Data.Text (Text)
3637
import qualified Control.Monad
3738
import qualified Data.Attoparsec.ByteString.Char8
3839
import qualified Data.Text.Encoding
40+
import qualified System.Nix.Hash
3941
--
4042
import qualified Data.ByteString.Lazy as BSL
4143

@@ -44,7 +46,6 @@ import System.Nix.Build ( BuildMode
4446
, BuildResult
4547
)
4648
import System.Nix.Hash ( NamedAlgo(..)
47-
, SomeNamedDigest(..)
4849
, BaseEncoding(NixBase32)
4950
, decodeDigestWith
5051
)
@@ -237,7 +238,7 @@ queryPathInfoUncached path = do
237238
decodeDigestWith @SHA256 NixBase32 narHashText
238239
of
239240
Left e -> error e
240-
Right x -> SomeDigest x
241+
Right d -> System.Nix.Hash.HashAlgo_SHA256 :=> d
241242

242243
references <- sockGetPaths
243244
registrationTime <- sockGet getTime

hnix-store-remote/src/System/Nix/Store/Remote/Util.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import Network.Socket.ByteString ( recv
2525
import Nix.Derivation
2626

2727
import System.Nix.Build
28-
import System.Nix.StorePath
28+
import System.Nix.StorePath (StoreDir, StorePath, InvalidPathError, parsePath, storePathToRawFilePath)
2929
import System.Nix.Store.Remote.Binary
3030
import System.Nix.Store.Remote.Types
3131

0 commit comments

Comments
 (0)