summaryrefslogtreecommitdiff
path: root/KeyRing.hs
diff options
context:
space:
mode:
Diffstat (limited to 'KeyRing.hs')
-rw-r--r--KeyRing.hs48
1 files changed, 30 insertions, 18 deletions
diff --git a/KeyRing.hs b/KeyRing.hs
index 53a1a34..0fbf2c2 100644
--- a/KeyRing.hs
+++ b/KeyRing.hs
@@ -99,6 +99,7 @@ module KeyRing
99 , KeySpec(..) 99 , KeySpec(..)
100 , getHostnames 100 , getHostnames
101 , secretPemFromPacket 101 , secretPemFromPacket
102 , getCrossSignedSubkeys
102 ) where 103 ) where
103 104
104import System.Environment 105import System.Environment
@@ -3328,27 +3329,12 @@ flattenUid :: FilePath -> Bool -> (String,([SigAndTrust],OriginMap)) -> [MappedP
3328flattenUid fname ispub (str,(sigs,om)) = 3329flattenUid fname ispub (str,(sigs,om)) =
3329 (mappedPacket "" $ UserIDPacket str) {locations=om} : concatSort fname head (unsig fname ispub) sigs 3330 (mappedPacket "" $ UserIDPacket str) {locations=om} : concatSort fname head (unsig fname ispub) sigs
3330 3331
3331getHostnames :: KeyData -> (SockAddr, ([L.ByteString],[L.ByteString])) 3332getCrossSignedSubkeys :: Packet -> Map.Map KeyKey SubKey -> String -> [Packet]
3332getHostnames (KeyData topmp _ uids subs) = (addr,(onames,othernames)) 3333getCrossSignedSubkeys topk subs tag = do
3333 where
3334 othernames = do
3335 mp <- flattenAllUids "" True uids
3336 let p = packet mp
3337 guard $ isSignaturePacket p
3338 uh <- unhashed_subpackets p
3339 case uh of
3340 NotationDataPacket True "hostname@" v
3341 -> return $ Char8.pack v
3342 _ -> mzero
3343
3344 addr = fingerdress topk
3345 -- name = fromMaybe "" $ listToMaybe onames -- TODO: more than one tor key?
3346 topk = packet topmp
3347 torkeys = do
3348 SubKey k sigs <- Map.elems subs 3334 SubKey k sigs <- Map.elems subs
3349 let subk = packet k 3335 let subk = packet k
3350 let sigs' = do 3336 let sigs' = do
3351 torsig <- filter (has_tag "tor") $ map (packet . fst) sigs 3337 torsig <- filter (has_tag tag) $ map (packet . fst) sigs
3352 sig <- (signatures $ Message [topk,subk,torsig]) 3338 sig <- (signatures $ Message [topk,subk,torsig])
3353 let v = verify (Message [topk]) sig 3339 let v = verify (Message [topk]) sig
3354 -- Require parent's signature 3340 -- Require parent's signature
@@ -3364,9 +3350,35 @@ getHostnames (KeyData topmp _ uids subs) = (addr,(onames,othernames))
3364 return torsig 3350 return torsig
3365 guard (not $ null sigs') 3351 guard (not $ null sigs')
3366 return subk 3352 return subk
3353 where
3367 has_tag tag p = isSignaturePacket p 3354 has_tag tag p = isSignaturePacket p
3368 && or [ tag `elem` mapMaybe usage (hashed_subpackets p) 3355 && or [ tag `elem` mapMaybe usage (hashed_subpackets p)
3369 , tag `elem` map usageString (mapMaybe keyflags (hashed_subpackets p)) ] 3356 , tag `elem` map usageString (mapMaybe keyflags (hashed_subpackets p)) ]
3357
3358
3359-- |
3360-- Returns (ip6 fingerprint address,(onion names,other host names))
3361--
3362-- Requires a validly cross-signed tor key for each onion name returned.
3363-- (Signature checks are performed.)
3364getHostnames :: KeyData -> (SockAddr, ([L.ByteString],[L.ByteString]))
3365getHostnames (KeyData topmp _ uids subs) = (addr,(onames,othernames))
3366 where
3367 othernames = do
3368 mp <- flattenAllUids "" True uids
3369 let p = packet mp
3370 guard $ isSignaturePacket p
3371 uh <- unhashed_subpackets p
3372 case uh of
3373 NotationDataPacket True "hostname@" v
3374 -> return $ Char8.pack v
3375 _ -> mzero
3376
3377 addr = fingerdress topk
3378 -- name = fromMaybe "" $ listToMaybe onames -- TODO: more than one tor key?
3379 topk = packet topmp
3380 torkeys = getCrossSignedSubkeys topk subs "tor"
3381
3370 -- subkeyPacket (SubKey k _ ) = k 3382 -- subkeyPacket (SubKey k _ ) = k
3371 onames :: [L.ByteString] 3383 onames :: [L.ByteString]
3372 onames = map ( (<> ".onion") 3384 onames = map ( (<> ".onion")