Thank you. But how if the cipher was specified outside the binary data? I mean I need to pass the decrypt/encrypt function to get/put while they do not accept parameters. Should I use Reader here?

On Tue, Apr 21, 2015 at 6:43 PM, Yitzchak Gale <gale@sefer.org> wrote:
Magicloud Magiclouds wrote:
> I am trying to work with some binary data that encrypted by field instead of
> the result of serialization. I'd like to use Data.Serialize to wrap the data
> structure. But I could not figure out how to apply an runtime specified
> cipher method to the bytestring.

Are you using the set of crypto libraries written by
Victor Hanquez, such as cryptocipher-types,
crypto-pubkey-types, and cryptohash?

Or the set of libraries written by Thomas DuBuisson,
such as crypto-api, cipher-aes128, etc.?

Here is an example of decoding for Victor's libraries.
Encoding would be similar using Put instead of Get.
Thomas' libraries would be similar using the other
API.

Let's say you have a type like this:

data MyCipher = MyAES | MyBlowfish | ...

Then in your cereal code you would have a Get monad
expression something like this (assuming you have
written all of the functions called parseSomething):

getStuff = do
  cipher <- parseCipher :: Get MyCipher
  clearText <- case cipher of
    MyAES -> do
      keyBS <- parseAESKey :: Get ByteString
      let key = either (error "bad AES key") id $ makeKey keyBS
          cipher = cipherInit key
      cipherText <- parseAESCipherText :: Get ByteString
      return $ ecbDecrypt cipher cipherText
    MyBlowfish -> do ...

etc.

Hope this helps,
Yitz



--
竹密岂妨流水过
山高哪阻野云飞

And for G+, please use magiclouds#gmail.com.