asn1-data 0.2 → 0.2.1
raw patch · 5 files changed
+33/−41 lines, 5 filesdep +monads-fddep −mtlPVP ok
version bump matches the API change (PVP)
Dependencies added: monads-fd
Dependencies removed: mtl
API changes (from Hackage documentation)
Files
- Data/ASN1/Internal.hs +4/−5
- Data/ASN1/Prim.hs +1/−1
- Data/ASN1/Raw.hs +20/−28
- Tests.hs +1/−1
- asn1-data.cabal +7/−6
Data/ASN1/Internal.hs view
@@ -34,12 +34,11 @@ {- | bytesOfInt convert an integer into a two's completemented list of bytes -} bytesOfInt :: Integer -> [Word8] bytesOfInt i- | i > 0 = ints+ | i > 0 = if testBit (head uints) 7 then 0 : uints else uints | i == 0 = [0]- | otherwise = reverse $ plusOne $ reverse $ map complement $ ints+ | otherwise = if testBit (head nints) 7 then nints else 0xff : nints where uints = bytesOfUInt (abs i)- isNeg = testBit (head uints) 7- ints = if isNeg then 0 : uints else uints- plusOne [] = []+ nints = reverse $ plusOne $ reverse $ map complement $ uints+ plusOne [] = [1] plusOne (x:xs) = if x == 0xff then 0 : plusOne xs else (x+1) : xs
Data/ASN1/Prim.hs view
@@ -266,7 +266,7 @@ putString :: L.ByteString -> ValStruct putString l = Primitive $ B.concat $ L.toChunks l -{- no enforce check that we oid1 is between [0..2] and oid2 is between [0..39] -}+{- no enforce check that oid1 is between [0..2] and oid2 is between [0..39] -} putOID :: [Integer] -> ValStruct putOID oids = Primitive $ B.pack $ eoid where
Data/ASN1/Raw.hs view
@@ -165,28 +165,27 @@ getLength = do l1 <- geteWord8 if testBit l1 7- then- case fromIntegral (clearBit l1 7) of- 0 -> return LenIndefinite- len -> do- lw <- geteBytes len- return $ LenLong len (fromIntegral $ snd $ uintOfBytes lw)+ then case fromIntegral (clearBit l1 7) of+ 0 -> return LenIndefinite+ len -> do+ lw <- geteBytes len+ return $ LenLong len (fromIntegral $ snd $ uintOfBytes lw) else return $ LenShort $ fromIntegral l1 {- | putLength encode a length into a ASN1 length. - see getLength for the encoding rules -} putLength :: ValLength -> Put-putLength (LenShort i) = do- when (i < 0 || i > 0x7f) (error "putLength: short length is not between 0x0 and 0x80")- putWord8 (fromIntegral i)+putLength (LenShort i)+ | i < 0 || i > 0x7f = error "putLength: short length is not between 0x0 and 0x80"+ | otherwise = putWord8 $ fromIntegral i -putLength (LenLong _ i) = do- when (i < 0) (error "putLength: long length is negative")- let lw = bytesOfUInt $ fromIntegral i- let lenbytes = fromIntegral (length lw .|. 0x80)- putWord8 lenbytes- mapM_ putWord8 lw+putLength (LenLong _ i)+ | i < 0 = error "putLength: long length is negative"+ | otherwise = putWord8 lenbytes >> mapM_ putWord8 lw+ where+ lw = bytesOfUInt $ fromIntegral i+ lenbytes = fromIntegral (length lw .|. 0x80) putLength (LenIndefinite) = putWord8 0x80 @@ -195,12 +194,8 @@ getValueConstructed check = do remain <- liftGet remaining if remain > 0- then do- o <- getValueCheck check- l <- getValueConstructed check- return (o : l)- else- return []+ then liftM2 (:) (getValueCheck check) (getValueConstructed check)+ else return [] {- helper to getValue to build a constructed list of values when length is unknown -} getValueConstructedUntilEOC :: CheckFn -> GetErr [Value]@@ -209,18 +204,15 @@ case o of -- technically EOC should also match (Primitive B.empty) (LenShort 0) Value Universal 0 _ -> return []- _ -> do- l <- getValueConstructedUntilEOC check- return (o : l)+ _ -> liftM (o :) (getValueConstructedUntilEOC check) getValueOfLength :: CheckFn -> Int -> Bool -> GetErr ValStruct getValueOfLength check len pc = do b <- geteBytes len if pc- then- case runGetErr (getValueConstructed check) (L.fromChunks [b]) of- Right x -> return $ Constructed x- Left err -> throwError err+ then case runGetErr (getValueConstructed check) (L.fromChunks [b]) of+ Right x -> return $ Constructed x+ Left err -> throwError err else return $ Primitive b
Tests.hs view
@@ -52,7 +52,7 @@ arbitrary = liftM3 Value arbitrary (suchThat arbitrary (\i -> i > 0)) arbitrary arbitraryTime = do- y <- choose (1950, 2050)+ y <- choose (1951, 2050) m <- choose (0, 11) d <- choose (0, 31) h <- choose (0, 23)
asn1-data.cabal view
@@ -1,17 +1,18 @@ Name: asn1-data-Version: 0.2+Version: 0.2.1 Description:- ASN1 data reader/writer in raw form with supports for high level forms of ASN1 (BER/CER/DER)+ ASN1 data reader and writer in raw form with supports for high level forms of ASN1 (BER, CER and DER) License: BSD3 License-file: LICENSE Copyright: Vincent Hanquez <vincent@snarc.org> Author: Vincent Hanquez <vincent@snarc.org> Maintainer: Vincent Hanquez <vincent@snarc.org>-Synopsis: ASN1 data reader/writer in RAW/BER/DER/CER forms+Synopsis: ASN1 data reader and writer in RAW, BER, DER and CER forms Build-Type: Simple Category: Data stability: experimental Cabal-Version: >=1.6+Homepage: http://github.com/vincenthz/hs-asn1-data data-files: README, TODO @@ -20,10 +21,10 @@ Default: False Library- Build-Depends: base >= 3 && < 5,+ Build-Depends: base >= 3 && < 7, binary >= 0.5, bytestring,- mtl+ monads-fd Exposed-modules: Data.ASN1.BER Data.ASN1.CER Data.ASN1.DER@@ -36,7 +37,7 @@ Main-Is: Tests.hs if flag(test) Buildable: True- Build-depends: base >= 3 && < 5, HUnit, QuickCheck >= 2, bytestring+ Build-depends: base >= 3 && < 7, HUnit, QuickCheck >= 2, bytestring else Buildable: False