summaryrefslogtreecommitdiff
path: root/Data/OpenPGP/Internal.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Data/OpenPGP/Internal.hs')
-rw-r--r--Data/OpenPGP/Internal.hs86
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 #-}
2module Data.OpenPGP.Internal where 4module Data.OpenPGP.Internal where
3 5
4import Data.Bits 6import Data.Bits
5import qualified Data.ByteString as BS 7import qualified Data.ByteString as BS
6import qualified Data.ByteString.Internal as BS 8import qualified Data.ByteString.Internal as BS
7import Data.Word 9import qualified Data.ByteString.Lazy as BL
8import Foreign.ForeignPtr 10import Data.Char
9import Foreign.Ptr 11import Data.Int
10import Foreign.Storable 12import Data.Word
11import GHC.Exts 13import Foreign.ForeignPtr
12import GHC.Integer.GMP.Internals 14import Foreign.Ptr
13import System.Endian 15import Foreign.Storable
14import System.IO.Unsafe 16import GHC.Exts
17import GHC.Integer.GMP.Internals
18import System.Endian
19import System.IO.Unsafe
20import Numeric (showHex)
21
22#if defined(VERSION_cryptonite)
23import qualified Data.ByteArray as Bytes
24import Crypto.Hash.Algorithms
25import Crypto.Hash
26import Crypto.Error
27#else
28import qualified Data.Byteable as Vincent
29import Crypto.Hash.SHA1 as SHA1
30#endif
31
32#ifdef CEREAL
33import qualified Data.ByteString as B
34import qualified Data.ByteString.UTF8 as B (fromString, toString)
35import Data.Serialize
36#define BINARY_CLASS Serialize
37#else
38import Data.Binary
39import Data.Binary.Get
40import Data.Binary.Put
41import qualified Data.ByteString.Lazy as B
42import 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
125toStrictBS :: B.ByteString -> BS.ByteString
126toStrictBS = BS.concat . B.toChunks
127
128checksum :: B.ByteString -> Word16
129checksum = fromIntegral .
130 B.foldl (\c i -> (c + fromIntegral i) `mod` 65536) (0::Integer)
131
132
133checksumForKey :: Word8 {- s2k_usage byte -} -> (Int64, B.ByteString -> BS.ByteString)
134checksumForKey 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
141checksumForKey _ = (2, toStrictBS . encode . checksum)
142 -- Words16s are written as 2 bytes in big-endian (network) order
143
144hexString :: [Word8] -> String
145hexString = 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
153hexify :: BS.ByteString -> String
154hexify = map toUpper . hexString . BS.unpack
155