openpgp-0.4/0000755000000000000000000000000012007770504011215 5ustar0000000000000000openpgp-0.4/Setup.hs0000644000000000000000000000005712007770504012653 0ustar0000000000000000import Distribution.Simple main = defaultMain openpgp-0.4/COPYING0000644000000000000000000000136112007770504012251 0ustar0000000000000000Copyright © 2011, Stephen Paul Weber Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. openpgp-0.4/README0000644000000000000000000000115212007770504012074 0ustar0000000000000000This is an OpenPGP library inspired by my work on OpenPGP libraries in Ruby , PHP , and Python . It defines types to represent OpenPGP messages as a series of packets and then defines instances of Data.Binary for each to facilitate encoding/decoding. For performing cryptography, see or It is intended that you use qualified imports with this library. > import qualified Data.OpenPGP as OpenPGP openpgp-0.4/openpgp.cabal0000644000000000000000000001331012007770504013647 0ustar0000000000000000name: openpgp version: 0.4 cabal-version: >= 1.8 license: OtherLicense license-file: COPYING category: Data copyright: © 2011-2012 Stephen Paul Weber author: Stephen Paul Weber maintainer: Stephen Paul Weber stability: experimental tested-with: GHC == 7.0.3 synopsis: Implementation of the OpenPGP message format homepage: http://github.com/singpolyma/OpenPGP-Haskell bug-reports: http://github.com/singpolyma/OpenPGP-Haskell/issues build-type: Simple description: This is an OpenPGP library inspired by my work on OpenPGP libraries in Ruby , PHP , and Python . . It defines types to represent OpenPGP messages as a series of packets and then defines instances of Data.Binary for each to facilitate encoding/decoding. . For performing cryptography, see or . It is intended that you use qualified imports with this library. . > import qualified Data.OpenPGP as OpenPGP extra-source-files: README, tests/suite.hs, tests/data/000001-006.public_key, tests/data/000002-013.user_id, tests/data/000003-002.sig, tests/data/000004-012.ring_trust, tests/data/000005-002.sig, tests/data/000006-012.ring_trust, tests/data/000007-002.sig, tests/data/000008-012.ring_trust, tests/data/000009-002.sig, tests/data/000010-012.ring_trust, tests/data/000011-002.sig, tests/data/000012-012.ring_trust, tests/data/000013-014.public_subkey, tests/data/000014-002.sig, tests/data/000015-012.ring_trust, tests/data/000016-006.public_key, tests/data/000017-002.sig, tests/data/000018-012.ring_trust, tests/data/000019-013.user_id, tests/data/000020-002.sig, tests/data/000021-012.ring_trust, tests/data/000022-002.sig, tests/data/000023-012.ring_trust, tests/data/000024-014.public_subkey, tests/data/000025-002.sig, tests/data/000026-012.ring_trust, tests/data/000027-006.public_key, tests/data/000028-002.sig, tests/data/000029-012.ring_trust, tests/data/000030-013.user_id, tests/data/000031-002.sig, tests/data/000032-012.ring_trust, tests/data/000033-002.sig, tests/data/000034-012.ring_trust, tests/data/000035-006.public_key, tests/data/000036-013.user_id, tests/data/000037-002.sig, tests/data/000038-012.ring_trust, tests/data/000039-002.sig, tests/data/000040-012.ring_trust, tests/data/000041-017.attribute, tests/data/000042-002.sig, tests/data/000043-012.ring_trust, tests/data/000044-014.public_subkey, tests/data/000045-002.sig, tests/data/000046-012.ring_trust, tests/data/000047-005.secret_key, tests/data/000048-013.user_id, tests/data/000049-002.sig, tests/data/000050-012.ring_trust, tests/data/000051-007.secret_subkey, tests/data/000052-002.sig, tests/data/000053-012.ring_trust, tests/data/000054-005.secret_key, tests/data/000055-002.sig, tests/data/000056-012.ring_trust, tests/data/000057-013.user_id, tests/data/000058-002.sig, tests/data/000059-012.ring_trust, tests/data/000060-007.secret_subkey, tests/data/000061-002.sig, tests/data/000062-012.ring_trust, tests/data/000063-005.secret_key, tests/data/000064-002.sig, tests/data/000065-012.ring_trust, tests/data/000066-013.user_id, tests/data/000067-002.sig, tests/data/000068-012.ring_trust, tests/data/000069-005.secret_key, tests/data/000070-013.user_id, tests/data/000071-002.sig, tests/data/000072-012.ring_trust, tests/data/000073-017.attribute, tests/data/000074-002.sig, tests/data/000075-012.ring_trust, tests/data/000076-007.secret_subkey, tests/data/000077-002.sig, tests/data/000078-012.ring_trust, tests/data/compressedsig-bzip2.gpg, tests/data/compressedsig.gpg, tests/data/compressedsig-zlib.gpg, tests/data/onepass_sig, tests/data/pubring.gpg, tests/data/secring.gpg, tests/data/uncompressed-ops-dsa.gpg, tests/data/uncompressed-ops-dsa-sha384.txt.gpg, tests/data/uncompressed-ops-rsa.gpg library exposed-modules: Data.OpenPGP other-modules: Data.OpenPGP.Internal build-depends: base == 4.*, bytestring, utf8-string, binary, zlib, bzlib test-suite tests type: exitcode-stdio-1.0 main-is: tests/suite.hs other-modules: Data.OpenPGP.Arbitrary build-depends: base == 4.*, bytestring, utf8-string, binary, zlib, bzlib, HUnit, QuickCheck >= 2.4.1.1, quickcheck-instances, test-framework, test-framework-hunit, test-framework-quickcheck2 source-repository head type: git location: git://github.com/singpolyma/OpenPGP-Haskell.git openpgp-0.4/Data/0000755000000000000000000000000012007770504012066 5ustar0000000000000000openpgp-0.4/Data/OpenPGP.hs0000644000000000000000000011463212007770504013701 0ustar0000000000000000{-# LANGUAGE CPP #-} -- | Main implementation of the OpenPGP message format -- -- The recommended way to import this module is: -- -- > import qualified Data.OpenPGP as OpenPGP module Data.OpenPGP ( Packet( OnePassSignaturePacket, PublicKeyPacket, SecretKeyPacket, CompressedDataPacket, MarkerPacket, LiteralDataPacket, UserIDPacket, ModificationDetectionCodePacket, UnsupportedPacket, compression_algorithm, content, encrypted_data, filename, format, hash_algorithm, hashed_subpackets, hash_head, key, is_subkey, v3_days_of_validity, key_algorithm, key_id, message, nested, private_hash, s2k_count, s2k_hash_algorithm, s2k_salt, s2k_type, s2k_useage, signature, signature_type, symmetric_type, timestamp, trailer, unhashed_subpackets, version ), isSignaturePacket, signaturePacket, Message(..), SignatureSubpacket(..), HashAlgorithm(..), KeyAlgorithm(..), SymmetricAlgorithm(..), CompressionAlgorithm(..), RevocationCode(..), MPI(..), find_key, fingerprint_material, signatures_and_data, signature_issuer ) where import Numeric import Control.Monad import Control.Exception (assert) import Data.Bits import Data.Word import Data.Char import Data.Maybe import Data.List import Data.OpenPGP.Internal import qualified Data.ByteString.Lazy as LZ #ifdef CEREAL import Data.Serialize import qualified Data.ByteString as B import qualified Data.ByteString.UTF8 as B (toString, fromString) #define BINARY_CLASS Serialize #else import Data.Binary import Data.Binary.Get import Data.Binary.Put import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy.UTF8 as B (toString, fromString) #define BINARY_CLASS Binary #endif import qualified Codec.Compression.Zlib.Raw as Zip import qualified Codec.Compression.Zlib as Zlib import qualified Codec.Compression.BZip as BZip2 #ifdef CEREAL getRemainingByteString :: Get B.ByteString getRemainingByteString = remaining >>= getByteString getSomeByteString :: Word64 -> Get B.ByteString getSomeByteString = getByteString . fromIntegral putSomeByteString :: B.ByteString -> Put putSomeByteString = putByteString unsafeRunGet :: Get a -> B.ByteString -> a unsafeRunGet g bs = let Right v = runGet g bs in v compress :: CompressionAlgorithm -> B.ByteString -> B.ByteString compress algo = toStrictBS . lazyCompress algo . toLazyBS decompress :: CompressionAlgorithm -> B.ByteString -> B.ByteString decompress algo = toStrictBS . lazyDecompress algo . toLazyBS toStrictBS :: LZ.ByteString -> B.ByteString toStrictBS = B.concat . LZ.toChunks toLazyBS :: B.ByteString -> LZ.ByteString toLazyBS = LZ.fromChunks . (:[]) #else getRemainingByteString :: Get B.ByteString getRemainingByteString = getRemainingLazyByteString getSomeByteString :: Word64 -> Get B.ByteString getSomeByteString = getLazyByteString . fromIntegral putSomeByteString :: B.ByteString -> Put putSomeByteString = putLazyByteString unsafeRunGet :: Get a -> B.ByteString -> a unsafeRunGet = runGet compress :: CompressionAlgorithm -> B.ByteString -> B.ByteString compress = lazyCompress decompress :: CompressionAlgorithm -> B.ByteString -> B.ByteString decompress = lazyDecompress #endif lazyCompress :: CompressionAlgorithm -> LZ.ByteString -> LZ.ByteString lazyCompress Uncompressed = id lazyCompress ZIP = Zip.compress lazyCompress ZLIB = Zlib.compress lazyCompress BZip2 = BZip2.compress lazyCompress x = error ("No implementation for " ++ show x) lazyDecompress :: CompressionAlgorithm -> LZ.ByteString -> LZ.ByteString lazyDecompress Uncompressed = id lazyDecompress ZIP = Zip.decompress lazyDecompress ZLIB = Zlib.decompress lazyDecompress BZip2 = BZip2.decompress lazyDecompress x = error ("No implementation for " ++ show x) assertProp :: (a -> Bool) -> a -> a assertProp f x = assert (f x) x data Packet = SignaturePacket { version::Word8, signature_type::Word8, key_algorithm::KeyAlgorithm, hash_algorithm::HashAlgorithm, hashed_subpackets::[SignatureSubpacket], unhashed_subpackets::[SignatureSubpacket], hash_head::Word16, signature::[MPI], trailer::B.ByteString } | OnePassSignaturePacket { version::Word8, signature_type::Word8, hash_algorithm::HashAlgorithm, key_algorithm::KeyAlgorithm, key_id::String, nested::Word8 } | PublicKeyPacket { version::Word8, timestamp::Word32, key_algorithm::KeyAlgorithm, key::[(Char,MPI)], is_subkey::Bool, v3_days_of_validity::Maybe Word16 } | SecretKeyPacket { version::Word8, timestamp::Word32, key_algorithm::KeyAlgorithm, key::[(Char,MPI)], s2k_useage::Word8, -- determines if the Maybes are Just or Nothing symmetric_type::Maybe Word8, s2k_type::Maybe Word8, s2k_hash_algorithm::Maybe HashAlgorithm, s2k_salt::Maybe Word64, s2k_count::Maybe Word32, encrypted_data::B.ByteString, private_hash::Maybe B.ByteString, -- the hash may be in the encrypted data is_subkey::Bool } | CompressedDataPacket { compression_algorithm::CompressionAlgorithm, message::Message } | MarkerPacket | LiteralDataPacket { format::Char, filename::String, timestamp::Word32, content::B.ByteString } | UserIDPacket String | ModificationDetectionCodePacket B.ByteString | UnsupportedPacket Word8 B.ByteString deriving (Show, Read, Eq) instance BINARY_CLASS Packet where put p = do -- First two bits are 1 for new packet format put ((tag .|. 0xC0) :: Word8) case tag of 19 -> put (assertProp (<192) blen :: Word8) _ -> do -- Use 5-octet lengths put (255 :: Word8) put (blen :: Word32) putSomeByteString body where blen :: (Num a) => a blen = fromIntegral $ B.length body (body, tag) = put_packet p get = do tag <- get :: Get Word8 let (t, l) = if (tag .&. 64) /= 0 then (tag .&. 63, parse_new_length) else ((tag `shiftR` 2) .&. 15, parse_old_length tag) len <- l -- This forces the whole packet to be consumed packet <- getSomeByteString (fromIntegral len) return $ unsafeRunGet (parse_packet t) packet -- http://tools.ietf.org/html/rfc4880#section-4.2.2 parse_new_length :: Get Word32 parse_new_length = do len <- fmap fromIntegral (get :: Get Word8) case len of -- One octet length _ | len < 192 -> return len -- Two octet length _ | len > 191 && len < 224 -> do second <- fmap fromIntegral (get :: Get Word8) return $ ((len - 192) `shiftL` 8) + second + 192 -- Five octet length 255 -> get :: Get Word32 -- TODO: Partial body lengths. 1 << (len & 0x1F) _ -> fail "Unsupported new packet length." -- http://tools.ietf.org/html/rfc4880#section-4.2.1 parse_old_length :: Word8 -> Get Word32 parse_old_length tag = case tag .&. 3 of -- One octet length 0 -> fmap fromIntegral (get :: Get Word8) -- Two octet length 1 -> fmap fromIntegral (get :: Get Word16) -- Four octet length 2 -> get -- Indeterminate length 3 -> fmap fromIntegral remaining -- Error _ -> fail "Unsupported old packet length." -- http://tools.ietf.org/html/rfc4880#section-5.5.2 public_key_fields :: KeyAlgorithm -> [Char] public_key_fields RSA = ['n', 'e'] public_key_fields RSA_E = public_key_fields RSA public_key_fields RSA_S = public_key_fields RSA public_key_fields ELGAMAL = ['p', 'g', 'y'] public_key_fields DSA = ['p', 'q', 'g', 'y'] public_key_fields _ = undefined -- Nothing in the spec. Maybe empty -- http://tools.ietf.org/html/rfc4880#section-5.5.3 secret_key_fields :: KeyAlgorithm -> [Char] secret_key_fields RSA = ['d', 'p', 'q', 'u'] secret_key_fields RSA_E = secret_key_fields RSA secret_key_fields RSA_S = secret_key_fields RSA secret_key_fields ELGAMAL = ['x'] secret_key_fields DSA = ['x'] secret_key_fields _ = undefined -- Nothing in the spec. Maybe empty (!) :: (Eq k) => [(k,v)] -> k -> v (!) xs = fromJust . (`lookup` xs) -- Need this seperate for trailer calculation signature_packet_start :: Packet -> B.ByteString signature_packet_start (SignaturePacket { version = 4, signature_type = signature_type, key_algorithm = key_algorithm, hash_algorithm = hash_algorithm, hashed_subpackets = hashed_subpackets }) = B.concat [ encode (0x04 :: Word8), encode signature_type, encode key_algorithm, encode hash_algorithm, encode ((fromIntegral $ B.length hashed_subs) :: Word16), hashed_subs ] where hashed_subs = B.concat $ map encode hashed_subpackets signature_packet_start x = error ("Trying to get start of signature packet for: " ++ show x) -- The trailer is just the top of the body plus some crap calculate_signature_trailer :: Packet -> B.ByteString calculate_signature_trailer (SignaturePacket { version = v, signature_type = signature_type, unhashed_subpackets = unhashed_subpackets }) | v `elem` [2,3] = B.concat [ encode signature_type, encode creation_time ] where Just (SignatureCreationTimePacket creation_time) = find isCreation unhashed_subpackets isCreation (SignatureCreationTimePacket {}) = True isCreation _ = False calculate_signature_trailer p@(SignaturePacket {version = 4}) = B.concat [ signature_packet_start p, encode (0x04 :: Word8), encode (0xff :: Word8), encode (fromIntegral (B.length $ signature_packet_start p) :: Word32) ] calculate_signature_trailer x = error ("Trying to calculate signature trailer for: " ++ show x) put_packet :: (Num a) => Packet -> (B.ByteString, a) put_packet (SignaturePacket { version = v, unhashed_subpackets = unhashed_subpackets, key_algorithm = key_algorithm, hash_algorithm = hash_algorithm, hash_head = hash_head, signature = signature, trailer = trailer }) | v `elem` [2,3] = -- TODO: Assert that there are no subpackets we cannot encode? (B.concat $ [ B.singleton v, B.singleton 0x05, trailer, -- signature_type and creation_time encode keyid, encode key_algorithm, encode hash_algorithm, encode hash_head ] ++ map encode signature, 2) where keyid = fst $ head $ readHex keyidS :: Word64 Just (IssuerPacket keyidS) = find isIssuer unhashed_subpackets isIssuer (IssuerPacket {}) = True isIssuer _ = False put_packet (SignaturePacket { version = 4, unhashed_subpackets = unhashed_subpackets, hash_head = hash_head, signature = signature, trailer = trailer }) = (B.concat $ [ trailer_top, encode (fromIntegral $ B.length unhashed :: Word16), unhashed, encode hash_head ] ++ map encode signature, 2) where trailer_top = B.reverse $ B.drop 6 $ B.reverse trailer unhashed = B.concat $ map encode unhashed_subpackets put_packet (OnePassSignaturePacket { version = version, signature_type = signature_type, hash_algorithm = hash_algorithm, key_algorithm = key_algorithm, key_id = key_id, nested = nested }) = (B.concat [ encode version, encode signature_type, encode hash_algorithm, encode key_algorithm, encode (fst $ head $ readHex key_id :: Word64), encode nested ], 4) put_packet (SecretKeyPacket { version = version, timestamp = timestamp, key_algorithm = algorithm, key = key, s2k_useage = s2k_useage, symmetric_type = symmetric_type, s2k_type = s2k_type, s2k_hash_algorithm = s2k_hash_algo, s2k_salt = s2k_salt, s2k_count = s2k_count, encrypted_data = encrypted_data, is_subkey = is_subkey }) = (B.concat $ [p, encode s2k_useage] ++ (if s2k_useage `elem` [255, 254] then [encode $ fromJust symmetric_type, encode s2k_t, encode $ fromJust s2k_hash_algo] ++ (if s2k_t `elem` [1,3] then [encode $ fromJust s2k_salt] else []) ++ if s2k_t == 3 then [encode $ encode_s2k_count $ fromJust s2k_count] else [] else []) ++ (if s2k_useage > 0 then [encrypted_data] else s ++ -- XXX: Checksum is part of encrypted_data for V4 ONLY if s2k_useage == 254 then [B.replicate 20 0] -- TODO SHA1 Checksum else [encode (fromIntegral $ B.foldl (\c i -> (c + fromIntegral i) `mod` 65536) (0::Integer) (B.concat s) :: Word16)]), if is_subkey then 7 else 5) where (Just s2k_t) = s2k_type p = fst (put_packet $ PublicKeyPacket version timestamp algorithm key False Nothing :: (B.ByteString, Integer)) -- Supress warning s = map (encode . (key !)) (secret_key_fields algorithm) put_packet p@(PublicKeyPacket { version = v, timestamp = timestamp, key_algorithm = algorithm, key = key, is_subkey = is_subkey }) | v == 3 = final (B.concat $ [ B.singleton 3, encode timestamp, encode (fromJust $ v3_days_of_validity p), encode algorithm ] ++ material) | v == 4 = final (B.concat $ [ B.singleton 4, encode timestamp, encode algorithm ] ++ material) where final x = (x, if is_subkey then 14 else 6) material = map (encode . (key !)) (public_key_fields algorithm) put_packet (CompressedDataPacket { compression_algorithm = algorithm, message = message }) = (B.append (encode algorithm) $ compress algorithm $ encode message, 8) put_packet MarkerPacket = (B.fromString "PGP", 10) put_packet (LiteralDataPacket { format = format, filename = filename, timestamp = timestamp, content = content }) = (B.concat [encode format, encode filename_l, lz_filename, encode timestamp, content], 11) where filename_l = (fromIntegral $ B.length lz_filename) :: Word8 lz_filename = B.fromString filename put_packet (UserIDPacket txt) = (B.fromString txt, 13) put_packet (ModificationDetectionCodePacket bstr) = (bstr, 19) put_packet (UnsupportedPacket tag bytes) = (bytes, fromIntegral tag) put_packet x = error ("Unsupported Packet version or type in put_packet: " ++ show x) parse_packet :: Word8 -> Get Packet -- SignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.2 parse_packet 2 = do version <- get case version of _ | version `elem` [2,3] -> do _ <- fmap (assertProp (==5)) (get :: Get Word8) signature_type <- get creation_time <- get :: Get Word32 keyid <- get :: Get Word64 key_algorithm <- get hash_algorithm <- get hash_head <- get signature <- listUntilEnd return SignaturePacket { version = version, signature_type = signature_type, key_algorithm = key_algorithm, hash_algorithm = hash_algorithm, hashed_subpackets = [], unhashed_subpackets = [ SignatureCreationTimePacket creation_time, IssuerPacket $ pad $ map toUpper $ showHex keyid "" ], hash_head = hash_head, signature = signature, trailer = B.concat [encode signature_type, encode creation_time] } 4 -> do signature_type <- get key_algorithm <- get hash_algorithm <- get hashed_size <- fmap fromIntegral (get :: Get Word16) hashed_data <- getSomeByteString hashed_size let hashed = unsafeRunGet listUntilEnd hashed_data unhashed_size <- fmap fromIntegral (get :: Get Word16) unhashed_data <- getSomeByteString unhashed_size let unhashed = unsafeRunGet listUntilEnd unhashed_data hash_head <- get signature <- listUntilEnd return SignaturePacket { version = version, signature_type = signature_type, key_algorithm = key_algorithm, hash_algorithm = hash_algorithm, hashed_subpackets = hashed, unhashed_subpackets = unhashed, hash_head = hash_head, signature = signature, trailer = B.concat [encode version, encode signature_type, encode key_algorithm, encode hash_algorithm, encode (fromIntegral hashed_size :: Word16), hashed_data, B.pack [4, 0xff], encode ((6 + fromIntegral hashed_size) :: Word32)] } x -> fail $ "Unknown SignaturePacket version " ++ show x ++ "." where pad s = replicate (16 - length s) '0' ++ s -- OnePassSignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.4 parse_packet 4 = do version <- get signature_type <- get hash_algo <- get key_algo <- get key_id <- get :: Get Word64 nested <- get return OnePassSignaturePacket { version = version, signature_type = signature_type, hash_algorithm = hash_algo, key_algorithm = key_algo, key_id = pad $ map toUpper $ showHex key_id "", nested = nested } where pad s = replicate (16 - length s) '0' ++ s -- SecretKeyPacket, http://tools.ietf.org/html/rfc4880#section-5.5.3 parse_packet 5 = do -- Parse PublicKey part (PublicKeyPacket { version = version, timestamp = timestamp, key_algorithm = algorithm, key = key }) <- parse_packet 6 s2k_useage <- get :: Get Word8 let k = SecretKeyPacket version timestamp algorithm key s2k_useage k' <- case s2k_useage of _ | s2k_useage `elem` [255, 254] -> do symmetric_type <- get s2k_type <- get s2k_hash_algorithm <- get s2k_salt <- if s2k_type `elem` [1, 3] then get else return undefined s2k_count <- if s2k_type == 3 then fmap decode_s2k_count get else return undefined return (k (Just symmetric_type) (Just s2k_type) (Just s2k_hash_algorithm) (Just s2k_salt) (Just s2k_count)) _ | s2k_useage > 0 -> -- s2k_useage is symmetric_type in this case return (k (Just s2k_useage) Nothing Nothing Nothing Nothing) _ -> return (k Nothing Nothing Nothing Nothing Nothing) if s2k_useage > 0 then do { encrypted <- getRemainingByteString; return (k' encrypted Nothing False) } else do key <- foldM (\m f -> do mpi <- get :: Get MPI return $ (f,mpi):m) key (secret_key_fields algorithm) private_hash <- getRemainingByteString return ((k' B.empty (Just private_hash) False) {key = key}) -- PublicKeyPacket, http://tools.ietf.org/html/rfc4880#section-5.5.2 parse_packet 6 = do version <- get :: Get Word8 case version of 3 -> do timestamp <- get days <- get algorithm <- get key <- mapM (\f -> fmap ((,)f) get) (public_key_fields algorithm) return PublicKeyPacket { version = version, timestamp = timestamp, key_algorithm = algorithm, key = key, is_subkey = False, v3_days_of_validity = Just days } 4 -> do timestamp <- get algorithm <- get key <- mapM (\f -> fmap ((,)f) get) (public_key_fields algorithm) return PublicKeyPacket { version = 4, timestamp = timestamp, key_algorithm = algorithm, key = key, is_subkey = False, v3_days_of_validity = Nothing } x -> fail $ "Unsupported PublicKeyPacket version " ++ show x ++ "." -- Secret-SubKey Packet, http://tools.ietf.org/html/rfc4880#section-5.5.1.4 parse_packet 7 = do p <- parse_packet 5 return p {is_subkey = True} -- CompressedDataPacket, http://tools.ietf.org/html/rfc4880#section-5.6 parse_packet 8 = do algorithm <- get message <- getRemainingByteString return CompressedDataPacket { compression_algorithm = algorithm, message = unsafeRunGet get (decompress algorithm message) } -- MarkerPacket, http://tools.ietf.org/html/rfc4880#section-5.8 parse_packet 10 = return MarkerPacket -- LiteralDataPacket, http://tools.ietf.org/html/rfc4880#section-5.9 parse_packet 11 = do format <- get filenameLength <- get :: Get Word8 filename <- getSomeByteString (fromIntegral filenameLength) timestamp <- get content <- getRemainingByteString return LiteralDataPacket { format = format, filename = B.toString filename, timestamp = timestamp, content = content } -- UserIDPacket, http://tools.ietf.org/html/rfc4880#section-5.11 parse_packet 13 = fmap (UserIDPacket . B.toString) getRemainingByteString -- Public-Subkey Packet, http://tools.ietf.org/html/rfc4880#section-5.5.1.2 parse_packet 14 = do p <- parse_packet 6 return p {is_subkey = True} -- ModificationDetectionCodePacket, http://tools.ietf.org/html/rfc4880#section-5.14 parse_packet 19 = fmap ModificationDetectionCodePacket getRemainingByteString -- Represent unsupported packets as their tag and literal bytes parse_packet tag = fmap (UnsupportedPacket tag) getRemainingByteString -- | Helper method for fingerprints and such fingerprint_material :: Packet -> [B.ByteString] fingerprint_material p | version p == 4 = [ B.singleton 0x99, encode (6 + fromIntegral (B.length material) :: Word16), B.singleton 4, encode (timestamp p), encode (key_algorithm p), material ] where material = B.concat $ map (encode . (key p !)) (public_key_fields $ key_algorithm p) fingerprint_material p | version p `elem` [2, 3] = [n, e] where n = B.drop 2 (encode (key p ! 'n')) e = B.drop 2 (encode (key p ! 'e')) fingerprint_material _ = error "Unsupported Packet version or type in fingerprint_material." enum_to_word8 :: (Enum a) => a -> Word8 enum_to_word8 = fromIntegral . fromEnum enum_from_word8 :: (Enum a) => Word8 -> a enum_from_word8 = toEnum . fromIntegral data HashAlgorithm = MD5 | SHA1 | RIPEMD160 | SHA256 | SHA384 | SHA512 | SHA224 | HashAlgorithm Word8 deriving (Show, Read, Eq) instance Enum HashAlgorithm where toEnum 01 = MD5 toEnum 02 = SHA1 toEnum 03 = RIPEMD160 toEnum 08 = SHA256 toEnum 09 = SHA384 toEnum 10 = SHA512 toEnum 11 = SHA224 toEnum x = HashAlgorithm $ fromIntegral x fromEnum MD5 = 01 fromEnum SHA1 = 02 fromEnum RIPEMD160 = 03 fromEnum SHA256 = 08 fromEnum SHA384 = 09 fromEnum SHA512 = 10 fromEnum SHA224 = 11 fromEnum (HashAlgorithm x) = fromIntegral x instance BINARY_CLASS HashAlgorithm where put = put . enum_to_word8 get = fmap enum_from_word8 get data KeyAlgorithm = RSA | RSA_E | RSA_S | ELGAMAL | DSA | ECC | ECDSA | DH | KeyAlgorithm Word8 deriving (Show, Read, Eq) instance Enum KeyAlgorithm where toEnum 01 = RSA toEnum 02 = RSA_E toEnum 03 = RSA_S toEnum 16 = ELGAMAL toEnum 17 = DSA toEnum 18 = ECC toEnum 19 = ECDSA toEnum 21 = DH toEnum x = KeyAlgorithm $ fromIntegral x fromEnum RSA = 01 fromEnum RSA_E = 02 fromEnum RSA_S = 03 fromEnum ELGAMAL = 16 fromEnum DSA = 17 fromEnum ECC = 18 fromEnum ECDSA = 19 fromEnum DH = 21 fromEnum (KeyAlgorithm x) = fromIntegral x instance BINARY_CLASS KeyAlgorithm where put = put . enum_to_word8 get = fmap enum_from_word8 get data SymmetricAlgorithm = Unencrypted | IDEA | TripleDES | CAST5 | Blowfish | AES128 | AES192 | AES256 | Twofish | SymmetricAlgorithm Word8 deriving (Show, Read, Eq) instance Enum SymmetricAlgorithm where toEnum 00 = Unencrypted toEnum 01 = IDEA toEnum 02 = TripleDES toEnum 03 = CAST5 toEnum 04 = Blowfish toEnum 07 = AES128 toEnum 08 = AES192 toEnum 09 = AES256 toEnum 10 = Twofish toEnum x = SymmetricAlgorithm $ fromIntegral x fromEnum Unencrypted = 00 fromEnum IDEA = 01 fromEnum TripleDES = 02 fromEnum CAST5 = 03 fromEnum Blowfish = 04 fromEnum AES128 = 07 fromEnum AES192 = 08 fromEnum AES256 = 09 fromEnum Twofish = 10 fromEnum (SymmetricAlgorithm x) = fromIntegral x instance BINARY_CLASS SymmetricAlgorithm where put = put . enum_to_word8 get = fmap enum_from_word8 get data CompressionAlgorithm = Uncompressed | ZIP | ZLIB | BZip2 | CompressionAlgorithm Word8 deriving (Show, Read, Eq) instance Enum CompressionAlgorithm where toEnum 0 = Uncompressed toEnum 1 = ZIP toEnum 2 = ZLIB toEnum 3 = BZip2 toEnum x = CompressionAlgorithm $ fromIntegral x fromEnum Uncompressed = 0 fromEnum ZIP = 1 fromEnum ZLIB = 2 fromEnum BZip2 = 3 fromEnum (CompressionAlgorithm x) = fromIntegral x instance BINARY_CLASS CompressionAlgorithm where put = put . enum_to_word8 get = fmap enum_from_word8 get data RevocationCode = NoReason | KeySuperseded | KeyCompromised | KeyRetired | UserIDInvalid | RevocationCode Word8 deriving (Show, Read, Eq) instance Enum RevocationCode where toEnum 00 = NoReason toEnum 01 = KeySuperseded toEnum 02 = KeyCompromised toEnum 03 = KeyRetired toEnum 32 = UserIDInvalid toEnum x = RevocationCode $ fromIntegral x fromEnum NoReason = 00 fromEnum KeySuperseded = 01 fromEnum KeyCompromised = 02 fromEnum KeyRetired = 03 fromEnum UserIDInvalid = 32 fromEnum (RevocationCode x) = fromIntegral x instance BINARY_CLASS RevocationCode where put = put . enum_to_word8 get = fmap enum_from_word8 get -- A message is encoded as a list that takes the entire file newtype Message = Message [Packet] deriving (Show, Read, Eq) instance BINARY_CLASS Message where put (Message xs) = mapM_ put xs get = fmap Message listUntilEnd -- | Extract all signature and data packets from a 'Message' signatures_and_data :: Message -> ([Packet], [Packet]) signatures_and_data (Message ((CompressedDataPacket {message = m}):_)) = signatures_and_data m signatures_and_data (Message lst) = (filter isSignaturePacket lst, filter isDta lst) where isDta (LiteralDataPacket {}) = True isDta _ = False newtype MPI = MPI Integer deriving (Show, Read, Eq, Ord) instance BINARY_CLASS MPI where put (MPI i) = do put (((fromIntegral . B.length $ bytes) - 1) * 8 + floor (logBase (2::Double) $ fromIntegral (bytes `B.index` 0)) + 1 :: Word16) putSomeByteString bytes where bytes = if B.null bytes' then B.singleton 0 else bytes' bytes' = B.reverse $ B.unfoldr (\x -> if x == 0 then Nothing else Just (fromIntegral x, x `shiftR` 8) ) (assertProp (>=0) i) get = do length <- fmap fromIntegral (get :: Get Word16) bytes <- getSomeByteString ((length + 7) `div` 8) return (MPI (B.foldl (\a b -> a `shiftL` 8 .|. fromIntegral b) 0 bytes)) listUntilEnd :: (BINARY_CLASS a) => Get [a] listUntilEnd = do done <- isEmpty if done then return [] else do next <- get rest <- listUntilEnd return (next:rest) -- http://tools.ietf.org/html/rfc4880#section-5.2.3.1 data SignatureSubpacket = SignatureCreationTimePacket Word32 | SignatureExpirationTimePacket Word32 | -- seconds after CreationTime ExportableCertificationPacket Bool | TrustSignaturePacket {depth::Word8, trust::Word8} | RegularExpressionPacket String | RevocablePacket Bool | KeyExpirationTimePacket Word32 | -- seconds after key CreationTime PreferredSymmetricAlgorithmsPacket [SymmetricAlgorithm] | RevocationKeyPacket { sensitive::Bool, revocation_key_algorithm::KeyAlgorithm, revocation_key_fingerprint::String } | IssuerPacket String | NotationDataPacket { human_readable::Bool, notation_name::String, notation_value::String } | PreferredHashAlgorithmsPacket [HashAlgorithm] | PreferredCompressionAlgorithmsPacket [CompressionAlgorithm] | KeyServerPreferencesPacket {keyserver_no_modify::Bool} | PreferredKeyServerPacket String | PrimaryUserIDPacket Bool | PolicyURIPacket String | KeyFlagsPacket { certify_keys::Bool, sign_data::Bool, encrypt_communication::Bool, encrypt_storage::Bool, split_key::Bool, authentication::Bool, group_key::Bool } | SignerUserIDPacket String | ReasonForRevocationPacket RevocationCode String | FeaturesPacket {supports_mdc::Bool} | SignatureTargetPacket { target_key_algorithm::KeyAlgorithm, target_hash_algorithm::HashAlgorithm, hash::B.ByteString } | EmbeddedSignaturePacket Packet | UnsupportedSignatureSubpacket Word8 B.ByteString deriving (Show, Read, Eq) instance BINARY_CLASS SignatureSubpacket where put p = do -- Use 5-octet-length + 1 for tag as the first packet body octet put (255 :: Word8) put (fromIntegral (B.length body) + 1 :: Word32) put tag putSomeByteString body where (body, tag) = put_signature_subpacket p get = do len <- fmap fromIntegral (get :: Get Word8) len <- case len of _ | len > 190 && len < 255 -> do -- Two octet length second <- fmap fromIntegral (get :: Get Word8) return $ ((len - 192) `shiftR` 8) + second + 192 255 -> -- Five octet length fmap fromIntegral (get :: Get Word32) _ -> -- One octet length, no furthur processing return len tag <- fmap stripCrit get :: Get Word8 -- This forces the whole packet to be consumed packet <- getSomeByteString (len-1) return $ unsafeRunGet (parse_signature_subpacket tag) packet where -- TODO: Decide how to actually encode the "is critical" data -- instead of just ignoring it stripCrit tag = if tag .&. 0x80 == 0x80 then tag .&. 0x7f else tag put_signature_subpacket :: SignatureSubpacket -> (B.ByteString, Word8) put_signature_subpacket (SignatureCreationTimePacket time) = (encode time, 2) put_signature_subpacket (SignatureExpirationTimePacket time) = (encode time, 3) put_signature_subpacket (ExportableCertificationPacket exportable) = (encode $ enum_to_word8 exportable, 4) put_signature_subpacket (TrustSignaturePacket depth trust) = (B.concat [encode depth, encode trust], 5) put_signature_subpacket (RegularExpressionPacket regex) = (B.concat [B.fromString regex, B.singleton 0], 6) put_signature_subpacket (RevocablePacket exportable) = (encode $ enum_to_word8 exportable, 7) put_signature_subpacket (KeyExpirationTimePacket time) = (encode time, 9) put_signature_subpacket (PreferredSymmetricAlgorithmsPacket algos) = (B.concat $ map encode algos, 11) put_signature_subpacket (RevocationKeyPacket sensitive kalgo fpr) = (B.concat [encode bitfield, encode kalgo, fprb], 12) where bitfield = 0x80 .|. (if sensitive then 0x40 else 0x0) :: Word8 fprb = B.drop 2 $ encode (MPI fpri) fpri = fst $ head $ readHex fpr put_signature_subpacket (IssuerPacket keyid) = (encode (fst $ head $ readHex keyid :: Word64), 16) put_signature_subpacket (NotationDataPacket human_readable name value) = (B.concat [ B.pack [flag1,0,0,0], encode (fromIntegral (B.length namebs) :: Word16), encode (fromIntegral (B.length valuebs) :: Word16), namebs, valuebs ], 20) where valuebs = B.fromString value namebs = B.fromString name flag1 = if human_readable then 0x80 else 0x0 put_signature_subpacket (PreferredHashAlgorithmsPacket algos) = (B.concat $ map encode algos, 21) put_signature_subpacket (PreferredCompressionAlgorithmsPacket algos) = (B.concat $ map encode algos, 22) put_signature_subpacket (KeyServerPreferencesPacket no_modify) = (B.singleton (if no_modify then 0x80 else 0x0), 23) put_signature_subpacket (PreferredKeyServerPacket uri) = (B.fromString uri, 24) put_signature_subpacket (PrimaryUserIDPacket isprimary) = (encode $ enum_to_word8 isprimary, 25) put_signature_subpacket (PolicyURIPacket uri) = (B.fromString uri, 26) put_signature_subpacket (KeyFlagsPacket certify sign encryptC encryptS split auth group) = (B.singleton $ flag 0x01 certify .|. flag 0x02 sign .|. flag 0x04 encryptC .|. flag 0x08 encryptS .|. flag 0x10 split .|. flag 0x20 auth .|. flag 0x80 group , 27) where flag x True = x flag _ False = 0x0 put_signature_subpacket (SignerUserIDPacket userid) = (B.fromString userid, 28) put_signature_subpacket (ReasonForRevocationPacket code string) = (B.concat [encode code, B.fromString string], 29) put_signature_subpacket (FeaturesPacket supports_mdc) = (B.singleton $ if supports_mdc then 0x01 else 0x00, 30) put_signature_subpacket (SignatureTargetPacket kalgo halgo hash) = (B.concat [encode kalgo, encode halgo, hash], 31) put_signature_subpacket (EmbeddedSignaturePacket packet) = (fst $ put_packet (assertProp isSignaturePacket packet), 32) put_signature_subpacket (UnsupportedSignatureSubpacket tag bytes) = (bytes, tag) parse_signature_subpacket :: Word8 -> Get SignatureSubpacket -- SignatureCreationTimePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.4 parse_signature_subpacket 2 = fmap SignatureCreationTimePacket get -- SignatureExpirationTimePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.10 parse_signature_subpacket 3 = fmap SignatureExpirationTimePacket get -- ExportableCertificationPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.11 parse_signature_subpacket 4 = fmap (ExportableCertificationPacket . enum_from_word8) get -- TrustSignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.13 parse_signature_subpacket 5 = liftM2 TrustSignaturePacket get get -- TrustSignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.14 parse_signature_subpacket 6 = fmap (RegularExpressionPacket . B.toString . B.init) getRemainingByteString -- RevocablePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.12 parse_signature_subpacket 7 = fmap (RevocablePacket . enum_from_word8) get -- KeyExpirationTimePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.6 parse_signature_subpacket 9 = fmap KeyExpirationTimePacket get -- PreferredSymmetricAlgorithms, http://tools.ietf.org/html/rfc4880#section-5.2.3.7 parse_signature_subpacket 11 = fmap PreferredSymmetricAlgorithmsPacket listUntilEnd -- RevocationKeyPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.15 parse_signature_subpacket 12 = do bitfield <- get :: Get Word8 kalgo <- get fpr <- getSomeByteString 20 -- bitfield must have bit 0x80 set, says the spec return RevocationKeyPacket { sensitive = bitfield .&. 0x40 == 0x40, revocation_key_algorithm = kalgo, revocation_key_fingerprint = pad $ map toUpper $ foldr (padB `oo` showHex) "" (B.unpack fpr) } where oo = (.) . (.) padB s | odd $ length s = '0':s | otherwise = s pad s = replicate (40 - length s) '0' ++ s -- IssuerPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.5 parse_signature_subpacket 16 = do keyid <- get :: Get Word64 return $ IssuerPacket (pad $ map toUpper $ showHex keyid "") where pad s = replicate (16 - length s) '0' ++ s -- NotationDataPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.16 parse_signature_subpacket 20 = do (flag1,_,_,_) <- get4word8 (m,n) <- liftM2 (,) get get :: Get (Word16,Word16) name <- fmap B.toString $ getSomeByteString $ fromIntegral m value <- fmap B.toString $ getSomeByteString $ fromIntegral n return NotationDataPacket { human_readable = flag1 .&. 0x80 == 0x80, notation_name = name, notation_value = value } where get4word8 :: Get (Word8,Word8,Word8,Word8) get4word8 = liftM4 (,,,) get get get get -- PreferredHashAlgorithmsPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.8 parse_signature_subpacket 21 = fmap PreferredHashAlgorithmsPacket listUntilEnd -- PreferredCompressionAlgorithmsPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.9 parse_signature_subpacket 22 = fmap PreferredCompressionAlgorithmsPacket listUntilEnd -- KeyServerPreferencesPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.17 parse_signature_subpacket 23 = do empty <- isEmpty flag1 <- if empty then return 0 else get :: Get Word8 return KeyServerPreferencesPacket { keyserver_no_modify = flag1 .&. 0x80 == 0x80 } -- PreferredKeyServerPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.18 parse_signature_subpacket 24 = fmap (PreferredKeyServerPacket . B.toString) getRemainingByteString -- PrimaryUserIDPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.19 parse_signature_subpacket 25 = fmap (PrimaryUserIDPacket . enum_from_word8) get -- PolicyURIPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.20 parse_signature_subpacket 26 = fmap (PolicyURIPacket . B.toString) getRemainingByteString -- KeyFlagsPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.21 parse_signature_subpacket 27 = do empty <- isEmpty flag1 <- if empty then return 0 else get :: Get Word8 return KeyFlagsPacket { certify_keys = flag1 .&. 0x01 == 0x01, sign_data = flag1 .&. 0x02 == 0x02, encrypt_communication = flag1 .&. 0x04 == 0x04, encrypt_storage = flag1 .&. 0x08 == 0x08, split_key = flag1 .&. 0x10 == 0x10, authentication = flag1 .&. 0x20 == 0x20, group_key = flag1 .&. 0x80 == 0x80 } -- SignerUserIDPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.22 parse_signature_subpacket 28 = fmap (SignerUserIDPacket . B.toString) getRemainingByteString -- ReasonForRevocationPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.23 parse_signature_subpacket 29 = liftM2 ReasonForRevocationPacket get (fmap B.toString getRemainingByteString) -- FeaturesPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.24 parse_signature_subpacket 30 = do empty <- isEmpty flag1 <- if empty then return 0 else get :: Get Word8 return FeaturesPacket { supports_mdc = flag1 .&. 0x01 == 0x01 } -- SignatureTargetPacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.25 parse_signature_subpacket 31 = liftM3 SignatureTargetPacket get get getRemainingByteString -- EmbeddedSignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.26 parse_signature_subpacket 32 = fmap (EmbeddedSignaturePacket . forceSignature) (parse_packet 2) where forceSignature x@(SignaturePacket {}) = x forceSignature _ = error "EmbeddedSignature must contain signature" -- Represent unsupported packets as their tag and literal bytes parse_signature_subpacket tag = fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString -- | Find the keyid that issued a SignaturePacket signature_issuer :: Packet -> Maybe String signature_issuer (SignaturePacket {hashed_subpackets = hashed, unhashed_subpackets = unhashed}) = if length issuers > 0 then Just issuer else Nothing where IssuerPacket issuer = issuers !! 0 issuers = filter isIssuer hashed ++ filter isIssuer unhashed isIssuer (IssuerPacket {}) = True isIssuer _ = False signature_issuer _ = Nothing find_key :: (Packet -> String) -> Message -> String -> Maybe Packet find_key fpr (Message (x@(PublicKeyPacket {}):xs)) keyid = find_key' fpr x xs keyid find_key fpr (Message (x@(SecretKeyPacket {}):xs)) keyid = find_key' fpr x xs keyid find_key fpr (Message (_:xs)) keyid = find_key fpr (Message xs) keyid find_key _ _ _ = Nothing find_key' :: (Packet -> String) -> Packet -> [Packet] -> String -> Maybe Packet find_key' fpr x xs keyid | thisid == keyid = Just x | otherwise = find_key fpr (Message xs) keyid where thisid = reverse $ take (length keyid) (reverse (fpr x)) -- | SignaturePacket smart constructor signaturePacket :: Word8 -> Word8 -> KeyAlgorithm -> HashAlgorithm -> [SignatureSubpacket] -> [SignatureSubpacket] -> Word16 -> [MPI] -> Packet signaturePacket version signature_type key_algorithm hash_algorithm hashed_subpackets unhashed_subpackets hash_head signature = let p = SignaturePacket { version = version, signature_type = signature_type, key_algorithm = key_algorithm, hash_algorithm = hash_algorithm, hashed_subpackets = hashed_subpackets, unhashed_subpackets = unhashed_subpackets, hash_head = hash_head, signature = signature, trailer = undefined } in p { trailer = calculate_signature_trailer p } isSignaturePacket :: Packet -> Bool isSignaturePacket (SignaturePacket {}) = True isSignaturePacket _ = False openpgp-0.4/Data/OpenPGP/0000755000000000000000000000000012007770504013336 5ustar0000000000000000openpgp-0.4/Data/OpenPGP/Arbitrary.hs0000644000000000000000000002370712007770504015642 0ustar0000000000000000module Data.OpenPGP.Arbitrary where import Data.OpenPGP import Test.QuickCheck import Test.QuickCheck.Instances import Numeric import Data.Char import Data.Word instance Arbitrary Packet where arbitrary = do x <- choose (0 :: Int, 9) case x of 0 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary x4 <- resize 10 (listOf arbitrary) x5 <- resize 10 (listOf arbitrary) x6 <- arbitrary x7 <- arbitrary version <- choose (2 :: Word8, 4) case version of 4 -> return (signaturePacket 4 x1 x2 x3 x4 x5 x6 x7) _ -> do creation_time <- arbitrary keyid <- vectorOf 16 (elements (['0'..'9'] ++ ['A'..'F'])) return (signaturePacket version x1 x2 x3 [] [SignatureCreationTimePacket creation_time, IssuerPacket keyid] x6 x7) 1 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary x4 <- arbitrary x5 <- arbitrary x6 <- arbitrary return (OnePassSignaturePacket x1 x2 x3 x4 x5 x6) 2 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary x4 <- arbitrary x5 <- arbitrary x6 <- arbitrary return (PublicKeyPacket x1 x2 x3 x4 x5 x6) 3 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary x4 <- arbitrary x5 <- arbitrary x6 <- arbitrary x7 <- arbitrary x8 <- arbitrary x9 <- arbitrary x10 <- arbitrary x11 <- arbitrary x12 <- arbitrary x13 <- arbitrary return (SecretKeyPacket x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13) 4 -> do x1 <- arbitrary x2 <- arbitrary return (CompressedDataPacket x1 x2) 5 -> return MarkerPacket 6 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary x4 <- arbitrary return (LiteralDataPacket x1 x2 x3 x4) 7 -> do x1 <- arbitrary return (UserIDPacket x1) 8 -> do x1 <- arbitrary return (ModificationDetectionCodePacket x1) 9 -> do x1 <- arbitrary x2 <- arbitrary return (UnsupportedPacket x1 x2) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" instance Arbitrary HashAlgorithm where arbitrary = do x <- choose (0 :: Int, 7) case x of 0 -> return MD5 1 -> return SHA1 2 -> return RIPEMD160 3 -> return SHA256 4 -> return SHA384 5 -> return SHA512 6 -> return SHA224 7 -> do x1 <- suchThat arbitrary (`notElem` [01,02,03,08,09,10,11]) return (HashAlgorithm x1) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" instance Arbitrary KeyAlgorithm where arbitrary = do x <- choose (0 :: Int, 8) case x of 0 -> return RSA 1 -> return RSA_E 2 -> return RSA_S 3 -> return ELGAMAL 4 -> return DSA 5 -> return ECC 6 -> return ECDSA 7 -> return DH 8 -> do x1 <- suchThat arbitrary (`notElem` [01,02,03,16,17,18,19,21]) return (KeyAlgorithm x1) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" instance Arbitrary SymmetricAlgorithm where arbitrary = do x <- choose (0 :: Int, 9) case x of 0 -> return Unencrypted 1 -> return IDEA 2 -> return TripleDES 3 -> return CAST5 4 -> return Blowfish 5 -> return AES128 6 -> return AES192 7 -> return AES256 8 -> return Twofish 9 -> do x1 <- suchThat arbitrary (`notElem` [00,01,02,03,04,07,08,09,10]) return (SymmetricAlgorithm x1) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" instance Arbitrary CompressionAlgorithm where arbitrary = do x <- choose (0 :: Int, 4) case x of 0 -> return Uncompressed 1 -> return ZIP 2 -> return ZLIB 3 -> return BZip2 4 -> do x1 <- suchThat arbitrary (`notElem` [0,1,2,3]) return (CompressionAlgorithm x1) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" instance Arbitrary RevocationCode where arbitrary = do x <- choose (0 :: Int, 5) case x of 0 -> return NoReason 1 -> return KeySuperseded 2 -> return KeyCompromised 3 -> return KeyRetired 4 -> return UserIDInvalid 5 -> do x1 <- suchThat arbitrary (`notElem` [00,01,02,03,32]) return (RevocationCode x1) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" instance Arbitrary Message where arbitrary = do x1 <- arbitrary return (Message x1) instance Arbitrary MPI where arbitrary = do x1 <- suchThat arbitrary (>=0) return (MPI x1) instance Arbitrary SignatureSubpacket where arbitrary = do x <- choose (0 :: Int, 23) case x of 0 -> do x1 <- arbitrary return (SignatureCreationTimePacket x1) 1 -> do x1 <- arbitrary return (SignatureExpirationTimePacket x1) 2 -> do x1 <- arbitrary return (ExportableCertificationPacket x1) 3 -> do x1 <- arbitrary x2 <- arbitrary return (TrustSignaturePacket x1 x2) 4 -> do x1 <- arbitrary return (RegularExpressionPacket x1) 5 -> do x1 <- arbitrary return (RevocablePacket x1) 6 -> do x1 <- arbitrary return (KeyExpirationTimePacket x1) 7 -> do x1 <- arbitrary return (PreferredSymmetricAlgorithmsPacket x1) 8 -> do x1 <- arbitrary x2 <- arbitrary x3 <- vectorOf 40 (elements (['0'..'9'] ++ ['A'..'F'])) return (RevocationKeyPacket x1 x2 x3) 9 -> do x1 <- vectorOf 16 (elements (['0'..'9'] ++ ['A'..'F'])) return (IssuerPacket x1) 10 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary return (NotationDataPacket x1 x2 x3) 11 -> do x1 <- arbitrary return (PreferredHashAlgorithmsPacket x1) 12 -> do x1 <- arbitrary return (PreferredCompressionAlgorithmsPacket x1) 13 -> do x1 <- arbitrary return (KeyServerPreferencesPacket x1) 14 -> do x1 <- arbitrary return (PreferredKeyServerPacket x1) 15 -> do x1 <- arbitrary return (PrimaryUserIDPacket x1) 16 -> do x1 <- arbitrary return (PolicyURIPacket x1) 17 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary x4 <- arbitrary x5 <- arbitrary x6 <- arbitrary x7 <- arbitrary return (KeyFlagsPacket x1 x2 x3 x4 x5 x6 x7) 18 -> do x1 <- arbitrary return (SignerUserIDPacket x1) 19 -> do x1 <- arbitrary x2 <- arbitrary return (ReasonForRevocationPacket x1 x2) 20 -> do x1 <- arbitrary return (FeaturesPacket x1) 21 -> do x1 <- arbitrary x2 <- arbitrary x3 <- arbitrary return (SignatureTargetPacket x1 x2 x3) 22 -> do x1 <- suchThat arbitrary isSignaturePacket return (EmbeddedSignaturePacket x1) 23 -> do x1 <- arbitrary return (UnsupportedSignatureSubpacket 105 x1) _ -> error "FATAL ERROR: Arbitrary instance, logic bug" openpgp-0.4/Data/OpenPGP/Internal.hs0000644000000000000000000000117012007770504015445 0ustar0000000000000000module Data.OpenPGP.Internal where import Data.Word import Data.Bits decode_s2k_count :: Word8 -> Word32 decode_s2k_count c = (16 + (fromIntegral c .&. 15)) `shiftL` ((fromIntegral c `shiftR` 4) + 6) encode_s2k_count :: Word32 -> Word8 encode_s2k_count iterations | iterations >= 65011712 = 255 | decode_s2k_count result < iterations = result+1 | otherwise = result where result = fromIntegral $ (fromIntegral c `shiftL` 4) .|. (count - 16) (count, c) = encode_s2k_count' (iterations `shiftR` 6) (0::Word8) encode_s2k_count' count c | count < 32 = (count, c) | otherwise = encode_s2k_count' (count `shiftR` 1) (c+1) openpgp-0.4/tests/0000755000000000000000000000000012007770504012357 5ustar0000000000000000openpgp-0.4/tests/suite.hs0000644000000000000000000002045012007770504014045 0ustar0000000000000000{-# LANGUAGE CPP #-} import Test.Framework (defaultMain, testGroup, Test) import Test.Framework.Providers.HUnit import Test.Framework.Providers.QuickCheck2 import Test.HUnit hiding (Test) import Data.Word import Data.OpenPGP.Arbitrary () import qualified Data.OpenPGP as OpenPGP import qualified Data.OpenPGP.Internal as OpenPGP #ifdef CEREAL import Data.Serialize import qualified Data.ByteString as B decode' :: (Serialize a) => B.ByteString -> a decode' x = let Right v = decode x in v #else import Data.Binary import qualified Data.ByteString.Lazy as B decode' :: (Binary a) => B.ByteString -> a decode' = decode #endif testSerialization :: FilePath -> Assertion testSerialization fp = do bs <- B.readFile $ "tests/data/" ++ fp nullShield "First" (decode' bs) (\firstpass -> nullShield "Second" (decode' $ encode firstpass) ( assertEqual ("for " ++ fp) firstpass ) ) where nullShield pass (OpenPGP.Message []) _ = assertFailure $ pass ++ " pass of " ++ fp ++ " decoded to nothing." nullShield _ m f = f m prop_s2k_count :: Word8 -> Bool prop_s2k_count c = c == OpenPGP.encode_s2k_count (OpenPGP.decode_s2k_count c) prop_MPI_serialization_loop :: OpenPGP.MPI -> Bool prop_MPI_serialization_loop mpi = mpi == decode' (encode mpi) prop_SignatureSubpacket_serialization_loop :: OpenPGP.SignatureSubpacket -> Bool prop_SignatureSubpacket_serialization_loop packet = packet == decode' (encode packet) tests :: [Test] tests = [ testGroup "Serialization" [ testCase "000001-006.public_key" (testSerialization "000001-006.public_key"), testCase "000002-013.user_id" (testSerialization "000002-013.user_id"), testCase "000003-002.sig" (testSerialization "000003-002.sig"), testCase "000004-012.ring_trust" (testSerialization "000004-012.ring_trust"), testCase "000005-002.sig" (testSerialization "000005-002.sig"), testCase "000006-012.ring_trust" (testSerialization "000006-012.ring_trust"), testCase "000007-002.sig" (testSerialization "000007-002.sig"), testCase "000008-012.ring_trust" (testSerialization "000008-012.ring_trust"), testCase "000009-002.sig" (testSerialization "000009-002.sig"), testCase "000010-012.ring_trust" (testSerialization "000010-012.ring_trust"), testCase "000011-002.sig" (testSerialization "000011-002.sig"), testCase "000012-012.ring_trust" (testSerialization "000012-012.ring_trust"), testCase "000013-014.public_subkey" (testSerialization "000013-014.public_subkey"), testCase "000014-002.sig" (testSerialization "000014-002.sig"), testCase "000015-012.ring_trust" (testSerialization "000015-012.ring_trust"), testCase "000016-006.public_key" (testSerialization "000016-006.public_key"), testCase "000017-002.sig" (testSerialization "000017-002.sig"), testCase "000018-012.ring_trust" (testSerialization "000018-012.ring_trust"), testCase "000019-013.user_id" (testSerialization "000019-013.user_id"), testCase "000020-002.sig" (testSerialization "000020-002.sig"), testCase "000021-012.ring_trust" (testSerialization "000021-012.ring_trust"), testCase "000022-002.sig" (testSerialization "000022-002.sig"), testCase "000023-012.ring_trust" (testSerialization "000023-012.ring_trust"), testCase "000024-014.public_subkey" (testSerialization "000024-014.public_subkey"), testCase "000025-002.sig" (testSerialization "000025-002.sig"), testCase "000026-012.ring_trust" (testSerialization "000026-012.ring_trust"), testCase "000027-006.public_key" (testSerialization "000027-006.public_key"), testCase "000028-002.sig" (testSerialization "000028-002.sig"), testCase "000029-012.ring_trust" (testSerialization "000029-012.ring_trust"), testCase "000030-013.user_id" (testSerialization "000030-013.user_id"), testCase "000031-002.sig" (testSerialization "000031-002.sig"), testCase "000032-012.ring_trust" (testSerialization "000032-012.ring_trust"), testCase "000033-002.sig" (testSerialization "000033-002.sig"), testCase "000034-012.ring_trust" (testSerialization "000034-012.ring_trust"), testCase "000035-006.public_key" (testSerialization "000035-006.public_key"), testCase "000036-013.user_id" (testSerialization "000036-013.user_id"), testCase "000037-002.sig" (testSerialization "000037-002.sig"), testCase "000038-012.ring_trust" (testSerialization "000038-012.ring_trust"), testCase "000039-002.sig" (testSerialization "000039-002.sig"), testCase "000040-012.ring_trust" (testSerialization "000040-012.ring_trust"), testCase "000041-017.attribute" (testSerialization "000041-017.attribute"), testCase "000042-002.sig" (testSerialization "000042-002.sig"), testCase "000043-012.ring_trust" (testSerialization "000043-012.ring_trust"), testCase "000044-014.public_subkey" (testSerialization "000044-014.public_subkey"), testCase "000045-002.sig" (testSerialization "000045-002.sig"), testCase "000046-012.ring_trust" (testSerialization "000046-012.ring_trust"), testCase "000047-005.secret_key" (testSerialization "000047-005.secret_key"), testCase "000048-013.user_id" (testSerialization "000048-013.user_id"), testCase "000049-002.sig" (testSerialization "000049-002.sig"), testCase "000050-012.ring_trust" (testSerialization "000050-012.ring_trust"), testCase "000051-007.secret_subkey" (testSerialization "000051-007.secret_subkey"), testCase "000052-002.sig" (testSerialization "000052-002.sig"), testCase "000053-012.ring_trust" (testSerialization "000053-012.ring_trust"), testCase "000054-005.secret_key" (testSerialization "000054-005.secret_key"), testCase "000055-002.sig" (testSerialization "000055-002.sig"), testCase "000056-012.ring_trust" (testSerialization "000056-012.ring_trust"), testCase "000057-013.user_id" (testSerialization "000057-013.user_id"), testCase "000058-002.sig" (testSerialization "000058-002.sig"), testCase "000059-012.ring_trust" (testSerialization "000059-012.ring_trust"), testCase "000060-007.secret_subkey" (testSerialization "000060-007.secret_subkey"), testCase "000061-002.sig" (testSerialization "000061-002.sig"), testCase "000062-012.ring_trust" (testSerialization "000062-012.ring_trust"), testCase "000063-005.secret_key" (testSerialization "000063-005.secret_key"), testCase "000064-002.sig" (testSerialization "000064-002.sig"), testCase "000065-012.ring_trust" (testSerialization "000065-012.ring_trust"), testCase "000066-013.user_id" (testSerialization "000066-013.user_id"), testCase "000067-002.sig" (testSerialization "000067-002.sig"), testCase "000068-012.ring_trust" (testSerialization "000068-012.ring_trust"), testCase "000069-005.secret_key" (testSerialization "000069-005.secret_key"), testCase "000070-013.user_id" (testSerialization "000070-013.user_id"), testCase "000071-002.sig" (testSerialization "000071-002.sig"), testCase "000072-012.ring_trust" (testSerialization "000072-012.ring_trust"), testCase "000073-017.attribute" (testSerialization "000073-017.attribute"), testCase "000074-002.sig" (testSerialization "000074-002.sig"), testCase "000075-012.ring_trust" (testSerialization "000075-012.ring_trust"), testCase "000076-007.secret_subkey" (testSerialization "000076-007.secret_subkey"), testCase "000077-002.sig" (testSerialization "000077-002.sig"), testCase "000078-012.ring_trust" (testSerialization "000078-012.ring_trust"), testCase "002182-002.sig" (testSerialization "002182-002.sig"), testCase "pubring.gpg" (testSerialization "pubring.gpg"), testCase "secring.gpg" (testSerialization "secring.gpg"), testCase "compressedsig.gpg" (testSerialization "compressedsig.gpg"), testCase "compressedsig-zlib.gpg" (testSerialization "compressedsig-zlib.gpg"), testCase "compressedsig-bzip2.gpg" (testSerialization "compressedsig-bzip2.gpg"), testCase "onepass_sig" (testSerialization "onepass_sig"), testCase "uncompressed-ops-dsa.gpg" (testSerialization "uncompressed-ops-dsa.gpg"), testCase "uncompressed-ops-dsa-sha384.txt.gpg" (testSerialization "uncompressed-ops-dsa-sha384.txt.gpg"), testCase "uncompressed-ops-rsa.gpg" (testSerialization "uncompressed-ops-rsa.gpg"), testProperty "MPI encode/decode" prop_MPI_serialization_loop, testProperty "SignatureSubpacket encode/decode" prop_SignatureSubpacket_serialization_loop ], testGroup "S2K count" [ testProperty "S2K count encode reverses decode" prop_s2k_count ] ] main :: IO () main = defaultMain tests openpgp-0.4/tests/data/0000755000000000000000000000000012007770504013270 5ustar0000000000000000openpgp-0.4/tests/data/000038-012.ring_trust0000644000000000000000000000000412007770504016436 0ustar0000000000000000openpgp-0.4/tests/data/000074-002.sig0000644000000000000000000000030012007770504015016 0ustar0000000000000000(OwL hmdi!Սyǜ+d1A(}=M4 BvSu [TXq, %f8o; m *At'|Fg0]%]%yޡ UVC~d:+5 uopenpgp-0.4/tests/data/000066-013.user_id0000644000000000000000000000005512007770504015700 0ustar0000000000000000+Test Key (DSA sign-only) openpgp-0.4/tests/data/000068-012.ring_trust0000644000000000000000000000000412007770504016441 0ustar0000000000000000openpgp-0.4/tests/data/000076-007.secret_subkey0000644000000000000000000000170112007770504017120 0ustar0000000000000000OwJGgC!_ZGk렂=KsxH-!*nLvXFw|#W,l;qfO^>3(@ 8A ̇کv4'gb2R!e.}񀙱ltM?E-]5ds1\Z7_MեZC)'MB4gȇIİLJ3JX< |4NW~AG}5[BaCrj/"͒u6 t=pjZ}Eh2:ZN<NcIVPDaP6Sd ׶P(sQ+'Jy!ڿ`{? bh5׽ OaD\2Vޖtr#'dWB_'<{ O,L , hd(&%/{3F){٬m5_YStuCCb̐openpgp-0.4/tests/data/000021-012.ring_trust0000644000000000000000000000000412007770504016426 0ustar0000000000000000openpgp-0.4/tests/data/000014-002.sig0000644000000000000000000000030312007770504015013 0ustar0000000000000000Ow$  π No9R \R^mNʖlysQ%x=ӿbG"lf!%F*w͎gL#!^_ql5qWe/< 0k)sL34ʺmEy$éH#TP.f\w=j4akopenpgp-0.4/tests/data/000073-017.attribute0000644000000000000000000000334112007770504016254 0ustar0000000000000000JFIFHHC  !"$"$C_"3!1"A2QVa#3Tq-!1AQa"2qBR ?}{H5Un5ˊ[]RB`JJ֤ RauvǏ"S''_xerqJP>;n@%̓fZ~qᏦ8ۋjxUB*__N~v׏qk#ĸ*:` `†?'FJt)n:StƢ5Nllj::^61 6NB |]\Idg=TD@VTDŽ?S֤~O?Z{tf¢uU9uRąCH 9A̭ă_]N)0Tuڞ\_Z|Q_O>t|Tp7 ۏq@ L_mMQCQb_$$((`_Up Taohqe3d"kH& LVO"=7*R(q7JJ!q{yE+"1Rf#ĥK JE@Mԑs:\>;QZېs 6= 28`zޭXRxY;w$$-Lş6KITAQFʧ5=4 (6{ e]`"YmXqu4rj2\YFJB tB6ꞡjrTit0BUtsȹ~;v;^qRQ5->o!IH! M4vn f"d\\SfJB/S/$=RA~ܲfiuErYtw!@ ˂>NU{pVQUee R%7Zl1㟞*liuovo|c{["*QrߓC@1'ZA~mf˶<'pL؋p$Hh* %@$ň#j۲UD6ֶ$$n4hګ VTs@39yF5YN!Ч\[FuqtVorF~Q1LhS.ڊMqt ?sFoUS$3tupѧSȆE- 6ZĤ8LzjQ,_B]BIQDs4hMLOs3>d3kpS(?71<\S~8ԾNKTw@āv-NcP'S ̑][`T \ƦKOҢTT\((*$H!FXm'2` G)&cW4aKMqlE3ٲ( uАQL\Jo_~ +­Dx:sTj_openpgp-0.4/tests/data/000029-012.ring_trust0000644000000000000000000000000412007770504016436 0ustar0000000000000000openpgp-0.4/tests/data/compressedsig.gpg0000644000000000000000000000050412007770504016635 0ustar0000000000000000xv>5IE%9z%%! @PPPZ_[PKSI&($&g(gddJ R32sRK2:v00212e,\?oMbbJ?+&=K査ŭw=ySOUj9gCVb뷭Z2)vnH ޥ8M 3Ϛ՞J?:Z8]"#ӧ>]H1uMWo wQ?uug~CeJnbopenpgp-0.4/tests/data/000064-002.sig0000644000000000000000000000014312007770504015022 0ustar0000000000000000a!OwJ y3EY >hm w2ϘcnA_-]joyp&e2r ؠXopenpgp-0.4/tests/data/000010-012.ring_trust0000644000000000000000000000000412007770504016424 0ustar0000000000000000openpgp-0.4/tests/data/000075-012.ring_trust0000644000000000000000000000000412007770504016437 0ustar0000000000000000openpgp-0.4/tests/data/compressedsig-bzip2.gpg0000644000000000000000000000067212007770504017667 0ustar0000000000000000BZh61AY&SYVmns{E"ZPf(1ŷKU0LTѴFL4`Li 1CL H`ISzHt20M0`G00TD= dFFOHd4i4 cD$HAP%~":(X;.;)6Lތ̖jH0D>ḽO&BD`;M*E8 nfoeuueFdYz Y#K,H.B4hNf'0 Jg~PIr#{,RHUG#/G:[~WkUY, #JٷDp"#e'"(H+67openpgp-0.4/tests/data/000049-002.sig0000644000000000000000000000033412007770504015027 0ustar0000000000000000(Ow$ π   No=8 \-97Ed;|̙j%`9^a M~U3pѰuhxᶱ[WkSfB)C3 %C ]h,x-fɗI Q]-liuCa$`ml5e1Υnopenpgp-0.4/tests/data/000051-007.secret_subkey0000644000000000000000000000114312007770504017111 0ustar0000000000000000`Ow$ພo# \X" l9Nv`x]pBA hzSX[s'S4~#{T V`;~ 'o]3U.-Psڮ>S}%Nbx%9mˣ^l":C*=emGM`A]Q$VamQX&nySRw!+ˑk^IW!4HX`5yKh4nQ?ՙthSM]$f/\Ts,FJwJ^Il2k0!xU;/̶̪a}>F7AL}ΚtP6n|iqq«VWzjkv-iV $=d/B9KʋTp%a *' : r$4* @OM2Whu}Va v< YG="ӱRf Q/swn 7 ưUl4ߕ,jLv)DÎyhl4Yopenpgp-0.4/tests/data/onepass_sig0000644000000000000000000000001712007770504015523 0ustar0000000000000000 Noopenpgp-0.4/tests/data/000057-013.user_id0000644000000000000000000000004612007770504015700 0ustar0000000000000000$Test Key (DSA) openpgp-0.4/tests/data/000037-002.sig0000644000000000000000000000030012007770504015015 0ustar0000000000000000(Ow! hmAD&5Ԝjmg^y]bnKA;x˲BT[DwQ%2rwEB b;ʴYhm w2ϘcnA_-]joyp&e2r ؠXopenpgp-0.4/tests/data/000059-012.ring_trust0000644000000000000000000000000412007770504016441 0ustar0000000000000000openpgp-0.4/tests/data/000003-002.sig0000644000000000000000000000016112007770504015013 0ustar0000000000000000o0OwITesting revsig ^#A2biBV#WY#-B>,[> $x yfu 38#openpgp-0.4/tests/data/000012-012.ring_trust0000644000000000000000000000000412007770504016426 0ustar0000000000000000openpgp-0.4/tests/data/compressedsig-zlib.gpg0000644000000000000000000000050212007770504017571 0ustar0000000000000000xxv>5IU9Iz%%dd+Qz~f^BIBRBqfz^jBb^Bnr~nAQjq1P,3$1O!?'E7-(7D 19;D<$$SW\ T^ձ d%=1,/D]=ûu!n;,TlﯞC+Z4]кX]y/52zbQC^/XAmS$cj}ȏ%=ل)Բ(~`Rͧ~@NTnN(ǘQصf.^3mw8P*}(Qwrdx')mqVP2g wa mG >\$B6C;i^4Rgׁ`A0ʭerT$fJ{y!TM{2XIסtWaʞ+openpgp-0.4/tests/data/000069-005.secret_key0000644000000000000000000000100112007770504016377 0ustar0000000000000000Ow!ž%Jo_-0=!t֤70#M\d&KnHyI Qm PG;RLjF!"N$9t98wvW"I%/̈LNСz Ny  WA/`++oXbN,9KpPwR,l&p<ǻ\n>+;I Sl Xr Ju#ʶK&Λ_o7HBߙAzHkWp`4dl LJ"`H.lۏ'O4]4,X3܉O'q)u]hhHi'KI>1/L,ڀT R6Z7VA,,&|yrXh,@@D:7k=0sD2އFcOq~8gU;[U 4AT}G J6>?9by$(A\vծ:Qe`0*(openpgp-0.4/tests/data/000024-014.public_subkey0000644000000000000000000000114012007770504017075 0ustar0000000000000000]Ow @7la Ua?a`K䠳q{Ü@H2{'2i0  D+=6h8k]NmY\}]X+%T|T̠ =%VubD;^`钘/hĢfFj㬒vA$_,G]aNz5ͽ w?

(ǘQصf.^3mw8P*}(Qwrdx')mqVP2g wa mG >\$B6C;i^4Ropenpgp-0.4/tests/data/000011-002.sig0000644000000000000000000000014012007770504015007 0ustar0000000000000000^OwI5 ^#A2bQ>&P{k-aعl nqaѡ0!Y꾹gkv0Hjopenpgp-0.4/tests/data/000016-006.public_key0000644000000000000000000000226112007770504016372 0ustar0000000000000000Ow m] yayT*p}GLE!SH)䃉4ŷQ,lŖF!b 4ދj;R  4<ްoz})Q6\R2y俓ܣ%}U|n;[ m @t9N\ߊW 4d*\ #KP E6)R߶l#0ӚBD`^.{{m#}gGV+ 6!b7Fa'Y J-`L4cWM9[E}U+0'3/HKfxpΞ{E*DQ:j oB&mK&_ S2B_"#0NEuFrV5m`sm렖}X4/H R-;548[,_zk\6"WLR ׁ*PieK6d*e5ͰF2HƩm&ވ0MO3e*5<*hp;gv-SIJZ8xRaZܗQDY,css9AO5 `]BQayl9J r t7sKamK . eDH Dqœ;B=zDky[dwz-ůnga5uTjgat̑LL]openpgp-0.4/tests/data/000036-013.user_id0000644000000000000000000000006012007770504015671 0ustar0000000000000000.Test Key (RSA sign-only) openpgp-0.4/tests/data/000040-012.ring_trust0000644000000000000000000000000412007770504016427 0ustar0000000000000000openpgp-0.4/tests/data/000023-012.ring_trust0000644000000000000000000000000412007770504016430 0ustar0000000000000000openpgp-0.4/tests/data/000045-002.sig0000644000000000000000000000024112007770504015020 0ustar0000000000000000 OwJ >hm߰yb)Qx0+G7ld:`c/ ~ڶTG̔Cr=0n~83aQ_zIN\|Sa8e`dqr#dW>}P끩openpgp-0.4/tests/data/000020-002.sig0000644000000000000000000000020212007770504015006 0ustar0000000000000000(Ow    ^#A2bܯgi\Q$`;! 873?wNj*rK%% Aý~uopenpgp-0.4/tests/data/000015-012.ring_trust0000644000000000000000000000000412007770504016431 0ustar0000000000000000openpgp-0.4/tests/data/000001-006.public_key0000644000000000000000000000025312007770504016363 0ustar0000000000000000Ow$G4r㪼v#X5[r 6TlS) >꬙ߗGK )ϒYJJa"tuw?#4`h)PVs5U\v!J&lmI  VC4󠮀kcnT~꬙ߗGK )ϒYJJa"tuw?#4`h)PVs5U\v!J&lmI  VC4󠮀kcnT~o0OwITesting revsig ^#A2biBV#WY#-B>,[> $x yfu 38#o0OwIDtesting revsig ^#A2b>+ #1ѽ^Qmz6!$W+6+TQeL[3Gl/(Ow$ π   No=8 \-97Ed;|̙j%`9^a M~U3pѰuhxᶱ[WkSfB)C3 %C ]h,x-fɗI Q]-liuCa$`ml5e1ΥnOwHw >hm´#pBjH t_%*Y/V;k.Yy7%;z(Pvn*_7JD+&*,il)c Y3n]U}aD|"[N#a^OwI5 ^#A2bQ>&P{k-aعl nqaѡ0!Y꾹gkv0HjOw$ພo# \X" l9Nv`x]pBA hzSX[s'S4~#{T V`;~ 'o]3U.-Psڮ>S}%Nbx%9mˣ^l":C*=Ow$  π No9R \R^mNʖlysQ%x=ӿbG"lf!%F*w͎gL#!^_ql5qWe/< 0k)sL34ʺmEy$éH#TP.f\w=j4akOw m] yayT*p}GLE!SH)䃉4ŷQ,lŖF!b 4ދj;R  4<ްoz})Q6\R2y俓ܣ%}U|n;[ m @t9N\ߊW 4d*\ #KP E6)R߶l#0ӚBD`^.{{m#}gGV+ 6!b7Fa'Y J-`L4cWM9[E}U+0'3/HKfxpΞ{E*DQ:j oB&mK&_ S2B_"#0NEuFrV5m`sm렖}X4/H R-;548[,_zk\6"WLR ׁ*PieK6d*e5ͰF2HƩm&ވ0MO3e*5<*hp;gv-SIJZ8xRaZܗQDY,css9AO5 `]BQayl9J r t7sKamK . eDH Dqœ;B=zDky[dwz-ůnga5uTjgat̑LL]y!OwJ  /Z\þw2Ϙc ^#A2b& bta=0)Ҷ?9pɼRORͤ[L]ڳ,}pcï-`+LѰ$Test Key (DSA) (Ow    ^#A2bܯgi\Q$`;! 873?wNj*rK%% Aý~uOwH4 NowMy/]GYjZU8{Sc!Q'VJ""[zT|ĽX]`qdD+Ւ !BwR'+iDm@ (ǘQصf.^3mw8P*}(Qwrdx')mqVP2g wa mG >\$B6C;i^4RgOw   ^#A2b)$[OX`J`6\I[o?u<wGkt˨\A]gM^"߶/HOw3!$}9 W̳us<,?#/ `N["cgU[In?60tw&U8j,K|7[Cb|p6.oaV1aS"oՍ)6W.=='%WgDڤDAmiԚr8h>$B/'tMZ ַk(Txg^;?Q#׻HD?HgQW-i|rKHA B,GO>G9ٓfp',6n?טYT/ ?XvT:`p/y){0ϜFw7νyV_3v }yNi[͙\zC?9A$Ya!OwJ y3EY >hm w2ϘcnA_-]joyp&e2r ؠXŰ+Test Key (DSA sign-only) B   OwItesting@notation w2Ϙcꆸ-&iDš$)`Sg<°^OwHT ^#A2b0$LM ɑ(;濂X/t+2f]9"W=O!}co*(:UOw!ž%Jo_-0=!t֤70#M\d&KnHyI Qm PG;RLjF!"N$9t98wvW"I%/̈LNСz Ny .Test Key (RSA sign-only) (Ow! hmAD&5Ԝjmg^y]bnKA;x˲BT[DwQ%2rwEB b;ʴY;n@%̓fZ~qᏦ8ۋjxUB*__N~v׏qk#ĸ*:` `†?'FJt)n:StƢ5Nllj::^61 6NB |]\Idg=TD@VTDŽ?S֤~O?Z{tf¢uU9uRąCH 9A̭ă_]N)0Tuڞ\_Z|Q_O>t|Tp7 ۏq@ L_mMQCQb_$$((`_Up Taohqe3d"kH& LVO"=7*R(q7JJ!q{yE+"1Rf#ĥK JE@Mԑs:\>;QZېs 6= 28`zޭXRxY;w$$-Lş6KITAQFʧ5=4 (6{ e]`"YmXqu4rj2\YFJB tB6ꞡjrTit0BUtsȹ~;v;^qRQ5->o!IH! M4vn f"d\\SfJB/S/$=RA~ܲfiuErYtw!@ ˂>NU{pVQUee R%7Zl1㟞*liuovo|c{["*QrߓC@1'ZA~mf˶<'pL؋p$Hh* %@$ň#j۲UD6ֶ$$n4hګ VTs@39yF5YN!Ч\[FuqtVorF~Q1LhS.ڊMqt ?sFoUS$3tupѧSȆE- 6ZĤ8LzjQ,_B]BIQDs4hMLOs3>d3kpS(?71<\S~8ԾNKTw@āv-NcP'S ̑][`T \ƦKOҢTT\((*$H!FXm'2` G)&cW4aKMqlE3ٲ( uАQL\Jo_~ +­Dx:sTj_و(OwL hmdi!Սyǜ+d1A(}=M4 BvSu [TXq, %f8o; m *At'|Fg0]%]%yޡ UVC~d:+5 u OwJGgC!_ZGk렂=KsxH-!*nLvXFw|#W,l;qfO^>3(@ 8hm߰yb)Qx0+G7ld:`c/ ~ڶTG̔Cr=0n~83aQ_zIN\|Sa8e`dqr#dW>}P끩1s񳠅.Ƿ3>&$^8 ](-1fg. Xv:PǽHG|ގq mNPBjCDD)ۮ|[Ӏu #Qu*mŀ& 53mŀ&M5}׀D!\zWvL`Ɵ^1E䌌;F;YUԸ)wBv^ t= إH;8bAw),ui"+t,|فP%єc +MɁ"#Manoj Srivastava ?5$Ծ%wE]o2,dǼXj Rps@Y}OJ?5qs}ONTm>v(.dǙPp07׈EF |Mgarug!u0{ ˤϯSo;=EF\ op;%3t)EwxBrTp kW}.Trg#F8  ׹ҥeƨIh/YeS@sL"E\; P?F8/ O{Tx+SHd{̅sZOȓ?%x qF9 D:giG4k_3WWp\:rʪ@8{).>F;8! !ڻ$BLr/G;Q˺CamƟ 6F;; hYf$F0CZ#?v) + .?lZNRmIצ싈F;; t%K]kTF0fbrMn=}@²_ `aUv"F;<] u$A -aQ2#/fS`6V(˄6RGůF;@w bT$is6nuR:^܇a! 6FB- +, z40 IcՓR4{Welf5AR*6FDn & 5H)#^8H3Gd/*F:]4؀yFDn |)IaO;$U.Sx j v6J(>te&^FDn 9MőqAR|,$(\DA!OуY~sYUFDn T {^mt&i.8ZƦR,wG!}:DFDpE vsjA]ehL T$ e1:˂kCn;R]VFDp EhO_nx?N`oq3>7Xy]2Ɉ v#"6Ѭ(FDyZp apqCV$wQo鷵mbn/g=\a5EFD} Z'4`)}?%n "˟y#d&2FDY~ ůwJXQ Z!l34-dh60y}9yQ@w'R;_lFDĶ i bʴm>CH`@k" *ی[qÎFDF  {0S69tobaX"s Vo=ᩲHRUaFD bKݛx F-ҡ; 8o7 * ܍ Ѡ| E3k0|ۥt _FFy /.P?c9jWFCMx-1x'{7UˣN}FF| VA&)ѲiD@J ?zI%]qEPLt.CFF=i FV7SRtJde6D_$]_cpFB'  ʿfMgcخ07ٮp1yDZvFDp,Z ̍W0|7= i,^8}N(@n-{|MFB* 3KSsok4Vvu]4O1Mt2],V:FB." hL֒SOP2 zKNɒIf'F:OňFBE~ ؿ]1ΰk<,W7n>v RL%dI*FF5 3Lr~XxO;DlC;:}xyUzlzx2}ÈI B+/ ZgrܗC70{7_B&CkYT:VbNbnpԳRhv2lju5dckFt&a#0—[h'nܿeuT@ɐG_B*PL^֑#>AU@;w:cq|?R_lj2"mŀ&t~^D\aZd!4 y]ŗ/~>FCSeQzx}OYbFfVF.W»n}p(nhnLArdcZսC9y=b+4wmŀ&T&>6\x(Lд+&wT]^N5*T_ UX䭲peBAh暀l zV`5YlaUvrLTp٨tUzMPFED| O]Pd::vGI ѯG'>#@Y?k<& yu7$? vU(tD56u^}h<9KKm{3,͍a%o0@#kiLl8}v%L&$Y"#3ZRq Jh:^.V~4`_ `{bX*r5Bu^}h<9~xzib7=̢{k{~ t 6>w(FC*)86:Hfn uޓb_Oq㐙K"} T+a`c)ཌྷg)CBeɋ+5w|A2%б^OS5ìf@E0~HśE!!m J]0lu9W¥\Dԟd*(ˍo-0 6>`kCqek#DZrgQP~phaB!?kKS~a-5Aܝ1c8 U j/'d0`,Y` (\I"+ p)~F+_& i̦f%cאWaW6bHja\j}ԃdQcB3b"Un)?[_'+.SuCUVCNQ(Ӻ5R__H_iYuv`oDS~g<2A씲gCx;Cn#]ORV ÎUYgEw nDxœgRT0XK.Y2*NWXQ l)@]u4V>C`6^!*?K2?2ʉ;VwC%NTeLdqs6Mc {*WwGa/ZbUg=k=k75U:';r(ǂ ´v*̳GhCH2-o)QY!. ?L2b cGc.;bHqY=߈uuooQUPJ V0nZ-:5=vZ҅#wvP f/^M>@9׳F3{$PtWNpgu\ ;$s=p;\~1Pv;J'$  0AfoDœ'qh,50=Rl#q<<-zBL1F &bĤaW] IZ",bn^bUH #.wKE~ݖvR;@!X OΫo- =LjOD;:wXϝ`>Fxl,GT2ƬuE'm5ː/YbK|X2g~]Z{5oqBPVbhX﵅DY}k;mqB_f#ܨA%!. -4iOl}9 F*.$Z[gIF~|_΁5=<>م\m]Df\D~i }鯚m\^7F(>wN scsh0bH:f\;o#Zy֔wv U"4W»4یA@u>*g僚"pJ8Oʛo'uؔȩ16))~]P|U7ܣ6h⋤^!P;5BπJ|15~E%Y?;|t.U?5zTúR6A-l7%50` ͮkge yƔi{Tiת͠ڞ9-/g..ޛTCxfhe+1)2cjOP+y]@x5Ke Yw9 ;;!3bڮ)}mVX!tR6ë, BX#U9zbn?M\/mzSJFOʱK#0Xw:)0`FDLOwnqїx縹K jm Y\5O۷iMSZ4[FɏX2ãvjnY=~I25uqLPĈ!WFUAgXh}*> V˭nz Z) .񴰓>%%Tꇞ*m9/$,Xsf^UY&kIPIW ;$G9&(Կ'3jމ J V H8wB97b[S s#F@KL.f r27y`O XK%vhxt/FRGu)r͑Y]LN_X}e+>Qtx<^clE;b;KDʛgc d+\ah^8նX;mP#?h}>;d{&+FI`&&0h%):3>>ߣ^Ҡga'O]|!L4*2l~&v H1M-w\i7a `7j!car/ DHlQZs@GISΪEiJl=黡2^/%-ü mX4LkfΪa]:M0 VP7Nd Xxϟ`JMd\(„9x7E>Lp⩠1h;z믿%r$$Manoj Srivastava ?5 qs}O2yJq8]t1;x*ix]S0aFS_EFx2 ݂܁K L7vud3֧tNՁ'c"ŏ^F6O  }/g\ 8*peep i{mK.tڱUMF8  ׹:0H=oü#mpNp#jF8/ O{Tx+aoz.%0u-r4yF9 D:U=x7Bl(P42f6K:z}-cɂ"T͈F;8! !ڻ$BL51-;ܫߺD<.pK0aifTN>/"~:/:F4Z`TF;T UHsư;Cī(Ɯ&=0q@*ƛzuF;a| V1_g8:W_.+uaWR,pu+9u Ҙv !|qֈF;E  @Xd,Cmo_JGo#0׬Nڗvhi+swF; Ԣ3#0~8v],LdL!F; HkK(p )qxvЀl.+w)@ɭ**3A =F;;y R|{8R{ȪT쫼qy a 0>#kFDn 9Mőꗚ?yCԧEyl,M{U['.@I(r0rFDn T {^mt&if܎A lNVTPx5٦EdJҐiވFDn _q%}/ufU+`I>GYf+#au'ԈFDo  %(!I( og$|{PFI7lke9FDpE vsZYβy/&흝{Q|8;qޤ{_eHFDp EiK906E,'0NX.* <; w`XFDyZl ap]] Yu¹@08d ):=pYAUݺƊFD} Z'C|LʦhSci#"ۧ!VjsƗ[x~&3BȤ2FDY~ ůwJXQ ZX$ځLx k%oЎmZ^FDĴ i b˫@9i IA=NC @7/T 룯 J;d bFF| VA&)ӡ, krA%diobOINKSప FF=g FV'CK<-8HhR/XS>(zAY:FF |M҄Ƈ]'eA~y_PQeڛ&ANẍFF\ opt.Rd *!t7bC|6yIP1E5bmŀ&ri?kDVa|y5 :b}҅l };VwC%I7g0rHhrbBQL_ò)wbt[!QO̘u)c[ qr;ɘR B1b뎩Lјd>,, :\~ SWR*99;bG'Y=߈uzu+HngwK=@`:@"(ҹ=;:K66,+ī5$Q!QT 먯PcNu9 dJ =s m *5[l;\~1Pv;ٚ"|i^q{:*HV#cw&[/Zt 61| V:mwBLN/D_ <_\iz_.Eǡ vGpb!!,ʼnDY}k;mqB$%wZiG7X @'VJ>VH"{T`}DQ[*wd][֎EBJ(5+zw džl$:TKڲS}UQxs)6fRcôAQ|8k633S P'}U~ױBke}OX/9+  5k 77z@TՂj"+'O]@j 40H HA[<satnix zm̛_@2J G J V H8w ]?Qy{e\":ZKR je uB<P'CZmf7޹c%:4rY6~f3 "LSv#bqj2Z1];{?cQhYC+>!PpK2y.)eWp㧲Xhoi =L%5vJWi\C?$e1R|9Mjm_Ŭutus8Hw$6 O܃+YKE* O*z霈56"@.  ?WwRB3+{2xGn(U ;ZNc$i͔Kٵ)zhD;8I&H'4uMOĿR,*%5F ӁIDmURJmewt +XYs[-,fK  7!kwQ&&X$Lb&Manoj Srivastava ?5 $Ծ%$4ϋKU\L3ɡOԓ-O]Z77?5qs}Om՞ŃUӲ AfY:xrn%_ ^^h?*E;@{ bTGU`0d\C-ߥ&o#ggn羏1ӽ zEDp EӚ}JzYU. ݷGP(WZQaey0߈F8  ׹yxұ/՛%vbRBBJ׾|Bc%w(UF8/ O{Tx+AW*ry%?mCΘ FWc݁ݸF9 D:OXe S{~}P_9 ̪1]WeyF;8! !ڻ$BL|ڳzeQ5]Kj[" G傥'F;; hYfm7^4qr9 wk~lFL"F;; t%K] WƯܧ1'_'\"; T %A)o;LjF;vG}~hF; Ԣ3cD;6V1~ z>表^F; HkK(5j"F熟iOhx}8L屢F;<9 R|{8 o9`b + 7qɪWF;9  I d2EJ#mN$G=_o)F;V נ$$BT(4dycضzUCW.Xt#Fp}F;@ ԛ\6^BXvv"aX}T,Yd<6G`2 FB- +, zJ? ӭ]R &c6*}S=%FDn & 5H~y */)iwsRtLH$Ez܈FDn |)Ia?^br Z{`ϵ֫b]ǬFFDn 9Mőz>RiVc+0>Z3oDߴhtFDn T {^mt&i 68VBn}8݉5$VKk O*VhJ FDn _q%}wh#12T2aHAƹD ?)FDo  dN w8OSo!bFDyZp apn߶|wVXF;crEC1GX~/-?@w1FDY~ ůwJXQ ZjBB(LN,BJ/)/ӥjz>b0m^p??rшFDĶ i bʀv&q%sVVec}4.ds8[?FDF  {hJ{16<ແRo܋P0FD bKݛ%!c6[w͓f\ݣ/f+A)B FEe 4PQ?*@'j{83`H)EZEZ.n-U<f$̆FE ^mN.Z.6Wz>M4򩢟u;-R _Sk9dF9CɏFFp:; B[ lMӞSB ?n]z{Tu|DEFFx1H \PRH~U?D2H͑WKg< Wjк=d5(KYHkؐ@u pZ?]hy5w1+5VA:h|J׈Pb0nL";#©8ZG g|Z0SAGd-gRyhɜʉ5\u^}h<9Fm+p TS8D{ yCQ?^gKWN]n氎RКNyiD4G:<[9$VY*}y3=: sN/WRKtP & x5۴u^}h<9 >{<@;&rJ? 뎻% m<6dN:KMT jxx=ؒDoJo'VュƢhgF6bH|a\j}#JR-!l\kh*-7ϟK?Ȓʰ)򄴠jz0<$Y<[[ $-1 ܃Y |@)axEu;ny8++v.~爖%.zÉ;Cn']ORaa.>xS]ԧT+wCT#x3/[8mN0%H8UIm_fa$ZlӚgeFշt^:vZ.R_aaʀfa; y J )Iy aYIdڞ@Ag.-˄ ]*芷#[Q8~5E%Q*noe*#ǧc1<9^ET|+8{!bp c $! E y FLW+tm$K]7DzbSVr~B?[!p":o*3atCO tת 8h}lzIATݐ;R<'> Myy +_63T&g),WZo )CA\@Y6(KQ_&i9zrn?M\/mRq敺s=|j8DE@tSʫ~jbP[MH9c4Ue R 0k@IJCuHn R0I+"\T=vBJ<}K{Iv%b>(*c.ź *AW(^uGhXUGZ,]:Rp+FoCKy,l :xG:5p>k ZkoWN,n J V H8w XFȊ/D~[`\G{] Q`]Vc W>X[f觿tQt E @ 7Ҋve.שׂjZ07EOq/i:lP?z MP$2 DܿsVi2fewi(+t#0w,kbWVFS+ViR3U4' =A!c f(#2 "Ov 4lANRx QDA\B4$qfiM)o qCXiLR]u ip#XSxKl3 F-豰9æ^Wnmq(Manoj Srivastava ?5Xqs}OA?){G0 fp.P55^t 4xo!F8  ׹̪jxb!DBQNG6jݣ}}~F8/ O{Tx+R{plk&, ߷di 7/F9 D:*CP R]C#5zoBԮ.F;8! !ڻ$BL10D orzsH| W(8aX`;E-6tM,9؈F;; hYfeJkGK[p򒍻E;\ PN^ߦIJ7ޙG}F;a V1_g8 YP~am Uo/ r߂#n3yzF;E  @X-SBpBq pagQS=ϯ l5F; Ԣ3}0LmFN)_G셏yCVLPo˛% #F; HkK(D$I%?yEݘNk)j&=ˆ_=KzSF;<: R|{8cFiL?AF4τ&MFLmJkUPW8NPF;9  I 'eY;wXA5 0@ŘNۜred$b̈F;V נ7!e 0vJBr$x:WB;W.F;A ԛ\.."Ay=1 ^iQ{ma,5{CnhFB- +, zyAuA~\K}iST>N4EmFDn & 5Ha/9G>Ԡ4Gj"*RFDn 9Mőpc>ܤN> G\JLw:FnmC$@FDn T {^mt&i3HyiiߙNyh ?@) :~䊮FDn _q%}:g&9`LrL0^;BF,SCU #r(գXFDo  X)59ߚ`z! j@:3 FDpE vsnZS3Ab)nZP![=zVyN8({FDp Eӥ-LsͰ|Ca`8` 16es`g:eFDyZp apƋ(pH,Jg r'4~#; #FD} Z'WjX2;VQV)VWE,6/aTmeMw[lFDY~ ůwJXQ Zy6l(܏1*q<[2喛rH#wFDĶ i bʪ{Us乚HccRJr[a&FDF  {.xǟ|*|p@qdz1uLhFD bKݛxؗ,e/ 66gjA(SFEe 4PQ?*<ʏO C#f_)nf˜hFE ^mN.Z{$egxwL5x\_PngJԈFFp:; B[ lMӷUR<2/b#a yr8Q0iFF= 3Lѓ ̴X*9_:!1-z֮Iċ7hI B+/ ZgrܗCkxm2b\ >%R;0DԳF5m)4wmŀ&Y+AdʮloK n4-oΝ`Gq%V[A>1K %[t`aI& ?A&{;@LeBO)iVc97,i==5Au^}h<9:^b Xnlgz/v.65eRp [= ;,\hjU$ ܹ}Q x ?PܢChšS_8Ιb*Z ّslȉ5xT|~ɯꋅmqnWDfY*db;># Ciģ"cP/^Ѫp.n".2`9sUR5]tƫh-3j )A469\FPW669i6bHJa\j}qu/BbU+hyإ\_ -?ۮh>cWqm3~N\;j?;/׸2g?s'9zXH2=+Ba-(wjXzS @:m=k '`%i6bHkCqek9tD_wVe:50EaLX6Brz<^xOuR-3 [0eׇAӹ8օC56J^ $UVW'&wݻ;Cn']OR&u4%/7EJ %͝v:8bD:~̡>LQit3k~O"5Or;VwC%~7Re^z*ENH zi 7TH[(tݳ3jM+AmF nn(eG1Z /0>גd:#αICLB;bHY=߈uEq VcF?w97b}'.+0~\Ȣ~`W9krtKvQΝ{6oaon}ç]{gFpƵ!b]yw+'PWB;\~1Pv;Q)i|0Z#2voi0$Pl:#YX"k vOAh^`؃{&jHf>b%]iji'Kf 燝ٮlwkL&`Lݛ;A! 4x#n/?,?}&UMGm(}T7̖r3aYǸ,QQAMZ Ɠwu55*Zx1ڟ!yG ܉DY}k;mqj|Ddf`ߍ y9F?u9?~- 儑q2 Εmog-#8#8 IX6#_\~No͑u,{gQhD~i }鯚mQbT868eM=$(nˀ8?("G+C/:h>\~dL(k_K_~{O)xD$P_e 'PdUw,9+)F9p%hg?enjrm$z?3|e/bnYp4َCWM -n(+fNyANq J V H8wխ c)k@7&騥bMɻB.n9"wȨ- i¨breQ+i&ZM-;>[c9X1^Q dOS?5?I#Pb4k iR'}zk sVk+8Gv X݁>&r1)iXb賢U>v2$%"n+YioI?{Guh! MYzD3#g 1[{gD%޶NJZ.ο1 q5j$Z RdPWE?o<("43RJ (LeI;4G6Pc3$X7Y?'* 31>Y-'v˴) U|<[G]㋚Y舴Moray Allan EBKo I>]dpX٤-BG4?y9esd NcD>F@;mW Wǿ ƲaE HTx؉":2RF@_ bKݛ7dCiUIP0Qp{ąqfhla)1 uʈF@|P Z' Cyϋbk]@f@P|†>3EeUC͈F@" c5n}QǭHmZ8&ȷ4h.{rr>֡ĈFA-,  _K,qhlaͨ,Լ+h[u pv7LsEFA̾ Ƌ,[8Ur~]|?6+_9VjY^8e.r2FB"R [,5dOBo0?&hkK4şOgl9_MBFB" ֺi۪tF|h2@$6OscxGratFB#u &킦@͘y8`W0md#Vы!M^alFB$ Fim+Lr]1%WL^'Jg_!gNFB$§ ќg͖`E&<>)'w^`W먅5lڀiFB& Kr[if7cCZl[t+t }>T7w6QTQFBQ mI>-9[SN#wO(T5;u*@태ZFBY ~\L'czаGPRtAc1a-Z0\9PkӇFB[1 !]0 ?~Ȋ6ǽѴ 9ƛ0^ %|FB\M  9D BO%Ӛ6ZATz yEȘ"$v>–}6ĈFB ™=] cc%<|jHu`aLH4FB2H Z 9|SLi 2)FC98gLMᅜPFB; 7SEҘWw3Ŷ]w 8n<9D>MFBR |)Ia~EX}CXq]`c&G0UvNwoFBS & 5HQhhJ*v Kh5/]@$FB 5J"`R?&(ec_ʕ-@}jv[>FB=t k?s1,LM aj'fPm FBۇ 'xsln#D>F){Z|-׽H|lQFB o 5 VHCk \636oaIo.~2s>FB2 Oh-,AfXPxژRgPY-HK,'8}FB uUG; XB`b pf|]^kg u~*A!eQFBC " ȃ3 JuvjcC6(ek40Q#O Um-^ǷFBi )9.!=ٛWgr?@8ː..I"Z!FBG """d] PݑMD40PK<^ëڧ9T9]FBj (/QfbC; ³ H3v̪);YIFBlS  sUP =|;=$8d3gdBJ󺄱9*g[<5FB2* 0HNjyeԪ5%j Oz"'O!I+u=B#琁FBY DhPs?;wj5pW@n\Aiw!fpnd[yyt9,6`{FBd* vsے@Ztt6LM}5 G@y=sINKzjj^̈FBu Y$s`BL2[uIoɳQ"ڍg);VZFB޿) Oj!4ALX3i?[+*ߘMނHB"VFBr ^Ͷ쿢:ȃgQ(_x0?FB nEmn?a>aZn oٳ(+r`Y)FBX 5<b&8p6 AI/83V.FR$g8׌FBq _q%} fGUAea;er97HFB XE z?5j}``C۲#tIW%SoFB %x~ݲ|2nzsPEkph5hՊ7z?3TK֖FBe 30g SX|]AD?f&N}Ũ,w[!FBk KX%xoN~3 ,ƢJ=9s}sog2* @SFB| >rf<Ȍ -QDv0DgzkB @'=&j%pLjFBs QhWFC󣔬g5$Ͳ7@=nk`4]up5&FB゘ 

/Wv+ {1m0FBX @ A%qJ0îdM@pg Y)2}BWUKsFB? W31"}=&l6i#H'/4JPI{뀟 #FB螮 23IS>g3.^Qz=nPyNfQ/BWr'FB-8 ȳggjN:`OM!6-(UoG9^;~| FB 4#O C d "i~Okjnd#)U 8FBa Ywvd22 TaI/:a 3fiRL3FBL {ȃ)B`njtx(ڒL疸?90dvV9}2FB !Q v7X^qq0qb Im[ryؽFB ts޿EoӬ[jcpYI3vK_hRFB y} C]\υwĔ1և\"|cF{ƝXxT FB K!`uY5(ji"/(iWmvuW]eB_2{ FB NKɘp|*vPmh 5PvH/dkܐY G]"FC  `0[1Zqy6,I9)uY_jij3RjňFC SK汷#s_ܵ'N6 4` 0P@A2` FC MR[lМC3!j `(VoN$iwFC N&G>ǥv҅ '`I|i2Z lݭ̎WQ FC+ iҦc- o :Am|SLWDC^Z2+E 8ވFC_ M b'i_?e]RRdS^{ϫ6j̰UFC# t/*BcZ^V&Z,KmLy,yU?>~ AmNF_xFCsϲ B&σ|S/&"HxW8#EpKzRFC6= 뎮ªP ,̝Ӗ=6G)-P1X7F⍈FC}v S)̀mC]aK2foֆ`Y;_FCմ 7~Jh b< Zҳi/.OF < >~ lB?WFD '\Q%P '}w߷I=Uu<b7Zs; jG6xmx+FD ۄvmG\wط2u/-n$gHo.BIiiyFD] lv-߃4`NzAH)-:P`KsFDc Ç Th/% ;OM%I4 FD و:deؿ_`8twH+% pOO@IIFD وĦ. A"v4OoCP^zBk"~FD5H ϳ!nU~eU&81AC7Q9 l^ׁB-ވFD5O ϳ!nS~$RӾvh( shbC3HFDz X.5C;|2H hF69)2,R2x=~ FDz X.Y WhHbBJrgR[Z4k xFDr W\`Ta Ӟ wXaNS̭qFDr WMvu[eĎLw%O=e7Вu蘈FD[  yY$\og$^' 1tdo|OcLh^.pw6r׹>FD h%+}; &1TR>qenK_IԦjJ ʱKSRؗ1FD , ESAWdU;Ϲi8=b&w|DcFDi xoUG SIb[,V M~%KJxc@FDU =Akh ķsf}@{HChz -AT+3FDd Jāq^ 6=~I~˒ ˦Bi՛~٧`㬈FDq ΀đ `cx&f.\M &F}5?g=sFDL /. [k];$+4(է gY 8ԈFD= )ƾk.g| Tr$RP& WF{OFQ!9x[w1߈FDg !;>y''@ˠ7i4>Vb@Ei"utV~WeFD ! #-3\׬8Cޑ>/|QkJ Px(*VbFD| (?EwQg]AxlHIg6ys/i [ `GFD !Np N4ἣS洜Z8y݉mFD z kZ5Bo:cȄ:˙b}RQ5 X'':2FD 1H&{،Eel,)?v xh֪] 9FD%wb q^֠~{2H}]< ~7{)r'/cpa2.AFD/ ;hZj ceqGa^jrCmL?=.B&ھFDd ,?>d&;aWi#O$T}bҴ%"O„FDn8 dczsk:d}CYIWؓ>&2TNy OĬuyk+FDn jky*m')U{V%Xf7-"$˵/WFDn T {^mt&iCo_.Pl'GHyLL#U 'mjMR> xFDn# Q`,\;l\S"?G{[t5 PZ8"mvr7zFDox ]<OGz>{7eT&m=7t_VL`@)o%FDo  ];_}2FDp/ EӓGr0_'6,(V;Oc#=Wo 8ID3;ۈFDph  0АF nN^aWýp <Ԏ 5ˏgFDq5 CqG?f C.Ғ;"W´Yis|4+טa#<#[maQcFDsWN ɼ(DhEr~l6>q׬TZjad646@*FDyTr ap4CK&LR[dT [u8n4XHN(t2FDzc' "Рc_\Ж!a!Lŏ "ˣFDMU ůwJXQ Z3|[*FH\ЊF&YMM6i}{Wmt@FD x<4a 0zM5W۔B!)G3Dk0ձaR~8CZ"+zFDgd xYʵ9&I@W+ʇ6!gթZAUUY4HFDP a~pC"5zx0N6[O}CX3ZzPFD~c >[iEFOBoڕBVq֩Ay8PoºgFD 2`55M,)"سif7iKiFD 20y{FBkZޟ'[ZK>RMՐS#-û =lFD4 i bWЯ )`+Vi肳ɗˈFDD  {Dp,'U@J@AgqUy)̣uM0Gi..RFEm ^mN.Z%H%E1]P;I[-}5(8wɐ.FJIF qѨMW!8WHO~dv BR' /Q:B4Q+FJIF qѨDBɳgŲuls/BObƙmYKx FJ,D !";_$Be) ΦzŻ`8f˸@ΑF@ GCwYJnͣ6}M4 q3ni[~JUZAf-F@y ̍W6#Tpy`4iU2?F@žr @r<q4hMjg*H_lnxTNٺ`LjF@ t%K]\d*&6ah5uyF@n ~*]*kUra=kb7e/e2#Ԧ"i,{ōkptZ;F@Pb (n{`N%ȿ߱3^Xh нמ ^ a'͍F@r %?㈈E R3s|A5d>1maݦ8˧F@ !sY9WZZQk&>aR46'X&GN: Ԧ{ˊF@m ֗檚Wwp+K3,}fG10,:@S.CF@1  imOWH? )\/ Z, ®]kT(FA1 +@ hxsx,K#[[*ܻuk-ɅHFATǜ "Ț;):un1[-zSQ?]@mӈFA 7`fE:p f̞0f)-^Ӱ| _" FB>+ 8 SWFD2)xOWZ4_0;kXZ96FB " sU[DD M5fQ&OL9?6 }(;7@F@8L 2|ڡ-8NQ'{ {`APm?s.,]F@9z Y]7Kr%H}mmC$sV^bT&S7zh% 1F@9 Ky l.\Q6u\P5&S D /3zF@9 ‰F*Q?ƉkR ,JY S-8nEDF@:J kKVxC,_)RU'JTT D(C}a6fHF@:}V  $kѿH0V3C#0[U,)gτ!&®͋FF@:+ 26swu^^Śp(_|0t)e^t`F@; ;+b8uHAᰐD9:-^G"F@;1P z:&^%_eEV.-D3/hp:fRS_z\PF@;y z_W9jc˖ H14 qZl]$E&F@= }ޟ~I#QER{LݛPm&%tF@@C <=Sa+x.n;TW0{KsD o-f´s!E#/ik,%-VEF@A * mՙ}PII!{AZXgIaF@FnP p( f̋GfH*嗔[rU`r$܆}L{fF@SB Os#"Z&D\n9_&O B{tQaxF@SC  .9Kp;?w;HօWPT=.R\PE,fF@T/z ˊd'Y5?Hx T+G"~*A#BRCM5F@T?F n&x (DlfZBͳuigMu覹<'~5QF@\z 0}V킪RNRl^ =|{_R.[F@hHH *XΪRi1 uǤfs)e>AkLJb-!EQ~CF@w2 >m' 6ve&it{ zrP*x~CNnG<'GF@x  'QEW߽"lF !`jtd ZywzZ !҈F@ BC]bt)zB RKUp#U~HA&F@# KVm ?aOh@r {*S?m%Ճ.8}̈F@m : !zPp]/="Pvg szwA:Ҥ q F@Y Eȶd7a@L0%,]gvU+oTT-Bu^9F@ c tf5P?Wv܉uGmn:3uYj&*F@; Qux`ްnnAX3Dm2FP'A^dKF@b 4veL0E2-%d_TwVɲjB<:XF@{ gy(<o|:,tf縠8$BtYsd1d F@ "{pUJnzn)M+MÙ}3V.Is5d> ÈF@ > `&*9 4'6J1 %!#dsxĩiR*hF@ 2$@%T y?N{iu"b. Ғ0;4ӈF@@ (ޮ).Z)]\9i#:LOM _ XͮY'*KڈF@y =-pI&cX?@?(\_ƴw l `bXF@2 =-o%`؁/&aѼm#cx;vn/1F@– s4ԞK$uv?ȑ]0TtLVS>u!Ԡ 6iވF@< K[Cg0y"T"xfZpa~n?CRo ۘ,F@þh  -S@>%0܆5Qk(wQZ>[!D3t ֈF@P<  {Wx>NZpJi1!:'\zW}JhRjYF@S \Un:ꂖ\@neC.@xڡʹF@w V*lKe̦?(~2gp`6 lF@ձ  [Hv9z$ZBJe(9+j;n\Q}KF0ЯF[llF@ ?,s%G0RhU尬Gï˟p?d^a F@ɧ q`Ьy2'tՋf.dv{gx?(_G?#F@q H&tp%M 6t<@Hk$ij=*9F@ˊ U43![+̂pVIQ;[iNi)܍ϻ 4[97{ F@˓ g z$4˩" -mr .-kF@̍ 3ʶ"bܛ<0 _oՑ)Xj{Nv|oF@ 5afE!۶.I0!RB{HƃA8=1*S+ugmcF@Љ %: e0C8-YlVo$'\{W4}ciGٱ9l҈F@ڒ A+1zj |aWag֐+0F-X2ϡ|@ȯF@i NL+7a v5 W%!4n;ZJF@? !OhAQ_tRa-%ԷErbAOztOqe+YF@{ )K&?d_ -?/ܓv1/D Xs3 gJ|$xZ"i@<; 5%PY~5IDZԌF@ lꐄ\*ʐъA~rV gՕnkSNgc2{[$lF@u K*Hӝ"7ٴ0Thj pM*P`2N⛥ZFA y~wA?#:Tb}iM'3f98BFB"3 ع,OqF^D } ;i^^ttљ1~Wz>4uXI&<ؾFB# %pM#(Ƹ3>~u:p:~th>tSFB# m?y6|_Oh+.*Kg&Pk ~SșOsfgFB#$ .eP]OͶ@|ռ&XT79DqFB#V D|2vKn\!бp5F>(9=7h`;o6cqJ*_%N^FB#B 9Mő}i'7 ̺7R&KU.; @k94pNFB#< mm!ݖ#&&g&^m|.;TرmyFB#% lZ[ fk\ٶ .$q:urqsZFB# lZfA:7ȅ=䔈G)!5mT\&:DЌFB$ dkpg\gKX()XN#Cצ1Al6&FB$v ni zngA- xv8, ~nȬ k$J-V q+FBr u +wgS{衐(v4Dl**G.jrB˥PiF*FD_ hX9d|twVtp_F8NgkV BP#Xц FD_ hX9d|Rs cj2Эmp%Hs< $8H颈FD~ Cغz7^+ik%x_.rd7#)FDp % k< }4gҦs%HkBb>$XZ\^@\  M)+mK>Sp߱"d-pug/xvf@\  M)+meGPGK>Sp߱"d-pug/xv@J(d#Fq-F'q)bp# QcJD&<1(?G\6E GYH"z,~}CpR9;ԯx{H*oΒׯ4Frmhb"~C dfpi"Vqu_ lى=$4ĵn $n@nV%ҁ[+qx픪yHS|p*vdI` >KKroš$$}jh!VIK#Ђ%#4y\CWrDMK k;mqfsGwgg6w :VB+KרdIfm4EZl۠Q5A15--Bԩ "M5_& "fu4b#Q:ԃ8i<91n}H],.94ǿǹ-JTExAez*:s7@4w`PT⛱!cxܯ \ea[y}?/ԈD~b }鯚maNx39D d!ȸY-*ZLd٠ JRdP׳?`*o_J;͎r]Ӷ3TQx\цc"؜ \=olm[n w lGUA#Wəjx"ewZ,0n(L^ VԲMo^O7"fM.cB$ GvN&͞LE^ !,@9wYNȪ}|br{HslJ"vCl т0m7U]ՠNy%2}`u7 /w5\2 'a"@̔lm8TkA֣͑z$O>}6I}q=^t ow/1`#ua(-pv}n ]ZCxߥWE:@$-r@? :ɕ$WA@#M#hd7LuETrQ)p"R1^A&{.Œ#3D萛R[7h H '7@0ӝ04FWR b/*Jt4r}tln~ql@DSp6G]}G B4 ֳ[@<xG]jxI15j쫣А.Y\+BbviFϖ'#D d9@]@~ AocY_.ϳoR<+X3=mUw1N^mO(ڗ欄ݞF׏EVm "v)7$)6NIijfvZan 7ZZ&byY}}0A,bfˮ>Z{˸YxmH6Xda@ ] Fr_@i ޴wX|ca[Clɒt%"b+"ßAvi$dV DB/ .xDo&;cHgՋe'@X&WkȀȑZDz[xo9sd~ HU1nK\#ۏiH#U+a $t>mH@M*v'ENU+qO"r:δׅ=m[^s:vK̋˲Ar=k1I R- Ά J83 u#N%0 0%Xcؖ{ZXmW@xdhzt@=^>jE$ahj0xC狵ncW~P2A.üX] cv1<ϼI7):@M'Za-U[!d MT # cZt@l~.? uS?]NI\o`S*\?Pf sZ*6ZMhbyط@Mq 'ʹ} zh,i<@sȟۆl}ykxr=B$ ?%,y>Vu<֕3lņVVq0Ic#9o]SM7ط1!u/%ec_!Њ'fM-;Uaq:W^\*:p}{v2,/kC$8At*D8A Q,C^]˪@ >qDMDE9ڗw#rIpٌ44IT&FRzX 1uyݸ^h]g[p:w@_WŸ,g,bL$@$Q+L GpƒE @҄eO.Ј9q(>HӝE_OlLkcD&6æ)J4C;bPRD34R?9%HxU\@_:"u'ꑨ, ?pTM/.񏑖]U4|M Um*rir`m=mMtI 7C.;K@z(UHL#%UVi.Le v#*r'0)Piddb7!pNNo#δRE4.gM׿gn!I+N$_C(tB'jZ'J 1 Џ0KX0<  2X^:{=xif姃3{ݦ;Ʌ k lK'%n"T<zN+7^w}"M:D&_DǧXG Y W a&C?Rk!XaQϋ<[ 2:^jD6Qf[[lRo+<6 :X40{yyHVj\Q}s`C;`]21+~]Pv~#KZQTx&(7Q i0"=@`Vfnى@et  Cz> <3H윻aٿ/hP7PE T:RLU'g],Lqhv=:!w% >7l1] #ߞ`p`͘dߜ1v hc"mZ;OSoo9~y@%`Ksj"I+\L$LY@8jac%aKzT-m(3bM ܱ֣ٱbkTܖHF$IltZ H6|]Xcb<ڌg:a)9^Û׀>WX@*B##http://www.elho.net/crypto/policy/ yR4t_#HCdZ?k0vT u;7~եX#MB I+* L2iζ}@Α4Й_Kzl3 .rѠ2_n\TnwN1hx ׀,vt3׍:oJ A{x(սR0kq e"`Mmp'bMP͌QL)8{ _eO(+Q;q퟇myڦ#Eآ FYZ*>_IYt? )?t|WFpda9#(nǏ_*dPf2 \ :{t&s,:kFݖMɶ|K.g޴35.'L(f8xy25QP/eM @S9rp1ZХkC(Y+VΚGm>~fi<)rʍkUrXMoray Allan ED ۄvmG\W}GBkp`R=[7tp"@XPSEDn T {^mt&izס%{]=oZgƺEDp2 FVXǑ'9lvZ]UVьE>R3E?2 F `0[1Z)[iXg $ɂ Ͳ̱(ȈވE@w2 >m'=8|Eɪ$TGB`F=E]" c۵ a7 C$7 P?'= 1]}&w, }! F=E} (ccG[r4ػ<aS' E€_/ F=E\ h))C3A? n= gMjI ZWR F=J  XyXUrpW6Ad?30]wHk5Z,bڧF=J S}} e߃ l!\`4u_X,b=qw͵RF=VI c5!e_i7 QTg"i좡ܷi&F=C Wf[ou^nEI}9I%Y.qOXm3{z#gF=Ш љ#b8<ju&.\b}}5dÇ3ÁN>ˈF=t ⵸i/uFz]BC$삎7PXO;nnVjH%F>IH ni`<2}'KșYr+%G }5Sc[IF>Ow~ /LU\0xc ƍ:"][C>(yYREQ (F>Y jZ'Vg0.鐶MMrC\YCD*'lF>_p w+Z[s^g tlzOHȁ?zӷ&F>u t`{45j4zVlz]f´3EbF>Wv c;(Qx};4'l2OG߀YF>A شK;%sT z $k\9"H+ $zp*F>] Y'c jr2r9cPV @Fur-tfY/W7߄F? ` ym l@hn Yyĭػe=hE*RX#>ˆF?  ~ܟPJN}tI׸&ȬdDh1 }ÈF?  !iCtbSwAdh ]Th9jl?\m/4;F?V ݕ/?)-r'QחQ_Mnx'*F?0 <4]`Xk5B8Ǽ#1"չgxR2F? 'nL3FZo+CIp6B;KF?`N ,7炠 ^6/WU*ޯx1JqfaWJ*NWF?Ȝ *%{w7(ŠKh8Vҟ$_~T3F? (ݰɶoMO)%y@ fR\LZs0vF?'> o#OZ Gw5_4ӳMRdjcR&J)oYhE 5IF?-f |qU~JYn=FBe "w{J,qwsDF?4 4Pdvb'mhP Zӛ| ķ9p%MF?5 iҦc.x(Aʘ~meD6;5MֈF?GA 4 $Gpr-xLlCIOi` "L!2$_S* NF?G bKݛc9;~O1?qYKրw.z'|ڝF?[ ċ}̧*%J-%li6.\;yp9N&jRF?3O ;n}T\Ml9(8!J?mnK S?Uo" gF?q d\cj舽8AsG]a~},ŔFoF@9?? E)DF/ ])p A/h<$X&!+(O%M3G3 %F@;mS WǶd;/΋Hm%ˍZ%]UWbZDΚ?!]=F@" c5nGv_dqѾ}.B=L}#oFAMT K {-2`+Lp8h-K,㱗ASz&p0FA-#  _K(,\R݊/pߓRe4 >{?FFA̾ Ƌ,[8xl4d2 uzD|xMU^5#FB"R [,5dOBo|^1qc([ 5*ھ-,ɘEFB" ֺi۪07EjUi(& Oh7ٸ!]7@v4'FB#u &킦ƖeLU&a%siͯ%KjկoytjFB$ Fim+x2?/?=#bGXx%]moFB& Kr[if}0l_dmo݉@F ʿ2k`7$T2:]E@U허FB't r[d+(W;]dpU^3h64cԭD.l ?V፵9TFBT1 B10I^C7.ɐ&rJoT ӉY -FB׵ ^F%ZyG{,?|y#/jCGu|=EQ\̈FB Tp<(u :4x/s~jdOj'8yDi]YRnXHFB 3evc1t]aB%N<ҽ9{5S@vFB<  Ѣ%!Fff{Pl*&ޅ7FBQ mI>('GN{= $ArhU7sCD'KYFBY ~\#(O!kM-"MѕSyv}ak #rZFB[1 !]07dwF1)sI+O~a4BqFFB\M  9D AZ4& iva+B#fK;FB ™=ʁǹ. $ "JGC+HD'|`Ut0FB2A Z 9|3~i:{]:s"5rߜwEӝoA FB; 7SEJ&dQ ^KZu,LNEUfFBj (/ [۳sIKFI%3dD{יJ5\$Չ+FBlS  sUvZɍtZRBZw+t:|īh枧#yVAYWP1+%FǬ5+ FBY DhPs?;`5zxXvI@_KԮ<-Ez];FBd* vsfpȰLwďd8#kG3X.:a r j4'FB޿) Oj!+-AvwW!8ESqvJh }UkFBr ^Ͷ쬚P&0f"sqyz%o@$Пt*Sd룈FB nEѶu@5Q<5P3ƕ2u2c +YFBX 5,'Ϲ? {QaC毶FBe 30g an97gԘ!:_(S=q6 -C4wFBk KX%x;gEN1K~YD[04I>hyA~|BcEnV FB-- ȳgg\9ji_Z&P}I6v-5cK}t. ""*%xĘFDc Ç Th;#9t= ]& t>V>"Aڏ SFDj I Yy׶hPgx̣QQOs&^6FDo\ vI@I@y ҚOY~ܲlZ_Sm(sM(FDv Stq_pz9df]w;`Hۗ 77sؔҤFD و:deؿ_`8twH+% pOO@IIFD5H ϳ!nU~eU&81AC7Q9 l^ׁB-ވFDz X.Y WhHbBJrgR[Z4k xFDr W\`Ta Ӟ wXaNS̭qFDc  yYH.qWrIRFD h%+};]`i h.rsz78IYiƛIBӈFD ' ESrTH sj|U$\n#m/ zc؈FDi xoUGh [p\`40O\ .nNFDU{ =Ak[]!;h಍d ^aǟPA&/z-cx,FDd Jāq^ zX1h/騝p=xgϜ{M T̈FDq ΀đ"hCe pdGpRx"j&12'm܈FDG /. fqZPDbUF 85yd3|)4C@3FD= )ƾk.&w[0aq[ﳑû{\B#R] Ox2FD` !;>yMi&dLPep(k (`K H4.r/FD  #-3\$OKD N'q\NQ&NFc3g(дS*FDu (?EwQ%f|{䅟H"yj8};+du7m1ӆFD y kZ5B#;Ɩt=ĢsO{xBq5(G]0 G|FD 1H&[qK /1ZCfGE:T?r׿^,FD! IP*rkbvr0-ʾ~M`ʴlA]Mf4FD/ ;hZj }E\5zcT`#oYCxjע7ąk:FDn8 dczskԄ_caQ |:KsE|1tV[ޙ3FDn jkyD;iBʠl/! p rm *Q{Sy}FDn Q`,\;6X5;?d%-1|tUSt z^N 4FDn; AK#o1n*w>l(AJ3ecOՕ]d"RSFDn6 /0l?4F$Dʚ2Τ9+1e|IOFDoW 1Qf;6Ud-FsEEq)چ8 ˻dg%؈FDox ]<OGR{{5|ebMBʚ5bdY&4l 6E?FDo  Bt[)<>S'OˏrRVX>52ו3ΣFDp& EҶ?#c.|qt@ alieFD~\ >[iE!sԛ:!9R-|T80m,j+B#͈FD 2>X4#i Ϛ.=)ΧLS`b}ykVf oFD 20y{B#,9n 3wnj1w^ȱMW(.FD0 i bwY mZ=|>ε3PUyAߨ?DUFDD  {?=&ΐ`_8E:B5yJw\HܶDF0bFEm ^mN.Z9ʭAP##J/H`H{ FJIF qѨVENpF*!t[`Q]FJ,D !"JK;vMX,Ynx{a^)LO])#FLX ʛ#yAtK,m @/+Mڹq 71=j[[RFL_Eb VIzk'#|-`L.3fiLw& fًF=Ic ۷>Åf)G֑lĢ+4Aƙ*da ŎJRYeGF=] òr[Αm%MR۽y]^~V?bIdF=> 3LmҲpyfI 5kDbk3ز0%TfږtF>F 7\ 5o,EҸ!ehUkd{7voPƠF>G\ PxSjFcaq>\dq LF?-i 5a|Q:4uk<=syZj&$EftBߚF? y~N$P iTgiG݂v->F? AY[sruQ=OaALs?V;T{YK9~ɑ}F?"@ NKɘp->n:$+V716ҷ>rzAKpV(kEF?, K!`uYBR݀Lalz6ݟ< h%uF?t |"ßz:&]J|'bzpDIAd\|D"a|HzF?; w3<ұI g١hsEi]HNP=PLqF?{: 3 lctmA HJLzº}L'.jH|uYeF?~ ݂܁K };9ArdD&D@ȳb«O0358F?* e4+_GPֶbݵ//ʉ(Ft62Y1N9ƈF? q6w%-b?l%!Kz?;iX|à ~n~D8F? Z' z׎h}u-eF?nv tYžc$'|IIQqeY: ;[*RE>^S*F? 4PQ?*52 fK+#1  XV)UFF?S OV I:t8ZIvVΓ$a feF? ' kyEkn%KM='Iyg|G3B-A5(7cF? M VHCpj:~8J +a +N )BczDrf<Ȍ XoYlnD`xTq&%NԾ6~/+jF?', ,?>d&? QaPA$/kR7~ D-w0,hF?.w~  cJ\ 1m=GH^JkUb+b"F?/V? 5IU<:ShG`Pud۱cq?N"|bgF?/ Nʹ"Z4,gKhQGjOO)]D%'FΓK7ڈF@ GCwa=: , 'XB] gӪ XDknyj;KKqqiF@žp @r<%J1O=Aƒ%\nƉ:*!{AUq.a lx;gXUΈFATǙ "d&\KB>1??= T@I+xh<^FA 7`fELp[? . ]'r&#>6}FB>+ 8 SWFy{/ݯ&TUcg}3"]$`ˬne̜LFB " sU 9<;@M\.HoFYM7~I,%FBy0 7t9 ޵:GD='O/᾵&G:Y}U󔐣y٥-ĈFCW `;Z.ϘKc}ABr\0@ N1Smj۱mW2>5Ajce^zLnw%}zTN F=2\ + !|\y ,FE};?ܥ唞L dF= B bmYm< 8mM~uBˈF=@ ^]T@FnLQd>GmN ߤQ(}}a;; CF=gw WaSK#W٦'u&v_5f늲IMF>)06 °yRV8a[xحOhA[]ϒ^aȳE$^9ՈF>F\ (O'bJ`As$J8BG3sjJ[W7={fF>F] cE~K|  15Έc?II"*v2ʨ<Çox#YF>F "mסT?|7.|ӄP4?)&X"FsF>F Ky^"WJ7c0T2\O^iBQ@ǡF>F ZuKZ= 'l:X qUvU[15H/01_F>FP Tڥɒ vx ú&ÕpiE؅m F>F " "&B1V)S4DHotopZ ҆1{|sF>F z_Wۋ"h=)+fb^[Leޞ%]^z"F>FG )]"hTv}d)i aaae>xi?qSN.F>G\c 3\qy;y:"v(#M(—1ۭ LJxF>G SY:^^;R(}ϔx$@!}vʹhZ+lOOF>G 3Q.PP!k չԸE ;vH ,zDw"T$֫Lo(Y+ MqzQCE-Fgt0TOF>H# K,T*XHx{՚3i/WQNV4 +F>H xGM+"BL ) ,9~F>Iz zn9&{#g^oHpMck(n0ڎZF>J _m&^c)C.?v,WX v[΅EVZF>N Ίyטmǡj1ŀTj[+] * jl̯6k lRF>N2 w/ا;yzC/Y1q*] F>N ]5gw3;z`1ĽA#o2Ej2vc |F>O Ŕ6QzW$uoȎZ.L|y+Q"?Y\Yk kɈF>O  %#f@ a-TUTP>ylđ|F>Oվ m1 r"{LU% 7rLQ ZaeuEY&@F>O{ y/]X;D󗵝*vrVWp (ӷX$V&F>P9 P(-`V,UPd;Jas@ɽ|y:F>Y$  ID/-^wp,9`myʏk\SActYF>j6] 4P!sIxO'pɰtn#bK-Й7l 0}VSp wwgYamwXl>y~rwjfF>} –"=*[.;{qF3ק{k T֟ BQ y|F>g 3Oe.e!Ft"!x"a [up*fn (`*>F>CT \c{FQ {60UeT| yY+k+JF>M -K%%Zŏ5 wTrmď QMbZ mA**F>p p( _cNe1%3B*P#]ҷAF>z. Aà4f$f8TTWbʃ(Bj~P=E .aIF>}o AJ]0VPO4ff0dXQ5jE}F>k d%%kx-\KO?0v1G2M jy!2։;pУNF>w^ 0>vf6ͽOM>k({AIJ* &"1A9F>} ebZ\ص*IdJ6W6 ^Stl;mō\: F?ً 'c辂 <hW6i ,z{s5#m!S"nH,T@veF?+ 4/iLAf2uzx:E~!6dǼCF? "|q+܂.g8c8:_m`( r| PF??] !A$wg[ P3'-p=Ovn_4 ?{߆F?G x3DH$<=L*$C#DdC7.`F?\ <⾣Ap:Z7c`11:D3un>:2Ʋ'68eF? ! W *٬Yaȹ]D&,+J+\ e,F'F? (k|5h,Z)&.Rs~ j^җ8< TY5+F? `NDT`jj%ƞz "g+_<>F?o ӗFSCO6 T4 o.*uNM3alS!*#8F? Vm6, w1+!š5aF`d@<2)AF?C qN1$ P =gsRas@]] 4dV]_F? lv-%;!ksګRP w}AbMN۝}M'(xF?j X)WP=W"^<WE2aR*TO =dLֈF?gY xK:\A-vp@xɭ8偔A:#RKk[F?g] # &[VGK?o|mFxt;{Rэ?F?mP U>#7[noe-4+{D{c,M+d*.F? K&$"@kt1NuС9Pw%)oY!rTf6F? dk%>Xt /?DJ1Q!)z}<z6bF?YT ۯV@CWmM%sE;#ko uF?Ӗ S<\M`ݧ` LƻOXTAB+!VF? J憡IZVUXϴ$BNy#tr$O^w* ynWF?@ VA&)o7ΏA;0غk &fg[qQObĈF?H t~E0'ha?MY b8YVCA{CF?" !O܄gl}+f/S\GJXY{t^G0E !TMMF?I/ L0<" Y_!,ϱet:~1L$'efbsvF? qӤ92׊QbAQ=I`sk/h+5M)WF?>n ;w 7J]rv4=|л VrS;ɈF?P $ >!\`QܜwAr,M[k|y&TriF?b <{Sf>'f2By?EqVS =NV&cKF?z  Sϊ8hp~ǐaI x pm@h&f4f_oPUsF?i Y$sa8PA+9Գф>PYBQ[֪Gp9& F? nxR{:_ %IDŽ }zX ;O;\2ϼֈF?!" !ґ 46X |+0'F j\@uĈF?!rz %DrRFK,vjtpZBmgzj`wEF?! fY_w't-e1tHW(EF5!QG;F?#é OƧjj d[vEtzRUmp+ l^F?%B *] _^JHrS* 늞-!BCn}mSvF?( 26sw6U4& t(؊bűr28{+AMa!м 2]F?+H g8s -<]f[DV@(WJ&V8iB JͺF?+  +(e!ٰzvh_G PLq#0 ZҊU֕grI294 ?iɨ?|d^ha?aо(<[#F?.s MP/y P)QzB< r2#&Q/džaF?0B q^֠~{lb&lSG=IO(=HERAwMBp~ֈF?14 p`("SWOu6PٷZM`hahP_0 *WRF?3 U\i%H|TSK]X_BMz`;BK~i9OCYȕF?9#p E!GiTIw,jE؎>is'v.N!q0^{ޚF?;w/ ĕqVQʤ=y( P9kZM! Kb`ЈF?Em |;ypՇ)م qqJ0>O4l.ܿWƳ6F?F< (8ܻbt1JH8R0hu#J1џv솰F?GH 1e\15a幼yJBI6'G埗9W6F?dh ffqzۃVy@1H~L8M]vsi,ۥuFF?dh7  KfWm={zQc ܥ12w7c9,Q"v2^F?dhN Nֳ#@W̗1I^=58g`Q4 4A:о3F?lY 8ɅJ`y%~#&g0}{جMF?lb- ]I4t5n+T: IpC0Ll?Yd)%=d_OBF?^ ƳL j) R ^59 `'XN;\Ptp`YWRF?%H `zʅ0x$]3v%@f6UXoeZVM)&l*6F?# |7(aUKB2m<7O$r2 <.2m=>F? |7(ң4lc0PO+n< xh:'|F?̴M Q_o$;mXYIw[8aN d|䮑VҭBa.F@8H 21zR:wȻ:JAY(ǞǑcv tĝ@/F@9x Y]7Kr%i8_b=(1A*".7!om:U9 'zF@9 ‰Rek͑"XLʍG!+)] nudk%piF@:J kKVL!KU8TVօԦ%0Lw,V.9'F@:}A  $k9;ڎ8tVD(bjJecNm@) F@; ;+b8hM#7d ;*Ě(|&C15F@;1M z:TY56AEYPʑ4a<F@= }ޟ~S?m 5 d"vM?܈EHoF@@> <=Sa-'; xYl)Ba aх;F@A s>{Ks2ɶ6Lh?D 9Jye'-+o{!ʚCJF@A * mՙ؁tv8X7"RKM(P2kF@SC  .9Kpi#UgN6v0],Ee8G. ڿY%F@T/t ˊd'ɇ7u->\ "⍠C\qN^Ki֞F@T?> n&xD!^;/CAU`"uo }LjF@hH8 *XΪRi%Pڀih;Gx;90;+ͣQ&3ZQ$׈F@x  'j|C}$@+{3 re]F@ BC]]\jPG0ɱW=:J}Tfq?NQF@< чKԛf.RI =dUWYfu1:?Iz2F@ KVmu20vY/xrU8B^M\@,V PF@m : !zPޜ^nɘ u8\$('tRcY&*%F@L EȶdaҀXmS<q'}|Ө!#PzBFF@ c tfcwJ0Tb Xi!Ył`C0fABc`.F@b 4Fda:ƩOF.o}ĕ!c"PXD3_F@{ gy(n)qaNwTEyĈF@ "{pUJpRoٙv+'>,4.5;\ `=},2ͻ %}y}`p6Kb@QF@ 2$@,52Yxu֟1lNn$_o#ވF@@ (ޮ).ZBRA'LbA]?VL+ld~1IF@y =-Ɇ]?6P.[ Dm|c2.7dF@! =-)|B) m6,.֒S8o-\m|:ä?:ȿF@– s4Ԟ}vOUOfBt-5p,ƌF@R /NxVz$Rc~Ob"VtU'Di&ϚF@F V*lK 9 1@6(X#{Kк٢>F@ժ  [Ḧ́K~UKăc[u1rޤ] adoF@ ?,s%ϋ'Q8yqoI5Ճ g]"6g^^,w[ňF@ɧ q`) =i K.Y}E qdlA-F@i H&ν-3L09ڒnl@lo\ lHUF@ˊ U43!l8҂ sDǝMAkFT9\KAbK>(\F@˓ g z_!fRo,'TDrK-@sF@̍ 3ʶVt#'*)E0P$=o5i^jpES>|~:F@ 5afE![ 8J#j<աs4 TY $c͈F@Љ %: e+'ȶ[6Ч#vK=~s,In3"9jF@ڒ A+1zji.;Y^@X2AJaP0!cuF@i N7(BVof¹ur0aF@? !OhAQ_tڇL޺iL@_|%$tqwyu ĈF@wr ! u% bċȪ~1x!ba^-r{(:F@w QU \Il%ISwGj+=ZKFd{R JbE.F@{ )K&V6k@tU>*tI=]PܺWU]F@^ Xб'W,GXkrJ~muW.Ov\;PƓ‡fF@!u ?UY1tgm }h*8n71F8lYtF@b gJqByL0FUZQkôDSZW{BڈF@ lꐄ\*Id&8ky+ uc$7cJAw Zv?meF@u K*HӝCh6,7~YɓtL1JI\YW}GhFA6 LK*0)C~Ap\WT &hH;X@^,^*3iFA# xR֍kq ~*./k2vFB"3 ع,OqFa B@ËKC:h.^vzYcGr3f2FB# %pM#D06ȞH}fJ abe.YTFB# m?y6|b)u<х5^l- >J'N}WDiFB#$ .eExnCinOzIsء'l65cuqΨFB#V D|2l9zK0j:Ne\8@pmmr/D݈FB#? 9MőɌ(k$- hsWjucL &36 0XꥌFB#< mmV9o=NwΛO̷5HkלrcrFB#! lZWɕ,CyVKBV/&}T?FB# lZPi#>|iGMj3G5K1WhFB$ dkpg8v69?Ų~h//GIJiFB$p ni7)$T P:?G(dhX9gL"IoRh͌{#&M)#Jm(< Z"S/ [o[X1cAy?@ o WWg$f8j8SM?mIWI~Q鍉hM$։>}uQDq>C%މ6X;a=a0B$=p%s冋۠ү^g7O!dȦռ~0g2Mwxccwh9 L>^PN/.Lv*A#>(]ay"Lv.QgID 4ncʼn[m5aSc64PgO1 /#tLj镛*lBn3i9lS%? mA]ixܥ5UX&x=&dFw` &/=Nu.Fb)6; KCҢv9#@(!Ѿ%zlu"Qc)殅l@(i )Bs:6tܻV?6 k;mq; "M!!*j3GMZ<^{j2Zv e5@,M dMCqAS,CDoļ@|sCd=w/>0_B<ƊIH">5#v]k ?Ƕh= Eť?D~b }鯚m;ϫc"a.cS|սGkc2n<0#qhIa2#R,ibf!M3 AX&v9+K,]:ke̝[-XDtk ݻLUBheiם&,~j'_M=:2G! (W<Ln=X?+u £]J$:)qXHC(E錒\<36kCTQ{zBT V 52`V]lĿ'Fٹ2gGJ֬ẇ-[|wX»zؾ22+8a@Yww^xbK!x!RQ q!GÕg-K~ȤM}rzObMܚ-$'R`zO:n9t/vU aJiә\3ތB:KNtZp?2笘Nz='iKl# ;gsϊƏ?J  rNE/-JhtcVܗ||XOCCaj]UI>$T!9g^q 8FT@7-ܧRĥ n^T3(eRU9TS>wd/ PN)Է' 5X\~I#0=K?3`y%{MF2:ә9q&6p@> :ɕ !L-}+!Hٙr*e8$ ~;R,[v"ԉŐ`fU-_x!f4?9g:6 (ZEH|UwA:O/ 3L?`ʊw#dvqHcvE{ga 6ؑ_~\QP|i.CӋLxD":%G>-nqꏌ`Xbi09v!wEbC%HaM&kE? @@ DY?r'SeGcId,.FU!:f.tw8fH!ZdV| T9[r~CKآD !! R0ݛc礁]Q״B@`ŖPXSXi%H#n+*B̌E1TKר0l;N 1o.k5{px<'G^vkXW&7ǼDuvy'/SQ @~v AocY:p`D$xf8;٢B 0~ =r*Oݸq37 KBzd\&7)BV%Ma>EH]z귷*.ZUt]kǯ+I3PSs/`SFx-a#kӷaw|"Hwo`J顕pXi}֕oUǥ@9$4E7aaMhүat§ m' LJp@F@*?#http://www.rath.org/gpgpolicy.html ܰ,RW")E~ zD26ՉBr?JRJHhǯ'!jO*c--cwliZR@7)?Ϸ#ʫЬ3Rܞ} thߪkZL+ChYy@\߇yg]Jk dW!Bw*64nmHg-&G3r2F _ >'p Gbu }w>MOgL3cM?lYFhttp://www.trash.net/~thomasb/crypto/keysigning/keysigning.ver1.0.txt |:K] 1JX ΏPRRn\h;X#րLu6-4V9f=4FeKVV t2zM4t/I ¤S10$N|t/>!eo/eUP2*;'a5l;R5d̠R:_5]+F 7Bqn@) o@ySޥoE: s,6(QE읤&<<^Xì?mcsignature-notes@penguin.de"http://www.penguin.de/~bb/contact/pgp/signings/notes.586377100EB11C2DAD7E1B3EE74D29B82BE16D01.asc"3http://www.penguin.de/~bb/contact/pgp/policy/v1.1/ h 8Ǹ!?U(o}pz2@Ge][_î|uX2@\AI%BJ?/*@B/ .xDo& @;=V j ܕu(ZD\ Ƴc\yDLN8VN^\% D-VYcۀT!YL& 9·A4hW4ub:0#ataê(S4 Y02 LC:2uV ވzr(5BZ/]ٍ9鯆V+z=AU |/=L.fћCg}p%DN6<3M)nqI((ɚs(.ĝY֍i{֋KaL4)"/Ma\ ׾u lQR#`NlǧHϔt4@E6F_k™J.| M_78.6Ij+(GXe<.fb.Brwij57`=Ş?Ew$x!VQo.gf~r Jz{0mϪJ4W fvH)=B$ ?%2eDuJTp`|“y>pאϻA%-qJ[Bnɢ1C @@l*s=s{(.o<}2Kv˞ĽsqhxFkVSRnSjm!+GHR8x5b $e:~IV,M x vT$Jњ]!U= Z"=ܘ朞9< vb%7l"fR?=S҉Nsg۔4Լ f`+xg ܽ2 ,E )e*3GgßTŀq9UTJ:Q!+oBrº&ʌA~Jqvpw@y Դ9 dEJ@(/wl,\Uo$cK6,z*nOQdS㧠Cv83d;=$:XY{U a_):֥ۡ@$57b@D:9y "2|Zʏ.?a,H5L6B$ᇚV;T-ǔOmg1`/jf]%'H+Rkc4?i%[O韩̃}'>di^ lK8$W bn[{i66ov*qks6ȭ0%&Xyû{ӝՂ!I ' dtw$_o+vR~WUj#m,6Sاi02;1~:L1F@<d9 6!84^0IUp0go"(5>ol!`xo|;Z\g@Eh"e6MLb5zKh{qPIJ,q$ wRGy5X)-@8j2jO@?<#\ux'8~>;eˉ&l\ir!gkRSm)I"w#CV$,w7lQQeOzPzA搎EQ,'nREq6zE3(iI.>7+IɈX Q]UT?%3;^IWLX )ˆ Z[["bk/*yVeTu̻ ]9#=F%)9}OKW1\x5S sxcEz\O"/<{S>h=8ȏt^5*c 8Q Yyh? oZU#۹H lq"ԑ H!t[!Fr5("JEFhsvwOKa= ʐdlސ+aj%r`s#ڐݛ#'<${8:ɹVcHizl=pv@YLe v#*E%Nb,̕~4w0X|>/ܖg][NNngԧ< ePE5*J8+^&WVNVNQy#'e`2EDQ!,iȃEBːdn,,J ӄ&{ >&'RAl`񽉌Gu?(RRK+ `9H+O\#0i+I`g!ͧ}W irJ 7WeXRb"akkgq-]M8Yϙ;} ?[N"9>' @Ihү`ulz57L܊m4V}7}B5 Et[G]q*]1UPMԔʱcc7Q".4m%5^MŸEe VBqnLnОy8 gHN` *Ԥl4h1# #T 2>E= V5CEVxwxZQZxnP Ap=* |N,60 חԭlho l? 3Sۡ~ZqoA0Q_e>0Re$ր5`{4L)G4~Ky9!ⷋcuRrjPɉb_l(+hJ\` 2L%"wKN=&ı>}D'7~8uC2?2h+BqIϱ V EbފeLX 95}P Q5qCI Dao7ǾvLHXܥcݲAPحPLJւzØ*2ٻq_GdK!KKPauq^;0ڨY5%m']5 6p1Q~i@јgyL2+p$l x<AȥbY2'7cSmLJ]ͱ̡MEjJ;iSYq7eff'υJq._ \aF#[@Ё/芕'dC- J"qYN I86,Ot3"8F]FF/6'i<{bXS/AÊ`}:h#@?W/jPxW2Ebـϼ=5iB~"4yQEMZ Y(-8yaF[RlYy"pyL-gF>ZlEo"oNb )>@{jPD7E1qN $rL]B /p,Mn%7t3BGfeLxrUoZx:. `\k5 )>1AӢ&3g+uuʲv4Bc-7ɖXc L/zΛۤ4zo}eˀZ-/H2NT]t5L8{[XL~6Qq g-5N_pDqtfl\!1P3#[p W;~^ӮS/\[L祄Dv@OS+̣\;|H-,axGy;LS@ĸƤCPI3-}A!3R9U9LQ5$t<8 7EͰ5t6$%|zC&ɗ QEs%xj dAr]&>ӋT[gkylP_¨6, ԃ\,Pmo$p.L_" (.|4C2[М|ǍZ<@AƲ\e^F팳CT"{zNxOx+Na8)ybԊ&g7ny6,-dG2xxV Lt_ K;c[3VY7/QINKn۸( u?(Qx}>T[y56݁ Pᜀ1C-Gs!:E GUGں̲CZda#jFǼw6-j#1S'uvOYgڇ-#b;j9 &CM6f2Ôhy; X^f"d^]=: lpIvQ ?ujm ւz-XeݟC V`,q&(3l&!~S5Vn1@|Bgw+~8 JS/֌7?20df?N#FDl 4WmK7;짜,f>V}}-jJ7Nx3I>otۆ|A! s['N[Dh\(&j/ Tfq V61*ۙ92]RY+q/ vƹƤkx)[,ࣤ \VLՐkjU1FBBE{k1E?t (GC lN|Ӗ%=bVE Ip4}Asxϕ&EBj (/UŚ=H]578ڗ\4KG0i=2JEDU =AkٽqpRz°zrDCܳ0鞐9p걈EDq ΀đ A703@s%ykSqEzY8W9E?$ $Vb4[gA[%QIQ@Qd"`L[dKShE? dk%>X3ZXRY_/C:> l.|[d LjψEBD .G?s4tdyol]-7;mYjꎝ}&F=E]( c۵ a7|Lw*")hŏQŋT5f&'EOHηFF=E} (c/xo*2s`êJj0؊nLF=Ea h(ڶ|wE+ Ѹr*xIF=J  XyDcy/$Rίy)._8= $>(;pL;F=J S}}[ tvƽAn\ڰ vqG8aELDw9ڄwF=VL c5!eqr܀H-'뒍l: Jh= fe({|F=C Wf[owWKd@a8 `b?;*gn" 5rP6ȈF=Ы љ#/F 4yAaguI;P[%%nF=t ⵸2aML:SLR+P]}cGk~%TKe–Tu8F>IH ni҄rV8^ !w#?:QMѿ 4!yF>Ow /LUvcv]}a&'p}`gbv61˚NֈF>Y jZ'V_v w+Z[`XTrD[`j2b0o Χb~]MF>u to#l[Y4d%C:g&xk|0BY\~F>Wy c;(QxzYYmt׀5@CuYta)s}1F>A شK;nK]Hf7n2~:`hwN̙|F˜[D5kF>]2 Y'e jr2rW=^É..` Ƀ rNinM̀{-x|F?V ݕ/?ׁs#6ﵘ(Y 5<В7F?7 k&9s&j#֥iQ^ 7 շN9">3lQjEaF?3 <4bPAkL&3k< ю%7g,m,O<|F? 'ŽKC"lh6{K1H1>ki.scB~2ʼ.F?`y ,7?S Bq_ l-*_)8Wao^XF?ȥ *%{w7(#s*!d;pM ->_obeZS)k"^KLjF? F\cjjƓ@B3/xު%`eMy(־ \ R?R7~F?h& |)IaQnAYQHaG:H훤NH_}bhZ!!+r/:ZO6cF?GA 4 $GpLF?[ ċ}̧*Vovc(<[YT @6Vi*HVtF?3R ;n}jJ H3Pd|FUuIxAދ|6wF?v dLhQ1[-B\b xTTnӁ_Xɒ(F@;mW WJ9ClI8 HxN؆&PHP qD[ˆF@" c5n{Z '`(۪7O'h(Dl^K2VAqr FA-,  _KtAp;sg:O9.}Vvj8UJ }FA̾ Ƌ,[8v1Ǹ^y^/O(SWZxci [~GFB"R [,5dOBoq'Oɢ^5䦐r 0CN_PѕFB" ֺi۪%_Ib!c,7 mK͈FB#u &킦^ȍ֖̜wL%{V,5ݑdx:FB$ Fim+*P։:T,b3~;a@Mnj3. d-tvCzFB& Kr[if]}j0U1sؐjKXHM&{:(h~FB't r[d+X ۶iUVHS9аtuRk]jNLjFB' \PRH~ED7H W:K[4;؛W o.fFBC Y7[e5h8 %`!pCւ 8uC$FBH  _mF]Tg 4r t&-6 垶R-dFBKo I>]dpf_f ~6"`29HƁ@TpTXjdFBT3 B10I^H\rؔbqd;geD͹EGU<FB׵ ^F%e%erжXݥde.[)۾[GKֈFB Tp<(ucsb8Rz4g:B 0DZq좞|s]FB 3evc KpcO3=#kݝ<:Y>k]EMOQFB<  ϹB' Sr9BdjaޙItWT 4[j߈FBQ mI> "[zR\/u€'`]=`-P4FBY ~\&q`U*l;!_N֊-ZY`p\xFB[1 !]0S֢\`ttfFB\M  9D L10hGyW +{RIvKBo@1U=8p|ne^U+x@Л S>(戏.uFB o ԤNEuib!6#3,n tڝ^7s9EXWk.LjFB2 Oh-,ASsAxDxV1%xTբ(Yf!"6/EFB uUG"D.f%po!Zk=W7YvܕʈFBC " ȃ3 Ju&6+j`52[h>g;Y`L-JFBi )9Au:LSf9âue%{v'+۹&ЈFBG "k 9x1ax>5x#l>;1+gFBlS  sU57aI\in:cr?/|F-ؿT3FBk KX%xAΈ"h`mn<ZSha6Q.uƒFBs QhWF"1%_<^8f}[ lҚ?rrdYBOP(FB 4#Yr&/R ̅g[ {\.jkq/~5FBa Y5JIϗŁ`seC<}SRqO6FBL {ȃ)B`i! _ fHmuz-J ċ$hrFB te`Jxj|;<>rp;&v|(uBFB y} {w>T,~.Q"$DsddZUFC SK汷#m%{~tSaBz7z15Z6XFC MRP`y-ҐGVW|qW~0&h( FC N&GncwB_#>Pz 8y)5뻄FC_ M bdN7dL5atv\ˊenЪg s@BEFCs{ Pr6X5 =>w, "K.fKBB&Qo$FC# t/*BcZ^h]QM6.rΟcI7SJ 5jA^͈FCsϲ B&σ|\ Mc{tT{ѽ#3DM?gJSوFC6= 뎮LuoFCմ 7~JhҞ4^!e5bzxDv`3bW53FD '\Q%PS}m'e;'Ld@rة lxIcKXU$FD ۄvmG KH|Z5tx^ ~U/\FDc Ç Th6ڪu 6D{Us ZfRi 'eFDj I Y{YL)d0:m8a0 DmAUJt\FDw Stq_ׅOAR03ùt:ٯ-BrfM'OFD و4я2;Iqy9pN Ve$VQh9GFD5O ϳ!n)L=qx¶W~[xh* )T(FDz X..+jy*qrFP0gO0L.LFDc  yYqyzgEo=.0[Ҁ4bg 4vu.FD h%+};*c&$f!JO=lWG roFD , ESD_9 uNk/gQ;gE^ZFDi xoUGBYP}:+{bX2( m}O}8da[-4i-FDd Jāq^o;ߑzɐǝ7W#JKtyb,?j|VFDL /.ĵ^օ'q؃U_O4.ZaFC(-9K{>+jFD= )ƾk.Eirݎkxl?EZ彸iɢ4:JMA'3FDg !;>yg)R[ jYԟmfsm}dx}/KFD ! #-3\J5Aޗ_A]=fmR (#Y4UHj5FD| (?EwQ:5ΠhM 2ٟ%.Yo䇂qf lyFD z kZ5B[I`[K9ԉ`%y˜ th]n]pkFD 1H&S8qj7r6GM ]fˣiMFD/ ;hZj _s6 Sw<Ď]BT_JY"+W܈FDn8 dczskb}b(,p>TG+Cݢ4lUr%FDn jky0~ʼBoVXsas/M`\-FDn T {^mt&i+G~{.p֐r'/>C {5y/FDn# Q`,\; esà׾`Ϡp*kk YثiJ1c-FDn; AK#omLl੢L@SYAQlJ)=l:UJԩFDo  w{rq}Pf!j|:D%fp+Im#n60FDp/ EHX)ᓔaQZpa(dޒT+FDph  0АFqV.4&=Mjz @P9%u-0@OFDq5 CqG?f\%SNOZÜK֢6oB۳6*p $FDsWN ɼ(TaP %KӔ;lv BZ J\]pFDyTr apHA-"E#N)UXh'E "#koq{XFDzc' "cNOܿG ԜAUnti9ǘP"|~FDMU ůwJXQ ZjR;SĦ"fT~,8yo`fFD x<4a[srTeUAI}Ą$(كVyd_^a!FDgd xY^-XrrߒYE4!ok;bH8#rFDP a~pF-feL }@fNssX,AG}\][WU)FD~c >[iEhRljX1OheK#Yb#X V};f娈FD 2WUEU-0"D\\9b6ex)A6zL1ܜ, {܍Vhk $1\Åf)nKO4Bѧt)!r9s{Es]eW1Z?;̈F=] òP#g`b Ąm= $(lIɗ߈F=V 3LrzIr`Óyj4CT%*&1 |F>F 7\ +RE:jh 'GJh4v(7u2Ԭ| }K]F>Gf PxSjB'.-8PpM2t-9y\O(F?-i 5a|Q:D,v4νX ],#wLL:ZXóQAmՎ~lF? y~T-͐|S[Lgcm\T8ΕVEHw=|IDq3S멀F?X? KAVM̧HY1t7W|[k^/ #`_}'lF@ GCwUq”xz Rba"K1ŵX W]W)KF@žr @r/P[oXKgDz{8H ?aU5rOF@ t%K]7#| -K{TŒՓ1 _ tѰF@n ~*]*0mN~dsF)fw|9k4IF@Pb (nJxᴌM0{0JJDkK  O6־IF@r %?/$̆\rb_QLNX-'؂9t؁Db !}EF@ !sY9WZD kr6}VK{r';\z7B̚+qF@ ֗U .Xc`3q(LBd|4BT)L rΈF@1  im,IЕKԴkvNƔUv73`ܻUN}qFA 7`fEd!XḆX:XqPJ ,]ҤϩFB>+ 8 SWF4LX%{sѴ"vMqmPY"  ƶFB " sUOOB٫M@| 55jj"r*ЈFBy4 7t9 N^N(:$QIC#X7B+v_ FCW `;Z.ϘK 3#0GpQXu 2EF-ve"kfF=JE 'eh\aS?QJEFm/]'u8L,Ef7!PjsVKڈF=JW Ȑu+5"SR׃ɐ+=H inНpA \TCF=Q b_4$fx:DC/c\s`.ݳr'eF=x- >1Sm{tP%O<˚9O9Q*c!pXzF=2g + !|D.| c~g CH T2̯T6rRX fF= B bl9ևKRQ2~XGWYjF=@ ^]T~gpE$%~n Tٝ1#>ϊ F=gw WaSK# +OAdO)\YwvQ/ڻO,fHr6v7<F>)08 °yRVb1-0| 't^YІ4d.B$}?;ƅ F>F\ (O'bJ xKĨָ߬DgmVjV[T O_F>Fj cE~K|9%UbzP+?}v0R{%oK\ HD6z0F>F "mסdsj/6ZHܥlKF>F Ky:xf}+K‘^ FԈP5(H/YmשʈF>F ZuKZ=Wu6:4^\xE#dak<YF>FT Tڥ*HRMlu,^W-.\4gp_F>F " "&G:lX+ ϻ1jYџLG'pF>F z_Wۤ(ɵ;`%Bޔf^lj>STFфJ'7CٚF>FI )]"hTR] *SIJPnWJVĬUXWzF>G\k 3\zzod_-AQɋnq 'q{< l=#F>G SYAW n!ĹCŵ(@5H}@5_⮽F>G 3Q./ Uo*HnChrċ?v~@\'y5F>H ,zDw0VQ 9I=tP@DlQt^iNnF>H# K,T*X1wNׅ`(˻Nv|JN @3:LbˆF>H x Pu|k{3g5o/A_(8"lHF>I{ zn]yeu N|'CXX\Ruh=Z^,F>J _mPu{)rԄ ,R0h r!/ aF>N Ίyטm'4m*90_'SjFK/|*ڀF>N= w/ا;S ' I8QM> ^ޅ᥷E F>N ]5h~R %NőcK/t-.<]tk:ĈF>O Ŕ6Qzel LP|-wZ\3q"%Y t],J~F>O ^ՖyoVȤO"ZJn;+ɕF>O m1 re6I߼zVLl[1'pyQlF>O y/]X;Wn`uIتhޜxlQ] `HJۈF>P9 P+n51M:5g_yt'^/p.SIF>Y$  IDY}/tgG%˾?F U\ @x&gF>j6a 4P!LM !Df2jm]kZM{fdF>l 0}V4fPΓӵE Y"A_NzDJpz:F>}, –"nE:P@dr!SA=M=Dico 3Oe.e ^:5 Yd3fF$U l-9luF>CY \>;tpD(+ w{wc]iEĕFvM X<>F>T -K%% A&"Ϥp%a^Ej* L( 2!py#F>p p( yGK4w]^Hda%>#baAMF>z3 Aà4f, /^-K~xkY;5i Kؐ2)st`5F>}r AJV9ɼdP2G8yg@-`-FJX(e7ψF>k d%%tj1! <\2R @7=5v~PrF>w` 0>vf3KPAmiQ:ݷ{'M N)l[f9]F?ِ 'c辂i@15kɮp=fUZ\=ˊ9dF?+ 4/c2;5.LNHR ZV{J]~'F? "|q+0vuŢ+_BzQI1`h0|:WF??h !A$wTlZe+ߔ&z ][*8% l#nF?G x3DHc'4tutn<*I"_̙SήpgF?\ <⾣A؛=2,WOj:PO!8N[kڃF? !+lwk]ujӌ>]9ڜd] Aӛ369F? (k|5h"Z)+!pI I)E!tP^n^%^3FF? `N8IP%<.(hJn[_M.nHdx{ 2)Rl=/F? lv-gNnJM~3ӯPf;(vKxp4-[F?& UM}u=S;"sW8 8{ͱ>ȈF?p -ne6H7쐙ER&lAڡ _VyF? u'eAn%5N6TTj4"cEBA>XF?$j Qu+P[]ɉWm|3pOP1^J?5}& UאF?m= u)Ւ<A "Ǐm.\]m9MfE 0VEF?mL ֠P. )d\*1a``r%_]R8lRr,F?o X)WP?Kנ8*rO8 :.`m[^r|ݑ(F?gY xK:\YM뤔\ <rb8<G,sQF?g] # &[ @3?^lrQwLkD+Y.{ӳ7ҁ6TF?mP U>3} AOEX{O᎛zE3{%i6PvMB%hF? K&$"@X8C$ph,@򈾜P0*<02ވF?YU ۯV1V@7F.QDskW c1O0åkF?ә S<)GrYۮ5;k ЍvQpwJʎF? J憡wDHTӓBE('W)(&@QܛAF?@ VA&)R oJ9ΒgE;ZSIl F?H t~E0'2_2qK  Ì%&_"b.F?" !O܄glgIK` aՁ+@i"ObWF?I0 L0< p4T۸'Ip1RS 8F? qӤ32>gYbeDx^X^C<)gX{waF?>p ;w }_>!qa~C#Cw)*t@/t-F?P q su@Mm2c-F!S#(ƪF?b <{SfZν ,אliM CuCłuDځ2!mF?{  Sϊ8/6/Ov/7|>w"Lrv2F?u' Y$s#K3Ca9hpt#O)3ވF?{k Uǣ2Zt[Ϭ^Kl ykPPȺ@*l JF?P +@ hxXD_ C|N7 <nʹT5,{QʙLjF?C vc&^! 0C+5(5}зOa%or!.5F?l (Z>Qs2d ӀmCP6[ЁGS;z|F? nܖ|u4 mXs/C*_fnѮa}F?!% !"h#hnNҦ7c"r2Lkz 򺼓F?!r} %DrRdץ YegS<3ǵ& b)8F?! fY_ '^!_A7=0^ٹE*cnΓ[?9a@~_F݈F?%E *] _ i!<~@YMZmІ% >cF?( 26sw]^,@-<]ljDܠX``LsTF?+K g8Lt ^Cq& :46ϪuIJ:rTF?+  +(e!9Xd‚!9]CrtxպXVu>,?.{F?.$& ,>ZҊU43A)}Po.M`rI%F?.s MPPQԵ^< aHMgG>tVy^%r[F?0B q^֠~{  c<>|f,M(hBKB8ʨ너F?14 p`("fyiΙLEM(iv*sYzZ=߈F?2 J `0[1ZDGͫ 5] q ֊sfIHF?2. Wdh#@_R8,j[3|Tχ*q瞉FgF?3 U\i%H*`j/@8wve^+#ArQ|9V.F?9#s E!GiTbLTU+M&Q؎|Z7#>W 9L0>7\V28ӈF?;w0 ĕqV_Gjp^?kmNDP Y^6YҽZH!0EF?E5 ќg͖R ̅*'CڧnW`Aa5ⷙMNE;F?Em |;yp=j 8XΎ1"9FP{DEG{'F?F< (8;6 GF=oF1,"T9ih29e[F?GP 1e\փom UE|"| ||u(1l8$.z4F?dh& ffqzۃVyGw]ȉmj_N#@9i/'F?h WQτ o8~Ϝ:V#hJ0E3 m H?JF?lY 8ɅtmWi]?{B9A.e^/ AWէ1F?lb1 ]I4\\ Y$7_|FpEzSC_"SʈF?f ƳL gϤo KݾzIy ܇NF?%O `zʅ0xUXQ$I#JFUGHZYHLF?U |7(pMsR( c վ_8̶ omF? |7(%[ 83"\Q*0F֦5o(4F?̴T Q_o$;d2Y)=^)Gx?rleU1PFfшF@8L 2cHH,U8M3Ԛ|_aEGx(W很F@9z Y]7Kr%8K t ѱG$:ӓ,WVBYF@9 ‰-jE:UUHƥKN*o&q/uwqfu|wF@:J kKVjk}Ժ7`u _'] ۪a'F@:}L  $kQEմLQ -Fa U 3B /F@; ;+b8k* /+P2J91 [ 0ͨx[CoXÞF@;1P z:J>a Ev69JVw_k*ToE'=*ÈF@= }ޟ~05 BR5W{KsgxI/PCgD=~v/ N<0F@A * mՙ=5X .m;5r@ l*HqXF@SC  .9Kp%`'Ӭrhfz\cPZ%S=+7yF@T/z ˊd'ǠUeݧrT#x6 E^K15VP3OF@T?F n&x)g$f]W#b!^CN6ahlqF@hHH *XΪRiN,sp-]Na ]u_Ͻe~wKF@w2 >m'C]V_ R]R:e`TYAׇteF@x  'r;>/}ձsdN7HRiJڨ>BojP˸[c&.F@ BC]}B/ ke r1_Sw{sJBl`?ƈF@< чKxYx([CʢQn$IY@:/曫tZF@# KVm1kcπC@#nb(e z9фVqk)}bF@m : !zP6'- mGD`jbwBi7$G yHt2F@Y Eȶd-1C@?wm6[0;GQS(a|_#F@ c tf3AļA x{΃x5suI7&!f'F@b 4Ga)Ec Sg5HFvU!(9g%>F@{ gy( `#VuEw'Dgη0>M-VJEňF@ 2$@_La?rAY=So%O!,(@xv4ZF@@ (ޮ).ZQQ:rɰᦉ}˂ׅEh~NY_F@y =-~5OH=-ˏ,efk~ F@& =-~<^9S2$e7^w!a/<ÈF@– s4Ԟ/{8 kOQYo*$[}|id1B$־ znb3F@< K[Cg|w8f%t23R4,$lugF@þa  -g4 Qw{(*alRwF@P  {WNw~Sۂj,`>!aO' ɤo$sl,F@S yun$.;9z;f+/ądOrʓF@w V*lK240)2gS:{ n_K]"N4nF@լ  [H"saUsy# ~jLkqн0pm‹F@> ?,s%*/4fu f& {=F@q H&(*ݻnWcVyc 'BrR AF@ˊ U43!Wp@QDYs$UBgfȓoq{WvsF@˓ g z1oxuZIW9_~`aKST=GvxolGF@̍ 3ʶ͙,)WBKukX((&nF@ 5afE!Fmq*cr+<b8f_ b-=Aw-"͈F@Љ %: ea -k2K 9?0JfPfmWBF@ڒ A+1zjTh(LZ2d1ژ R;MF@i N(^(=hGJ{{ydzdrDg2F@? !OhAQ_tZ َA="Bc%ws )n9L:2F@w} !;'!.46fLeQgI"sQF@a Xб'W,Gn7!ì9]y7Acevn7Hw0XֈF@!x ?UY{[h{iO xaֱ1sq*,B=JuF@H gJw"7ot!>|nE()J{~F@ lꐄ\*Jiܵx/k1MJVwX"Q+u/FA LK*0)+AKɔ9,gL|Q<%{V=SKL) ԈFA# xR֍PQ'B{ D;lH;ox_\LxFB"3 ع,OqFC;<5;y0')xujgsV[vXxWGFB# %pM#,Qfeyxp;>zFB#$ .e9.5Эg  yzh9nӘnG]/FB#V D|2 7(#l>=jCGp*{>})v 'Л FB#F 9Mő]sEHse+ qLpj<57CD FB#< mmw\)C{At63:A> X$$w&FB#) lZ( vCʴ̚V?woқF1w9sރvOKɈFB# lZ`3}uQDbs\Wz:rA/ԍ׾s)G|G&q ^LOT@nl-`[G"s3Z.NmaĖ5,R*>C~S4'yG>^PN/ݔ a&U\ 9dqj֊wJUlVm)yڄJus^F_8,0ob'_Aeu@z<,P:wRM94WXһ1xU? mA]tm()%tE@ta]W*Y5} &cޥ)J%>NIIp@x F!-lBd V٧qԖ\B!㫘-n5QlYOYaI5dWܝkbQJ\Uz ~Q̬GڝZ}5Htl,nEN!bPT;ډz3.~/d @> "M,{2mM7 E@߉ *H64.1He#M 1󩊆Hk>A*\)f"UK˭Eg?ZD}@abϊ` x0Wdu>&@ D~b }鯚m2~qjԒ A)%axn{De0!;y Bul7>ʽU&6x^? `)jJlvW2%pDѧTrZ.\ˮo7^4|t&8/9qwkm˭29&, #l^ UKBX317?+v £]J$:)Kmɞ¥n9긁щԿrȍ"݅qzpS 0(a;mOE\SA&A5 1u)o \JQ,uoG 8_BW"+Sҽ[V~qN?uwntst|鯙@j !^!PUdZ˨ܣKUrHN9?csignature-notes@penguin.de"http://www.penguin.de/~bb/contact/pgp/signings/notes.586377100EB11C2DAD7E1B3EE74D29B82BE16D01.asc"3http://www.penguin.de/~bb/contact/pgp/policy/v1.1/ K`Fuke,PwHT V 52`Vn!r![@ V޻g*z:Þn&"M-(vqk%vjF?J  rNE1bB@݂r'(5v` zԕ갘+G624Br#=4GZC\~}wgfCTa;|oaTŏ Vҹ^bLƱfǼ.Ω*1)wd)xXzHDG.wky,.+6'xpt]Hl` )\`$9$~u3d|ڴgM-@~c0w.kZ@Ӫ{/ns= wM< fgOT7jA? @@ jD2;5=H-%|J`|nxUw)Dj], edtcK^>oV0?,*0bi]URgߎ}vKڶp_} ѡjڗOt(8/j*~h:2kIU%k~^U]^/t!e1Ō,s/eYGKT6%{J~#TΏq\< "Al `cgul0@U AocY?h %rAFg5cwDRCy ;(Yo_6-f*?"PN#" a!\H}+fQv'Yt]?3j߯7C )Sĩ)Cq|*>dhLCs|e0(U&~VQ|`(lTRrUPzYkvn"LH":+jɳ"ᆩRJ' ]ƼTyQ@*?#http://www.rath.org/gpgpolicy.html ܰ,RZzh4Ra}o fFTS ~D(2ru.7XR!hHoR&A3VIdH/OKvhK)͟f[.ݧ)ߌ':]6c  }ĹpՆ r{|g~4uC(K7t A3:l8f _K)9; 5 [njD0X6#Ge=0JS5p7 @ĕDl@jcM?lYFhttp://www.trash.net/~thomasb/crypto/keysigning/keysigning.ver1.0.txt |:K]vtHea93rڞGgNOfj}XıR16أo>< f|֯LtL(ߴv}\dހ{x5$R"#{_<9%'Jμep48gדC3Vxa>JMWot _:]Ա"շ55R[F8ǝՎ`#﹙&h`?A,S{ +YKL-X%Y[yls)ծI[ ;i=?ucsignature-notes@penguin.de"http://www.penguin.de/~bb/contact/pgp/signings/notes.586377100EB11C2DAD7E1B3EE74D29B82BE16D01.asc"3http://www.penguin.de/~bb/contact/pgp/policy/v1.1/ h 8 2y9 H{$H^xi/63}0|25/7U\"sZa8 $9E2h STnßijDy~|2ckJ8ӊt@!%ٸ,$=G7N8 Gi>\Ԯ : _|"Dx\}W$x76N‡\~u=ՑO #M}tZmO`B/ .xDo&)xsT8R_(]9g P厄& ? {8y<<@ӗܷ8A!6a9k!0:dl#A{$&1b2`:d=M\"{9Q!k92kwSq((7trzr,d}3&!h; Aqãw:eH5fGWxIX7ktdܑsteZ9?!vny 9)i#|>:=bPdi";IoԗI.$LƸby,|(csNCZ[f!&.ZnPh[D 8B>lh'm*0ҴN#d7>01(eQ_-;#ܘ *dV SBӖ6J@VB".(M:^|<6C0-'O<' B$ ?%7 +V#wǨNG17^-@ bEQA;1"R2$ @g0q^鎰T}HAY>5[I zML4؅t4 !(~[} 9SZߓō.~&Vuog 0;R"[L"kyYcTOyNc aԗ%/F5To1 *֌@*-ї3k^LVk$wc_ _7+@24&iÄ$h k`NW!{t~<Υ~)#6 .P2Y=5@}]눁gup; YNVOZP7M}:6[ +WkܲbhI׏|d5)+g6$8|bKX.aėU&ϭ:򧚒V/)#$w'){L'uMgR9@\4}5'Le v#*ߕ2;0GIKWE9莂CvE`Qg81I2[SBS hG${p:x/| >`6v8G %IbRRR)JCf>+dDc+A2jdp3>J!n 52D9ъH:姀8}?m+hZ; jLRAgJԢ¼(A֧.`:LYeN|+?k_*|G_"2*"Lb3sKQHp͒INM~-pD|IPk: 9~ 2h ]Ml LP'd?∙O5m2d'{~ "GRwŸʆ NXщw :A4SUO^h[z< vr=3!h+,N\3"oh[dO^@en  CzeMR^d+ru.8+n%,N̑SYY;)1U撙qzdcĉrŝ+) ݦ_X <"hj=rՁ7(d.S'́$(&"IP^3!~k5w`9 BzDxejIeGߚh %Ũ}!x0&to)CxܝC+ี&mo鯪uFRqCq[6Bwlu`E?* e4+_>=Q•1`)#R5mMsjw3͗WE?& >rf<Ȍ LC!h wZ9wpZe6,!mӝϗE? (k|5ha ѰI qO Nݳ:Li'+r[E?o X)WPХ*Q|Nd`2 (O>UZ)7ʺ|E?u* Y$sc"5aQn%ig;{17n[r$@VB/,&3h\PЈF=E]( c۵ a7k3:qWW<|<?].[$F=E} (cC/+s>XA$-LēXI^VF=Ea hF}+uW6H=( W]]ͤ.CB}F=J  Xy$N7?}E'8w p`M]gL>_MF=J S}}+(3?ץWpAx tr%FSR>}=F=VL c5!evt&`=!u2`\_1O'7(LyF=C Wf[oK-9[  V"+nDdL*, )<ڈF=Ь љ#w 6k P<918ADz՛i)F=t ⵸|%J{ThKٟq\i[ @`Pҹ߈F>IH niH+F։<>^(L "P"?/݄F>Ow /LU{+7(®6]̝*oEyaYǨ^BfF>Y jZ'Vl^u*6B>،_St)wSr.yF>_v w+Z[05MVex| @?jց3)bJF>u tXq.d@*.v[-04F~)ΏF>Wy c;(QxB~טҎX2Jc1wm`G *w1PqF>A شK;.$.]3 Y'e jr2rʹ|q|$󧖛.$ZiMkDrJz'-G;A;F?V ݕ/?+ /6st.G,Q(lW1{P x9F?7 k&9sr3zAS:mE෷yh:{Gap# F?3 <4lc,U4Ä?K!*tX'׸fmΈF? 'ɱE/ IqOM&]{VTiv_4ֈF?` ,7c+2G\eN[93\|F?z 7N[yey| {ziKY(f7,1oiS F? (ݰɶq<(5Y:լ WW:+i\"&SF?'B o#OZ H.L._?(l"0;X.F?-f |q^uKYl_j3+mITbF?4 4Pd'Y!$/JtY($[5rF?5 iҦcpQ^I!]J;!cjwpT Z _oI:F?GA 4 $GphVc۾rY,=2tR$`T\aF?[ ċ}̧*iQc.Tp)׶& mu3YQh'`gF?3R ;n}`LCti iG7K3nGNvFLF?v dsY)ǧ-o KNzE ,EGFH{ÈF@;mW Wte0FĵV-?oY֮y`2fF@" c5niTe{VgiW12g"{BBQŗ t,*FA-,  _K46# `PHJY,ܤ3,Αb Q#m,FA̾ Ƌ,[8R0XqȖ5l|s,֜ۍBFB"R [,5dOBoO(!y5N`z+lq?b=FB" ֺi۪V2`XqtCԎ#3FTF̆hyFB#u &킦 WW>woHwFB$k Fim+Q솹O1 6%{(Tj0cOFB& Kr[if1Mb"b:Hd35 >I EFB't r[d+HLՒf᥯B1`@΍V(zqi6Am6x]FB' \PRH~QF>DU⨰k_շ'/4NR9Z1FBC Y7>.BZş:Rh=ӃSC e'wFBH  _m?%'ɤoL n.Xbz3_h_FBKo I>]dp#KȻT MՄ'83I:`p8}m<FBT3 B10I^ h!/,f€ {7dwzXiT]=ow:ZFB<  ϲ]7['+8' jÙ085+-aΒaaFBQ mI>6 m*ϭAF  PR ahkcTQFBY ~\f3C }x@@ M\BeauU qDIzKdFB[1 !]0xwɔzP{uE%~d3^vx8݅FB\M  9D FA Z^q!etU q(,io0وFB ™=ɺؕtxUȿmax 1O`LFB2H Z 9|t $4%uYFЬXz}nH4J9* T4İqFB; 7SEFS9n-T~KUn P<ƽ 㶈FB 5J Rd߱ܗPjµF]haτ6P7]fFB=t k?=StZɫ9HOXۻyݿPzSGr!yDFBۇ 'xslny`i3T#Q2 .oAj2˘]__lFB o QXt[z~٬?؆=,>s[NnzFB2 Oh-,A]A ׊<]QDj RG-$FB uUG OX;mz$2uj VGUl&Q$O;= _F3 FBC " ȃ3 JuЖ{xmd/m?5y ͮwv1LZFBi )9(K7Ь0AGBc/:ֱR?32FBG "-6CJ{*ib|{e)z)qrY#FBj (/f;%/z-Wm_ 6CĞFBlS  sUe Q10u$ jFtvIe?A8T\8FB2* 0HNjyxCDA9 PAQrrReDwj/&1sRpFBY DhPs?;&xDne}*\PYuMt?&]FBd* vs#mj3!1-k{"4s? iij1cFB޿) Oj!029Q\ aAqȜd~tKҟ%YFBr ^Ͷt=HY&+§28'.(-l8#ݾFB nE] v< (3o1T"93qƈFBY 5<g+#7̍JjoeLu9%* }."PFB %x~ݲh,FG }Ѧ)n,*f HJʕ9K??FBe 30g ށ0r] t3ҺGv+E ?ܿ FBk KX%xC-Afzm `KvOt5"/J%RFxU FBs QhWFcFydiCh ShRZؑ|Cv?FB゘ 

gQ^FB 4#V%$zK&՝)!Ik|SŻe :FwSFBa YGzm4CDOoy/3a0tV[AfFBL {ȃ)B`է7^NZ!~{-.ڟTanlXFB tMSeEH;RP-7mT | 6y?*"FB y} }L$%)yDdSHn /u7L݋pZ3+@"FC SK汷#ϫ<]47AIü׶{nkE혭FC MRaGS 2Dh-h>Up7P 5,cFC N&GS 3b]8n| ?P! FC# t/*BcZ^%IiRDhv GdXbOj0fQ.AxoFCsϲ B&σ|rslI҇laF^4vYr T_[FC6= 뎮r1^#G MBA{;}&]6\FCܫ ieO(#_Tzv!{O#ԋGtozFCS  hE8%J9T FC; 68Ryx-"yRKES(]% Q :FC}v S)̀G:S!rrNGd1~RGBa~|pt5mdԈFCմ 7~JhC{iM~;>-V D&_&k~B FD '\Q%P-ǡfkqHO.?$لO>G#FD ۄvmG`6$"4zy%Sz7sLLjNUy2RFDc Ç ThI֔0LoZВs`ZRVP[3,xl&FDj I Y͏-P_hFD5O ϳ!nC>f{H`:b.c V3dUkFDz X.q#~e3Q"kʴrQ%vFFDc  yY3َ3ӑt"~iWhwHR(OI5\FD h%+};?NMӁ7mFu ^`LRxVeWfsFD , ES:DD?ƕ- ]wA:5Mi0Eq .PЈFDi xoUG9Y Ιk6]02cȎ80|tWLeFDU =AkSyD\e_; /%"kQgI! ^C*)n#W;KFDd Jāq^B]u6 b`r3f2sMѥQ_ϵr_u4VFDq ΀đ$mt"Q ڑ?Nc2>CEzR0e-38+-҈FDL /.vC4dhr=R5B;Fentu Y!^FD= )ƾk.KT~#G0R h&-7vҘA(Vh>uFDh !;>yѥX^y`_)kNe7rzL $FD ! #-3\ܿ㒥;7oKh <=AA>HmvFD| (?EwQ}*IcR7\>Cc> +59ƣ@FD z kZ5BtD_`V# 34K qyJ(~A=\FD 1H&2%fbpĮ. ^t_2u"D{ﺗb>FD/ ;hZj *7h@pXb 5*4n%14} RtFDn8 dczsk) wW_A |^]~?sucz~FDn jkySQi58 y?׶6$c:9h]FDn T {^mt&i|GN['s |Ik5^U)#ed`FDn] _q%}f(1G)y"?FDp/ EEcCT6Th)Kq=!-'ˆFDph  0АFK=v1g0! mm |/ NLjFDq5 CqG?f#z,( =4Y\Yj1:=؈FDsWN ɼ(,T"핤ja ч5gB*ȬRY)FDyTr apƢ92~D$r 0H_)nKl?b&Sv܌FDMU ůwJXQ ZL_@[/:"*CO 2(kbavwq<(EňFD x<4a?9%QeZxuo%;IFDgd xY47}HcT߂_Sre4_դ|_FDP a~p-d0lN|oG` vF!DXkc &@FEm ^mN.Z"Tg):yAWg'a, FJIF qѨavæodN'w7'Sez1F*A6 {FJ,D !"ʢ) y_XF@g#),HtfHϢv5TD9zF=Ic# ۷>Åf)q|\r;Z'ϷJQG L\`F=] òbqu%!?ru֙k1ӨYgF^ F=V 3Lnmc?1<-c܄gnD]O` [/$eF>F 7\ w:$"<<5>q`wƟo%{)F>Gf PxSjxHJ~w-CIhamّZIo\ŚT@RF?-i 5a|Q:u|.d. لZoej<^}mDccYd]F? y~Wu\NPt%]'e03;.70@F=2Ѕ kF? AY[sr͚Hb3"P T %L9[V':X:`ZF?"C NKɘp ]{hGW) fu-MtY^jJEIdF?, K!`uYE :8Cسo)~?%F?t |"ßz:2):kQ8GUgF/2LD+foEHVF?< w3&RyF?٧r.+ :2giaQl&̇F?{I 3 lctmU v2 pI.nL|(%}+cOvi0PA ƿF?~ ݂܁K !X ) H&(R\G!? oӇOjU'F? q6w% 5Ԕ6q\0o\ù=ڰSܶA(bF? Z'v:{skktJ#ǎvE!;-eq N&F?), t׀׿;ݕ8^{9̿-`|Z-/SS_IqXF?ny tYžt%vG ǨOZzm[p(8ÖVF? 4PQ?* 텂Y5,%  co@[d# 5\!F?\ OV9*Gn\ "f5H>cpӖF? ' kxݫַ) m9xeNU@%*ISQJ+"F? M VHC6l T3AMcq0x`P4f 0ˆF?"m 7Q8}%-PdgV%n OGF?#r ̍W?JX )/w\D~h3܍F?$ $Vb4.0\ulkE"4#lOx'SÈF?'/ ,?>d&xJ1q)DȖvMj?G0淣*l30F?.w  cJ\u{iB#U:/Egpv/3C79}V1F?/VB 5I{Y^@o5l4S!*F!f?5!JF?/ Nʹk L#T8\ 1>~U#q^qcO>c܈F?D0  ))߁CM؃oUF*C3ua  F?X? KÒfl1MDdcJנœw$|f6< KrF@ GCw|f&'he<",UaxrPW D%@F@žr @r<1VOu(aOo4OTJ_Z~F@ t%K]LvX#rKx,6X' 2@f7*iz\?EdF@o! ~*]*:/K5`-|Oès.s0ί;j%fF@Pb (n13sn!W\#ot]6D^a ߈F@r %?΃| es[ 9C+2Un$F@ !sY9WZ\&ot4SX;Ff}.f}Lm:1fv6_F@裌 ֗$m5wcmj? B"|gCwQF@1  im=c+;%q׾ L lU:ˈFA 7`fEQP_9SI60{qu. JXihUƈFB>+ 8 SWFC39拝:??_)ǿpJĤ\RM9Mm#{ɥP,FB " sU]e4h">b$Rwh@Sn.FBy4 7t9 O Ê [ Kez',^h"5ȫSQI6݆FCW `;Z.ϘK.`ZUr:nJ{ͽZ<ހF=JF 'eh\aSfzˇ">rĶIk1ĔK~ӻ0GaAMF=JW Ȑu+Hd5ON@Ig0I;ҩ^Ryvrr8F=Q b_4mH DR?랐cb&"FLLK>c%F=x- >1Sm]S2CS YSb O'&jI]j@űNh;eP9jF=2g + !|gw/ZDͿC B -a0$\ċX&FF= B bNJmx3kܑ yd_`{RA z@BF=@ ^]T?R;`qÿB$]WvT˂8IaXuú =fQF=gw WaSK#uNi}?qp&T4^8!M)08 °yRV[Swbby(`_BomD:~e&>b[}ňF>F\ (O'bJP_41wJ t K8M*c$Smz-uhڈF>Fj cE~K||oZL^Dyq d,lŔ~zʩpF>F "mס.^QZ_S"hJY۝!`n:Җ9ddS]{F>F KyCY'CkZAY~R*?ytF>F ZuKZ= #^8OJG6F3ˀh\F>FT Tڥ6"B3#lF8 8')gnj89%UF>F " "&Q%~޼rf՞7f/Ed;\<,PL*(F>F z_W-IHhVIla LEc!4JdoBPzNوF>G\k 3\]ar -c]H$5 #>K+ NVF>G SYj=PPL|x#[URCRh w6KЈF>G 3Q.rdt'4̈́-##I^L%yeaMv52!H ,zDwRwM8fVYJ΍j0xCRlYF>H# K,T*XH^e C|"S$t\! 8Quٳ'NdF>H xmOUVN&BeDhZ߰m0])6beAF>I{ znNEn϶aM`f:>2G=]A\*]pF>J _m$ON ΊyטmǍC-SZ L[FEPPҬeaqBxx4+؈F>N= w/ا;dW̰a*hP}R ysp ;&[EF>N ]5 6[;(]RqWHh?6 *F>O Ŕ6QzOL5:zu.}i&8Pz-濖WF>O D>O0[Lmd2@8vn7=#шF>O m1 r=)Ůo#DyQC) ]ɋ!LFk3$|BLF>P9 Pm޹{VPsO =cg`/!Nn_jF>Y$  ID"Y~0mBFK=O2kh650KF>j6a 4P!;$/i=C^pH=k?窼.L߈F>l 0}VbS&IVErR':\e{3t^%_F>}, –"_LF\鵺]1ظ;V91s +F>o 3Oe.e6[F+,(PmLꙴdV÷CY \RC ɄNB rȴh~bwJO}U$~F>T -K%%} uz-i_OxPٍw|ӕ:a(F>p p( ʟg-`pK GhC}:' O&fA'F>z3 Aà4f5 T(ZZ-BϘN5Difa]x ^G!LjF>k d%%fgǡXfmq)cax}뭇pF>w` 0>vfP/u ɘc?Ir_ bPlY9rcJUt6^0XuUHwibЈF?p d[h yK{/\&ŎyF? u'eAГO%1mHlG쫩e~l~hϹ8tkZ`ҳnF?$j Qu;|5HV|se xfa^ޕ;j3FF?m= u)!:X8/3ekL,6w ږnF%Q6ܝF?mL ֠P. 8رO.dᱜVZbsdzQ{P ¹P}/F?gY xK:\|D-").zv.Zg'_.KB {4|UՈF?g] # &[-撂~] l oD74Mb405ƘWe.sg3(F?mP U>^JA|J%a~o[QK@49g*uWF? K&$"@Xv}=jКn4xneb燮WPd-CF? dk%>XO; vơ?s?t|)>_9rJ\=L jF?YU ۯVvGaب46~-i9X?Qݪzdq4F?ә S<.(XKrBj.b/`jjňF?@ VA&)ѕK@EElb?gYu|qq拸0IF?H t~E0|t&bM&F*tIv`ǻ~SbF?" !O܄glvSQC=?"}̣O`yq, ՈF?I0 L0<@/L] <֣!@vQ9"&]fQoƙ 1ukF? qӤ.%<]QF!6Ȉn4fNOHbgsV F?>p ;w &>̭vgM%7W:u6Rr_F?P `9"c&!mDmNq:cԦ/bfvF?b <{Sf;NBĝP){T%XKHp F?{  Sϊ8!i+K0Zs"kM/`<E8M߰=wF?{l Uǣ2Zt E/>~ܒwF=j7 .7U没h`ꎈF?Q +@ hx@ E3N-zz`Foh8LuE|RAΏ>B'F?C vc&^yMM1)j9 W&nE|amx~'yBc|YC{ ZYŬQ "XF? npzoA[GWG-)pJBMy{._@F?!% !H}%i M)YrN\6HsBW#F?!r} %DrRAmMINdV&38}}pY+?0-c[( n WgF?! fY_>%Y0$|DJ/Ԓ8~fUF8TՈF?#í OƧjj /-Z;3Z-bz_Xw*+{tؐ{>s{XF?( 26sw cE,z`_Z w=oz!`zF?+K g8PA]M•j 8s8ÒB!"絈HUN`:F?+  +(e!LJd{=|ω`S,,(ESXQF?.$& ,>ZҊUt6 JT4y){:D|EvJF?.s MPdOsn%C E9x힖RHc+F?0B q^֠~{Zh/rdgPR^zFp /:?Y7$O>.giF?14 p`("bQ/QWrw2cwzOLq̅f6nEF?2 J `0[1Z<*&޸tQ"U{""1L4ЈF?23 W^E6o+2uLٞ|%&l^&F?3 U\i%H|*k%# &bdH^vmg5.JF_èwoF?9#s E!GiTXI܅{Ih홋X. <l4Cnd{F?;w1 ĕqVC?t]ǫ;͆q2ڈÐq|F?E7 ќg͖&uӼy4bAG/F?Em |;ypB!-vpB ĵ–<@3z;SRkF?F< (8ieHͿz -vz;~~|t6F?G[ 1e\eQaLe%R !dP# 4vPh&^ ʈF?dh& ffqzۃVy K1}.E3w;,¸Qom@:;oF?dh:  KfWmvZBt75yF?dhQ Nֳ_%K#40Et렡T5/OZnF?lY 8Ʌ.'D %kgi(PzB8b`YF?lb2 ]I4rb3\6VsFYj!Il@ EM\F?f ƳL ͘G+n[Ct(a9Uvx>B u/F?%P `zʅ0x-[򡦄0H+Zy\! j>9h9zO0F? |7(#a T!pN.)C, .r:i m"FSF?̴T Q_o$;W$K򉥨am~@DDϨ'9F@8L 2z"B/r6d q<^sxK_03{Ks ڱ;9I SIZ}\ ZgGɸ_F@A * mՙ^tX7,A&J$]ڢF9v?F/<0GF@SC  .9Kp<# "έ GSx+KG\=kw1F@T/z ˊd'=>\Lֲ`;Gɤt=2*9F@T?F n&xq.^$Mg"#%"YJRrF@hHH *XΪRipjHթ<I` |ȱe;즚5HF@w2 >m'ˌ! , DW6oepWY)ȈF@x  '6Mx9R#JJr(wVNe+C)hF@ BC],\ѶC L%P]ޠ5,Jj3붒PF@< чKC_AAiHgAH +ux'+~5kqF@# KVm,&(RˢFY(MOY`1:nwj*>boX/& k9t^1c mF@Y Eȶd H%E㞻Jgt>Fy- ͑YF@ c tfVyoUVt)q TJNs]Y !^*5.zF@ "{pUJk!< `P =gP1rE#T:DƂtI#Z8̷clF@ 2$@W/quiТwYa@e/iUܶh+lF@@ (ޮ).ZaAyzp@OPDR >]ޠ/A gF@y =-uSB=6Vܓyϰ$Qvl8bH.F@+ =-K\0=Jt yyM1㍏ΎHuF@– s4ԞsWϹ/4s;Iq҃dH./F@< K[CgqzcA9m\Ft!s`2hiH@ hP轗wpF@þd  -X:6O/A,vp>'A4{-]o~8LF@Q'  {W5^(t^6yQ!IalkԜRyC!&F@T ^,y:HM75Y;QJ&+kVL̎$vF@w V*lK.5J [)Y%`%0 u$WꯄY@pKF@ծ  [HocMoŌqr\HnT a| oL0GF@^ ?,s%LNy)-2/Lp/!b㫿;huA|F@ɧ q`-VlP|4'p' FgךH BAҶhVDF@q H&4w<=D[9fgPZ)k+&4А@F@˓ g zϣuE+ӉqU,+]? ,F@̍ 3ʶM\#0w0*ZZjK`F@ 5afE!Iz#{kUlXR;T "F@Љ %: eB76nia=͉Tol.vY I@>i[oF@i N qNsYnC,c6޹y,';n=d녱F@? !OhAQ_tJ]^Yfjۛ>Ce!s %kȓ/3v䲘F@w} !,ʧn\D<et fߐ3l qCF@w QU \ +=;Ҁt|V;4w;~I7q2%(e)1N˟F@H gJtؕ0̢E6_X͝ȵ>^= FA# xR֍ILubCAjƋs2I\ {ZA4>5;FB"3 ع,OqFHaop^qCquV quc8|;39 ϩ1FB# %pM#+s_-30= 2MN`w:1ňFB# m?y6|ff6@]ͷ2Mcح_Fl0FB#$ .e1#%.0[@ܝ`U0y+U8FB#V D|2O#̇<,cSS%?g>y#(B DFB#J 9MőAyA: | 5C }aRW sFB#- lZX]A3 I e'PRWM@DɢFB# lZ/*WEV6UTg:4-[PƩO߳q))%M ݣΈM?lYFhttp://www.trash.net/~thomasb/crypto/keysigning/keysigning.ver1.0.txt yZ`j r4)\:BBY*w+w1=fqM?lYFhttp://www.trash.net/~thomasb/crypto/keysigning/keysigning.ver1.0.txt yvuحD"@> +{6ٴ(gIf6{~|®Ĉ[N?Ghttp://www.mathematik.uni-bielefeld.de/~mmutz/sign-policy-2003-07.html ޅ8.63W_ZOr gf/Ú.Tư|'?G(dElǽ 3(i%]̠?]t#ǒ}~+%(} PT/͵ os LOnGZk9 c_y wݧ ?ұcvcNj}^O>}uQDE{˦3ooA /OpPI[3Fbz&\es< H )tH/rr47X5y66{mRU31bҴjscQ\.з(^PN/P2/ x-D:$i!Dz .O:0RX%$@2VA QfB]id*] y#0&Vꄳ5`dekWhqAMmFu,LS^z瑽^? mA] PEHO/m?*]q2 0PAOZM.S[^9N#3cK48FQԞ֒C[Wm8X9Ԝ}vX#vJh C dfpiN3jbH85` < ?"!K]4l8آPueٛ!& Aj̳L_ r6I@r+6ik0] Rk>V#7.5<@U,أrC^ Sy=A Ddb}h\ ُ53^ۀʆ?{<6Ŝ:@x F!-H+uM![L&XF"&ֳ,o| 66,()Fq&A+q- Ov iag2f)t "MZ-5 Anw1fl0RKV6CEC5 E]Ӌ,>ߋǃ di0 ! ,qM'9"Q٥$ bp<,${m`(]ZӑD~b }鯚mU;erUIm{fժ9t9;K4@KHa!{!D?߾DX̷ByD4=q0DzʂiTɄ̅"j? 4KRPbGyZ㌄ ]Hܿ%?4,k; >`ՖJ~9b ْ1Ձȱ_no?+v £]J$:)(m,ydysqaԎ{P(i84'xnh#FU4Eb%1m%8'VahDXNBh ;YM%02yb)TU>3X:4J v=Gm!9oC*FfZL ;޸U`?csignature-notes@penguin.de"http://www.penguin.de/~bb/contact/pgp/signings/notes.586377100EB11C2DAD7E1B3EE74D29B82BE16D01.asc"3http://www.penguin.de/~bb/contact/pgp/policy/v1.1/ K`FukAEѿ b?WGRsߞ <О>T V 52`VhgG

    :ͥD=וSH% D3Eu^*8V5tCIg =υ+| kS\ C33][G_\o[L$JAlrsi5?J  rNEg?ָTCm<Ы7Ȇ@nDU#.^բՃ 3Arfc93SzSٛie94Tf=yX;_oNz :VC͎Yhrkn_ldZ~=#Krr'cC'&5+#S @裣 :2ҢTҍ5AW;S ;$<ŌBjj|7PC [MC*ky7rp/s8~иT1H_' W^8*s:4E%r_oj|N&Ul\yuw酲=s1b;X@8:|mHXZv9@26(kJL8M~x|n{ c)BZa@z Z,)\f}g*NQ79Ps[h`? @@ #uD2w:֩24pm~ ua*{+ki[vTea|/wkH6 l!p{%ƒs0*[f 97R+OX/>a`pkE=}50fz6p=U [dQa(&uF1B©W3\<{rNF*hqV6*?ޕHAcX8t;i f [k1A Iް O%11yi{;t~ YG١ipl^_έtۻI ߃h}֕:snnv)a[j%Z[vp;b esG짂K~) f֭7|dSZ47XcM?lYFhttp://www.trash.net/~thomasb/crypto/keysigning/keysigning.ver1.0.txt |:K]u#7iH3p&[eG2%+0 1n.XjnլҦpl7[!4G%]bNK[Sk/vŕN#A_^z9r1O>O-u@Ud?ucsignature-notes@penguin.de"http://www.penguin.de/~bb/contact/pgp/signings/notes.586377100EB11C2DAD7E1B3EE74D29B82BE16D01.asc"3http://www.penguin.de/~bb/contact/pgp/policy/v1.1/ h 8v9h>$8LCaj5 ;)(!dDA9W[˯`QC$#;eȀ~ /q1 R GHBu6l#? WkA, ä́k&O"^b 7_!= % č۝ jRdSfۧԂIӹ%]CQ'z/x 6EB/ .xDo&S2&KMX&yS|>XMK. c'r**reԧ{@,MFa𶊳#Y=)- CEh\) u?i]ZrGz%}r a.t e΄1wcEՎNqdLK:?lUs[84,f[\g\nE0dH_b{2}2j.YǨ+.BYĕpKY|Jf;8(܁Bk΢V?EGqF8O?s,( a5t1 Ojyٸt>ݤ.?2Ղ7PY0ݽ7*l\"툡f;U]#,Me?m 2ּF ž0EIV! F>ld`E3+x$@)glq/*-#Su/R@[p\Oއ|D1$`VHB$ ?%92[He"5(k'@Ǐs\x&ɉf5cufYY!-]X@莍xV6$ $Vc0+PܢIom zlQ9 VssOn B84ydSG?|kst,q'y& |wo9t5+ǃ<X wa83ѻqY*,j|X|=Q<* dl?n}"J$Up[=KJ$( qSb.:Y~+ /2"R2HW-m;Ii%P_LpCҾu߆wI$p`K:M](8E֭C6 o6Mv4A)VhS:6_م}x9!<[ 7z\i?6ɟ#Sd:JofKLe v#*l69NEP%g]v.DO)g jÔaUUU}խDZp@BkYtNԎ<VS:7>Hud.rjQ[3?j@J aS`{FwQVlÃ>[w$U "-.va( nPoM6?ӉNx&s*W3͜>7hϞ+Ax]} @ep  Cz#Qp.jTH@EG[cdE@)x߫f#)*v{!ͺxn(`f7<CNMt'g^4Cx}3(aQ̆wRh.ZI@^EH|AUp@V>ppb}pGԧ;`RV7;8Q} v`CrJzz8AyO򠸯?Xip٭4|u 7UaM@XPRZ7J؄dͭ;~Щ:0kQ;:T7~`Jܹ(3nM)CU%~Y^7CS|,Oyii4ѤmS}lsǁ%*}89}+I.`ms<=t"d龯@sy.rC9Qьx8d &R;-x ebԉi[X0 On}#^zf(uɏZ#˒ԞgZ{?|}+ ˏܱ)7(:Q4C wu pjeOH'.(ORx cGNn(=t~jDZ,\$0,]5,ނX4%.† ˳4@/I,m 9 FKfiTĔTџ<' GbR LDGI 6f͏G;&N^<a0y)$k^ɻݼ IwTy`+K|%ٖ}./&]8E"<%jv%ȻwN꬙ߗGK )ϒYJJa"tuw?#4`h)PVs5U\v!J&lmI  VC4󠮀kcnT~mW3W%O:`X~8%d\ٺ§'openpgp-0.4/tests/data/000027-006.public_key0000644000000000000000000000064512007770504016400 0ustar0000000000000000Ow3!$}9 W̳us<,?#/ `N["cgU[In?60tw&U8j,K|7[Cb|p6.oaV1aS"oՍ)6W.=='%WgDڤDAmiԚr8h>$B/'tMZ ַk(Txg^;?Q#׻HD?HgQW-i|rKHA B,GO>G9ٓfp',6n?טYT/ ?XvT:`p/y){0ϜFw7νyV_3v }yNi[͙\zC?9A$Yopenpgp-0.4/tests/data/000058-002.sig0000644000000000000000000000020212007770504015021 0ustar0000000000000000(Ow    ^#A2bܯgi\Q$`;! 873?wNj*rK%% Aý~uopenpgp-0.4/tests/data/000053-012.ring_trust0000644000000000000000000000000412007770504016433 0ustar0000000000000000openpgp-0.4/tests/data/000078-012.ring_trust0000644000000000000000000000000412007770504016442 0ustar0000000000000000openpgp-0.4/tests/data/000077-002.sig0000644000000000000000000000024112007770504015025 0ustar0000000000000000 OwJ >hm߰yb)Qx0+G7ld:`c/ ~ڶTG̔Cr=0n~83aQ_zIN\|Sa8e`dqr#dW>}P끩openpgp-0.4/tests/data/000002-013.user_id0000644000000000000000000000004612007770504015666 0ustar0000000000000000$Test Key (RSA) openpgp-0.4/tests/data/000007-002.sig0000644000000000000000000000033412007770504015021 0ustar0000000000000000(Ow$ π   No=8 \-97Ed;|̙j%`9^a M~U3pѰuhxᶱ[WkSfB)C3 %C ]h,x-fɗI Q]-liuCa$`ml5e1Υnopenpgp-0.4/tests/data/000067-002.sig0000644000000000000000000000015212007770504015025 0ustar0000000000000000h(Ow    w2ϘczHm5YDBT!.ADs48$Q9H>jopenpgp-0.4/tests/data/000056-012.ring_trust0000644000000000000000000000000412007770504016436 0ustar0000000000000000openpgp-0.4/tests/data/000013-014.public_subkey0000644000000000000000000000025312007770504017077 0ustar0000000000000000Ow$ພo# \X" l9Nv`x]pBA hzSX[s'S4~#{T V`;~ 'o]3U.-Psڮ>S}%Nbx%9mˣ^l":C*=openpgp-0.4/tests/data/000017-002.sig0000644000000000000000000000017312007770504015023 0ustar0000000000000000y!OwJ  /Z\þw2Ϙc ^#A2b& bta=0)Ҷ?9pɼRORͤ[L]ڳ,}pcï-`+LѰopenpgp-0.4/tests/data/000018-012.ring_trust0000644000000000000000000000000412007770504016434 0ustar0000000000000000openpgp-0.4/tests/data/000033-002.sig0000644000000000000000000000014012007770504015013 0ustar0000000000000000^OwHT ^#A2b0$LM ɑ(;濂X/t+2f]9"W=O!}co*(:Uopenpgp-0.4/tests/data/000025-002.sig0000644000000000000000000000015112007770504015016 0ustar0000000000000000gOw   ^#A2b)$[OX`J`6\I[o?u<wGkt˨\A]gM^"߶/Hopenpgp-0.4/tests/data/000054-005.secret_key0000644000000000000000000000237312007770504016406 0ustar0000000000000000Ow m] yayT*p}GLE!SH)䃉4ŷQ,lŖF!b 4ދj;R  4<ްoz})Q6\R2y俓ܣ%}U|n;[ m @t9N\ߊW 4d*\ #KP E6)R߶l#0ӚBD`^.{{m#}gGV+ 6!b7Fa'Y J-`L4cWM9[E}U+0'3/HKfxpΞ{E*DQ:j oB&mK&_ S2B_"#0NEuFrV5m`sm렖}X4/H R-;548[,_zk\6"WLR ׁ*PieK6d*e5ͰF2HƩm&ވ0MO3e*5<*hp;gv-SIJZ8xRaZܗQDY,css9AO5 `]BQayl9J r t7sKamK . eDH Dqœ;B=zDky[dwz-ůnga5uTjgat̑LL]gׁ`vE%nOqaWqrn!`i}lw!B&{b]+GQ openpgp-0.4/tests/data/000055-002.sig0000644000000000000000000000017312007770504015025 0ustar0000000000000000y!OwJ  /Z\þw2Ϙc ^#A2b& bta=0)Ҷ?9pɼRORͤ[L]ڳ,}pcï-`+LѰopenpgp-0.4/tests/data/000043-012.ring_trust0000644000000000000000000000000412007770504016432 0ustar0000000000000000openpgp-0.4/tests/data/000061-002.sig0000644000000000000000000000015012007770504015015 0ustar0000000000000000fOw   ^#A2b)$ ::y!cƋI3b;@{S?bSZV9ިPMopenpgp-0.4/tests/data/000044-014.public_subkey0000644000000000000000000000042012007770504017077 0ustar0000000000000000 OwJGgC!_ZGk렂=KsxH-!*nLvXFw|#W,l;qfO^>3(@ 8openpgp-0.4/tests/data/000022-002.sig0000644000000000000000000000027212007770504015017 0ustar0000000000000000OwH4 NowMy/]GYjZU8{Sc!Q'VJ""[zT|ĽX]`qdD+Ւ !BwR'+iDm@ $B/'tMZ ַk(Txg^;?Q#׻HD?HgQW-i|rKHA B,GO>G9ٓfp',6n?טYT/ ?XvT:`p/y){0ϜFw7νyV_3v }yNi[͙\zC?9A$YZ".ܵh``(S -lNwF5B`l m)openpgp-0.4/tests/data/000039-002.sig0000644000000000000000000000011012007770504015016 0ustar0000000000000000FOwHe w2Ϙc ?aKZopenpgp-0.4/tests/data/000071-002.sig0000644000000000000000000000030012007770504015013 0ustar0000000000000000(Ow! hmAD&5Ԝjmg^y]bnKA;x˲BT[DwQ%2rwEB b;ʴYopenpgp-0.4/tests/data/000042-002.sig0000644000000000000000000000030012007770504015011 0ustar0000000000000000(OwL hmdi!Սyǜ+d1A(}=M4 BvSu [TXq, %f8o; m *At'|Fg0]%]%yޡ UVC~d:+5 uopenpgp-0.4/tests/data/000072-012.ring_trust0000644000000000000000000000000412007770504016434 0ustar0000000000000000openpgp-0.4/tests/data/uncompressed-ops-rsa.gpg0000644000000000000000000000035412007770504020062 0ustar0000000000000000 >hm=buncompressed-ops.txtOz4Uncompressed one-pass sig message. Oz4 >hmu2X;DwHsP|(E\D\h]AIK FSxl o[(,s+g&T KX~.EbQ;Y"8E9Z!`_x?MMopenpgp-0.4/tests/data/secring.gpg0000644000000000000000000002216112007770504015423 0ustar0000000000000000_Ow$G4r㪼v#X5[r 6TlS) >꬙ߗGK )ϒYJJa"tuw?#4`h)PVs5U\v!J&lmI  VC4󠮀kcnT~mW3W%O:`X~8%d\ٺ§'$Test Key (RSA) (Ow$ π   No=8 \-97Ed;|̙j%`9^a M~U3pѰuhxᶱ[WkSfB)C3 %C ]h,x-fɗI Q]-liuCa$`ml5e1Υn`Ow$ພo# \X" l9Nv`x]pBA hzSX[s'S4~#{T V`;~ 'o]3U.-Psڮ>S}%Nbx%9mˣ^l":C*=emGM`A]Q$VamQX&nySRw!+ˑk^IW!4HX`5yKh4nQ?ՙthSM]$f/\Ts,FJwJ^Il2k0!xU;/̶̪a}>F7AL}ΚtP6n|iqq«VWzjkv-iV $=d/B9KʋTp%a *' : r$4* @OM2Whu}Va v< YG="ӱRf Q/swn 7 ưUl4ߕ,jLv)DÎyhl4YOw$  π No9R \R^mNʖlysQ%x=ӿbG"lf!%F*w͎gL#!^_ql5qWe/< 0k)sL34ʺmEy$éH#TP.f\w=j4akOw m] yayT*p}GLE!SH)䃉4ŷQ,lŖF!b 4ދj;R  4<ްoz})Q6\R2y俓ܣ%}U|n;[ m @t9N\ߊW 4d*\ #KP E6)R߶l#0ӚBD`^.{{m#}gGV+ 6!b7Fa'Y J-`L4cWM9[E}U+0'3/HKfxpΞ{E*DQ:j oB&mK&_ S2B_"#0NEuFrV5m`sm렖}X4/H R-;548[,_zk\6"WLR ׁ*PieK6d*e5ͰF2HƩm&ވ0MO3e*5<*hp;gv-SIJZ8xRaZܗQDY,css9AO5 `]BQayl9J r t7sKamK . eDH Dqœ;B=zDky[dwz-ůnga5uTjgat̑LL]gׁ`vE%nOqaWqrn!`i}lw!B&{b]+GQ y!OwJ  /Z\þw2Ϙc ^#A2b& bta=0)Ҷ?9pɼRORͤ[L]ڳ,}pcï-`+LѰ$Test Key (DSA) (Ow    ^#A2bܯgi\Q$`;! 873?wNj*rK%% Aý~uOw @7la Ua?a`K䠳q{Ü@H2{'2i0  D+=6h8k]NmY\}]X+%T|T̠ =%VubD;^`钘/hĢfFj㬒vA$_,G]aNz5ͽ w?

    (ǘQصf.^3mw8P*}(Qwrdx')mqVP2g wa mG >\$B6C;i^4Rgׁ`A0ʭerT$fJ{y!TM{2XIסtWaʞ+fOw   ^#A2b)$ ::y!cƋI3b;@{S?bSZV9ިPMOw3!$}9 W̳us<,?#/ `N["cgU[In?60tw&U8j,K|7[Cb|p6.oaV1aS"oՍ)6W.=='%WgDڤDAmiԚr8h>$B/'tMZ ַk(Txg^;?Q#׻HD?HgQW-i|rKHA B,GO>G9ٓfp',6n?טYT/ ?XvT:`p/y){0ϜFw7νyV_3v }yNi[͙\zC?9A$YZ".ܵh``(S -lNwF5B`l m)a!OwJ y3EY >hm w2ϘcnA_-]joyp&e2r ؠXŰ+Test Key (DSA sign-only) h(Ow    w2ϘczHm5YDBT!.ADs48$Q9H>jOw!ž%Jo_-0=!t֤70#M\d&KnHyI Qm PG;RLjF!"N$9t98wvW"I%/̈LNСz Ny  WA/`++oXbN,9KpPwR,l&p<ǻ\n>+;I Sl Xr Ju#ʶK&Λ_o7HBߙAzHkWp`4dl LJ"`H.lۏ'O4]4,X3܉O'q)u]hhHi'KI>1/L,ڀT R6Z7VA,,&|yrXh,@@D:7k=0sD2އFcOq~8gU;[U 4AT}G J6>?9by$(A\vծ:Qe`0*(ƴ.Test Key (RSA sign-only) (Ow! hmAD&5Ԝjmg^y]bnKA;x˲BT[DwQ%2rwEB b;ʴY;n@%̓fZ~qᏦ8ۋjxUB*__N~v׏qk#ĸ*:` `†?'FJt)n:StƢ5Nllj::^61 6NB |]\Idg=TD@VTDŽ?S֤~O?Z{tf¢uU9uRąCH 9A̭ă_]N)0Tuڞ\_Z|Q_O>t|Tp7 ۏq@ L_mMQCQb_$$((`_Up Taohqe3d"kH& LVO"=7*R(q7JJ!q{yE+"1Rf#ĥK JE@Mԑs:\>;QZېs 6= 28`zޭXRxY;w$$-Lş6KITAQFʧ5=4 (6{ e]`"YmXqu4rj2\YFJB tB6ꞡjrTit0BUtsȹ~;v;^qRQ5->o!IH! M4vn f"d\\SfJB/S/$=RA~ܲfiuErYtw!@ ˂>NU{pVQUee R%7Zl1㟞*liuovo|c{["*QrߓC@1'ZA~mf˶<'pL؋p$Hh* %@$ň#j۲UD6ֶ$$n4hګ VTs@39yF5YN!Ч\[FuqtVorF~Q1LhS.ڊMqt ?sFoUS$3tupѧSȆE- 6ZĤ8LzjQ,_B]BIQDs4hMLOs3>d3kpS(?71<\S~8ԾNKTw@āv-NcP'S ̑][`T \ƦKOҢTT\((*$H!FXm'2` G)&cW4aKMqlE3ٲ( uАQL\Jo_~ +­Dx:sTj_و(OwL hmdi!Սyǜ+d1A(}=M4 BvSu [TXq, %f8o; m *At'|Fg0]%]%yޡ UVC~d:+5 uOwJGgC!_ZGk렂=KsxH-!*nLvXFw|#W,l;qfO^>3(@ 8A ̇کv4'gb2R!e.}񀙱ltM?E-]5ds1\Z7_MեZC)'MB4gȇIİLJ3JX< |4NW~AG}5[BaCrj/"͒u6 t=pjZ}Eh2:ZN<NcIVPDaP6Sd ׶P(sQ+'Jy!ڿ`{? bh5׽ OaD\2Vޖtr#'dWB_'<{ O,L , hd(&%/{3F){٬m5_YStuCCb̐ OwJ >hm߰yb)Qx0+G7ld:`c/ ~ڶTG̔Cr=0n~83aQ_zIN\|Sa8e`dqr#dW>}P끩L(qWj '\ Z#u8QM1GT(vR92 K@R5AGM;  * @ǤPvS7;"ԡ"(y,XUo]kl]B>[3Ԃ+zGVIt.(ԓ(T$0,_R[2>c)&B'|^W`YcΪؑLM\1%W~a0TxlQ2RTEST ONLY !L(q    a9S)2nY5ЇզTtSHͺH#Fzok}CA;n@%̓fZ~qᏦ8ۋjxUB*__N~v׏qk#ĸ*:` `†?'FJt)n:StƢ5Nllj::^61 6NB |]\Idg=TD@VTDŽ?S֤~O?Z{tf¢uU9uRąCH 9A̭ă_]N)0Tuڞ\_Z|Q_O>t|Tp7 ۏq@ L_mMQCQb_$$((`_Up Taohqe3d"kH& LVO"=7*R(q7JJ!q{yE+"1Rf#ĥK JE@Mԑs:\>;QZېs 6= 28`zޭXRxY;w$$-Lş6KITAQFʧ5=4 (6{ e]`"YmXqu4rj2\YFJB tB6ꞡjrTit0BUtsȹ~;v;^qRQ5->o!IH! M4vn f"d\\SfJB/S/$=RA~ܲfiuErYtw!@ ˂>NU{pVQUee R%7Zl1㟞*liuovo|c{["*QrߓC@1'ZA~mf˶<'pL؋p$Hh* %@$ň#j۲UD6ֶ$$n4hګ VTs@39yF5YN!Ч\[FuqtVorF~Q1LhS.ڊMqt ?sFoUS$3tupѧSȆE- 6ZĤ8LzjQ,_B]BIQDs4hMLOs3>d3kpS(?71<\S~8ԾNKTw@āv-NcP'S ̑][`T \ƦKOҢTT\((*$H!FXm'2` G)&cW4aKMqlE3ٲ( uАQL\Jo_~ +­Dx:sTj_openpgp-0.4/tests/data/000009-002.sig0000644000000000000000000000023612007770504015024 0ustar0000000000000000OwHw >hm´#pBjH t_%*Y/V;k.Yy7%;z(Pvn*_7JD+&*,il)c Y3n]U}aD|"[N#aopenpgp-0.4/tests/data/000048-013.user_id0000644000000000000000000000004612007770504015700 0ustar0000000000000000$Test Key (RSA) openpgp-0.4/tests/data/uncompressed-ops-dsa.gpg0000644000000000000000000000022612007770504020042 0ustar0000000000000000 w2Ϙc=buncompressed-ops.txtOz4}Uncompressed one-pass sig message. FOz4} w2Ϙc$hk-A^jYΔ0+ #1ѽ^Qmz6!$W+6+TQeL[3Gl/openpgp-0.4/tests/data/000006-012.ring_trust0000644000000000000000000000000412007770504016431 0ustar0000000000000000