[Haskell-cafe] Binary serialization, was Re: Abstraction leak

Dominic Steinitz dominic.steinitz at blueyonder.co.uk
Thu Jul 5 16:41:11 EDT 2007


> 
>> (Bonus points for being able to parse ASN.1 and generate appropriate
>> Haskell datatypes & serialization primitives automatically :-) )
> 
> I think there's at least an ASN.1 definition in the crypto library.
> Dominic might be able to enlighten us on that.
> 

No bonus points I'm afraid. There is an embryonic ASN.1 library here

http://hackage.haskell.org/cgi-bin/hackage-scripts/package/ASN1-0.0.1

You can take an ASN.1 definition such as

FooBar {1 2 0 0 6 1} DEFINITIONS ::=
   BEGIN
       Journey ::= SEQUENCE {
          origin IA5String,
          stop1 [0] IA5String OPTIONAL,
          stop2 [1] IA5String OPTIONAL,
          destination IA5String
       }
       Odyssey ::= SEQUENCE {
          start Journey,
          trip1 [0] Journey OPTIONAL,
          trip2 [1] Journey OPTIONAL,
          trip3 [2] Journey OPTIONAL,
          end Journey
       }
   END

And then create abstract Haskell representations of the ASN.1 types

journey =
    "Journey" ::=
         AbsSeq Universal 16 Implicit [
          Regular (Just "origin"        :>:
             (Nothing :@: absIA5String)),
          Optional (Just "stop1"        :>:
             (Just 0   :@: absIA5String)),
          Optional (Just "stop2"        :>:
             (Just 1   :@: absIA5String)),
          Regular (Just "destination" :>:
             (Nothing :@: absIA5String))
      ]

odyssey =
   "Odyssey" ::=
      AbsSeq Universal 16 Implicit [
          Regular (Just "start"        :>:  (Nothing :@: journey)),
          Optional (Just "trip1"       :>:  (Just 0  :@: journey)),
          Optional (Just "trip2"       :>:  (Just 1  :@: journey)),
          Optional (Just "trip3"       :>:  (Just 2  :@: journey)),
          Regular (Just "end"          :>:  (Nothing :@: journey))
      ]

The library then allows you to decode BER representations of these
types. It's good enough to decode X.509 identity and attribute certificates.

There's no encoding routines currently as I didn't need them.

I'll try and make some documentation more easily available if I get time
at the weekend.

I'm working on PER at the moment both encoding and decoding using GADTs.
I will extend it at some point for BER but that won't be for some time.

I thought I read that someone was working on parsing ASN.1 so I'll try
and follow that up (again it will have to be at the weekend).

Dominic.





More information about the Haskell-Cafe mailing list