Merge pull request #157 from ixmatus/parnell/adding-ed25519-seckey-generator

ed25519: Adding generateSecretKey and a unit test
This commit is contained in:
Vincent Hanquez 2017-05-03 04:32:48 +01:00 committed by GitHub
commit 8a9bd75dc7
2 changed files with 24 additions and 6 deletions

View File

@ -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

View File

@ -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