diff options
Diffstat (limited to 'Data/OpenPGP/Util/Ed25519.hs')
-rw-r--r-- | Data/OpenPGP/Util/Ed25519.hs | 51 |
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 @@ | |||
1 | module Data.OpenPGP.Util.Ed25519 where | ||
2 | |||
3 | import Crypto.Error | ||
4 | import qualified Crypto.PubKey.Ed25519 as Ed25519 | ||
5 | import Data.OpenPGP.Internal -- (integerToBS,integerToLE,getBigNumLE) | ||
6 | import qualified Data.OpenPGP as OpenPGP | ||
7 | import Crypto.ECC.Edwards25519 | ||
8 | |||
9 | import qualified Data.ByteArray as BA | ||
10 | import Control.Monad | ||
11 | import qualified Data.ByteString as BS | ||
12 | import qualified Data.ByteString.Lazy as BL | ||
13 | import Data.List | ||
14 | import Data.Int | ||
15 | import Data.Word | ||
16 | import Data.OpenPGP.Util.Base | ||
17 | |||
18 | import Text.Printf | ||
19 | import Numeric | ||
20 | import Data.Char | ||
21 | import System.IO | ||
22 | |||
23 | import Foreign.Ptr | ||
24 | import System.IO.Unsafe | ||
25 | |||
26 | import Crypto.Cipher.SBox | ||
27 | |||
28 | ed25519Key :: OpenPGP.Packet -> Maybe Ed25519.PublicKey | ||
29 | ed25519Key k = case Ed25519.publicKey $ integerToBS $ keyParam 'n' k of | ||
30 | CryptoPassed ed25519 -> Just ed25519 | ||
31 | CryptoFailed err -> Nothing | ||
32 | |||
33 | ed25519sig 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 | |||
43 | ed25519Verify :: OpenPGP.Packet -> BS.ByteString -> OpenPGP.Packet -> Maybe Bool | ||
44 | ed25519Verify 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 | |||