Merge pull request #157 from ixmatus/parnell/adding-ed25519-seckey-generator
ed25519: Adding generateSecretKey and a unit test
This commit is contained in:
commit
8a9bd75dc7
@ -7,12 +7,17 @@
|
|||||||
--
|
--
|
||||||
-- Ed25519 support
|
-- Ed25519 support
|
||||||
--
|
--
|
||||||
|
{-# LANGUAGE BangPatterns #-}
|
||||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||||
{-# LANGUAGE BangPatterns #-}
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
module Crypto.PubKey.Ed25519
|
module Crypto.PubKey.Ed25519
|
||||||
( SecretKey
|
( SecretKey
|
||||||
, PublicKey
|
, PublicKey
|
||||||
, Signature
|
, Signature
|
||||||
|
-- * Size constants
|
||||||
|
, publicKeySize
|
||||||
|
, secretKeySize
|
||||||
|
, signatureSize
|
||||||
-- * Smart constructors
|
-- * Smart constructors
|
||||||
, signature
|
, signature
|
||||||
, publicKey
|
, publicKey
|
||||||
@ -21,17 +26,20 @@ module Crypto.PubKey.Ed25519
|
|||||||
, toPublic
|
, toPublic
|
||||||
, sign
|
, sign
|
||||||
, verify
|
, verify
|
||||||
|
, generateSecretKey
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Word
|
import Data.Word
|
||||||
import Foreign.Ptr
|
|
||||||
import Foreign.C.Types
|
import Foreign.C.Types
|
||||||
|
import Foreign.Ptr
|
||||||
|
|
||||||
|
import Crypto.Error
|
||||||
|
import Crypto.Internal.ByteArray (ByteArrayAccess, Bytes,
|
||||||
|
ScrubbedBytes, withByteArray)
|
||||||
|
import qualified Crypto.Internal.ByteArray as B
|
||||||
import Crypto.Internal.Compat
|
import Crypto.Internal.Compat
|
||||||
import Crypto.Internal.Imports
|
import Crypto.Internal.Imports
|
||||||
import Crypto.Internal.ByteArray (ByteArrayAccess, withByteArray, ScrubbedBytes, Bytes)
|
import Crypto.Random
|
||||||
import qualified Crypto.Internal.ByteArray as B
|
|
||||||
import Crypto.Error
|
|
||||||
|
|
||||||
-- | An Ed25519 Secret key
|
-- | An Ed25519 Secret key
|
||||||
newtype SecretKey = SecretKey ScrubbedBytes
|
newtype SecretKey = SecretKey ScrubbedBytes
|
||||||
@ -106,12 +114,21 @@ verify public message signatureVal = unsafeDoIO $
|
|||||||
where
|
where
|
||||||
!msgLen = B.length message
|
!msgLen = B.length message
|
||||||
|
|
||||||
|
-- | Generate a secret key
|
||||||
|
generateSecretKey :: MonadRandom m => m SecretKey
|
||||||
|
generateSecretKey = do
|
||||||
|
ba :: ScrubbedBytes <- getRandomBytes secretKeySize
|
||||||
|
return (SecretKey $ B.copyAndFreeze ba (\_ -> return ()))
|
||||||
|
|
||||||
|
-- | A public key is 32 bytes
|
||||||
publicKeySize :: Int
|
publicKeySize :: Int
|
||||||
publicKeySize = 32
|
publicKeySize = 32
|
||||||
|
|
||||||
|
-- | A secret key is 32 bytes
|
||||||
secretKeySize :: Int
|
secretKeySize :: Int
|
||||||
secretKeySize = 32
|
secretKeySize = 32
|
||||||
|
|
||||||
|
-- | A signature is 64 bytes
|
||||||
signatureSize :: Int
|
signatureSize :: Int
|
||||||
signatureSize = 64
|
signatureSize = 64
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
|
{-# LANGUAGE BangPatterns #-}
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE BangPatterns #-}
|
|
||||||
module KAT_Ed25519 ( tests ) where
|
module KAT_Ed25519 ( tests ) where
|
||||||
|
|
||||||
import Crypto.Error
|
import Crypto.Error
|
||||||
@ -23,6 +23,7 @@ vec1 = Vec
|
|||||||
testVec :: String -> Vec -> [TestTree]
|
testVec :: String -> Vec -> [TestTree]
|
||||||
testVec s vec =
|
testVec s vec =
|
||||||
[ testCase (s ++ " gen publickey") (pub @=? Ed25519.toPublic sec)
|
[ testCase (s ++ " gen publickey") (pub @=? Ed25519.toPublic sec)
|
||||||
|
, testCase (s ++ " gen secretkey") (Ed25519.generateSecretKey *> pure ())
|
||||||
, testCase (s ++ " gen signature") (sig @=? Ed25519.sign sec pub (vecMsg vec))
|
, testCase (s ++ " gen signature") (sig @=? Ed25519.sign sec pub (vecMsg vec))
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user