{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE OverloadedStrings #-} import Control.Arrow import Control.Monad import Data.Binary import Data.Binary.Get import Data.ByteString (ByteString) import Data.Bits import qualified Data.ByteArray as BA import qualified Data.ByteString.Char8 as B8 import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BL import Data.Char import Text.Show.Pretty import Numeric import Data.Int import Data.OpenPGP.Internal import Data.OpenPGP.Util import Data.OpenPGP.Util.Base import Data.OpenPGP as OpenPGP import Crypto.Cipher.SBox import Data.OpenPGP.Util.Ed25519 (zeroExtend,zeroPad) import qualified Crypto.PubKey.Curve25519 as Cv25519 import Crypto.Error import Crypto.Cipher.AES import Crypto.Cipher.Types import Data.OpenPGP.Util.DecryptSecretKey -- (withS2K, simpleUnCFB, Enciphered(..)) import Data.OpenPGP.Util.Cv25519 msg :: ByteString msg = [bytes| 84 5e 03 c2 69 bf c6 b5 ad 64 55 12 01 07 40 ed 3a 49 32 b5 2b 4e f5 c8 b1 3d 25 8c 73 c6 bc f3 16 c2 4d ed 23 3c ef ac 01 df ff ea 8a 38 75 30 ab 5e d2 7b eb 5c 1f 7d 65 9d 7b 84 b4 5e fb b9 43 81 29 d4 e9 ba 0d 08 34 be 95 40 9d 57 0c 85 0d 94 4c fe 42 21 a0 23 d9 70 3d a2 03 ec 0a d1 d2 70 01 95 06 62 3d 1b 66 ba 5b 67 b8 a7 2a b7 86 0b 28 94 18 c5 3b ef fc 2f e2 5d 87 78 80 9e 89 dc c7 e7 87 14 b8 bc 8c 9f 93 2f bb 2b c3 7c 3c da c5 32 32 bf 58 3f fa 7f 1c 53 b7 14 63 b7 1c 2e d6 29 c8 8e 15 a8 48 6d 97 a9 35 49 21 c7 73 20 b4 00 4e db 80 04 30 4a df 59 77 79 22 aa 0c 7c 08 a1 d0 d6 a7 30 9d e9 59 8d 2d 9f e8 c4 0c 2b |] keyring :: ByteString keyring = [bytes| 94 58 04 5d c8 7f 7e 16 09 2b 06 01 04 01 da 47 0f 01 01 07 40 bb a7 dc 2a e0 b0 ef 05 d1 69 07 31 b3 91 0d c9 69 38 6f 3f 97 e6 19 45 cb 6c 76 3b 15 29 f5 e5 00 01 00 96 eb 2a 5c d5 5b 65 25 e9 dd ed b8 58 1c e9 1e 75 f2 26 92 9d 9f 35 d7 35 a7 65 e5 41 44 f5 f5 11 a4 b4 18 47 75 79 20 54 2e 20 3c 67 75 79 40 65 78 61 6d 70 6c 65 2e 63 6f 6d 3e 88 90 04 13 16 08 00 38 16 21 04 00 7d a7 19 91 02 5a 09 bd da 46 78 38 ed ab 61 d8 66 c7 02 05 02 5d c8 7f 7e 02 1b 03 05 0b 09 08 07 02 06 15 0a 09 08 0b 02 04 16 02 03 01 02 1e 01 02 17 80 00 0a 09 10 38 ed ab 61 d8 66 c7 02 3e d4 00 ff 7a 88 a3 af cd 96 bd 46 b4 31 76 3c 40 35 1c ef 0b 0b 1d e2 66 03 7e 22 4c 32 34 f7 db dd 20 98 00 ff 55 20 65 55 ed 70 a4 a0 03 58 c3 1c 0a 12 63 b5 5c 3f f8 18 de 62 c8 0b e7 85 37 ee 8c 7a 2a 0d 9c 5d 04 5d c8 7f 7e 12 0a 2b 06 01 04 01 97 55 01 05 01 01 07 40 71 8a c9 e8 0d cf 0d d0 16 10 c2 26 50 f1 f4 1c 49 b4 af 4d aa 0e 06 2b 35 8c 1e 86 79 8c 25 31 03 01 08 07 00 00 ff 68 a2 f7 b1 31 2c 6a 09 82 f2 55 a2 44 cb d4 a1 0d 62 ef f0 77 18 68 d9 6c 86 c1 b2 c7 e1 4d 40 12 28 88 78 04 18 16 08 00 20 16 21 04 00 7d a7 19 91 02 5a 09 bd da 46 78 38 ed ab 61 d8 66 c7 02 05 02 5d c8 7f 7e 02 1b 0c 00 0a 09 10 38 ed ab 61 d8 66 c7 02 86 10 01 00 83 99 5d 74 90 f5 4a b5 74 bc 07 77 7a f7 25 14 3e 5e bf ae 52 99 0c 01 05 0b 4b 57 ee 95 02 1b 01 00 eb db e4 27 95 f9 a4 4f bc f0 ce cc 44 33 90 ab 42 0f aa ca 06 89 ce 48 f1 85 27 62 05 73 e3 03 |] expected_result = CompressedDataPacket { compression_algorithm = ZLIB , message = Message [ LiteralDataPacket { format = 'b' , filename = "secret-message.txt" , timestamp = 1573421489 , content = "This is a secret that will be encrypted.\n"} ] } main = do let Message [asym,encdta] = decode (BL.fromStrict msg) Message [ master -- ---Secret 007DA71991025A09BDDA467838EDAB61D866C702 Ed25519 , uid -- UserID "Guy T. " , uidsig -- Signature ^ signed: 38EDAB61D866C702 ["vouch-sign"] , ecdhkey -- SecretKey 8CF3B7D9CDCA47086F3C509AC269BFC6B5AD6455 ECC , ecdhsig -- Signature ^ signed: 38EDAB61D866C702 ["encrypt"] ] = decode (BL.fromStrict keyring) m = decryptMessage ecdhkey asym encdta print m putStrLn $ "decrypt cv25519: " ++ show (m == Just [expected_result])