summaryrefslogtreecommitdiff
path: root/lib/Base58.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Base58.hs')
-rw-r--r--lib/Base58.hs17
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 #-}
2module Base58 where 1module Base58 where
3 2
4#if !defined(VERSION_cryptonite)
5import qualified Crypto.Hash.SHA256 as SHA256
6#else
7import Crypto.Hash 3import Crypto.Hash
8import Data.ByteArray (convert) 4import Data.ByteArray (convert)
9#endif
10import qualified Data.ByteString as S 5import qualified Data.ByteString as S
11import Data.Maybe 6import Data.Maybe
12import Data.List 7import Data.List
@@ -20,7 +15,7 @@ base58digits :: [Char] -> Maybe [Int]
20base58digits str = sequence mbs 15base58digits 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
25base58_decode :: [Char] -> Maybe (Word8,[Word8]) 20base58_decode :: [Char] -> Maybe (Word8,[Word8])
26base58_decode str = do 21base58_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
51base58_encode hsh = replicate zcount '1' ++ map (base58chars !!) (reverse rdigits) 42base58_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