Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/secp256k1.c
Show First 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
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_ = { | |||||
{ 0 }, | |||||
{ 0 }, | |||||
{ default_illegal_callback_fn, 0 }, | |||||
{ default_error_callback_fn, 0 } | |||||
}; | |||||
const secp256k1_context *secp256k1_context_no_precomp = &secp256k1_context_no_precomp_; | |||||
secp256k1_context* secp256k1_context_create(unsigned int flags) { | secp256k1_context* secp256k1_context_create(unsigned int flags) { | ||||
secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); | secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); | ||||
ret->illegal_callback = default_illegal_callback; | ret->illegal_callback = default_illegal_callback; | ||||
ret->error_callback = default_error_callback; | ret->error_callback = default_error_callback; | ||||
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(&ret->illegal_callback, | secp256k1_callback_call(&ret->illegal_callback, | ||||
"Invalid flags"); | "Invalid flags"); | ||||
Show All 19 Lines | secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { | ||||
ret->illegal_callback = ctx->illegal_callback; | ret->illegal_callback = ctx->illegal_callback; | ||||
ret->error_callback = ctx->error_callback; | ret->error_callback = ctx->error_callback; | ||||
secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); | secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); | ||||
secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); | secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); | ||||
return ret; | return ret; | ||||
} | } | ||||
void secp256k1_context_destroy(secp256k1_context* ctx) { | void secp256k1_context_destroy(secp256k1_context* ctx) { | ||||
CHECK(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); | ||||
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); | |||||
if (fun == NULL) { | if (fun == NULL) { | ||||
fun = default_illegal_callback_fn; | fun = 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); | |||||
if (fun == NULL) { | if (fun == NULL) { | ||||
fun = default_error_callback_fn; | fun = 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) { | ||||
▲ Show 20 Lines • Show All 436 Lines • ▼ Show 20 Lines | if (ret) { | ||||
} | } | ||||
} | } | ||||
return ret; | return ret; | ||||
} | } | ||||
int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { | int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { | ||||
VERIFY_CHECK(ctx != NULL); | VERIFY_CHECK(ctx != NULL); | ||||
CHECK(ctx != secp256k1_context_no_precomp); | |||||
ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); | ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); | ||||
secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); | secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); | ||||
return 1; | return 1; | ||||
} | } | ||||
int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { | int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { | ||||
size_t i; | size_t i; | ||||
secp256k1_gej Qj; | secp256k1_gej Qj; | ||||
Show All 36 Lines |