ginsu 0.8.2 → 0.8.2.1
raw patch · 3 files changed
+26/−26 lines, 3 files
Files
- Gale/Gale.hs +23/−22
- Gale/KeyCache.hs +2/−3
- ginsu.cabal +1/−1
Gale/Gale.hs view
@@ -21,7 +21,6 @@ import Data.List import Data.Maybe import System.Time-import System.Timeout (timeout) import Control.Concurrent import Control.Concurrent.Async (async, wait)@@ -189,27 +188,29 @@ ct <- getClockTime let ef = \xs -> ((fromString "_ginsu.timestamp",FragmentTime ct):(fromString "_ginsu.spumbuster", FragmentText (packString (bsToHex hash))):xs) p' <- galeDecryptPuff gc Puff { signature = [], cats = cat, fragments = ef puff}- np <- case [(kh, k, data_, sig)- | RequestingKey kh k data_ sig <- signature p'] of- [] -> return p'- (kh, k, data_, sig):_ -> do- res <- timeout 4000000 $ wait kh- let unver = p' { signature = [Unverifyable k] }- case res of- Just x -> case x of- DestEncrypted (k':_) -> do- mkey <- verifySignature k' data_ sig- return $ p' { signature = [mkey] }- _ -> return unver- Nothing -> return unver- writeChan (channel gc) np- case getFragmentData np f_answerKey' of- Just d -> putKey (keyCache gc) d- Nothing -> return ()- case (cats np,getFragmentString np f_answerKeyError') of- ([Category (n,d)],Just _) | "_gale.key." `isPrefixOf` n -> noKey (keyCache gc) (catShowNew $ Category (drop 10 n,d))- (_,_) -> return ()- maybeReplyToKeyQuery gc np+ case [(kh, k, data_, sig)+ | RequestingKey kh k data_ sig <- signature p'] of+ [] -> finishPuff p'+ (kh, k, data_, sig):_ -> void $ forkIO $ do+ let encs = [s | s@(Encrypted _) <- signature p']+ unver = p' { signature = Unverifyable k:encs }+ dest <- wait kh+ np <- case dest of+ DestEncrypted (k':_) -> do+ mkey <- verifySignature k' data_ sig+ return $ p' { signature = mkey:encs }+ _ -> return unver+ finishPuff np+ where+ finishPuff np = do+ writeChan (channel gc) np+ case getFragmentData np f_answerKey' of+ Just d -> putKey (keyCache gc) d+ Nothing -> return ()+ case (cats np,getFragmentString np f_answerKeyError') of+ ([Category (n,d)],Just _) | "_gale.key." `isPrefixOf` n -> noKey (keyCache gc) (catShowNew $ Category (drop 10 n,d))+ (_,_) -> return ()+ maybeReplyToKeyQuery gc np maybeReplyToKeyQuery :: GaleContext -> Puff -> IO () maybeReplyToKeyQuery gc p | Just kn <- getFragmentString p f_questionKey = do
Gale/KeyCache.hs view
@@ -73,8 +73,7 @@ numberKeys kc = fmap Map.size $ readMVar (kkeyCache kc) keyIsPubKey :: HasFragmentList a => a -> Bool-keyIsPubKey k = not (hasFragment k f_rsaPrivateExponent)- && hasFragment k f_rsaExponent+keyIsPubKey k = hasFragment k f_rsaExponent keyIsPrivKey :: HasFragmentList a => a -> Bool keyIsPrivKey k = (hasFragment k f_rsaPrivateExponent) keyIsPublic :: HasFragmentList a => a -> Bool@@ -88,7 +87,7 @@ keyToRSAElems :: Monad m => Key -> m (RSAElems BS.ByteString) keyToRSAElems fl = do- if not (keyIsPrivKey fl) then fail "key does not have bits" else do+ if not (keyIsPubKey fl) then fail "key does not have bits" else do n <- getFragmentData fl f_rsaModulus e <- getFragmentData fl f_rsaExponent if not (keyIsPrivKey fl) then
ginsu.cabal view
@@ -1,6 +1,6 @@ -- vim:et Name: ginsu-Version: 0.8.2+Version: 0.8.2.1 Copyright: 2002-2009 John Meacham <john@repetae.net> 2011-2012 Dylan Simon <dylan@dylex.net> Author: John Meacham <john@foo.net>