diff options
author | Andrew Cady <d@jerkface.net> | 2019-07-13 15:22:45 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2019-07-13 15:41:12 -0400 |
commit | 006d1f0b7f36c25a91006fce24cbe76416fcee86 (patch) | |
tree | bf3e95582edf806677c6aaf56c825ba33c2c2974 /lib/Base58.hs | |
parent | 495d9fbac3d633b768d910fced5cf00d00118fa0 (diff) |
no cpp needed, since my love is unconditional
Diffstat (limited to 'lib/Base58.hs')
-rw-r--r-- | lib/Base58.hs | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/lib/Base58.hs b/lib/Base58.hs index 2de841d..9af3eb5 100644 --- a/lib/Base58.hs +++ b/lib/Base58.hs | |||
@@ -1,12 +1,7 @@ | |||
1 | {-# LANGUAGE CPP #-} | ||
2 | module Base58 where | 1 | module Base58 where |
3 | 2 | ||
4 | #if !defined(VERSION_cryptonite) | ||
5 | import qualified Crypto.Hash.SHA256 as SHA256 | ||
6 | #else | ||
7 | import Crypto.Hash | 3 | import Crypto.Hash |
8 | import Data.ByteArray (convert) | 4 | import Data.ByteArray (convert) |
9 | #endif | ||
10 | import qualified Data.ByteString as S | 5 | import qualified Data.ByteString as S |
11 | import Data.Maybe | 6 | import Data.Maybe |
12 | import Data.List | 7 | import Data.List |
@@ -20,7 +15,7 @@ base58digits :: [Char] -> Maybe [Int] | |||
20 | base58digits str = sequence mbs | 15 | base58digits str = sequence mbs |
21 | where | 16 | where |
22 | mbs = map (flip elemIndex base58chars) str | 17 | mbs = map (flip elemIndex base58chars) str |
23 | 18 | ||
24 | -- 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ | 19 | -- 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ |
25 | base58_decode :: [Char] -> Maybe (Word8,[Word8]) | 20 | base58_decode :: [Char] -> Maybe (Word8,[Word8]) |
26 | base58_decode str = do | 21 | base58_decode str = do |
@@ -31,16 +26,12 @@ base58_decode str = do | |||
31 | guard (d/=0) | 26 | guard (d/=0) |
32 | let (q,b) = d `divMod` 256 | 27 | let (q,b) = d `divMod` 256 |
33 | return (fromIntegral b,q) | 28 | return (fromIntegral b,q) |
34 | 29 | ||
35 | let (rcksum,rpayload) = splitAt 4 $ rbytes | 30 | let (rcksum,rpayload) = splitAt 4 $ rbytes |
36 | a_payload = reverse rpayload | 31 | a_payload = reverse rpayload |
37 | #if !defined(VERSION_cryptonite) | ||
38 | hash_result = S.take 4 . SHA256.hash . SHA256.hash . S.pack $ a_payload | ||
39 | #else | ||
40 | hash_result = S.take 4 . convert $ digest | 32 | hash_result = S.take 4 . convert $ digest |
41 | where digest = hash diges1 :: Digest SHA256 | 33 | where digest = hash diges1 :: Digest SHA256 |
42 | diges1 = hash (S.pack a_payload) :: Digest SHA256 | 34 | diges1 = hash (S.pack a_payload) :: Digest SHA256 |
43 | #endif | ||
44 | expected_hash = S.pack $ reverse rcksum | 35 | expected_hash = S.pack $ reverse rcksum |
45 | (network_id,payload) = splitAt 1 a_payload | 36 | (network_id,payload) = splitAt 1 a_payload |
46 | network_id <- listToMaybe network_id | 37 | network_id <- listToMaybe network_id |
@@ -51,13 +42,9 @@ base58_encode :: S.ByteString -> String | |||
51 | base58_encode hsh = replicate zcount '1' ++ map (base58chars !!) (reverse rdigits) | 42 | base58_encode hsh = replicate zcount '1' ++ map (base58chars !!) (reverse rdigits) |
52 | where | 43 | where |
53 | zcount = S.length . S.takeWhile (==0) $ hsh | 44 | zcount = S.length . S.takeWhile (==0) $ hsh |
54 | #if !defined(VERSION_cryptonite) | ||
55 | cksum = S.take 4 . SHA256.hash . SHA256.hash $ hsh | ||
56 | #else | ||
57 | cksum = S.take 4 (convert digest2 :: S.ByteString) | 45 | cksum = S.take 4 (convert digest2 :: S.ByteString) |
58 | where digest2 = hash ( convert digest1 :: S.ByteString) :: Digest SHA256 | 46 | where digest2 = hash ( convert digest1 :: S.ByteString) :: Digest SHA256 |
59 | digest1 = hash hsh :: Digest SHA256 | 47 | digest1 = hash hsh :: Digest SHA256 |
60 | #endif | ||
61 | n = foldl' (\a b->a*256+b) 0 . map asInteger $ concatMap S.unpack [hsh, cksum] | 48 | n = foldl' (\a b->a*256+b) 0 . map asInteger $ concatMap S.unpack [hsh, cksum] |
62 | asInteger x = fromIntegral x :: Integer | 49 | asInteger x = fromIntegral x :: Integer |
63 | rdigits = unfoldr getdigit n | 50 | rdigits = unfoldr getdigit n |