diff --git a/Crypto/PubKey/ECC/P256.hs b/Crypto/PubKey/ECC/P256.hs new file mode 100644 index 0000000..234f933 --- /dev/null +++ b/Crypto/PubKey/ECC/P256.hs @@ -0,0 +1,88 @@ +-- | +-- Module : Crypto.PubKey.ECC.P256 +-- License : BSD-style +-- Maintainer : Vincent Hanquez +-- Stability : experimental +-- Portability : unknown +-- +-- P256 support +-- +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE EmptyDataDecls #-} +{-# OPTIONS_GHC -fno-warn-unused-binds #-} +{-# OPTIONS_GHC -fno-warn-unused-matches #-} +{-# OPTIONS_GHC -fno-warn-unused-imports #-} +module Crypto.PubKey.ECC.P256 + ( SecretKey + , PublicKey + ) where + +import Data.Word +import Foreign.Ptr +import Foreign.C.Types + +import Crypto.Internal.Compat +import Crypto.Internal.Imports +import Crypto.Internal.Memory +import Crypto.Internal.ByteArray +import Crypto.Error + +-- | A P256 Secret key +newtype SecretKey = SecretKey P256Num + deriving (Eq,ByteArrayAccess) + +-- | A P256 public key +data PublicKey = PublicKey P256Num P256Num + deriving (Show,Eq) + +newtype P256Num = P256Num SecureBytes + deriving (Eq,ByteArrayAccess) + +instance Show P256Num where + show _ = "P256Num" + +publicKeySize :: Int +publicKeySize = 32 + +secretKeySize :: Int +secretKeySize = 32 + +type P256Digit = Word32 + +foreign import ccall "cryptonite_p256_init" + ccryptonite_p256_init :: Ptr P256Num -> IO () +foreign import ccall "cryptonite_p256_clear" + ccryptonite_p256_clear :: Ptr P256Num -> IO () +foreign import ccall "cryptonite_p256_add" + ccryptonite_p256_add :: Ptr P256Num -> Ptr P256Num -> Ptr P256Num -> IO CInt +foreign import ccall "cryptonite_p256_sub" + ccryptonite_p256_sub :: Ptr P256Num -> Ptr P256Num -> Ptr P256Num -> IO CInt +foreign import ccall "cryptonite_p256_cmp" + ccryptonite_p256_cmp :: Ptr P256Num -> Ptr P256Num -> IO CInt +foreign import ccall "cryptonite_p256_mod" + ccryptonite_p256_mod :: Ptr P256Num -> Ptr P256Num -> Ptr P256Num -> IO () +foreign import ccall "cryptonite_p256_modmul" + ccryptonite_p256_modmul :: Ptr P256Num -> Ptr P256Num -> P256Digit -> Ptr P256Num -> Ptr P256Num -> IO () +foreign import ccall "cryptonite_p256_modinv" + ccryptonite_p256_modinv :: Ptr P256Num -> Ptr P256Num -> Ptr P256Num -> IO () +foreign import ccall "cryptonite_p256_modinv_vartime" + ccryptonite_p256_modinv_vartime :: Ptr P256Num -> Ptr P256Num -> Ptr P256Num -> IO () +foreign import ccall "cryptonite_p256_base_point_mul" + ccryptonite_p256_basepoint_mul :: Ptr P256Num + -> Ptr P256Num -> Ptr P256Num + -> IO () +foreign import ccall "cryptonite_p256_point_mul" + ccryptonite_p256_point_mul :: Ptr P256Num + -> Ptr P256Num -> Ptr P256Num + -> Ptr P256Num -> Ptr P256Num + -> IO () +foreign import ccall "cryptonite_p256_is_valid_point" + ccryptonite_p256_is_valid_point :: Ptr P256Num -> Ptr P256Num -> IO CInt + +foreign import ccall "cryptonite_p256_to_bin" + ccryptonite_p256_to_bin :: Ptr P256Num -> Ptr Word8 -> IO () + +foreign import ccall "cryptonite_p256_from_bin" + ccryptonite_p256_from_bin :: Ptr Word8 -> Ptr P256Num -> IO () diff --git a/cryptonite.cabal b/cryptonite.cabal index dc966bb..d82de01 100644 --- a/cryptonite.cabal +++ b/cryptonite.cabal @@ -77,6 +77,7 @@ Library Crypto.PubKey.ECC.Prim Crypto.PubKey.ECC.DH Crypto.PubKey.ECC.ECDSA + Crypto.PubKey.ECC.P256 Crypto.PubKey.ECC.Types Crypto.PubKey.Ed25519 Crypto.PubKey.RSA