{-# LANGUAGE ForeignFunctionInterface #-}
module Crypto.OpenSSL.BN.Foreign where

import           Foreign.C.Types
import           Foreign.Ptr

data BN_CTX
data BIGNUM

foreign import ccall unsafe "&BN_CTX_free"
    ssl_bn_ctx_free :: FunPtr (Ptr BN_CTX -> IO ())

foreign import ccall unsafe "BN_CTX_new"
    ssl_bn_ctx_new :: IO (Ptr BN_CTX)

foreign import ccall unsafe "BN_new"
    ssl_bn_new :: IO (Ptr BIGNUM)

foreign import ccall unsafe "&BN_free"
    ssl_bn_free :: FunPtr (Ptr BIGNUM -> IO ())

foreign import ccall unsafe "BN_num_bits"
    ssl_bn_num_bits :: Ptr BIGNUM -> IO CInt

foreign import ccall unsafe "BN_bn2bin"
    ssl_bn_2bin :: Ptr BIGNUM -> Ptr CUChar -> IO CInt

foreign import ccall unsafe "BN_bin2bn"
    ssl_bn_bin2 :: Ptr CUChar -> CInt -> Ptr BIGNUM -> IO (Ptr BIGNUM)

-- bn_num_bytes is a macro, 
ssl_bn_num_bytes :: Ptr BIGNUM -> IO CInt
ssl_bn_num_bytes ptr = do
    bits <- ssl_bn_num_bits ptr
    return $ ((bits + 7) `div` 8)