packages feed

raaz-0.0.1: spec/Raaz/Cipher/AESSpec.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE DataKinds            #-}

module Raaz.Cipher.AESSpec where

import           Common
import qualified Common.Cipher as C
import Raaz.Cipher.AES
import Raaz.Cipher.Internal

spec :: Spec
spec =  do describe "128bit CBC" $ aes128cbcSpec
           describe "192bit CBC" $ aes192cbcSpec
           describe "256bit CBC" $ aes256cbcSpec

----------------- AES 128 CBC ------------------------------

aes128cbcSpec :: Spec
aes128cbcSpec = do
  C.encryptVsDecrypt aes128cbc

  with ( "06a9214036b8a15b512e03d534120006"
       , "3dafba429d9eb430b422da802c9fac41")
    $ ("Single block msg" :: ByteString)
    `encryptsTo` ("e353779c1079aeb82708942dbe77181a" :: Base16)

  with ( "c286696d887c9aa0611bbb3e2025a45a"
       , "562e17996d093d28ddb3ba695a2e6f58")$
       ( "000102030405060708090a0b0c0d0e0f" <>
         "101112131415161718191a1b1c1d1e1f" :: Base16)
       `encryptsTo`
       ( "d296cd94c2cccf8a3a863028b5e1dc0a" <>
         "7586602d253cfff91b8266bea6d61ab1" ::Base16)


  with ( "6c3ea0477630ce21a2ce334aa746c2cd"
       , "c782dc4c098c66cbd9cd27d825682c81" )$
       ( "This is a 48-byte message (exactly 3 AES blocks)" :: ByteString)
       `encryptsTo`
       ( "d0a02b3836451753d493665d33f0e886" <>
         "2dea54cdb293abc7506939276772f8d5" <>
         "021c19216bad525c8579695d83ba2684" :: Base16
       )

  with ( "56e47a38c5598974bc46903dba290349"
       , "8ce82eefbea0da3c44699ed7db51b7d9" ) $
       ( "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" <>
         "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" <>
         "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" <>
         "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" :: Base16 )
       `encryptsTo`
       ( "c30e32ffedc0774e6aff6af0869f71aa" <>
         "0f3af07a9a31a9c684db207eb0ef8e4e" <>
         "35907aa632c3ffdf868bb7b29d3d46ad" <>
         "83ce9f9a102ee99d49a53e87f4c3da55" :: Base16
       )

  with ( "2b7e151628aed2a6abf7158809cf4f3c"
       , "000102030405060708090a0b0c0d0e0f") $
       ( "6bc1bee22e409f96e93d7e117393172a" :: Base16 )
       `encryptsTo`
       ( "7649abac8119b246cee98e9b12e9197d" :: Base16 )

  with ( "2b7e151628aed2a6abf7158809cf4f3c"
       , "7649abac8119b246cee98e9b12e9197d") $
       ( "ae2d8a571e03ac9c9eb76fac45af8e51" :: Base16 )
       `encryptsTo`
       ( "5086cb9b507219ee95db113a917678b2" :: Base16 )

  with ( "2b7e151628aed2a6abf7158809cf4f3c"
       , "5086cb9b507219ee95db113a917678b2") $
       ( "30c81c46a35ce411e5fbc1191a0a52ef" :: Base16 )
       `encryptsTo`
       ( "73bed6b8e3c1743b7116e69e22229516" :: Base16 )

  with ( "2b7e151628aed2a6abf7158809cf4f3c"
       , "73bed6b8e3c1743b7116e69e22229516") $
       ( "f69f2445df4f9b17ad2b417be66c3710" :: Base16 )
       `encryptsTo`
       ( "3ff1caa1681fac09120eca307586e1a7"  :: Base16 )

  where encryptsTo :: (Format fmt1, Format fmt2)
                   => fmt1 -> fmt2 -> Key (AES 128 CBC) -> Spec
        encryptsTo = C.encryptsTo aes128cbc

------------------ AES 192 CBC ---------------------------

aes192cbcSpec :: Spec
aes192cbcSpec = do
  C.encryptVsDecrypt aes192cbc

  with ( "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b"
       , "000102030405060708090a0b0c0d0e0f") $
       ( "6bc1bee22e409f96e93d7e117393172a" :: Base16 )
       `encryptsTo`
       ( "4f021db243bc633d7178183a9fa071e8" :: Base16 )

  with ( "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b"
       , "4f021db243bc633d7178183a9fa071e8" ) $
       ( "ae2d8a571e03ac9c9eb76fac45af8e51" :: Base16 )
       `encryptsTo`
       ( "b4d9ada9ad7dedf4e5e738763f69145a" :: Base16 )

  with ( "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b"
       , "b4d9ada9ad7dedf4e5e738763f69145a" ) $
       ( "30c81c46a35ce411e5fbc1191a0a52ef" :: Base16 )
       `encryptsTo`
       ( "571b242012fb7ae07fa9baac3df102e0" :: Base16 )

  with ( "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b"
       , "571b242012fb7ae07fa9baac3df102e0") $
       ( "f69f2445df4f9b17ad2b417be66c3710" :: Base16 )
       `encryptsTo`
       ( "08b0e27988598881d920a9e64f5615cd" :: Base16 )

  where encryptsTo :: (Format fmt1, Format fmt2)
                   => fmt1 -> fmt2 -> Key (AES 192 CBC) -> Spec
        encryptsTo = C.encryptsTo aes192cbc

------------------ AES 192 CBC ---------------------------

aes256cbcSpec :: Spec
aes256cbcSpec = do
  C.encryptVsDecrypt aes256cbc

  with ( "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"
       , "000102030405060708090a0b0c0d0e0f" ) $
       ( "6bc1bee22e409f96e93d7e117393172a" :: Base16)
       `encryptsTo`
       ( "f58c4c04d6e5f1ba779eabfb5f7bfbd6" :: Base16)

  with ( "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"
       , "f58c4c04d6e5f1ba779eabfb5f7bfbd6" ) $
       ( "ae2d8a571e03ac9c9eb76fac45af8e51" :: Base16 )
       `encryptsTo`
       ( "9cfc4e967edb808d679f777bc6702c7d" :: Base16 )

  with ( "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"
       , "9cfc4e967edb808d679f777bc6702c7d") $
       ( "30c81c46a35ce411e5fbc1191a0a52ef" :: Base16 )
       `encryptsTo`
       ( "39f23369a9d9bacfa530e26304231461" :: Base16 )

  with ( "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"
       , "39f23369a9d9bacfa530e26304231461" ) $
       ( "f69f2445df4f9b17ad2b417be66c3710" :: Base16 )
       `encryptsTo`
       ( "b2eb05e2c39be9fcda6c19078c6a9d1b" :: Base16 )

  where encryptsTo :: (Format fmt1, Format fmt2)
                   => fmt1 -> fmt2 -> Key (AES 256 CBC) -> Spec
        encryptsTo = C.encryptsTo aes256cbc