diff options
Diffstat (limited to 'KeyRing.hs')
-rw-r--r-- | KeyRing.hs | 48 |
1 files changed, 30 insertions, 18 deletions
@@ -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 | ||
104 | import System.Environment | 105 | import System.Environment |
@@ -3328,27 +3329,12 @@ flattenUid :: FilePath -> Bool -> (String,([SigAndTrust],OriginMap)) -> [MappedP | |||
3328 | flattenUid fname ispub (str,(sigs,om)) = | 3329 | flattenUid 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 | ||
3331 | getHostnames :: KeyData -> (SockAddr, ([L.ByteString],[L.ByteString])) | 3332 | getCrossSignedSubkeys :: Packet -> Map.Map KeyKey SubKey -> String -> [Packet] |
3332 | getHostnames (KeyData topmp _ uids subs) = (addr,(onames,othernames)) | 3333 | getCrossSignedSubkeys 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.) | ||
3364 | getHostnames :: KeyData -> (SockAddr, ([L.ByteString],[L.ByteString])) | ||
3365 | getHostnames (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") |