Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/secp256k1.c
Show All 21 Lines | |||||
#define ARG_CHECK(cond) do { \ | #define ARG_CHECK(cond) do { \ | ||||
if (EXPECT(!(cond), 0)) { \ | if (EXPECT(!(cond), 0)) { \ | ||||
secp256k1_callback_call(&ctx->illegal_callback, #cond); \ | secp256k1_callback_call(&ctx->illegal_callback, #cond); \ | ||||
return 0; \ | return 0; \ | ||||
} \ | } \ | ||||
} while(0) | } while(0) | ||||
static void default_illegal_callback_fn(const char* str, void* data) { | #define ARG_CHECK_NO_RETURN(cond) do { \ | ||||
if (EXPECT(!(cond), 0)) { \ | |||||
secp256k1_callback_call(&ctx->illegal_callback, #cond); \ | |||||
} \ | |||||
} while(0) | |||||
#ifndef USE_EXTERNAL_DEFAULT_CALLBACKS | |||||
#include <stdlib.h> | |||||
#include <stdio.h> | |||||
static void secp256k1_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 secp256k1_default_error_callback_fn(const char* str, void* data) { | |||||
static const secp256k1_callback default_illegal_callback = { | |||||
default_illegal_callback_fn, | |||||
NULL | |||||
}; | |||||
static void default_error_callback_fn(const char* str, void* data) { | |||||
(void)data; | (void)data; | ||||
fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); | fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); | ||||
abort(); | abort(); | ||||
} | } | ||||
#else | |||||
void secp256k1_default_illegal_callback_fn(const char* str, void* data); | |||||
void secp256k1_default_error_callback_fn(const char* str, void* data); | |||||
#endif | |||||
static const secp256k1_callback default_error_callback = { | static const secp256k1_callback default_illegal_callback = { | ||||
default_error_callback_fn, | secp256k1_default_illegal_callback_fn, | ||||
NULL | NULL | ||||
}; | }; | ||||
static const secp256k1_callback default_error_callback = { | |||||
secp256k1_default_error_callback_fn, | |||||
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; | ||||
secp256k1_callback illegal_callback; | secp256k1_callback illegal_callback; | ||||
secp256k1_callback error_callback; | secp256k1_callback error_callback; | ||||
}; | }; | ||||
static const secp256k1_context secp256k1_context_no_precomp_ = { | static const secp256k1_context secp256k1_context_no_precomp_ = { | ||||
{ 0 }, | { 0 }, | ||||
{ 0 }, | { 0 }, | ||||
{ default_illegal_callback_fn, 0 }, | { secp256k1_default_illegal_callback_fn, 0 }, | ||||
{ default_error_callback_fn, 0 } | { secp256k1_default_error_callback_fn, 0 } | ||||
}; | }; | ||||
const secp256k1_context *secp256k1_context_no_precomp = &secp256k1_context_no_precomp_; | const secp256k1_context *secp256k1_context_no_precomp = &secp256k1_context_no_precomp_; | ||||
size_t secp256k1_context_preallocated_size(unsigned int flags) { | size_t secp256k1_context_preallocated_size(unsigned int flags) { | ||||
size_t ret = ROUND_TO_ALIGN(sizeof(secp256k1_context)); | size_t ret = ROUND_TO_ALIGN(sizeof(secp256k1_context)); | ||||
if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { | if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { | ||||
secp256k1_callback_call(&default_illegal_callback, | secp256k1_callback_call(&default_illegal_callback, | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { | ||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
prealloc_size = secp256k1_context_preallocated_clone_size(ctx); | prealloc_size = secp256k1_context_preallocated_clone_size(ctx); | ||||
ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, prealloc_size); | ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, prealloc_size); | ||||
ret = secp256k1_context_preallocated_clone(ctx, ret); | ret = secp256k1_context_preallocated_clone(ctx, ret); | ||||
return ret; | return ret; | ||||
} | } | ||||
void secp256k1_context_preallocated_destroy(secp256k1_context* ctx) { | void secp256k1_context_preallocated_destroy(secp256k1_context* ctx) { | ||||
CHECK(ctx != secp256k1_context_no_precomp); | ARG_CHECK_NO_RETURN(ctx != secp256k1_context_no_precomp); | ||||
if (ctx != NULL) { | if (ctx != NULL) { | ||||
secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); | secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); | ||||
secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); | secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); | ||||
} | } | ||||
} | } | ||||
void secp256k1_context_destroy(secp256k1_context* ctx) { | void secp256k1_context_destroy(secp256k1_context* ctx) { | ||||
if (ctx != NULL) { | if (ctx != NULL) { | ||||
secp256k1_context_preallocated_destroy(ctx); | secp256k1_context_preallocated_destroy(ctx); | ||||
free(ctx); | free(ctx); | ||||
} | } | ||||
} | } | ||||
void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { | void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { | ||||
CHECK(ctx != secp256k1_context_no_precomp); | ARG_CHECK_NO_RETURN(ctx != secp256k1_context_no_precomp); | ||||
if (fun == NULL) { | if (fun == NULL) { | ||||
fun = default_illegal_callback_fn; | fun = secp256k1_default_illegal_callback_fn; | ||||
} | } | ||||
ctx->illegal_callback.fn = fun; | ctx->illegal_callback.fn = fun; | ||||
ctx->illegal_callback.data = data; | ctx->illegal_callback.data = data; | ||||
} | } | ||||
void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { | void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { | ||||
CHECK(ctx != secp256k1_context_no_precomp); | ARG_CHECK_NO_RETURN(ctx != secp256k1_context_no_precomp); | ||||
if (fun == NULL) { | if (fun == NULL) { | ||||
fun = default_error_callback_fn; | fun = secp256k1_default_error_callback_fn; | ||||
} | } | ||||
ctx->error_callback.fn = fun; | ctx->error_callback.fn = fun; | ||||
ctx->error_callback.data = data; | ctx->error_callback.data = data; | ||||
} | } | ||||
secp256k1_scratch_space* secp256k1_scratch_space_create(const secp256k1_context* ctx, size_t max_size) { | secp256k1_scratch_space* secp256k1_scratch_space_create(const secp256k1_context* ctx, size_t max_size) { | ||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
return secp256k1_scratch_create(&ctx->error_callback, max_size); | return secp256k1_scratch_create(&ctx->error_callback, max_size); | ||||
▲ Show 20 Lines • Show All 489 Lines • Show Last 20 Lines |