packages feed

bitcoin-hash-0.1: test/Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main (main) where

import qualified Data.ByteString as B
import qualified Data.ByteString.Builder as BB
import qualified Data.ByteString.Lazy as BL
import qualified Test.Tasty as Tasty
import qualified Test.Tasty.Runners as Tasty
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (testCase, (@=?))

-- We don't use the 'time' library expicitly, but if we don't import it
-- GHCJS fails to run the tests because an undefined 'h$current_time'.
import qualified Data.Time as Time ()

import qualified Bitcoin.Hash as BH
import qualified Bitcoin.Hash.Prim as BH

--------------------------------------------------------------------------------

main :: IO ()
main = Tasty.defaultMainWithIngredients
  [ Tasty.consoleTestReporter
  , Tasty.listingTests
  ] tt

tt :: TestTree
tt = testGroup "bitcoin-hash"
  [ tt_ripemd160
  , tt_sha256
  , tt_hash160
  , tt_hash256
  , tt_check32
  , tt_hmacSHA512
  ]

msg :: Int -> B.ByteString
msg len = B.replicate len 0x27

fh :: (B.ByteString -> B.ByteString) -> Int -> B.ByteString -> TestTree
fh f len out = testCase (show len) $ out @=? toBase16 (f (msg len))

tt_ripemd160 :: TestTree
tt_ripemd160 = testGroup "ripemd160"
  [ h    0 "9c1185a5c5e9fc54612808977ee8f548b2258d31"
  , h    1 "e4ee5c96e6a059ff08d441d7667e7b3936ed8089"
  , h    2 "327a5811faaf39601554f1e9fa75cefea719bf1b"
  , h    8 "c9d553b3329ea7ade32c89ce2dbe5b5d3af2c02c"
  , h   16 "d97869cab890738068f4759ff03056a323cf7da6"
  , h   32 "47ba9ae144d982c09bb68046fd87731fbe4d050a"
  , h   33 "a22128456832e574624248d2cfe9cc0e7081134e"
  , h   64 "f3e39a2c916b85183405babf88ba19f28d46b296"
  , h  128 "c5467ad5008bbdc3e27740f7b847aa427502d23e"
  , h  256 "696f2fac6dc837936b3c07684c6fa557a75c8986"
  , h  257 "c18821b44674454e716b2ca71945960862e11f07"
  , h  512 "e6b39d5ac1be9462d17d0c2c329fca10207804c9"
  , h  519 "c199d39af3ec736c347a72e6065a8479fac00050"
  , h 1024 "07048736bb4be170aa405d7702f05951bf91cd38"
  , h 1029 "be98cf421089c1581eca74ae3d8c351467754be7"
  , h 2048 "aab6cf47c7e46d3fab7f797afdceca60123b1d8d"
  , h 2055 "56eecf9bdae3a3a094884c6ad4bca1cdf7125600"
  ]
  where
    h :: Int -> B.ByteString -> TestTree
    h = fh BH.ripemd160

tt_sha256 :: TestTree
tt_sha256 = testGroup "sha256"
  [ h    0 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  , h    1 "265fda17a34611b1533d8a281ff680dc5791b0ce0a11c25b35e11c8e75685509"
  , h    2 "6f49cdbd80e1b95d5e6427e1501fc217790daee87055fa5b4e71064288bddede"
  , h    8 "93b50054bf138761edd58b09cf99bab521dbe00fa703bb055941df80c9a043cf"
  , h   16 "e160ec46a8f3e2066cf88c72c7545812b2cc847e30bda671942cd7cdaa063cf7"
  , h   32 "4ce65e91582a44819c8f17dfe5225e3b79269ec1ad92dfef3137b98a2bfff551"
  , h   33 "8fd6eba95e8d1ba2c691d0f7ed8ff815d573c7aa28d3bde13a86558f6df348aa"
  , h   64 "59af513c29d2fc3728126da90c84905c6ea451840a3099a3e3959e753b38a2fc"
  , h  128 "32932efae95e19aab9862ce6dac38680a5e5e9fe949c7abfef3916fab53532b0"
  , h  256 "18a8d14bb05697d9c779dd795992945f345b6e4f10ff713b989da307693dbd62"
  , h  257 "6c19b0feb3ecdcefff3c3b1e9bf80437c76165a3bb4c143789288173060e6954"
  , h  512 "746cba66a1c2e5ad7ef4fe64195b126df69fe8c0fdbf5a0d14487546f2d059c3"
  , h  519 "2d86b63c625ffcfb417af2ee06e8d97acf820b9d151f1592deaccb06eafa347a"
  , h 1024 "4f1f3e5c43da7c45cf4f2e7690fcd99dbb6a3794ee4ec4ec3604cfd930a23409"
  , h 1029 "e8ac7ceee762a9fd98b37815797cbdf6eba215ad232aac025bb3d25a8e73828d"
  , h 2048 "0265b8f82954fb56e5ea876c19c8bc5d289519fabb67682e9723cca0da72892f"
  , h 2055 "babaa339695587c4eb34ff10077e9080e6feab85cc730ccf580431c9feb78130"
  ]
  where
    h :: Int -> B.ByteString -> TestTree
    h = fh BH.sha256

tt_hash160 :: TestTree
tt_hash160 = testGroup "hash160"
  [ h    0 "b472a266d0bd89c13706a4132ccfb16f7c3b9fcb"
  , h    1 "64f5b99153eb4a63d32416d4269f1c346d6e8ac4"
  , h    2 "7b6f57c8b7d72d7bad3fb916b066519fb693efdb"
  , h    8 "cd2f0c4d5fe5279327549883d95f8276a953ebc8"
  , h   16 "c94dd81c7d9b3b08c81bf154a40a87fc9b0d4988"
  , h   32 "a5fb1acecd47e7b3d31d2f45df590509d118ed51"
  , h   33 "2032ad3938ef12ed1e92b9c9bf306c4ee72aa58f"
  , h   64 "8e4def42bee7f44e6f344b45874c705f8ad26774"
  , h  128 "c08c5dd5942ad358db28ae4872a0ab49676df8f1"
  , h  160 "b9c16a0844be5f3b72ddfac7df514f1876bc4578"
  , h  257 "8ac52cfe67ffc5db834fb075ab21433712386f54"
  , h  160 "b9c16a0844be5f3b72ddfac7df514f1876bc4578"
  , h  519 "35d768b1bd36543e7d3366e22098b3ef3fcc48da"
  , h 1024 "8ac122cc8956b0b4ec4d6e204eb88e752ce735fc"
  , h 1029 "577a6eff788bf44829e0aeeb02ffdc74e9cffb3d"
  , h 2048 "8204ed56a4076e190b7affb27859de88d67c12e5"
  , h 2055 "cddc7258d480b001aa11e1c07c9903a4298b2cab"
  ]
  where
    h :: Int -> B.ByteString -> TestTree
    h = fh BH.hash160

tt_hash256 :: TestTree
tt_hash256 = testGroup "hash256"
  [ h    0 "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456"
  , h    1 "e368b5f8bac32462da14cda3a2c944365cbf7f34a5db8aa4e9d85abc21cf8f8a"
  , h    2 "4a9b8de6233de14e76d4146a43030920a0ce43302b0ef885c9b3982d51ff81e4"
  , h    8 "7f3a9bc8e135e559f9c5a388cc3db5c017227984fe031177af25f719205c70b5"
  , h   16 "cdc6f516ac0d520f9827dd29a1eba16846d5effb1c799a0a43aaa49e32de5631"
  , h   32 "10f11f8f76f95726b51a69ad03e6ddc0ea3ffcd350d897040a9dc80cc87b5af4"
  , h   33 "27bb0754c0ede411da787aef7b46e3499d17902c7d8c078dd0dbd083678b5828"
  , h   64 "a8cac40994107d52033ed5a2e476318ea6919aad27cadb59666d15f33f5c6408"
  , h  128 "baaf81d32565dcc44b027157f9dca8a2b07dbead96965de38d854da06e3ea07b"
  , h  512 "60c5d80dd8300576bbab8ca8c8aae25bb4402bc0bae85ddb5f68b78f53d0871e"
  , h  257 "13b859a80f7be290337b6068d65f8706efd855d5eb193178a15636b29728d696"
  , h  512 "60c5d80dd8300576bbab8ca8c8aae25bb4402bc0bae85ddb5f68b78f53d0871e"
  , h  519 "458c1a7847d44161bff4846acd78f6b44b489b517736f0ec5d4ad4b3b9a856d7"
  , h 1024 "f34efcd0bd9f6e3f1119d38420b0f066c147463ebab34ae8fd3902aae1f369df"
  , h 1029 "037147c77ee9e7b3b5bd4fd321749406e4e422cf26e206c7c0d9b2acec0b04a6"
  , h 2048 "6533648135aeb3d636285d92fd0c9aaac0b67905a01e5e2b89b8601e67869b8c"
  , h 2055 "f40a20f40caeffc575e63f5fc31b4beefeb83d7c3f09a7029e25996b92953dd0"
  ]
  where
    h :: Int -> B.ByteString -> TestTree
    h = fh BH.hash256

tt_check32 :: TestTree
tt_check32 = testGroup "check32"
  [ h    0 "5df6e0e2"
  , h    1 "e368b5f8"
  , h    2 "4a9b8de6"
  , h    8 "7f3a9bc8"
  , h   16 "cdc6f516"
  , h   32 "10f11f8f"
  , h   33 "27bb0754"
  , h   64 "a8cac409"
  , h  128 "baaf81d3"
  , h  512 "60c5d80d"
  , h  257 "13b859a8"
  , h  512 "60c5d80d"
  , h  519 "458c1a78"
  , h 1024 "f34efcd0"
  , h 1029 "037147c7"
  , h 2048 "65336481"
  , h 2055 "f40a20f4"
  ]
  where
    h :: Int -> B.ByteString -> TestTree
    h = fh BH.check32

tt_hmacSHA512 :: TestTree
tt_hmacSHA512 = testGroup "hmacSHA512"
  [ h 0      0 "b936cee86c9f87aa5d3c6f2e84cb5a4239a5fe50480a6ec66b70ab5b1f4ac6730c6c515421b327ec1d69402e53dfb49ad7381eb067b338fd7b0cb22247225d47"
  , h 0      1 "3e6bb8a8d21abae18f5646d5d87a57962121e0a9b3edccdf09864925df56d728a29e550142f48d210a7e38f8737aedbaecfa843dfc8b562876710618912a7a8a"
  , h 0      2 "87ac25bb3d233467ae449498712e80256a24117689c3178fce62b713bd3e5cfe65dcdbe2e79504c9780d8240ec24bf1cea427ef629359ad6aa150a7fb4b42243"
  , h 0      8 "c9e3c0b53a8e0fe887d26e53ef0f222bd18d253cfe1830f791ab185bb6a7b7237562c54bbf2c282ce7a08b7dfd90eca87364a66e48002ca4d0183af7fcfd8f7b"
  , h 0     16 "d6dfb859ae31641b08345990cc198400255a8eae50fec01d605188ceaba371755c8c77cd227f6b58e5d93057ad446d92de88035221a5ab14115a2840ddd8d219"
  , h 0     32 "87b354778869a66c0eb2f245ff79cb24f991aebf7f6378ff3f6414d4a70b26d214d9d3a6abaf821c06787564938745a4ed4a5b882ed14bff10388cdfc35842ab"
  , h 0     33 "99f23de02aeffc7f30d1b09bd42a3efa4c46dd84125f4b733da56cbaaea437e122f491ffe728491b3435a3f8ad70d1c262d5a8b5aad0d48758e789bae28debfa"
  , h 0     64 "d188d6c6eb9e5803a5c2e3d6145c22b2535b16d24bff3158a76ac4d06ed0f1a49494f2463063ef38c1cc3c841ae85ba8ef9dd30ddcdd0129455813709b155edf"
  , h 0    128 "687fd0bfe55617b0b58b2f932319cf5c1938612c13fe75499ac2b76f126a8ed06e3add557101a60d64a42d6166a0581907f3d9a881ec96dfc315cb30edb2d4d1"
  , h 0    512 "cdc9855f3aa1915f96f8724342794df73abd9d23d7677befc006299b50a7af7ed5e48b1ded7795cd7cdeb99fb1a62a0891a9ca22d42fa6c374125b8c73348cd9"
  , h 0    257 "b67d36bd251747fcf0b0765c307ee45fa2e0ecc615c0f857dc76b8d3a1991d5f57a2035c7b6134cc76af50db3e9f4f38fd16b4c86246ca6931b3a5655f36dcef"
  , h 0    512 "cdc9855f3aa1915f96f8724342794df73abd9d23d7677befc006299b50a7af7ed5e48b1ded7795cd7cdeb99fb1a62a0891a9ca22d42fa6c374125b8c73348cd9"
  , h 0    519 "c2dff40a5512833b01e4091e641c3d453e687f138b1ef520fe82f05851122617a6aae2948f92635139b8592ebad4f2cb9a38f34aaa6c8e102051cddbd86921bf"
  , h 0   1024 "e5baff56465a850aa6d8421e3980c92967c7d40a28e25555d0f65710ca3e6ed8bb19e8452508304d48a2c6849e619c5604cac109ebb3d53bb4833b26254b142e"
  , h 0   1029 "181a965c021c454eb2e93387903f743c0f6d8d45142c179529bfee13b5ccae71a41eb53c8c027e8f48e15ce3e25617660d68e07924af3a38592ff65d5a68b0f9"
  , h 0   2048 "34e5a9698b83334e50ce0c9909b09db6387e983be2a3542ac34424ef7a1a7c06ecb235eb02d8a0aaf85dcda8b590c991a2d603a951ed96470f0da3196fbdeef2"
  , h 0   2055 "d552ce5181075a22f63aa161ad9ce4583c66106fa81cf6a5954e2d03e34a5488d92fde43e06ca97d9db0acaa560a77e785610bf7950b6ea144bd79094d22f7f3"
  , h 9      0 "6f7f51d7f2d33020b808c3e2766fd4a529f21541a18a58629cc04276485e500624d1c46d9541a33c45a865b1797e66f50f49fd0492a74d30302c1e7b01d6e78b"
  , h 9      1 "3d673c1273b8c426cb4e48119161030ce7fadeaeaf2ce47fec8d3332b982094a349e7f175530597a4c37090c1bd97ae6b1a81224b72b56e7a7db4927b48c32ee"
  , h 9      2 "a3ec5f33bebd3abe8829f579902a183b4193a4b50476ebb9305179b6b606f30cfb60a90f5a0935e4bc0b9efe24ce9c1f07efc8fd9002d439284565b955cef675"
  , h 9      8 "a9ef661eb3497ccc3313cae92fb8eeb333023e783507d1d9540758b9fe06e066cacaf6a4ef4a10bb672ba729efc77d9e17050bccde9f6f44fa2c5bd6e4d4bbd4"
  , h 9     16 "2717db66432712373cc0e01a126823582d790012fb97224c1325f6325d94955161a0d1cef086e84997482544100e192c99d420ecf382d3e045066f6400d60f97"
  , h 9     32 "0b693970829e55517fabf65671dcfa22891b93db8416f816e7339ab648142d7769ff60b1519d09783b5c947f890e7ae47d44a8aa3d4e5b73ae63854e090ae1a2"
  , h 9     33 "f07e3deb713e1cb5ee4173a6f1de95f68e86d6be12fb9cf81aa0ee4f5cf1e9eb50a9070b6ae57b7dd4cf538f53fad19fe05d5c4bfa6ae5fba4b4b77115658002"
  , h 9     64 "5bda29660053e5dbfbff1ec36b9c0294de195cf7632a44fb9d5f0e49e00f1a80832285cfdfc6cab5487807ee87151bb10abff5e5fd1a40967d804b2c1b8353e0"
  , h 9    128 "5cc7d80c552b0a348c5a82e1b3e3e65b5895882e025e79a99ceb0ed7949fad3d44e8ac4dac7eb0dcf552825ca9aabc9378d6b403bbdeb2325bf7ec00a044e860"
  , h 9    512 "3781b3ffeba43195c3428a52572f4643e53d7e9375e4b9a9079d692acb05471cc0dae04a60a74ad3ddd7ceb7866644ff57a74ff5b57068f2cbd3f6bc9ca791d7"
  , h 9    257 "96b9f9371d5cafd2044aa7268605d3e04db8c9e3e72391c80f649bbb84879a29238682520708ed06053efbff74fbe5c8b81fcc7bc2b24b3867915cfea627fed7"
  , h 9    512 "3781b3ffeba43195c3428a52572f4643e53d7e9375e4b9a9079d692acb05471cc0dae04a60a74ad3ddd7ceb7866644ff57a74ff5b57068f2cbd3f6bc9ca791d7"
  , h 9    519 "160ace1bc82c82fae5b1b8215dde77618f901fef61b709aa15d5231ddd91eac3472a53be6442837fe49831c92a8c26bc7fe952386e5c3b52b280643f10b9bdc1"
  , h 9   1024 "3246fa08831a3aec3c2bacbc6c282f6004bc6dd3914862bdaad7eb0e64e704f6d7449c12b7c839f637830a866bacdc6fb91df725b887f18a5066175e12c3e085"
  , h 9   1029 "ff0feeceb96b59fdb8af4fd67c82e8c2131a09d921c272b24e24005d80bc88f731308081c3a45e4492f3c4ada0905994b55343dd1fd3d1c46d12225aef734ba9"
  , h 9   2048 "06c6eda47336e49d5b1e3c97a5fef99455489944516087b5f196fcb35410ce800a2b34b38a70dd2a8b9e8ef29822eadf37d9538d7541d976e5a099f2cf6aecc9"
  , h 9   2055 "c60a8d5f1e48dbc24b36fa4b3a5123c9cdd1a2722ebead76815c75e6fde08047bcb11023b573ff83ec4b2f48ff99b09a728b0494d875036cfce7fedfb29110b3"
  , h 128    0 "9dfb363b8d730179112f28091209f54ebf8a66e3da33735022a5b7494d5d3a86d12decc70a0098e2ef42e3f9f559031fd63135293a9e39e854a7c40e3e47bc00"
  , h 128    1 "df0986089c4a8a3f9d2b4a9302acc5cf340f65998c4d3ee307665e42c8a428b95f63fd1af56b589561284daef3845d407013ed5d43201ffa5f5be466191e4798"
  , h 128    2 "0c8e909c834da24e26dd943e2442bbead5310501288d0f17a4544d98ae9f7b8a45f232ed5dbd73696a093fca53ec3c6c6fb4bc903c259a19b1d20b51b7c108e7"
  , h 128    8 "79712905e4ee972ddcf87f01da98dd97a0c4888ae069c635fc21033159d32170ef81f43a67863ba6e955fc071f75e902312718e1ba7248694d69b82044cbc62b"
  , h 128   16 "f590da64d2e527443fef642fc122436346d5e8c94222241241c03a80b5b4b353f510bf451a1aa78a764e9f60dda0d8ce3f8950b46d55b3bc131aa9a34f6b6b47"
  , h 128   32 "aa80eccc3f9095af38b7cf5e918a791fa4140daa9d2e360c076c414a2e45a5965883d987678a8d640f2f96724df194e4333b50c35bf2939eca34fe16b936c4d3"
  , h 128   33 "d02c457f1e69c6d666a704ac9da3d6f66eaa12b0143e73b3aaadd8fc49cfabd12f2b157dbe778349898473611eb491ff194fd329fbe6ceef2b9f2b07e9c46b47"
  , h 128   64 "8485a89797fc2e6dc7ed081a546266460d9d5e0b4e5d7accc9ec37b5265380d69b9270175958c666a50d3ed26612e2be67760d0778ad5e1f2e8736c6b626b929"
  , h 128  128 "38e8988acceaaa6c55ab8530d67f2d3c78a2e025fa7181cef04e8571f0c6074a5c4b9c3eb492f2535fafad8cb9efc2ea72778a227988fb946f21a21807138974"
  , h 128  512 "8e7a4c1b37b4d4734839047da81981635b86f75d4fae4ddbb17828db95b3aed15cef6f5dcee607c6adcc4ae33c463b040020448a31cf4a4a5edc9eb6e862ced9"
  , h 128  257 "ec28dadc2d7268dae0eb10b95f223b69c17363a16c66f39aee82e5dab7add23c10078ea8cde9d6a7b9d783b2d5535abd1f327beb4efe36ef273952f7dfbe1b2e"
  , h 128  512 "8e7a4c1b37b4d4734839047da81981635b86f75d4fae4ddbb17828db95b3aed15cef6f5dcee607c6adcc4ae33c463b040020448a31cf4a4a5edc9eb6e862ced9"
  , h 128  519 "7b2ec73f5eaf45a924b71284372c80dd80d55af1790e8bbd927ea786b303f267cffe7bf2ebad5b946f9b5fd5db38d215212275eda37b55103134f05c2e3a9660"
  , h 128 1024 "583760f7e25f55eb70c726788e01ac7c3935801c8030a76ec537f5ed5713717f2bfbc8bd5681fd316e7ce6cc933b37309352c4ad954bf4288edc552a4f0e4b9e"
  , h 128 1029 "1afcf9bcb0ced816fd2349f5e2210fe82a2c229535faa72f80f72710a713adddaa569a9f12676f2a6f3b594d78629ce290c41a471bf7fcce802bda10cfacad09"
  , h 128 2048 "ea7802e4883bf132bfe9bcfea71dc0c062c0e5e3227e9c1d5f4c571b3ae57b7246eee27f15ee1e938f8eec4f01d3416d43859fee97051ac89781d92de682e38c"
  , h 128 2055 "dd40777cd3f188d92eff50b84bac51743d5c6c936cce818a75b2d3afa8333c662254b58285891f2aa52ac98c081eb72d40646acbbb1485e97961df9eba77eae6"
  , h 333    0 "5a0587467c13160baf251b07f8204c05effcf994511967de8fd25a2885ab4c12eba333bdfd6588b40d0d2d381e1fbde86dbb08ad366b8e9bb34881967a27c64d"
  , h 333    1 "a54e69dabe1925f8058d2f50fea6e1118b92a14313517b5428c144deed119086196ff7ecc183aaf6eb5033e6ed3eb2522d311bf193fe866a7078cbf8f2361813"
  , h 333    2 "8183755464f02e6033be551700482d173827e87e2e4be0aa6b0a08b7632c0a1eb75323e36a679cc0ca86a62e58b3613cc904d77ee5c35934e03400402706b9ac"
  , h 333    8 "991f92b8d05d1077be011d27a80c3113d0ffda137ee3056af67445f41395865760e91eebcb7e7ad5e3b81554e6133b0dd247f5700d2b5d2038d4bf4c3f04ffe5"
  , h 333   16 "a59d4fc369e70a3c108d5a325b6f803f2a396692a28aec11b6d1908ebf8d102387df769687e97d58d83587ace176323e5029b1e0861f8d582f7bdb38264c9c1a"
  , h 333   32 "ceeafbbf65152805680fdca1759899a56d0e9d9cd54b631d765c56547278d4e665ae200c3d08eb5e89bcacd989f17dbf27cbcb482c9a364351272eb2b5b2fb53"
  , h 333   33 "ec1e70824fca85e798dfb4b1ce804428db8d555b8c289d5b37c4c1c6a087bd34851c9148d2cd544311aca6f5a8374dc3193011f3265de7aeded06f526278a16d"
  , h 333   64 "3bc90c0f0ab7a911f49d2905d24b3fb37da23c2b3c3bdf9e930c77fa783e0293848a5e8784247548a9216e35d35991ad8ec4c007d27872df14b6091cb5b3d4fe"
  , h 333  128 "5975ce0895b6af8f8cc918ec75d070fc6363100e41cd08768ded0a8237b64081fa4f18120f2baacd3b458e22ee3ef03d9be707561830b0f4e72fce4f08e37959"
  , h 333  512 "ff2367fa11dc37194b1c4c8954dc48506d781081c5b0dd541391e3b85fb837c83b978f88ec600635eaa0453227b6d5b9ac19d0c12ae23339fdf49b1b68986707"
  , h 333  257 "768f5dc2eaf82f55796a2b6276c5c2dfbcc5d23fb88b1673ff6431bdd7cd8c95670d22467f785054e1c5b1490de0256f91e4f0da4cd6d2fe5be7eb9c37645bff"
  , h 333  512 "ff2367fa11dc37194b1c4c8954dc48506d781081c5b0dd541391e3b85fb837c83b978f88ec600635eaa0453227b6d5b9ac19d0c12ae23339fdf49b1b68986707"
  , h 333  519 "9c5b3a7c6c86df637ae741c4fdf87a3e6b9bc9d930ad89e50cfb7e314fe69bb67a76a84a9372e74eb330436d5fcb1f028a6e0b69f2336ab65dbbcfec7c9470c3"
  , h 333 1024 "03155b65dfd55c24d8583fbff21564db15372f99fe134872e09977657dc4d3a42921b596b0ea545ae8be6f75b40eefd22405ce49014c27e2b032dfaf545d111a"
  , h 333 1029 "dd18cc2e732b6ff27fb154dc92a8d4c73bb2184d1e4e71aa87a8412aa4ecafe8cf37014ad0186a08d0a10145e4d99da51361ec20b427c2169c9ddbd4d2f38737"
  , h 333 2048 "2a843042c773dbd4d4aee3bd5108f9e0077d71fc97c575309be804f3931886c955c60261165e9800cb8c1ce9ad6e2a37f316186c603d95253c5dc97f6f8a9d8d"
  , h 333 2055 "41061265f084c010340eea293f58e5ba331da17b84918fdb25ffd3c0a01ea8d7e403a4f45df43742a47d4bccb0311df4e05cd039756546ac33bf66b8e0017457"
  ]
  where
    h :: Int -> Int -> B.ByteString -> TestTree
    h klen dlen out =
      testCase ("key len " <> show klen <> ", msg len " <> show dlen) $
        out @=? toBase16 (BH.hmacSHA512 (msg klen) (msg dlen))

--------------------------------------------------------------------------------

toBase16 :: B.ByteString -> B.ByteString
toBase16 = BL.toStrict . BB.toLazyByteString . BB.byteStringHex