module Main where import Data.Int (Int32) import Data.Digest.WebMoney.Algebra import Data.Digest.WebMoney.Montgomery import Data.Digest.WebMoney.Signer import qualified Data.ByteString as B (pack) import Data.Vector (Vector, fromList) import Test.Hspec signer :: Signer signer = newSigner [125, -78, 54, 8, -67, -98, -116, 15, -88, -19, -82, 2, 108, 41, 89, 27, 34, -80, -49, 55, -62, -2, -89, 19, -79, 41, -65, 11, -120, 87, -64, 89, 27, -67, -92, -23, -77, 29, 46, -52, 95, -96, -113, -32, -99, -26, -95, -27, 12, 108, -18, -101, -46, 103, -29, -112, 16, -50, -67, 88, -2, -86, 40, -69, -65, 0] [85, 31, -1, -98, -62, -2, -13, 76, -48, 2, 103, -66, -71, -41, -49, 106, 114, 99, 102, -28, -55, 93, -75, 98, 119, 68, 60, 66, 123, 101, -99, -16, 30, 118, -66, 123, 77, -103, -59, -116, -92, -90, 9, 98, 108, -92, -111, -108, -18, -62, -20, -35, 83, -11, 115, 70, -20, -42, -31, -80, -44, -53, -42, -16, 110, 5] main :: IO () main = hspec $ do describe "Signer" $ do it "signBytes" $ do ( signBytes signer (replicate 46 0) (B.pack [109, 101, 115, 115, 97, 103, 101])) `shouldBe` (fromList [1420192846, -514184231, -858634323, -658448382, 52207915, -437346630, -666018004, -2043170752, 1241009014, 879655623, -1601019036, -1233902541, 17763596, -1169198420, 1209444264, 223198074, 1327]) it "buildSignature" $ do ( buildSignature signer (fromList [1420192846, -514184231, -858634323, -658448382, 52207915, -437346630, -666018004, -2043170752, 1241009014, 879655623, -1601019036, -1233902541, 17763596, -1169198420, 1209444264, 223198074, 1327])) `shouldBe` "6c4e54a62bd9e15a47adccd2e002d8c0a12b031c9ebae5ee5f2cd84db04086374b7649f87ac7346e6364a0922433b6740d0c010f72acba4fa7a84816bb7a0d4d052f" it "blank" $ do ( signUnsafe signer " ") `shouldBe` "d5295349168cdb6fdbdb9c1984836cc1db939dda1dd6e18112db007154db8065b25583c71bd952f88f24f2515fbc4bb3037e5cedd5ef33cd336960b6a655537304bf" it "symbols" $ do ( signUnsafe signer "!@#$%^&*()-=_{}[]\"'1234567890.,%:?<>/\\") `shouldBe` "61b8260b9d5d7cce8e1c0262f0722b8114a7b3e233d76f4b93d08933a89d23d73acfb2d960966b0c175a8604e7c71c391b7f2a64743b3c3b11c5d07ed224445300b3" it "specSymbols" $ do ( signUnsafe signer "\n\n\n\n\t\t\t\t\n\n\n\n") `shouldBe` "c37c96e02f8678a13a43a3bade0ba77275da0d9869d18856daaf4b413106a9bfea74054462d851a0c5a2596dbf9c371284c61b3741b35343c91d2978db328c2f00c9" describe "Montgomery" $ do it "multiplication" $ do ( multiplication (fromList [-1476460488, -1118323957, 1120423587, -1596341302, 43673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]) (fromList [887153153, 1663090240, 2023161700, -1792225711, -2037349738, 431338827, 936480955, 1341971236, 1200687489, 795067959, -325209191, 1292772351, 905855361, -230695685, -1798442900, 313894787, 1080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390]) 3397655043) `shouldBe` (fromList [629254954, -1321769800, 1900654924, 2056436422, 1791614990, 475542676, 547583796, 1358516486, 1650142553, -1578392030, -1395505261, 1389520284, -494774702, 536840267, 790850704, -1567780526, 64, 0]) it "exponentaion" $ do ( exponentation (fromList [-1476460488, -1118323957, 1120423587, -1596341302, 43673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]) (fromList [137802365, 260873917, 45018536, 458828140, 936357922, 329776834, 197077425, 1505777544, -375079653, -869392973, -527458209, -442374499, -1678873588, -1864144942, 1488834064, -1154962690, 191]) (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390]) ) `shouldBe` (fromList [1420192846, -514184231, -858634323, -658448382, 52207915, -437346630, -666018004, -2043170752, 1241009014, 879655623, -1601019036, -1233902541, 17763596, -1169198420, 1209444264, 223198074, 1327]) describe "Algebra" $ do it "reminder" $ do ( remainder (fromList [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]) (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390]) ) `shouldBe` (fromList [1602626370, 296859807, -1933305503, 1018504923, 2106164031, -469194707, 1605789230, 1881367321, 127989226, -1751912682, 2087886977, 1741983051, -1090589209, 1428161158, 647631356, -121976833, 889, 0]) it "getBitsCount" $ do ( getBitsCount (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390] :: Vector Int32)) `shouldBe` 523 it "getBitsCount" $ do ( getBitsCount (fromList [358612992, 665591836, -1510579840, 147338015, -1850563067, 1187214131, 1897113940, 1352120439, 1008856147, -699365327, 728655692, 1920188107, -1574081077, 1434731111, 578236801, -2056657979, 1377953062, 0] :: Vector Int32)) `shouldBe` 543 it "comparison with equal length" $ do ( compareLists (fromList [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]) (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390]) ) `shouldBe` GT it "comparison with different length" $ do ( compareLists (fromList [358612992, 665591836, -1510579840, 147338015, -1850563067, 1187214131, 1897113940, 1352120439, 1008856147, -699365327, 728655692, 1920188107, -1574081077, 1434731111, 578236801, -2056657979, 1377953062, 0]) (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390]) ) `shouldBe` GT it "sub" $ do ( sub (fromList [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]) (fromList [-358612992, -665591837, 1510579839, -147338016, 1850563066, -1187214132, -1897113941, -1352120440, -1008856148, 699365326, -728655693, -1920188108, 1574081076, -1434731112, -578236802, 2056657978, -1377953063, 0]) ) `shouldBe` (fromList [358612992, 665591836, -1510579840, 147338015, -1850563067, 1187214131, 1897113940, 1352120439, 1008856147, -699365327, 728655692, 1920188107, -1574081077, 1434731111, 578236801, -2056657979, 1377953062, 0]) it "shiftRight" $ do ( shiftRight (fromList [-717225984, -1331183673, -1273807617, -294676032, -593841163, 1920539032, 500739415, 1590726417, -2017712295, 1398730653, -1457311386, 454591081, -1146805143, 1425505072, -1156473603, -181651339, 1539061170, 1])) `shouldBe` (fromList [-358612992, -665591837, 1510579839, -147338016, 1850563066, -1187214132, -1897113941, -1352120440, -1008856148, 699365326, -728655693, -1920188108, 1574081076, -1434731112, -578236802, 2056657978, -1377953063, 0]) it "shift" $ do ( shift (fromList [-1627447467, 1291058882, -1100545328, 1792006073, -463051918, 1656053193, 1111245943, -258120325, 2076079646, -1933207219, 1644799652, -1802394516, -571686162, 1182004563, -1327376660, -254358572, 1390]) 22) `shouldBe` (fromList [-717225984, -1331183673, -1273807617, -294676032, -593841163, 1920539032, 500739415, 1590726417, -2017712295, 1398730653, -1457311386, 454591081, -1146805143, 1425505072, -1156473603, -181651339, 1539061170, 1])