{-# LANGUAGE CApiFFI #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
module Cardano.Crypto.SECP256K1.C (
SECP256k1Context,
secpContextSignVerify,
SECP256k1SchnorrExtraParams,
secpContextCreate,
secpKeyPairCreate,
secpSchnorrSigSignCustom,
secpKeyPairXOnlyPub,
secpSchnorrSigVerify,
secpXOnlyPubkeySerialize,
secpXOnlyPubkeyParse,
secpCtxPtr,
secpEcPubkeyCreate,
secpEcdsaSign,
secpEcdsaVerify,
secpEcCompressed,
secpEcPubkeySerialize,
secpEcdsaSignatureSerializeCompact,
secpEcdsaSignatureParseCompact,
secpEcPubkeyParse,
) where
import Control.Exception (mask_)
import Data.Bits ((.|.))
import Foreign.ForeignPtr (ForeignPtr, FinalizerPtr, newForeignPtr)
import Foreign.Ptr (Ptr)
import System.IO.Unsafe (unsafePerformIO)
import Foreign.C.Types (CUChar, CSize (CSize), CInt (CInt), CUInt (CUInt))
import Cardano.Foreign (SizedPtr (SizedPtr))
import Cardano.Crypto.SECP256K1.Constants (
SECP256K1_SCHNORR_KEYPAIR_BYTES,
SECP256K1_SCHNORR_PRIVKEY_BYTES,
SECP256K1_SCHNORR_SIGNATURE_BYTES,
SECP256K1_SCHNORR_PUBKEY_BYTES_INTERNAL,
SECP256K1_SCHNORR_PUBKEY_BYTES,
SECP256K1_ECDSA_PUBKEY_BYTES_INTERNAL,
SECP256K1_ECDSA_PRIVKEY_BYTES,
SECP256K1_ECDSA_SIGNATURE_BYTES_INTERNAL,
SECP256K1_ECDSA_SIGNATURE_BYTES,
SECP256K1_ECDSA_MESSAGE_BYTES,
)
data SECP256k1Context
data
{-# NOINLINE secpCtxPtr #-}
secpCtxPtr :: ForeignPtr SECP256k1Context
secpCtxPtr :: ForeignPtr SECP256k1Context
secpCtxPtr = IO (ForeignPtr SECP256k1Context) -> ForeignPtr SECP256k1Context
forall a. IO a -> a
unsafePerformIO (IO (ForeignPtr SECP256k1Context) -> ForeignPtr SECP256k1Context)
-> (IO (ForeignPtr SECP256k1Context)
-> IO (ForeignPtr SECP256k1Context))
-> IO (ForeignPtr SECP256k1Context)
-> ForeignPtr SECP256k1Context
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (ForeignPtr SECP256k1Context)
-> IO (ForeignPtr SECP256k1Context)
forall a. IO a -> IO a
mask_ (IO (ForeignPtr SECP256k1Context) -> ForeignPtr SECP256k1Context)
-> IO (ForeignPtr SECP256k1Context) -> ForeignPtr SECP256k1Context
forall a b. (a -> b) -> a -> b
$ do
Ptr SECP256k1Context
ctx <- CUInt -> IO (Ptr SECP256k1Context)
secpContextCreate CUInt
secpContextSignVerify
FinalizerPtr SECP256k1Context
-> Ptr SECP256k1Context -> IO (ForeignPtr SECP256k1Context)
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr SECP256k1Context
secpContextDestroy Ptr SECP256k1Context
ctx
foreign import ccall unsafe "secp256k1.h &secp256k1_context_destroy"
secpContextDestroy :: FinalizerPtr SECP256k1Context
foreign import ccall unsafe "secp256k1.h secp256k1_context_create"
secpContextCreate ::
CUInt
-> IO (Ptr SECP256k1Context)
foreign import capi "secp256k1.h value SECP256K1_CONTEXT_SIGN"
secpContextSign :: CUInt
foreign import capi "secp256k1.h value SECP256K1_CONTEXT_VERIFY"
secpContextVerify :: CUInt
secpContextSignVerify :: CUInt
secpContextSignVerify :: CUInt
secpContextSignVerify = CUInt
secpContextSign CUInt -> CUInt -> CUInt
forall a. Bits a => a -> a -> a
.|. CUInt
secpContextVerify
foreign import capi "secp256k1.h value SECP256K1_EC_COMPRESSED"
secpEcCompressed :: CUInt
foreign import ccall unsafe "secp256k1_extrakeys.h secp256k1_keypair_create"
secpKeyPairCreate ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_SCHNORR_KEYPAIR_BYTES
-> SizedPtr SECP256K1_SCHNORR_PRIVKEY_BYTES
-> IO CInt
foreign import ccall unsafe "secp256k1_schnorrsig.h secp256k1_schnorrsig_sign_custom"
secpSchnorrSigSignCustom ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_SCHNORR_SIGNATURE_BYTES
-> Ptr CUChar
-> CSize
-> SizedPtr SECP256K1_SCHNORR_KEYPAIR_BYTES
-> Ptr SECP256k1SchnorrExtraParams
-> IO CInt
foreign import ccall unsafe "secp256k1_extrakeys.h secp256k1_keypair_xonly_pub"
secpKeyPairXOnlyPub ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_SCHNORR_PUBKEY_BYTES_INTERNAL
-> Ptr CInt
-> SizedPtr SECP256K1_SCHNORR_KEYPAIR_BYTES
-> IO CInt
foreign import ccall unsafe "secp256k1_schnorrsig.h secp256k1_schnorrsig_verify"
secpSchnorrSigVerify ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_SCHNORR_SIGNATURE_BYTES
-> Ptr CUChar
-> CSize
-> SizedPtr SECP256K1_SCHNORR_PUBKEY_BYTES_INTERNAL
-> CInt
foreign import ccall unsafe "secp256k1_extrakeys.h secp256k1_xonly_pubkey_serialize"
secpXOnlyPubkeySerialize ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_SCHNORR_PUBKEY_BYTES
-> SizedPtr SECP256K1_SCHNORR_PUBKEY_BYTES_INTERNAL
-> IO CInt
foreign import ccall unsafe "secp256k1_extrakeys.h secp256k1_xonly_pubkey_parse"
secpXOnlyPubkeyParse ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_SCHNORR_PUBKEY_BYTES_INTERNAL
-> Ptr CUChar
-> IO CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ec_pubkey_create"
secpEcPubkeyCreate ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_ECDSA_PUBKEY_BYTES_INTERNAL
-> SizedPtr SECP256K1_ECDSA_PRIVKEY_BYTES
-> IO CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ecdsa_sign"
secpEcdsaSign ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_ECDSA_SIGNATURE_BYTES_INTERNAL
-> SizedPtr SECP256K1_ECDSA_MESSAGE_BYTES
-> SizedPtr SECP256K1_ECDSA_PRIVKEY_BYTES
-> Ptr CUChar
-> Ptr CUChar
-> IO CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ecdsa_verify"
secpEcdsaVerify ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_ECDSA_SIGNATURE_BYTES_INTERNAL
-> SizedPtr SECP256K1_ECDSA_MESSAGE_BYTES
-> SizedPtr SECP256K1_ECDSA_PUBKEY_BYTES_INTERNAL
-> CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ec_pubkey_serialize"
secpEcPubkeySerialize ::
Ptr SECP256k1Context
-> Ptr CUChar
-> Ptr CSize
-> SizedPtr SECP256K1_ECDSA_PUBKEY_BYTES_INTERNAL
-> CUInt
-> IO CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ecdsa_signature_serialize_compact"
secpEcdsaSignatureSerializeCompact ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_ECDSA_SIGNATURE_BYTES
-> SizedPtr SECP256K1_ECDSA_SIGNATURE_BYTES_INTERNAL
-> IO CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ecdsa_signature_parse_compact"
secpEcdsaSignatureParseCompact ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_ECDSA_SIGNATURE_BYTES_INTERNAL
-> SizedPtr SECP256K1_ECDSA_SIGNATURE_BYTES
-> IO CInt
foreign import ccall unsafe "secp256k1.h secp256k1_ec_pubkey_parse"
secpEcPubkeyParse ::
Ptr SECP256k1Context
-> SizedPtr SECP256K1_ECDSA_PUBKEY_BYTES_INTERNAL
-> Ptr CUChar
-> CSize
-> IO CInt