summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2013-12-14 23:14:16 -0500
committerjoe <joe@jerkface.net>2013-12-14 23:14:16 -0500
commit6b42fc6904d05979c409c0043d6d7b2eed22b58c (patch)
tree0cccb442aa3ab4f17ee54e63ae80ca240fbb5b8e
parentce0d32ef83ccf15198bdd5248faa02abbcf2f769 (diff)
Refactoring.
-rw-r--r--Data/OpenPGP/Util/Base.hs67
-rw-r--r--Data/OpenPGP/Util/DecryptSecretKey.hs26
-rw-r--r--Data/OpenPGP/Util/Sign.hs56
-rw-r--r--Data/OpenPGP/Util/Verify.hs66
4 files changed, 72 insertions, 143 deletions
diff --git a/Data/OpenPGP/Util/Base.hs b/Data/OpenPGP/Util/Base.hs
new file mode 100644
index 0000000..802d503
--- /dev/null
+++ b/Data/OpenPGP/Util/Base.hs
@@ -0,0 +1,67 @@
1module Data.OpenPGP.Util.Base where
2
3import qualified Data.ByteString as BS
4import qualified Data.ByteString.Lazy as LZ
5import Data.Binary (encode)
6
7import Data.OpenPGP as OpenPGP
8import Crypto.Hash.MD5 as MD5
9import Crypto.Hash.SHA1 as SHA1
10import Crypto.Hash.SHA256 as SHA256
11import Crypto.Hash.SHA384 as SHA384
12import Crypto.Hash.SHA512 as SHA512
13import Crypto.Hash.SHA224 as SHA224
14import Crypto.Hash.RIPEMD160 as RIPEMD160
15import qualified Crypto.PubKey.RSA as Vincent.RSA
16import Crypto.PubKey.HashDescr as Vincent
17
18import Data.OpenPGP.Util.Fingerprint (fingerprint)
19
20hashBySymbol OpenPGP.MD5 = MD5.hashlazy
21hashBySymbol OpenPGP.SHA1 = SHA1.hashlazy
22hashBySymbol OpenPGP.SHA256 = SHA256.hashlazy
23hashBySymbol OpenPGP.SHA384 = SHA384.hashlazy
24hashBySymbol OpenPGP.SHA512 = SHA512.hashlazy
25hashBySymbol OpenPGP.SHA224 = SHA224.hashlazy
26hashBySymbol OpenPGP.RIPEMD160 = RIPEMD160.hashlazy
27
28toStrictBS :: LZ.ByteString -> BS.ByteString
29toStrictBS = BS.concat . LZ.toChunks
30
31toLazyBS :: BS.ByteString -> LZ.ByteString
32toLazyBS = LZ.fromChunks . (:[])
33
34find_key :: OpenPGP.Message -> String -> Maybe OpenPGP.Packet
35find_key = OpenPGP.find_key fingerprint
36
37
38
39keyParam :: Char -> OpenPGP.Packet -> Integer
40keyParam c k = fromJustMPI $ lookup c (OpenPGP.key k)
41 where
42 fromJustMPI :: Maybe OpenPGP.MPI -> Integer
43 fromJustMPI (Just (OpenPGP.MPI x)) = x
44 fromJustMPI _ = error "Not a Just MPI, Data.OpenPGP.CryptoAPI"
45
46integerBytesize :: Integer -> Int
47integerBytesize i = fromIntegral $ LZ.length (encode (OpenPGP.MPI i)) - 2
48
49rsaKey :: OpenPGP.Packet -> Vincent.RSA.PublicKey
50rsaKey k =
51 Vincent.RSA.PublicKey (integerBytesize n) n (keyParam 'e' k)
52 where
53 n = keyParam 'n' k
54
55-- http://tools.ietf.org/html/rfc3447#page-43
56-- http://tools.ietf.org/html/rfc4880#section-5.2.2
57hashAlgoDesc OpenPGP.MD5 = Vincent.hashDescrMD5
58hashAlgoDesc OpenPGP.SHA1 = Vincent.hashDescrSHA1
59hashAlgoDesc OpenPGP.RIPEMD160 = Vincent.hashDescrRIPEMD160
60hashAlgoDesc OpenPGP.SHA256 = Vincent.hashDescrSHA256
61hashAlgoDesc OpenPGP.SHA384 = Vincent.hashDescrSHA384
62hashAlgoDesc OpenPGP.SHA512 = Vincent.hashDescrSHA512
63hashAlgoDesc OpenPGP.SHA224 = Vincent.hashDescrSHA224
64hashAlgoDesc _ =
65 error "Unsupported HashAlgorithm in hashAlgoDesc"
66
67
diff --git a/Data/OpenPGP/Util/DecryptSecretKey.hs b/Data/OpenPGP/Util/DecryptSecretKey.hs
index 0ba89d2..4370ffc 100644
--- a/Data/OpenPGP/Util/DecryptSecretKey.hs
+++ b/Data/OpenPGP/Util/DecryptSecretKey.hs
@@ -3,22 +3,14 @@ module Data.OpenPGP.Util.DecryptSecretKey where
3import qualified Data.OpenPGP as OpenPGP 3import qualified Data.OpenPGP as OpenPGP
4import qualified Data.ByteString as BS 4import qualified Data.ByteString as BS
5import qualified Data.ByteString.Lazy as LZ 5import qualified Data.ByteString.Lazy as LZ
6import Data.Word (Word16,Word8) 6import Data.Word (Word16)
7import Data.Char (toUpper)
8import Control.Monad (foldM) 7import Control.Monad (foldM)
9import Numeric (showHex)
10import Data.Binary (get,Binary,Get) 8import Data.Binary (get,Binary,Get)
11import Data.Binary.Get (runGetOrFail) 9import Data.Binary.Get (runGetOrFail)
12import qualified Data.Serialize as Serialize 10import qualified Data.Serialize as Serialize
13import Control.Applicative ( (<$>) ) 11import Control.Applicative ( (<$>) )
14 12
15import Crypto.Hash.MD5 as MD5
16import Crypto.Hash.SHA1 as SHA1 13import Crypto.Hash.SHA1 as SHA1
17import Crypto.Hash.SHA256 as SHA256
18import Crypto.Hash.SHA384 as SHA384
19import Crypto.Hash.SHA512 as SHA512
20import Crypto.Hash.SHA224 as SHA224
21import Crypto.Hash.RIPEMD160 as RIPEMD160
22 14
23import qualified Crypto.Cipher.AES as Vincent 15import qualified Crypto.Cipher.AES as Vincent
24import qualified Crypto.Cipher.Blowfish as Vincent 16import qualified Crypto.Cipher.Blowfish as Vincent
@@ -28,16 +20,9 @@ import qualified Data.Byteable as Vincent
28 20
29import Crypto.Cipher.Cast5 (CAST5_128) 21import Crypto.Cipher.Cast5 (CAST5_128)
30import Crypto.Cipher.ThomasToVincent 22import Crypto.Cipher.ThomasToVincent
23import Data.OpenPGP.Util.Base (toStrictBS,toLazyBS,hashBySymbol)
31 24
32 25
33hashBySymbol OpenPGP.MD5 = MD5.hashlazy
34hashBySymbol OpenPGP.SHA1 = SHA1.hashlazy
35hashBySymbol OpenPGP.SHA256 = SHA256.hashlazy
36hashBySymbol OpenPGP.SHA384 = SHA384.hashlazy
37hashBySymbol OpenPGP.SHA512 = SHA512.hashlazy
38hashBySymbol OpenPGP.SHA224 = SHA224.hashlazy
39hashBySymbol OpenPGP.RIPEMD160 = RIPEMD160.hashlazy
40
41 26
42 27
43data Enciphered = 28data Enciphered =
@@ -94,13 +79,6 @@ decryptSecretKey pass k@(OpenPGP.SecretKeyPacket {
94 79
95decryptSecretKey _ _ = Nothing 80decryptSecretKey _ _ = Nothing
96 81
97toStrictBS :: LZ.ByteString -> BS.ByteString
98toStrictBS = BS.concat . LZ.toChunks
99
100toLazyBS :: BS.ByteString -> LZ.ByteString
101toLazyBS = LZ.fromChunks . (:[])
102
103
104 82
105string2sdecrypt :: OpenPGP.SymmetricAlgorithm -> OpenPGP.S2K -> LZ.ByteString -> Enciphered -> LZ.ByteString 83string2sdecrypt :: OpenPGP.SymmetricAlgorithm -> OpenPGP.S2K -> LZ.ByteString -> Enciphered -> LZ.ByteString
106string2sdecrypt OpenPGP.AES128 s2k s = withIV $ simpleUnCFB (string2key s2k s :: Vincent.AES128) 84string2sdecrypt OpenPGP.AES128 s2k s = withIV $ simpleUnCFB (string2key s2k s :: Vincent.AES128)
diff --git a/Data/OpenPGP/Util/Sign.hs b/Data/OpenPGP/Util/Sign.hs
index ef7d16b..e492f95 100644
--- a/Data/OpenPGP/Util/Sign.hs
+++ b/Data/OpenPGP/Util/Sign.hs
@@ -17,28 +17,8 @@ import qualified Crypto.Random as Vincent
17import qualified Crypto.PubKey.DSA as Vincent.DSA 17import qualified Crypto.PubKey.DSA as Vincent.DSA
18import qualified Crypto.PubKey.RSA as Vincent.RSA 18import qualified Crypto.PubKey.RSA as Vincent.RSA
19import qualified Crypto.PubKey.RSA.PKCS15 as Vincent.RSA 19import qualified Crypto.PubKey.RSA.PKCS15 as Vincent.RSA
20import Crypto.PubKey.HashDescr as Vincent 20
21 21import Data.OpenPGP.Util.Base
22import Crypto.Hash.MD5 as MD5
23import Crypto.Hash.SHA1 as SHA1
24import Crypto.Hash.SHA256 as SHA256
25import Crypto.Hash.SHA384 as SHA384
26import Crypto.Hash.SHA512 as SHA512
27import Crypto.Hash.SHA224 as SHA224
28import Crypto.Hash.RIPEMD160 as RIPEMD160
29
30hashAlgoDesc OpenPGP.MD5 = Vincent.hashDescrMD5
31hashAlgoDesc OpenPGP.SHA1 = Vincent.hashDescrSHA1
32hashAlgoDesc OpenPGP.RIPEMD160 = Vincent.hashDescrRIPEMD160
33hashAlgoDesc OpenPGP.SHA256 = Vincent.hashDescrSHA256
34hashAlgoDesc OpenPGP.SHA384 = Vincent.hashDescrSHA384
35hashAlgoDesc OpenPGP.SHA512 = Vincent.hashDescrSHA512
36hashAlgoDesc OpenPGP.SHA224 = Vincent.hashDescrSHA224
37hashAlgoDesc _ =
38 error "Unsupported HashAlgorithm in hashAlgoDesc"
39
40find_key :: OpenPGP.Message -> String -> Maybe OpenPGP.Packet
41find_key = OpenPGP.find_key fingerprint
42 22
43 23
44privateDSAkey :: OpenPGP.Packet -> Vincent.DSA.PrivateKey 24privateDSAkey :: OpenPGP.Packet -> Vincent.DSA.PrivateKey
@@ -58,38 +38,6 @@ privateRSAkey k =
58 q = keyParam 'q' k 38 q = keyParam 'q' k
59 pubkey = rsaKey k 39 pubkey = rsaKey k
60 40
61rsaKey :: OpenPGP.Packet -> Vincent.RSA.PublicKey
62rsaKey k =
63 Vincent.RSA.PublicKey (integerBytesize n) n (keyParam 'e' k)
64 where
65 n = keyParam 'n' k
66
67integerBytesize :: Integer -> Int
68integerBytesize i = fromIntegral $ LZ.length (encode (OpenPGP.MPI i)) - 2
69
70
71toStrictBS :: LZ.ByteString -> BS.ByteString
72toStrictBS = BS.concat . LZ.toChunks
73
74toLazyBS :: BS.ByteString -> LZ.ByteString
75toLazyBS = LZ.fromChunks . (:[])
76
77
78keyParam :: Char -> OpenPGP.Packet -> Integer
79keyParam c k = fromJustMPI $ lookup c (OpenPGP.key k)
80fromJustMPI :: Maybe OpenPGP.MPI -> Integer
81fromJustMPI (Just (OpenPGP.MPI x)) = x
82fromJustMPI _ = error "Not a Just MPI, Data.OpenPGP.CryptoAPI"
83
84hashBySymbol OpenPGP.MD5 = MD5.hashlazy
85hashBySymbol OpenPGP.SHA1 = SHA1.hashlazy
86hashBySymbol OpenPGP.SHA256 = SHA256.hashlazy
87hashBySymbol OpenPGP.SHA384 = SHA384.hashlazy
88hashBySymbol OpenPGP.SHA512 = SHA512.hashlazy
89hashBySymbol OpenPGP.SHA224 = SHA224.hashlazy
90hashBySymbol OpenPGP.RIPEMD160 = RIPEMD160.hashlazy
91
92
93 41
94 42
95-- | Make a signature 43-- | Make a signature
diff --git a/Data/OpenPGP/Util/Verify.hs b/Data/OpenPGP/Util/Verify.hs
index 137c00f..2367570 100644
--- a/Data/OpenPGP/Util/Verify.hs
+++ b/Data/OpenPGP/Util/Verify.hs
@@ -6,69 +6,18 @@ import Data.Binary (encode)
6import Control.Monad 6import Control.Monad
7import qualified Data.ByteString as BS 7import qualified Data.ByteString as BS
8import qualified Data.ByteString.Lazy as LZ 8import qualified Data.ByteString.Lazy as LZ
9import Data.Monoid ( (<>) )
10
11import Data.OpenPGP.Util.Fingerprint (fingerprint)
12 9
13import qualified Crypto.PubKey.DSA as Vincent.DSA 10import qualified Crypto.PubKey.DSA as Vincent.DSA
14import qualified Crypto.PubKey.RSA as Vincent.RSA
15import qualified Crypto.PubKey.RSA.PKCS15 as Vincent.RSA 11import qualified Crypto.PubKey.RSA.PKCS15 as Vincent.RSA
16import Crypto.PubKey.HashDescr as Vincent
17
18import Crypto.Hash.MD5 as MD5
19import Crypto.Hash.SHA1 as SHA1
20import Crypto.Hash.SHA256 as SHA256
21import Crypto.Hash.SHA384 as SHA384
22import Crypto.Hash.SHA512 as SHA512
23import Crypto.Hash.SHA224 as SHA224
24import Crypto.Hash.RIPEMD160 as RIPEMD160
25
26hashBySymbol OpenPGP.MD5 = MD5.hashlazy
27hashBySymbol OpenPGP.SHA1 = SHA1.hashlazy
28hashBySymbol OpenPGP.SHA256 = SHA256.hashlazy
29hashBySymbol OpenPGP.SHA384 = SHA384.hashlazy
30hashBySymbol OpenPGP.SHA512 = SHA512.hashlazy
31hashBySymbol OpenPGP.SHA224 = SHA224.hashlazy
32hashBySymbol OpenPGP.RIPEMD160 = RIPEMD160.hashlazy
33
34
35toStrictBS :: LZ.ByteString -> BS.ByteString
36toStrictBS = BS.concat . LZ.toChunks
37
38toLazyBS :: BS.ByteString -> LZ.ByteString
39toLazyBS = LZ.fromChunks . (:[])
40
41hush :: Either a b -> Maybe b
42hush (Left _) = Nothing
43hush (Right x) = Just x
44
45fromJustMPI :: Maybe OpenPGP.MPI -> Integer
46fromJustMPI (Just (OpenPGP.MPI x)) = x
47fromJustMPI _ = error "Not a Just MPI, Data.OpenPGP.CryptoAPI"
48 12
13import Data.OpenPGP.Util.Base
49 14
50 15
51find_key :: OpenPGP.Message -> String -> Maybe OpenPGP.Packet
52find_key = OpenPGP.find_key fingerprint
53
54integerBytesize :: Integer -> Int
55integerBytesize i = fromIntegral $ LZ.length (encode (OpenPGP.MPI i)) - 2
56
57dsaKey :: OpenPGP.Packet -> Vincent.DSA.PublicKey 16dsaKey :: OpenPGP.Packet -> Vincent.DSA.PublicKey
58dsaKey k = Vincent.DSA.PublicKey 17dsaKey k = Vincent.DSA.PublicKey
59 (Vincent.DSA.Params (keyParam 'p' k) (keyParam 'g' k) (keyParam 'q' k)) 18 (Vincent.DSA.Params (keyParam 'p' k) (keyParam 'g' k) (keyParam 'q' k))
60 (keyParam 'y' k) 19 (keyParam 'y' k)
61 20
62rsaKey :: OpenPGP.Packet -> Vincent.RSA.PublicKey
63rsaKey k =
64 Vincent.RSA.PublicKey (integerBytesize n) n (keyParam 'e' k)
65 where
66 n = keyParam 'n' k
67
68
69keyParam :: Char -> OpenPGP.Packet -> Integer
70keyParam c k = fromJustMPI $ lookup c (OpenPGP.key k)
71
72 21
73-- | Verify a message signature 22-- | Verify a message signature
74verify :: 23verify ::
@@ -100,16 +49,3 @@ verifyOne keys sig over = fmap (const sig) $ maybeKey >>= verification >>= guard
100 hash_algo = OpenPGP.hash_algorithm sig 49 hash_algo = OpenPGP.hash_algorithm sig
101 maybeKey = OpenPGP.signature_issuer sig >>= find_key keys 50 maybeKey = OpenPGP.signature_issuer sig >>= find_key keys
102 51
103-- http://tools.ietf.org/html/rfc3447#page-43
104-- http://tools.ietf.org/html/rfc4880#section-5.2.2
105hashAlgoDesc OpenPGP.MD5 = Vincent.hashDescrMD5
106hashAlgoDesc OpenPGP.SHA1 = Vincent.hashDescrSHA1
107hashAlgoDesc OpenPGP.RIPEMD160 = Vincent.hashDescrRIPEMD160
108hashAlgoDesc OpenPGP.SHA256 = Vincent.hashDescrSHA256
109hashAlgoDesc OpenPGP.SHA384 = Vincent.hashDescrSHA384
110hashAlgoDesc OpenPGP.SHA512 = Vincent.hashDescrSHA512
111hashAlgoDesc OpenPGP.SHA224 = Vincent.hashDescrSHA224
112hashAlgoDesc _ =
113 error "Unsupported HashAlgorithm in hashAlgoDesc"
114
115