[Haskell-cafe] How to use an crypto with hackage cereal?
Ivan Lazar Miljenovic
ivan.miljenovic at gmail.com
Tue Apr 21 14:08:29 UTC 2015
On 21 April 2015 at 23:58, Magicloud Magiclouds
<magicloud.magiclouds at gmail.com> wrote:
> 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?
Maybe you could explain what you're doing better.
I would envisage that you would get a Bytestring/Text value, then
encrypt/decrypt and then put it back (though if you're dealing with
Bytestrings, unless you're wanting to compose them with others there's
no real need to use Get and Put as you'll have the resulting
Or are you wanting to implement your own encryption/decryption scheme?
In which case, you might want to either:
a) write custom functions in the Get and Put monads OR
b) write custom parsers (e.g. attoparsec) and builders (using the
Builder module in bytestring); this is probably going to suit you
> On Tue, Apr 21, 2015 at 6:43 PM, Yitzchak Gale <gale at 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
>> 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 ...
>> Hope this helps,
> And for G+, please use magiclouds#gmail.com.
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
Ivan Lazar Miljenovic
Ivan.Miljenovic at gmail.com
More information about the Haskell-Cafe