summaryrefslogtreecommitdiff
path: root/Data/OpenPGP/Util/Ed25519.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Data/OpenPGP/Util/Ed25519.hs')
-rw-r--r--Data/OpenPGP/Util/Ed25519.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/Data/OpenPGP/Util/Ed25519.hs b/Data/OpenPGP/Util/Ed25519.hs
new file mode 100644
index 0000000..ed277c8
--- /dev/null
+++ b/Data/OpenPGP/Util/Ed25519.hs
@@ -0,0 +1,51 @@
1module Data.OpenPGP.Util.Ed25519 where
2
3import Crypto.Error
4import qualified Crypto.PubKey.Ed25519 as Ed25519
5import Data.OpenPGP.Internal -- (integerToBS,integerToLE,getBigNumLE)
6import qualified Data.OpenPGP as OpenPGP
7import Crypto.ECC.Edwards25519
8
9import qualified Data.ByteArray as BA
10import Control.Monad
11import qualified Data.ByteString as BS
12import qualified Data.ByteString.Lazy as BL
13import Data.List
14import Data.Int
15import Data.Word
16import Data.OpenPGP.Util.Base
17
18import Text.Printf
19import Numeric
20import Data.Char
21import System.IO
22
23import Foreign.Ptr
24import System.IO.Unsafe
25
26import Crypto.Cipher.SBox
27
28ed25519Key :: OpenPGP.Packet -> Maybe Ed25519.PublicKey
29ed25519Key k = case Ed25519.publicKey $ integerToBS $ keyParam 'n' k of
30 CryptoPassed ed25519 -> Just ed25519
31 CryptoFailed err -> Nothing
32
33ed25519sig sig =
34 let [OpenPGP.MPI r,OpenPGP.MPI s] = OpenPGP.signature sig
35 -- rbs = BS.pack $ take 32 $ rbytes r ++ repeat 0
36 -- sbs = BS.pack $ take 32 $ rbytes s ++ repeat 0
37 rbs = let r' = integerToBS r in BS.replicate (32 - BS.length r') 0 <> r'
38 sbs = let s' = integerToBS s in BS.replicate (32 - BS.length s') 0 <> s'
39 in case Ed25519.signature (rbs <> sbs) of
40 CryptoPassed sig -> Just sig
41 CryptoFailed err -> Nothing
42
43ed25519Verify :: OpenPGP.Packet -> BS.ByteString -> OpenPGP.Packet -> Maybe Bool
44ed25519Verify sig over k = do
45 let hashbs = hashBySymbol (OpenPGP.hash_algorithm sig) $ BL.fromChunks [over]
46 guard $ 0x2B06010401DA470F01 == keyParam 'c' k -- Only Ed25519 curve.
47 k' <- ed25519Key k -- SecretKeyPacket ???
48 sig' <- ed25519sig sig
49 let result = Ed25519.verify k' hashbs sig'
50 Just result
51