import Crypto.Cipher.AES import Codec.Binary.Base16 import Data.Maybe import Data.Char let (k) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "2b7e151628aed2a6abf7158809cf4f3c" let (iv) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" let (Just ptext) = Codec.Binary.Base16.decode $ map toUpper $ "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" let (Just ctext) = Codec.Binary.Base16.decode $ map toUpper $ "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee" let lastIV = IV $ B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "f0f1f2f3f4f5f6f7f8f9fafbfcfdff03" let (Just c) = buildKey k::Maybe AES128 (ctr incIV c (IV iv) $ L.pack ptext) == (L.pack ctext,lastIV) (ctr' incIV c (IV iv) $ B.pack ptext) == (B.pack ctext,lastIV) let (Just ptext) = Codec.Binary.Base16.decode $ map toUpper $ "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c37" let (Just ctext) = Codec.Binary.Base16.decode $ map toUpper $ "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009c" (ctr incIV c (IV iv) $ L.pack ptext) == (L.pack ctext,lastIV) (ctr' incIV c (IV iv) $ B.pack ptext) == (B.pack ctext,lastIV) let (k1) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "fbeed618357133667c85e08f7236a8de" let (k2) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "f7ddac306ae266ccf90bc11ee46d513b" ( cMacSubk c) == (IV k1, IV k2) let (ehash) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "bb1d6929e95937287fa37d129b756746" let m1 = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "6bc1bee22e409f96e93d7e117393172a" let m1hash = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "070a16b46b4d4144f79bdd9dd04a287c" let m2 = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411" let m2hash = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "dfa66747de9ae63030ca32611497c827" let m3 = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710" let m3hash = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "51f0bebf7e3b9d92fc49741779363cfe" (cMac' c B.empty) == ehash (cMac' c m1) == m1hash (cMac' c m2) == m2hash (cMac' c m3) == m3hash let (ka) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0" let (kb) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" let (Just c1) = buildKey ka::Maybe AES128 let (Just c2) = buildKey kb::Maybe AES128 let ad = map (\x->B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper x) ["101112131415161718191a1b1c1d1e1f2021222324252627"] let pt = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "112233445566778899aabbccddee" let res = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "85632d07c6e8f37f950acd320a2ecc9340c02b9690c4dc04daef7f6afe5c" siv' c1 c2 ad pt == Just res unSiv' c1 c2 ad (fromJust $ siv' c1 c2 ad pt) == Just pt let (ka) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "7f7e7d7c7b7a79787776757473727170" let (kb) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "404142434445464748494a4b4c4d4e4f" let (Just c1) = buildKey ka::Maybe AES128 let (Just c2) = buildKey kb::Maybe AES128 let ad = map (\x->B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper x) ["00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddccbbaa99887766554433221100","102030405060708090a0","09f911029d74e35bd84156c5635688c0"] let pt = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "7468697320697320736f6d6520706c61696e7465787420746f20656e6372797074207573696e67205349562d414553" let res = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "7bdb6e3b432667eb06f4d14bff2fbd0fcb900f2fddbe404326601965c889bf17dba77ceb094fa663b7a3f748ba8af829ea64ad544a272e9c485b62a3fd5c0d" siv' c1 c2 ad pt == Just res unSiv' c1 c2 ad (fromJust $ siv' c1 c2 ad pt) == Just pt let (ka) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0" let (kb) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" let (Just c1) = buildKey ka::Maybe AES128 let (Just c2) = buildKey kb::Maybe AES128 let ad = map (\x->L.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper x) ["101112131415161718191a1b1c1d1e1f2021222324252627"] let pt = L.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "112233445566778899aabbccddee" let res = L.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "85632d07c6e8f37f950acd320a2ecc9340c02b9690c4dc04daef7f6afe5c" siv c1 c2 ad pt == Just res unSiv c1 c2 ad (fromJust $ siv c1 c2 ad pt) == Just pt let (ka) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "7f7e7d7c7b7a79787776757473727170" let (kb) = B.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper $ "404142434445464748494a4b4c4d4e4f" let (Just c1) = buildKey ka::Maybe AES128 let (Just c2) = buildKey kb::Maybe AES128 let ad = map (\x->L.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper x) ["00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddccbbaa99887766554433221100","102030405060708090a0","09f911029d74e35bd84156c5635688c0"] let pt = L.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "7468697320697320736f6d6520706c61696e7465787420746f20656e6372797074207573696e67205349562d414553" let res = L.pack $ fromJust $ Codec.Binary.Base16.decode $ map toUpper "7bdb6e3b432667eb06f4d14bff2fbd0fcb900f2fddbe404326601965c889bf17dba77ceb094fa663b7a3f748ba8af829ea64ad544a272e9c485b62a3fd5c0d" siv c1 c2 ad pt == Just res unSiv c1 c2 ad (fromJust $ siv c1 c2 ad pt) == Just pt