@@ -6,13 +6,17 @@ Description : Nix-relevant interfaces to NaCl signatures.
66
77module System.Nix.Signature
88 ( Signature (.. )
9- , NarSignature (.. )
109 , signatureParser
1110 , parseSignature
1211 , signatureToText
12+ , NarSignature (.. )
13+ , narSignatureParser
14+ , parseNarSignature
15+ , narSignatureToText
1316 ) where
1417
1518import Crypto.Error (CryptoFailable (.. ))
19+ import Data.Attoparsec.Text (Parser )
1620import Data.ByteString (ByteString )
1721import Data.Text (Text )
1822import GHC.Generics (Generic )
@@ -28,6 +32,26 @@ import qualified Data.Text
2832newtype Signature = Signature Ed25519. Signature
2933 deriving (Eq , Generic , Show )
3034
35+ signatureParser :: Parser Signature
36+ signatureParser = do
37+ encodedSig <-
38+ Data.Attoparsec.Text. takeWhile1
39+ (\ c -> Data.Char. isAlphaNum c || c == ' +' || c == ' /' || c == ' =' )
40+ decodedSig <- case decodeWith Base64 encodedSig of
41+ Left e -> fail e
42+ Right decodedSig -> pure decodedSig
43+ sig <- case Ed25519. signature decodedSig of
44+ CryptoFailed e -> (fail . show ) e
45+ CryptoPassed sig -> pure sig
46+ pure $ Signature sig
47+
48+ parseSignature :: Text -> Either String Signature
49+ parseSignature = Data.Attoparsec.Text. parseOnly signatureParser
50+
51+ signatureToText :: Signature -> Text
52+ signatureToText (Signature sig) =
53+ encodeWith Base64 (Data.ByteArray. convert sig :: ByteString )
54+
3155-- | A detached signature attesting to a nix archive's validity.
3256data NarSignature = NarSignature
3357 { -- | The name of the public key used to sign the archive.
@@ -43,26 +67,19 @@ instance Ord Signature where
4367 yBS = Data.ByteArray. convert y :: ByteString
4468 in compare xBS yBS
4569
46- signatureParser :: Data.Attoparsec.Text. Parser NarSignature
47- signatureParser = do
70+ narSignatureParser :: Parser NarSignature
71+ narSignatureParser = do
4872 publicKey <- Data.Attoparsec.Text. takeWhile1 (/= ' :' )
4973 _ <- Data.Attoparsec.Text. string " :"
50- encodedSig <- Data.Attoparsec.Text. takeWhile1 (\ c -> Data.Char. isAlphaNum c || c == ' +' || c == ' /' || c == ' =' )
51- decodedSig <- case decodeWith Base64 encodedSig of
52- Left e -> fail e
53- Right decodedSig -> pure decodedSig
54- sig <- case Ed25519. signature decodedSig of
55- CryptoFailed e -> (fail . show ) e
56- CryptoPassed sig -> pure sig
57- pure $ NarSignature publicKey (Signature sig)
74+ sig <- signatureParser
75+ pure $ NarSignature {.. }
5876
59- parseSignature :: Text -> Either String NarSignature
60- parseSignature = Data.Attoparsec.Text. parseOnly signatureParser
77+ parseNarSignature :: Text -> Either String NarSignature
78+ parseNarSignature = Data.Attoparsec.Text. parseOnly narSignatureParser
6179
62- signatureToText :: NarSignature -> Text
63- signatureToText NarSignature {publicKey, sig= Signature sig'} = let
64- b64Encoded = encodeWith Base64 (Data.ByteArray. convert sig' :: ByteString )
65- in mconcat [ publicKey, " :" , b64Encoded ]
80+ narSignatureToText :: NarSignature -> Text
81+ narSignatureToText NarSignature {.. } =
82+ mconcat [ publicKey, " :" , signatureToText sig ]
6683
6784instance Show NarSignature where
68- show narSig = Data.Text. unpack (signatureToText narSig)
85+ show narSig = Data.Text. unpack (narSignatureToText narSig)
0 commit comments