summaryrefslogtreecommitdiff
path: root/lib/Kiki.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Kiki.hs')
-rw-r--r--lib/Kiki.hs51
1 files changed, 48 insertions, 3 deletions
diff --git a/lib/Kiki.hs b/lib/Kiki.hs
index 9513b0f..f89aad2 100644
--- a/lib/Kiki.hs
+++ b/lib/Kiki.hs
@@ -1,7 +1,8 @@
1{-# LANGUAGE NamedFieldPuns #-} 1{-# LANGUAGE LambdaCase #-}
2{-# LANGUAGE RecordWildCards #-} 2{-# LANGUAGE NamedFieldPuns #-}
3{-# LANGUAGE ViewPatterns #-}
4{-# LANGUAGE OverloadedStrings #-} 3{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE RecordWildCards #-}
5{-# LANGUAGE ViewPatterns #-}
5module Kiki 6module Kiki
6 ( module Kiki 7 ( module Kiki
7 , setVerifyFlag 8 , setVerifyFlag
@@ -48,9 +49,11 @@ import qualified SSHKey as SSH
48import CommandLine 49import CommandLine
49import DotLock 50import DotLock
50import GnuPGAgent (Query (..)) 51import GnuPGAgent (Query (..))
52import qualified IntMapClass as I
51import KeyRing hiding (pemFromPacket) 53import KeyRing hiding (pemFromPacket)
52import KeyDB 54import KeyDB
53import KeyRing.BuildKeyDB (gpgipv6addr, Hostnames, allNames) 55import KeyRing.BuildKeyDB (gpgipv6addr, Hostnames, allNames)
56import TimeUtil
54 57
55withAgent :: [PassphraseSpec] -> [PassphraseSpec] 58withAgent :: [PassphraseSpec] -> [PassphraseSpec]
56withAgent [] = [PassphraseAgent] 59withAgent [] = [PassphraseAgent]
@@ -763,6 +766,48 @@ verifyFile isHomeless cap keyrings filename = do
763 _ -> do 766 _ -> do
764 hPutStrLn stderr "Unsupported file format." 767 hPutStrLn stderr "Unsupported file format."
765 768
769signFile :: Bool -> CommonArgsParsed -> [FilePath] -> String -> FilePath -> IO ()
770signFile isHomeless cap keyrings keyid filename = do
771 let mop = minimalOp isHomeless cap
772 KikiResult r report <- runKeyRing mop
773 { opFiles = opFiles mop
774 `Map.union` Map.fromList
775 [ (ArgFile f, strm { access = Sec }) | f <- keyrings ]
776 }
777 case r of
778 KikiSuccess rt -> go rt
779 err -> hPutStrLn stderr $ errorString err
780 where
781 go :: KeyRingRuntime -> IO ()
782 go rt = do
783 tm <- modificationTime <$> getFileStatus filename
784 bs <- L.readFile filename
785 let hashed = [] -- TODO: FingerprintPacket
786 unhashed = [IssuerPacket keyid]
787 lit = LiteralDataPacket
788 { format = 'b' -- b:binary, t:text, u:utf8
789 , filename = filename
790 , timestamp = fromTime tm -- seconds since Jan 1, 1970 UTC
791 , content = bs
792 }
793 hash = SHA512
794 matchkey fp mp = matchpr fp (packet mp) == fp
795 case smallprGrip keyid of
796 Nothing -> hPutStrLn stderr "Bad keygrip."
797 Just grip -> do
798 let keydata = lookupByGrip grip (rtKeyDB rt)
799 case keydata of
800 [] -> hPutStrLn stderr "No matching key."
801 (k,_):_ -> rtPassphrases rt (Unencrypted,S2K 100 "") k >>= \case
802 KikiSuccess un -> do
803 mb <- pgpSign (Message [un]) (DataSignature lit []) hash keyid
804 case mb of
805 Nothing -> hPutStrLn stderr "Failed to make signature."
806 Just o -> do
807 putStrLn $ "Using "++show (fingerprint un)++" to write " <> filename <> ".sig"
808 let sigs = map (\sig -> sig { unhashed_subpackets = unhashed }) (signatures_over o)
809 L.writeFile (filename <> ".sig") $ L.concat $ map encode sigs
810 err -> hPutStrLn stderr $ errorString err
766 811
767parsePackets :: L.ByteString -> Either String [Packet] 812parsePackets :: L.ByteString -> Either String [Packet]
768parsePackets bs = case decodeOrFail bs of 813parsePackets bs = case decodeOrFail bs of