asn1-data 0.4.6 → 0.5.0
raw patch · 8 files changed
+56/−54 lines, 8 filesdep ~enumeratorPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: enumerator
API changes (from Hackage documentation)
- Data.ASN1.BER: BMPString :: Text -> ASN1
+ Data.ASN1.BER: BMPString :: String -> ASN1
- Data.ASN1.BER: IA5String :: Text -> ASN1
+ Data.ASN1.BER: IA5String :: String -> ASN1
- Data.ASN1.BER: PrintableString :: Text -> ASN1
+ Data.ASN1.BER: PrintableString :: String -> ASN1
- Data.ASN1.BER: T61String :: Text -> ASN1
+ Data.ASN1.BER: T61String :: String -> ASN1
- Data.ASN1.BER: UTF8String :: Text -> ASN1
+ Data.ASN1.BER: UTF8String :: String -> ASN1
- Data.ASN1.BER: UniversalString :: Text -> ASN1
+ Data.ASN1.BER: UniversalString :: String -> ASN1
- Data.ASN1.CER: BMPString :: Text -> ASN1
+ Data.ASN1.CER: BMPString :: String -> ASN1
- Data.ASN1.CER: IA5String :: Text -> ASN1
+ Data.ASN1.CER: IA5String :: String -> ASN1
- Data.ASN1.CER: PrintableString :: Text -> ASN1
+ Data.ASN1.CER: PrintableString :: String -> ASN1
- Data.ASN1.CER: T61String :: Text -> ASN1
+ Data.ASN1.CER: T61String :: String -> ASN1
- Data.ASN1.CER: UTF8String :: Text -> ASN1
+ Data.ASN1.CER: UTF8String :: String -> ASN1
- Data.ASN1.CER: UniversalString :: Text -> ASN1
+ Data.ASN1.CER: UniversalString :: String -> ASN1
- Data.ASN1.DER: BMPString :: Text -> ASN1
+ Data.ASN1.DER: BMPString :: String -> ASN1
- Data.ASN1.DER: IA5String :: Text -> ASN1
+ Data.ASN1.DER: IA5String :: String -> ASN1
- Data.ASN1.DER: PrintableString :: Text -> ASN1
+ Data.ASN1.DER: PrintableString :: String -> ASN1
- Data.ASN1.DER: T61String :: Text -> ASN1
+ Data.ASN1.DER: T61String :: String -> ASN1
- Data.ASN1.DER: UTF8String :: Text -> ASN1
+ Data.ASN1.DER: UTF8String :: String -> ASN1
- Data.ASN1.DER: UniversalString :: Text -> ASN1
+ Data.ASN1.DER: UniversalString :: String -> ASN1
- Data.ASN1.Stream: BMPString :: Text -> ASN1
+ Data.ASN1.Stream: BMPString :: String -> ASN1
- Data.ASN1.Stream: IA5String :: Text -> ASN1
+ Data.ASN1.Stream: IA5String :: String -> ASN1
- Data.ASN1.Stream: PrintableString :: Text -> ASN1
+ Data.ASN1.Stream: PrintableString :: String -> ASN1
- Data.ASN1.Stream: T61String :: Text -> ASN1
+ Data.ASN1.Stream: T61String :: String -> ASN1
- Data.ASN1.Stream: UTF8String :: Text -> ASN1
+ Data.ASN1.Stream: UTF8String :: String -> ASN1
- Data.ASN1.Stream: UniversalString :: Text -> ASN1
+ Data.ASN1.Stream: UniversalString :: String -> ASN1
- Data.ASN1.Types: BMPString :: Text -> ASN1t
+ Data.ASN1.Types: BMPString :: String -> ASN1t
- Data.ASN1.Types: IA5String :: Text -> ASN1t
+ Data.ASN1.Types: IA5String :: String -> ASN1t
- Data.ASN1.Types: PrintableString :: Text -> ASN1t
+ Data.ASN1.Types: PrintableString :: String -> ASN1t
- Data.ASN1.Types: T61String :: Text -> ASN1t
+ Data.ASN1.Types: T61String :: String -> ASN1t
- Data.ASN1.Types: UTF8String :: Text -> ASN1t
+ Data.ASN1.Types: UTF8String :: String -> ASN1t
- Data.ASN1.Types: UniversalString :: Text -> ASN1t
+ Data.ASN1.Types: UniversalString :: String -> ASN1t
Files
- Data/ASN1/BER.hs +12/−11
- Data/ASN1/DER.hs +9/−8
- Data/ASN1/Prim.hs +12/−12
- Data/ASN1/Raw.hs +4/−3
- Data/ASN1/Stream.hs +6/−7
- Data/ASN1/Types.hs +6/−7
- Tests.hs +5/−4
- asn1-data.cabal +2/−2
Data/ASN1/BER.hs view
@@ -57,9 +57,10 @@ import qualified Data.ByteString.Lazy as L import Data.ByteString (ByteString) -import Data.Enumerator.IO+import Data.Enumerator.Binary (enumFile) import Data.Enumerator (Iteratee(..), Enumeratee, ($$), (>>==)) import qualified Data.Enumerator as E+import qualified Data.Enumerator.List as EL decodeConstruction :: ASN1Header -> ASN1ConstructionType decodeConstruction (ASN1Header Universal 0x10 _ _) = Sequence@@ -72,7 +73,7 @@ enumReadRawRepr = E.checkDone $ \k -> k (E.Chunks []) >>== loop [] where loop l = E.checkDone $ go l- go l k = E.head >>= \x -> case x of+ go l k = EL.head >>= \x -> case x of Nothing -> if l == [] then k (E.Chunks []) >>== return else E.throwError (Raw.ASN1ParsingPartial) Just el -> p l k el @@ -81,7 +82,7 @@ {- on header with construction, we pop the next element in the enumerator and - expect a ConstructionBegin. the list context is prepended by the new construction -}- p l k el@(Raw.Header hdr@(ASN1Header _ _ True _)) = E.head >>= \z -> case z of+ p l k el@(Raw.Header hdr@(ASN1Header _ _ True _)) = EL.head >>= \z -> case z of Just el2@Raw.ConstructionBegin -> let ctype = decodeConstruction hdr in k (E.Chunks [(Start ctype, [el,el2])]) >>== loop ((End ctype,[Raw.ConstructionEnd]) : l)@@ -90,7 +91,7 @@ {- on header with primtive, we pop the next element in the enumerator and - expect a Primitive -}- p l k el@(Raw.Header hdr@(ASN1Header _ _ False _)) = E.head >>= \z -> case z of+ p l k el@(Raw.Header hdr@(ASN1Header _ _ False _)) = EL.head >>= \z -> case z of Just el2@(Raw.Primitive prim) -> let (Right pr) = decodePrimitive hdr prim in k (E.Chunks [(pr, [el,el2])]) >>== loop l@@ -116,7 +117,7 @@ E.checkDone $ \k -> k (E.Chunks []) >>== loop where loop = E.checkDone $ go- go k = E.head >>= \x -> case x of+ go k = EL.head >>= \x -> case x of Nothing -> k (E.Chunks []) >>== return Just n@(Start _) -> consumeTillEnd >>= \y -> k (E.Chunks [(n, y)] ) >>== loop Just p -> k (E.Chunks [(p, [])] ) >>== loop@@ -199,29 +200,29 @@ {-| decode a list of raw ASN1Events into a stream of ASN1 types -} decodeASN1Events :: [Raw.ASN1Event] -> Either ASN1Err [ASN1]-decodeASN1Events evs = wrapASN1Err $ runIdentity (iterateEvents evs E.consume)+decodeASN1Events evs = wrapASN1Err $ runIdentity (iterateEvents evs EL.consume) {-| decode a list of raw ASN1Events into a stream of ASN1Repr types -} decodeASN1EventsRepr :: [Raw.ASN1Event] -> Either ASN1Err [ASN1Repr]-decodeASN1EventsRepr evs = wrapASN1Err $ runIdentity (iterateEventsRepr evs E.consume)+decodeASN1EventsRepr evs = wrapASN1Err $ runIdentity (iterateEventsRepr evs EL.consume) {-| decode a lazy bytestring as an ASN1 stream -} decodeASN1Stream :: L.ByteString -> Either ASN1Err [ASN1]-decodeASN1Stream l = wrapASN1Err $ runIdentity (iterateByteString l E.consume)+decodeASN1Stream l = wrapASN1Err $ runIdentity (iterateByteString l EL.consume) {-| decode a lazy bytestring as an ASN1repr stream -} decodeASN1StreamRepr :: L.ByteString -> Either ASN1Err [ASN1Repr]-decodeASN1StreamRepr l = wrapASN1Err $ runIdentity (iterateByteStringRepr l E.consume)+decodeASN1StreamRepr l = wrapASN1Err $ runIdentity (iterateByteStringRepr l EL.consume) {-| encode an ASN1 Stream as raw ASN1 Events -} encodeASN1Events :: [ASN1] -> Either ASN1Err [Raw.ASN1Event] encodeASN1Events o = wrapASN1Err $ runIdentity run- where run = E.run (E.enumList 8 o $$ E.joinI $ enumWriteRaw $$ E.consume)+ where run = E.run (E.enumList 8 o $$ E.joinI $ enumWriteRaw $$ EL.consume) {-| encode an ASN1 Stream as lazy bytestring -} encodeASN1Stream :: [ASN1] -> Either ASN1Err L.ByteString encodeASN1Stream l = either Left (Right . L.fromChunks) $ wrapASN1Err $ runIdentity run- where run = E.run (E.enumList 1 l $$ E.joinI $ enumWriteBytes $$ E.consume)+ where run = E.run (E.enumList 1 l $$ E.joinI $ enumWriteBytes $$ EL.consume) {-# DEPRECATED decodeASN1s "use stream types with decodeASN1Stream" #-} decodeASN1s :: L.ByteString -> Either ASN1Err [ASN1t]
Data/ASN1/DER.hs view
@@ -61,8 +61,9 @@ import Control.Exception import Data.Enumerator (Iteratee, Enumeratee, ($$), (>>==))-import Data.Enumerator.IO+import Data.Enumerator.Binary (enumFile) import qualified Data.Enumerator as E+import qualified Data.Enumerator.List as EL {- | Check if the length is the minimum possible and it's not indefinite -} checkLength :: ASN1Length -> Maybe ASN1Err@@ -79,7 +80,7 @@ checkRawDER = E.checkDone $ \k -> k (E.Chunks []) >>== loop where loop = E.checkDone go- go k = E.head >>= \x -> case x of+ go k = EL.head >>= \x -> case x of Nothing -> k (E.Chunks []) >>== return Just l -> case tyCheck l of Nothing -> k (E.Chunks [l]) >>== loop@@ -141,29 +142,29 @@ {-| decode a list of raw ASN1Events into a stream of ASN1 types -} decodeASN1Events :: [Raw.ASN1Event] -> Either ASN1Err [ASN1]-decodeASN1Events evs = wrapASN1Err $ runIdentity (iterateEvents evs E.consume)+decodeASN1Events evs = wrapASN1Err $ runIdentity (iterateEvents evs EL.consume) {-| decode a list of raw ASN1Events into a stream of ASN1Repr types -} decodeASN1EventsRepr :: [Raw.ASN1Event] -> Either ASN1Err [ASN1Repr]-decodeASN1EventsRepr evs = wrapASN1Err $ runIdentity (iterateEventsRepr evs E.consume)+decodeASN1EventsRepr evs = wrapASN1Err $ runIdentity (iterateEventsRepr evs EL.consume) {-| decode a lazy bytestring as an ASN1 stream -} decodeASN1Stream :: L.ByteString -> Either ASN1Err [ASN1]-decodeASN1Stream l = wrapASN1Err $ runIdentity (iterateByteString l E.consume)+decodeASN1Stream l = wrapASN1Err $ runIdentity (iterateByteString l EL.consume) {-| decode a lazy bytestring as an ASN1repr stream -} decodeASN1StreamRepr :: L.ByteString -> Either ASN1Err [ASN1Repr]-decodeASN1StreamRepr l = wrapASN1Err $ runIdentity (iterateByteStringRepr l E.consume)+decodeASN1StreamRepr l = wrapASN1Err $ runIdentity (iterateByteStringRepr l EL.consume) {-| encode an ASN1 Stream as raw ASN1 Events -} encodeASN1Events :: [ASN1] -> Either ASN1Err [Raw.ASN1Event] encodeASN1Events o = wrapASN1Err $ runIdentity run- where run = E.run (E.enumList 8 o $$ E.joinI $ enumWriteRaw $$ E.consume)+ where run = E.run (E.enumList 8 o $$ E.joinI $ enumWriteRaw $$ EL.consume) {-| encode an ASN1 Stream as lazy bytestring -} encodeASN1Stream :: [ASN1] -> Either ASN1Err L.ByteString encodeASN1Stream l = either Left (Right . L.fromChunks) $ wrapASN1Err $ runIdentity run- where run = E.run (E.enumList 1 l $$ E.joinI $ enumWriteBytes $$ E.consume)+ where run = E.run (E.enumList 1 l $$ E.joinI $ enumWriteBytes $$ EL.consume) {-# DEPRECATED decodeASN1s "use stream types with decodeASN1Stream" #-} decodeASN1s :: L.ByteString -> Either ASN1Err [ASN1t]
Data/ASN1/Prim.hs view
@@ -125,20 +125,20 @@ encodePrimitiveData (OID oid) = putOID oid encodePrimitiveData (Real _) = B.empty -- not implemented encodePrimitiveData Enumerated = B.empty -- not implemented-encodePrimitiveData (UTF8String b) = putString $ encodeUtf8 b+encodePrimitiveData (UTF8String b) = putString $ encodeUtf8 $ T.pack b encodePrimitiveData (NumericString b) = putString b-encodePrimitiveData (PrintableString b) = putString $ encodeUtf8 b-encodePrimitiveData (T61String b) = putString $ encodeUtf8 b+encodePrimitiveData (PrintableString b) = putString $ encodeUtf8 $ T.pack b+encodePrimitiveData (T61String b) = putString $ encodeUtf8 $ T.pack b encodePrimitiveData (VideoTexString b) = putString b-encodePrimitiveData (IA5String b) = putString $ encodeUtf8 b+encodePrimitiveData (IA5String b) = putString $ encodeUtf8 $ T.pack b encodePrimitiveData (UTCTime t) = putUTCTime t encodePrimitiveData (GeneralizedTime t) = putGeneralizedTime t encodePrimitiveData (GraphicString b) = putString b encodePrimitiveData (VisibleString b) = putString b encodePrimitiveData (GeneralString b) = putString b-encodePrimitiveData (UniversalString b) = putString $ encodeUtf32BE b+encodePrimitiveData (UniversalString b) = putString $ encodeUtf32BE $ T.pack b encodePrimitiveData (CharacterString b) = putString b-encodePrimitiveData (BMPString b) = putString $ encodeUCS2BE b+encodePrimitiveData (BMPString b) = putString $ encodeUCS2BE $ T.pack b encodePrimitiveData (Other _ _ b) = b encodePrimitiveData o = error ("not a primitive " ++ show o) @@ -269,19 +269,19 @@ getNumericString = either Left (Right . NumericString) . getString (\_ -> Nothing) getPrintableString :: ByteString -> Either ASN1Err ASN1-getPrintableString = either Left (Right . PrintableString . decodeASCII) . getString (\_ -> Nothing)+getPrintableString = either Left (Right . PrintableString . T.unpack . decodeASCII) . getString (\_ -> Nothing) getUTF8String :: ByteString -> Either ASN1Err ASN1-getUTF8String = either Left (Right . UTF8String . decodeUtf8) . getString (\_ -> Nothing)+getUTF8String = either Left (Right . UTF8String . T.unpack . decodeUtf8) . getString (\_ -> Nothing) getT61String :: ByteString -> Either ASN1Err ASN1-getT61String = either Left (Right . T61String . decodeASCII) . getString (\_ -> Nothing)+getT61String = either Left (Right . T61String . T.unpack . decodeASCII) . getString (\_ -> Nothing) getVideoTexString :: ByteString -> Either ASN1Err ASN1 getVideoTexString = either Left (Right . VideoTexString) . getString (\_ -> Nothing) getIA5String :: ByteString -> Either ASN1Err ASN1-getIA5String = either Left (Right . IA5String . decodeASCII) . getString (\_ -> Nothing)+getIA5String = either Left (Right . IA5String . T.unpack . decodeASCII) . getString (\_ -> Nothing) getGraphicString :: ByteString -> Either ASN1Err ASN1 getGraphicString = either Left (Right . GraphicString) . getString (\_ -> Nothing)@@ -293,13 +293,13 @@ getGeneralString = either Left (Right . GeneralString) . getString (\_ -> Nothing) getUniversalString :: ByteString -> Either ASN1Err ASN1-getUniversalString = either Left (Right . UniversalString . decodeUtf32BE) . getString (\_ -> Nothing)+getUniversalString = either Left (Right . UniversalString . T.unpack . decodeUtf32BE) . getString (\_ -> Nothing) getCharacterString :: ByteString -> Either ASN1Err ASN1 getCharacterString = either Left (Right . CharacterString) . getString (\_ -> Nothing) getBMPString :: ByteString -> Either ASN1Err ASN1-getBMPString = either Left (Right . BMPString . decodeUCS2BE) . getString (\_ -> Nothing)+getBMPString = either Left (Right . BMPString . T.unpack . decodeUCS2BE) . getString (\_ -> Nothing) getNull :: ByteString -> Either ASN1Err ASN1 getNull s = if B.length s == 0 then Right Null else Left $ ASN1Misc "Null: data length not within bound"
Data/ASN1/Raw.hs view
@@ -31,7 +31,8 @@ import Data.Enumerator hiding (head, length, map) import qualified Data.Enumerator as E-import Data.Enumerator.IO+import qualified Data.Enumerator.List as EL+import Data.Enumerator.Binary (enumFile) import Data.Attoparsec.Enumerator import Data.Attoparsec import qualified Data.Attoparsec as A@@ -262,7 +263,7 @@ where putEoc = putHeader $ ASN1Header Universal 0 False (LenShort 0) loop eocs = checkDone $ go eocs- go eocs k = E.head >>= \x -> case x of+ go eocs k = EL.head >>= \x -> case x of Nothing -> if eocs == [] then k (Chunks []) >>== return else E.throwError ASN1WritingUnexpectedInputEOF Just (Header hdr@(ASN1Header _ _ True len)) ->@@ -276,6 +277,6 @@ False : tl -> k (Chunks []) >>== loop tl toBytes :: [ASN1Event] -> L.ByteString-toBytes evs = case runIdentity (run (enumList 8 evs $$ joinI (enumWriteBytes $$ E.consume))) of+toBytes evs = case runIdentity (run (enumList 8 evs $$ joinI (enumWriteBytes $$ EL.consume))) of Left err -> error $ show err Right l -> L.fromChunks l
Data/ASN1/Stream.hs view
@@ -7,7 +7,6 @@ ) where import Data.ASN1.Raw-import Data.Text.Lazy (Text) import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as L @@ -26,20 +25,20 @@ | OID [Integer] | Real Double | Enumerated- | UTF8String Text+ | UTF8String String | NumericString L.ByteString- | PrintableString Text- | T61String Text+ | PrintableString String+ | T61String String | VideoTexString L.ByteString- | IA5String Text+ | IA5String String | UTCTime (Int, Int, Int, Int, Int, Int, Bool) | GeneralizedTime (Int, Int, Int, Int, Int, Int, Bool) | GraphicString L.ByteString | VisibleString L.ByteString | GeneralString L.ByteString- | UniversalString Text+ | UniversalString String | CharacterString L.ByteString- | BMPString Text+ | BMPString String | Other ASN1Class ASN1Tag ByteString | Start ASN1ConstructionType | End ASN1ConstructionType
Data/ASN1/Types.hs view
@@ -7,7 +7,6 @@ import qualified Data.ASN1.Stream as S import qualified Data.ByteString.Lazy as L import Data.ByteString (ByteString)-import Data.Text.Lazy (Text) import Data.ASN1.Raw (ASN1Class, ASN1Tag) data ASN1t =@@ -19,20 +18,20 @@ | OID [Integer] | Real Double | Enumerated- | UTF8String Text+ | UTF8String String | NumericString L.ByteString- | PrintableString Text- | T61String Text+ | PrintableString String+ | T61String String | VideoTexString L.ByteString- | IA5String Text+ | IA5String String | UTCTime (Int, Int, Int, Int, Int, Int, Bool) | GeneralizedTime (Int, Int, Int, Int, Int, Int, Bool) | GraphicString L.ByteString | VisibleString L.ByteString | GeneralString L.ByteString- | UniversalString Text+ | UniversalString String | CharacterString L.ByteString- | BMPString Text+ | BMPString String | Other ASN1Class ASN1Tag ByteString | Sequence [ASN1t] | Set [ASN1t]
Tests.hs view
@@ -14,6 +14,7 @@ import qualified Data.ByteString.Lazy as L import qualified Data.Text.Lazy as T import qualified Data.Enumerator as E+import qualified Data.Enumerator.List as EL import Data.Enumerator (($$)) import Control.Monad@@ -113,11 +114,11 @@ arbitraryPrintString = do let printableString = (['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ " ()+,-./:=?") x <- replicateM 21 (elements printableString)- return $ T.pack x+ return $ x arbitraryIA5String = do x <- replicateM 21 (elements $ map toEnum [0..127])- return $ T.pack x+ return $ x instance Arbitrary ASN1 where arbitrary = oneof@@ -192,7 +193,7 @@ prop_event_marshalling_id :: ASN1Events -> Bool prop_event_marshalling_id (ASN1Events e) =- let r = runIdentity $ E.run (E.enumList 1 e $$ E.joinI $ enumWriteReadBytes $$ E.consume) in+ let r = runIdentity $ E.run (E.enumList 1 e $$ E.joinI $ enumWriteReadBytes $$ EL.consume) in case r of Left _ -> False Right z -> e == z@@ -201,7 +202,7 @@ prop_asn1_event_marshalling_id :: ASN1 -> Bool prop_asn1_event_marshalling_id x =- let r = runIdentity $ E.run (E.enumList 1 [x] $$ E.joinI $ enumWriteReadRaw $$ E.consume) in+ let r = runIdentity $ E.run (E.enumList 1 [x] $$ E.joinI $ enumWriteReadRaw $$ EL.consume) in case r of Left _ -> False Right z -> [x] == z
asn1-data.cabal view
@@ -1,5 +1,5 @@ Name: asn1-data-Version: 0.4.6+Version: 0.5.0 Description: ASN1 data reader and writer in raw form with supports for high level forms of ASN1 (BER, CER and DER). .@@ -26,7 +26,7 @@ Build-Depends: base >= 3 && < 5, bytestring, text >= 0.11,- enumerator >= 0.4 && < 0.5,+ enumerator >= 0.4.5 && < 0.5, attoparsec >= 0.8 && < 0.9, attoparsec-enumerator >= 0.2 && < 0.3, mtl