summaryrefslogtreecommitdiff
path: root/Codec
diff options
context:
space:
mode:
authorClint Adams <clint@debian.org>2012-04-25 19:10:27 -0400
committerClint Adams <clint@debian.org>2012-04-25 19:10:27 -0400
commitf06c3f713f99c9ea09a76728ffce2c6e1c957070 (patch)
tree647c5c500b0713ff73533988944eef3bb4ca1bf8 /Codec
parent5ed645493e10190f7cddd753bb058e8487037549 (diff)
Handle decoding multiple ASCII armor messages from a single bytestream.
Diffstat (limited to 'Codec')
-rw-r--r--Codec/Encryption/OpenPGP/ASCIIArmor.hs4
-rw-r--r--Codec/Encryption/OpenPGP/ASCIIArmor/Decode.hs26
2 files changed, 19 insertions, 11 deletions
diff --git a/Codec/Encryption/OpenPGP/ASCIIArmor.hs b/Codec/Encryption/OpenPGP/ASCIIArmor.hs
index 74c8c69..075a481 100644
--- a/Codec/Encryption/OpenPGP/ASCIIArmor.hs
+++ b/Codec/Encryption/OpenPGP/ASCIIArmor.hs
@@ -5,9 +5,9 @@
5 5
6module Codec.Encryption.OpenPGP.ASCIIArmor ( 6module Codec.Encryption.OpenPGP.ASCIIArmor (
7 armor 7 armor
8 , decodeArmor 8 , decode
9 , parseArmor 9 , parseArmor
10) where 10) where
11 11
12import Codec.Encryption.OpenPGP.ASCIIArmor.Encode (armor) 12import Codec.Encryption.OpenPGP.ASCIIArmor.Encode (armor)
13import Codec.Encryption.OpenPGP.ASCIIArmor.Decode (decodeArmor, parseArmor) 13import Codec.Encryption.OpenPGP.ASCIIArmor.Decode (decode, parseArmor)
diff --git a/Codec/Encryption/OpenPGP/ASCIIArmor/Decode.hs b/Codec/Encryption/OpenPGP/ASCIIArmor/Decode.hs
index 8c2a8a3..e69087c 100644
--- a/Codec/Encryption/OpenPGP/ASCIIArmor/Decode.hs
+++ b/Codec/Encryption/OpenPGP/ASCIIArmor/Decode.hs
@@ -6,13 +6,14 @@
6 6
7module Codec.Encryption.OpenPGP.ASCIIArmor.Decode ( 7module Codec.Encryption.OpenPGP.ASCIIArmor.Decode (
8 parseArmor 8 parseArmor
9 , decodeArmor 9 , decode
10) where 10) where
11 11
12import Codec.Encryption.OpenPGP.ASCIIArmor.Types 12import Codec.Encryption.OpenPGP.ASCIIArmor.Types
13import Control.Applicative (many, (<|>), (<$>)) 13import Control.Applicative (many, (<|>), (<$>), Alternative, (*>))
14import Data.Attoparsec.ByteString (Parser, many1, string, inClass, notInClass, satisfy, word8, (<?>), parse, IResult(..)) 14import Data.Attoparsec.ByteString (Parser, many1, string, inClass, notInClass, satisfy, word8, (<?>), parse, IResult(..))
15import Data.Attoparsec.ByteString.Char8 (isDigit_w8) 15import Data.Attoparsec.ByteString.Char8 (isDigit_w8, anyChar)
16import Data.Attoparsec.Combinator (manyTill)
16import Data.Bits (shiftL) 17import Data.Bits (shiftL)
17import Data.ByteString (ByteString) 18import Data.ByteString (ByteString)
18import qualified Data.ByteString as B 19import qualified Data.ByteString as B
@@ -25,15 +26,19 @@ import Data.Serialize.Put (runPut, putWord32be)
25import Data.String (IsString, fromString) 26import Data.String (IsString, fromString)
26import Data.Word (Word32) 27import Data.Word (Word32)
27 28
28decodeArmor :: (Integral a, Read a, Show a, IsString e) => ByteString -> Either e (Armor a) 29decode :: (Integral a, Read a, Show a, IsString e) => ByteString -> Either e ([Armor a])
29decodeArmor bs = case parse parseArmor bs of 30decode bs = go (parse parseArmors bs)
30 Fail t c e -> Left (fromString e) 31 where
31 Partial _ -> Left (fromString "what") 32 go (Fail t c e) = Left (fromString e)
32 Done _ r -> Right r 33 go (Partial cont) = go (cont B.empty)
34 go (Done _ r) = Right r
35
36parseArmors :: (Integral a, Read a, Show a) => Parser ([Armor a])
37parseArmors = many parseArmor
33 38
34parseArmor :: (Integral a, Read a, Show a) => Parser (Armor a) 39parseArmor :: (Integral a, Read a, Show a) => Parser (Armor a)
35parseArmor = do 40parseArmor = do
36 atype <- beginLine <?> "begin line" 41 atype <- prefixed beginLine <?> "begin line"
37 headers <- armorHeaders <?> "headers" 42 headers <- armorHeaders <?> "headers"
38 blankishLine <?> "blank line" 43 blankishLine <?> "blank line"
39 payload <- base64Data <?> "base64 data" 44 payload <- base64Data <?> "base64 data"
@@ -126,3 +131,6 @@ d24 = do
126 b <- getWord8 131 b <- getWord8
127 c <- getWord8 132 c <- getWord8
128 return $ shiftL (fromIntegral a :: Word32) 16 + shiftL (fromIntegral b :: Word32) 8 + (fromIntegral c :: Word32) 133 return $ shiftL (fromIntegral a :: Word32) 16 + shiftL (fromIntegral b :: Word32) 8 + (fromIntegral c :: Word32)
134
135prefixed :: Parser a -> Parser a
136prefixed end = end <|> anyChar *> prefixed end