diff options
Diffstat (limited to 'Data/OpenPGP/Internal.hs')
-rw-r--r-- | Data/OpenPGP/Internal.hs | 86 |
1 files changed, 74 insertions, 12 deletions
diff --git a/Data/OpenPGP/Internal.hs b/Data/OpenPGP/Internal.hs index a4cdc10..a62923a 100644 --- a/Data/OpenPGP/Internal.hs +++ b/Data/OpenPGP/Internal.hs | |||
@@ -1,17 +1,47 @@ | |||
1 | {-# LANGUAGE BangPatterns, MagicHash #-} | 1 | {-# LANGUAGE BangPatterns #-} |
2 | {-# LANGUAGE CPP #-} | ||
3 | {-# LANGUAGE MagicHash #-} | ||
2 | module Data.OpenPGP.Internal where | 4 | module Data.OpenPGP.Internal where |
3 | 5 | ||
4 | import Data.Bits | 6 | import Data.Bits |
5 | import qualified Data.ByteString as BS | 7 | import qualified Data.ByteString as BS |
6 | import qualified Data.ByteString.Internal as BS | 8 | import qualified Data.ByteString.Internal as BS |
7 | import Data.Word | 9 | import qualified Data.ByteString.Lazy as BL |
8 | import Foreign.ForeignPtr | 10 | import Data.Char |
9 | import Foreign.Ptr | 11 | import Data.Int |
10 | import Foreign.Storable | 12 | import Data.Word |
11 | import GHC.Exts | 13 | import Foreign.ForeignPtr |
12 | import GHC.Integer.GMP.Internals | 14 | import Foreign.Ptr |
13 | import System.Endian | 15 | import Foreign.Storable |
14 | import System.IO.Unsafe | 16 | import GHC.Exts |
17 | import GHC.Integer.GMP.Internals | ||
18 | import System.Endian | ||
19 | import System.IO.Unsafe | ||
20 | import Numeric (showHex) | ||
21 | |||
22 | #if defined(VERSION_cryptonite) | ||
23 | import qualified Data.ByteArray as Bytes | ||
24 | import Crypto.Hash.Algorithms | ||
25 | import Crypto.Hash | ||
26 | import Crypto.Error | ||
27 | #else | ||
28 | import qualified Data.Byteable as Vincent | ||
29 | import Crypto.Hash.SHA1 as SHA1 | ||
30 | #endif | ||
31 | |||
32 | #ifdef CEREAL | ||
33 | import qualified Data.ByteString as B | ||
34 | import qualified Data.ByteString.UTF8 as B (fromString, toString) | ||
35 | import Data.Serialize | ||
36 | #define BINARY_CLASS Serialize | ||
37 | #else | ||
38 | import Data.Binary | ||
39 | import Data.Binary.Get | ||
40 | import Data.Binary.Put | ||
41 | import qualified Data.ByteString.Lazy as B | ||
42 | import qualified Data.ByteString.Lazy.UTF8 as B (fromString, toString) | ||
43 | #define BINARY_CLASS Binary | ||
44 | #endif | ||
15 | 45 | ||
16 | 46 | ||
17 | 47 | ||
@@ -91,3 +121,35 @@ integerToLE i = BS.unsafeCreate (I# (word2Int# (sizeInBaseInteger i 256#))) $ \p | |||
91 | let Ptr addr = ptr | 121 | let Ptr addr = ptr |
92 | cnt <- exportIntegerToAddr i addr 0# | 122 | cnt <- exportIntegerToAddr i addr 0# |
93 | return () | 123 | return () |
124 | |||
125 | toStrictBS :: B.ByteString -> BS.ByteString | ||
126 | toStrictBS = BS.concat . B.toChunks | ||
127 | |||
128 | checksum :: B.ByteString -> Word16 | ||
129 | checksum = fromIntegral . | ||
130 | B.foldl (\c i -> (c + fromIntegral i) `mod` 65536) (0::Integer) | ||
131 | |||
132 | |||
133 | checksumForKey :: Word8 {- s2k_usage byte -} -> (Int64, B.ByteString -> BS.ByteString) | ||
134 | checksumForKey 254 = (20, sha1 . toStrictBS) | ||
135 | where | ||
136 | #if defined(VERSION_cryptonite) | ||
137 | sha1 x = Bytes.convert (hash x :: Digest SHA1) | ||
138 | #else | ||
139 | sha1 = SHA1.hash | ||
140 | #endif | ||
141 | checksumForKey _ = (2, toStrictBS . encode . checksum) | ||
142 | -- Words16s are written as 2 bytes in big-endian (network) order | ||
143 | |||
144 | hexString :: [Word8] -> String | ||
145 | hexString = foldr (pad `oo` showHex) "" | ||
146 | where | ||
147 | pad s | odd $ length s = '0':s | ||
148 | | otherwise = s | ||
149 | |||
150 | oo :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c | ||
151 | oo = (.) . (.) | ||
152 | |||
153 | hexify :: BS.ByteString -> String | ||
154 | hexify = map toUpper . hexString . BS.unpack | ||
155 | |||