Allow usage of external default callbacks
This commit is contained in:
parent
b7fca7590a
commit
9a949e5f2b
41
configure.ac
41
configure.ac
@ -159,6 +159,11 @@ AC_ARG_ENABLE(module_whitelist,
|
|||||||
[enable_module_whitelist=$enableval],
|
[enable_module_whitelist=$enableval],
|
||||||
[enable_module_whitelist=no])
|
[enable_module_whitelist=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(external_default_callbacks,
|
||||||
|
AS_HELP_STRING([--enable-external-default-callbacks],[enable external default callback functions (default is no)]),
|
||||||
|
[use_external_default_callbacks=$enableval],
|
||||||
|
[use_external_default_callbacks=no])
|
||||||
|
|
||||||
AC_ARG_ENABLE(jni,
|
AC_ARG_ENABLE(jni,
|
||||||
AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is no)]),
|
AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is no)]),
|
||||||
[use_jni=$enableval],
|
[use_jni=$enableval],
|
||||||
@ -507,17 +512,9 @@ if test x"$use_external_asm" = x"yes"; then
|
|||||||
AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
|
AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_NOTICE([Using static precomputation: $set_precomp])
|
if test x"$use_external_default_callbacks" = x"yes"; then
|
||||||
AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
|
AC_DEFINE(USE_EXTERNAL_DEFAULT_CALLBACKS, 1, [Define this symbol if an external implementation of the default callbacks is used])
|
||||||
AC_MSG_NOTICE([Using field implementation: $set_field])
|
fi
|
||||||
AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
|
|
||||||
AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
|
|
||||||
AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
|
|
||||||
AC_MSG_NOTICE([Building benchmarks: $use_benchmark])
|
|
||||||
AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage])
|
|
||||||
AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])
|
|
||||||
AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])
|
|
||||||
AC_MSG_NOTICE([Using jni: $use_jni])
|
|
||||||
|
|
||||||
if test x"$enable_experimental" = x"yes"; then
|
if test x"$enable_experimental" = x"yes"; then
|
||||||
AC_MSG_NOTICE([******])
|
AC_MSG_NOTICE([******])
|
||||||
@ -610,3 +607,25 @@ unset PKG_CONFIG_PATH
|
|||||||
PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
|
PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP"
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Build Options:"
|
||||||
|
echo " with endomorphism = $use_endomorphism"
|
||||||
|
echo " with ecmult precomp = $set_precomp"
|
||||||
|
echo " with external callbacks = $use_external_default_callbacks"
|
||||||
|
echo " with jni = $use_jni"
|
||||||
|
echo " with benchmarks = $use_benchmark"
|
||||||
|
echo " with coverage = $enable_coverage"
|
||||||
|
echo " module ecdh = $enable_module_ecdh"
|
||||||
|
echo " module recovery = $enable_module_recovery"
|
||||||
|
echo
|
||||||
|
echo " asm = $set_asm"
|
||||||
|
echo " bignum = $set_bignum"
|
||||||
|
echo " field = $set_field"
|
||||||
|
echo " scalar = $set_scalar"
|
||||||
|
echo
|
||||||
|
echo " CC = $CC"
|
||||||
|
echo " CFLAGS = $CFLAGS"
|
||||||
|
echo " CPPFLAGS = $CPPFLAGS"
|
||||||
|
echo " LDFLAGS = $LDFLAGS"
|
||||||
|
echo
|
||||||
|
@ -247,11 +247,28 @@ SECP256K1_API void secp256k1_context_destroy(
|
|||||||
* to cause a crash, though its return value and output arguments are
|
* to cause a crash, though its return value and output arguments are
|
||||||
* undefined.
|
* undefined.
|
||||||
*
|
*
|
||||||
|
* When this function has not been called (or called with fn=NULL), then the
|
||||||
|
* default handler will be used. The library provides a default handler which
|
||||||
|
* writes the message to stderr and calls abort. This default handler can be
|
||||||
|
* replaced at link time if the preprocessor macro
|
||||||
|
* USE_EXTERNAL_DEFAULT_CALLBACKS is defined, which is the case if the build
|
||||||
|
* has been configured with --enable-external-default-callbacks. Then the
|
||||||
|
* following two symbols must be provided to link against:
|
||||||
|
* - void secp256k1_default_illegal_callback_fn(const char* message, void* data);
|
||||||
|
* - void secp256k1_default_error_callback_fn(const char* message, void* data);
|
||||||
|
* The library can call these default handlers even before a proper callback data
|
||||||
|
* pointer could have been using secp256k1_context_set_illegal_callback or
|
||||||
|
* secp256k1_context_set_illegal_callback, e.g., when the creation of a context
|
||||||
|
* fails. In this case, the corresponding default handler will be called with
|
||||||
|
* the data pointer argument set to NULL.
|
||||||
|
*
|
||||||
* Args: ctx: an existing context object (cannot be NULL)
|
* Args: ctx: an existing context object (cannot be NULL)
|
||||||
* In: fun: a pointer to a function to call when an illegal argument is
|
* In: fun: a pointer to a function to call when an illegal argument is
|
||||||
* passed to the API, taking a message and an opaque pointer
|
* passed to the API, taking a message and an opaque pointer.
|
||||||
* (NULL restores a default handler that calls abort).
|
* (NULL restores the default handler.)
|
||||||
* data: the opaque pointer to pass to fun above.
|
* data: the opaque pointer to pass to fun above.
|
||||||
|
*
|
||||||
|
* See also secp256k1_context_set_error_callback.
|
||||||
*/
|
*/
|
||||||
SECP256K1_API void secp256k1_context_set_illegal_callback(
|
SECP256K1_API void secp256k1_context_set_illegal_callback(
|
||||||
secp256k1_context* ctx,
|
secp256k1_context* ctx,
|
||||||
@ -271,9 +288,12 @@ SECP256K1_API void secp256k1_context_set_illegal_callback(
|
|||||||
*
|
*
|
||||||
* Args: ctx: an existing context object (cannot be NULL)
|
* Args: ctx: an existing context object (cannot be NULL)
|
||||||
* In: fun: a pointer to a function to call when an internal error occurs,
|
* In: fun: a pointer to a function to call when an internal error occurs,
|
||||||
* taking a message and an opaque pointer (NULL restores a default
|
* taking a message and an opaque pointer (NULL restores the
|
||||||
* handler that calls abort).
|
* default handler, see secp256k1_context_set_illegal_callback
|
||||||
|
* for details).
|
||||||
* data: the opaque pointer to pass to fun above.
|
* data: the opaque pointer to pass to fun above.
|
||||||
|
*
|
||||||
|
* See also secp256k1_context_set_illegal_callback.
|
||||||
*/
|
*/
|
||||||
SECP256K1_API void secp256k1_context_set_error_callback(
|
SECP256K1_API void secp256k1_context_set_error_callback(
|
||||||
secp256k1_context* ctx,
|
secp256k1_context* ctx,
|
||||||
|
@ -43,29 +43,32 @@
|
|||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
#ifndef USE_EXTERNAL_DEFAULT_CALLBACKS
|
||||||
static void default_illegal_callback_fn(const char* str, void* data) {
|
static void default_illegal_callback_fn(const char* str, void* data) {
|
||||||
(void)data;
|
(void)data;
|
||||||
fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str);
|
fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
static void default_error_callback_fn(const char* str, void* data) {
|
||||||
|
(void)data;
|
||||||
|
fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void default_illegal_callback_fn(const char* str, void* data);
|
||||||
|
void default_error_callback_fn(const char* str, void* data);
|
||||||
|
#endif
|
||||||
|
|
||||||
static const secp256k1_callback default_illegal_callback = {
|
static const secp256k1_callback default_illegal_callback = {
|
||||||
default_illegal_callback_fn,
|
default_illegal_callback_fn,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static void default_error_callback_fn(const char* str, void* data) {
|
|
||||||
(void)data;
|
|
||||||
fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str);
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
static const secp256k1_callback default_error_callback = {
|
static const secp256k1_callback default_error_callback = {
|
||||||
default_error_callback_fn,
|
default_error_callback_fn,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct secp256k1_context_struct {
|
struct secp256k1_context_struct {
|
||||||
secp256k1_ecmult_context ecmult_ctx;
|
secp256k1_ecmult_context ecmult_ctx;
|
||||||
secp256k1_ecmult_gen_context ecmult_gen_ctx;
|
secp256k1_ecmult_gen_context ecmult_gen_ctx;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user