Switch to a single malloc call
This commit is contained in:
parent
16d4a0a251
commit
1738dd0eb5
@ -187,6 +187,9 @@ typedef int (*secp256k1_nonce_function)(
|
|||||||
SECP256K1_API extern const secp256k1_context *secp256k1_context_no_precomp;
|
SECP256K1_API extern const secp256k1_context *secp256k1_context_no_precomp;
|
||||||
|
|
||||||
/** Create a secp256k1 context object.
|
/** Create a secp256k1 context object.
|
||||||
|
*
|
||||||
|
* This function uses malloc to allocate memory. It is guaranteed that malloc is
|
||||||
|
* called at most once for every call of this function.
|
||||||
*
|
*
|
||||||
* Returns: a newly created context object.
|
* Returns: a newly created context object.
|
||||||
* In: flags: which parts of the context to initialize.
|
* In: flags: which parts of the context to initialize.
|
||||||
@ -198,6 +201,9 @@ SECP256K1_API secp256k1_context* secp256k1_context_create(
|
|||||||
) SECP256K1_WARN_UNUSED_RESULT;
|
) SECP256K1_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/** Copies a secp256k1 context object.
|
/** Copies a secp256k1 context object.
|
||||||
|
*
|
||||||
|
* This function uses malloc to allocate memory. It is guaranteed that malloc is
|
||||||
|
* called at most once for every call of this function.
|
||||||
*
|
*
|
||||||
* Returns: a newly created context object.
|
* Returns: a newly created context object.
|
||||||
* Args: ctx: an existing context to copy (cannot be NULL)
|
* Args: ctx: an existing context to copy (cannot be NULL)
|
||||||
|
@ -22,9 +22,8 @@ typedef struct {
|
|||||||
|
|
||||||
static const size_t SECP256K1_ECMULT_CONTEXT_PREALLOCATED_SIZE;
|
static const size_t SECP256K1_ECMULT_CONTEXT_PREALLOCATED_SIZE;
|
||||||
static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx);
|
static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx);
|
||||||
static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb);
|
static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, void **prealloc);
|
||||||
static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst,
|
static void secp256k1_ecmult_context_finalize_memcpy(secp256k1_ecmult_context *dst, const secp256k1_ecmult_context *src);
|
||||||
const secp256k1_ecmult_context *src, const secp256k1_callback *cb);
|
|
||||||
static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx);
|
static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx);
|
||||||
static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx);
|
static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx);
|
||||||
|
|
||||||
|
@ -30,9 +30,8 @@ typedef struct {
|
|||||||
|
|
||||||
static const size_t SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE;
|
static const size_t SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE;
|
||||||
static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx);
|
static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx);
|
||||||
static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb);
|
static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, void **prealloc);
|
||||||
static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst,
|
static void secp256k1_ecmult_gen_context_finalize_memcpy(secp256k1_ecmult_gen_context *dst, const secp256k1_ecmult_gen_context* src);
|
||||||
const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb);
|
|
||||||
static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx);
|
static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx);
|
||||||
static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx);
|
static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx);
|
||||||
|
|
||||||
|
@ -26,19 +26,21 @@ static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx)
|
|||||||
ctx->prec = NULL;
|
ctx->prec = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) {
|
static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, void **prealloc) {
|
||||||
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
||||||
secp256k1_ge prec[1024];
|
secp256k1_ge prec[1024];
|
||||||
secp256k1_gej gj;
|
secp256k1_gej gj;
|
||||||
secp256k1_gej nums_gej;
|
secp256k1_gej nums_gej;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
size_t const prealloc_size = SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE;
|
||||||
|
void* const base = *prealloc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ctx->prec != NULL) {
|
if (ctx->prec != NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
||||||
ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec));
|
ctx->prec = (secp256k1_ge_storage (*)[64][16])manual_alloc(prealloc, prealloc_size, base, prealloc_size);
|
||||||
|
|
||||||
/* get the generator */
|
/* get the generator */
|
||||||
secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);
|
secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);
|
||||||
@ -93,7 +95,7 @@ static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
(void)cb;
|
(void)prealloc;
|
||||||
ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context;
|
ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context;
|
||||||
#endif
|
#endif
|
||||||
secp256k1_ecmult_gen_blind(ctx, NULL);
|
secp256k1_ecmult_gen_blind(ctx, NULL);
|
||||||
@ -103,27 +105,18 @@ static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_cont
|
|||||||
return ctx->prec != NULL;
|
return ctx->prec != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst,
|
static void secp256k1_ecmult_gen_context_finalize_memcpy(secp256k1_ecmult_gen_context *dst, const secp256k1_ecmult_gen_context *src) {
|
||||||
const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) {
|
|
||||||
if (src->prec == NULL) {
|
|
||||||
dst->prec = NULL;
|
|
||||||
} else {
|
|
||||||
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
||||||
dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec));
|
if (src->prec != NULL) {
|
||||||
memcpy(dst->prec, src->prec, sizeof(*dst->prec));
|
/* We cast to void* first to suppress a -Wcast-align warning in clang. */
|
||||||
#else
|
dst->prec = (secp256k1_ge_storage (*)[64][16])(void*)((unsigned char*)dst + ((unsigned char*)src->prec - (unsigned char*)src));
|
||||||
(void)cb;
|
|
||||||
dst->prec = src->prec;
|
|
||||||
#endif
|
|
||||||
dst->initial = src->initial;
|
|
||||||
dst->blind = src->blind;
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
(void)dst, (void)src;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) {
|
static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) {
|
||||||
#ifndef USE_ECMULT_STATIC_PRECOMPUTATION
|
|
||||||
free(ctx->prec);
|
|
||||||
#endif
|
|
||||||
secp256k1_scalar_clear(&ctx->blind);
|
secp256k1_scalar_clear(&ctx->blind);
|
||||||
secp256k1_gej_clear(&ctx->initial);
|
secp256k1_gej_clear(&ctx->initial);
|
||||||
ctx->prec = NULL;
|
ctx->prec = NULL;
|
||||||
|
@ -308,8 +308,10 @@ static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) {
|
static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, void **prealloc) {
|
||||||
secp256k1_gej gj;
|
secp256k1_gej gj;
|
||||||
|
void* const base = *prealloc;
|
||||||
|
size_t const prealloc_size = SECP256K1_ECMULT_CONTEXT_PREALLOCATED_SIZE;
|
||||||
|
|
||||||
if (ctx->pre_g != NULL) {
|
if (ctx->pre_g != NULL) {
|
||||||
return;
|
return;
|
||||||
@ -318,7 +320,7 @@ static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const
|
|||||||
/* get the generator */
|
/* get the generator */
|
||||||
secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);
|
secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);
|
||||||
|
|
||||||
ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G));
|
ctx->pre_g = (secp256k1_ge_storage (*)[])manual_alloc(prealloc, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G), base, prealloc_size);
|
||||||
|
|
||||||
/* precompute the tables with odd multiples */
|
/* precompute the tables with odd multiples */
|
||||||
secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj);
|
secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj);
|
||||||
@ -328,7 +330,7 @@ static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const
|
|||||||
secp256k1_gej g_128j;
|
secp256k1_gej g_128j;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G));
|
ctx->pre_g_128 = (secp256k1_ge_storage (*)[])manual_alloc(prealloc, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G), base, prealloc_size);
|
||||||
|
|
||||||
/* calculate 2^128*generator */
|
/* calculate 2^128*generator */
|
||||||
g_128j = gj;
|
g_128j = gj;
|
||||||
@ -340,22 +342,13 @@ static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst,
|
static void secp256k1_ecmult_context_finalize_memcpy(secp256k1_ecmult_context *dst, const secp256k1_ecmult_context *src) {
|
||||||
const secp256k1_ecmult_context *src, const secp256k1_callback *cb) {
|
if (src->pre_g != NULL) {
|
||||||
if (src->pre_g == NULL) {
|
dst->pre_g = (secp256k1_ge_storage (*)[])((unsigned char*)dst + ((unsigned char*)(src->pre_g) - (unsigned char*)src));
|
||||||
dst->pre_g = NULL;
|
|
||||||
} else {
|
|
||||||
size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G);
|
|
||||||
dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size);
|
|
||||||
memcpy(dst->pre_g, src->pre_g, size);
|
|
||||||
}
|
}
|
||||||
#ifdef USE_ENDOMORPHISM
|
#ifdef USE_ENDOMORPHISM
|
||||||
if (src->pre_g_128 == NULL) {
|
if (src->pre_g_128 != NULL) {
|
||||||
dst->pre_g_128 = NULL;
|
dst->pre_g_128 = (secp256k1_ge_storage (*)[])((unsigned char*)dst + ((unsigned char*)(src->pre_g_128) - (unsigned char*)src));
|
||||||
} else {
|
|
||||||
size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G);
|
|
||||||
dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size);
|
|
||||||
memcpy(dst->pre_g_128, src->pre_g_128, size);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -365,10 +358,6 @@ static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) {
|
static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) {
|
||||||
free(ctx->pre_g);
|
|
||||||
#ifdef USE_ENDOMORPHISM
|
|
||||||
free(ctx->pre_g_128);
|
|
||||||
#endif
|
|
||||||
secp256k1_ecmult_context_init(ctx);
|
secp256k1_ecmult_context_init(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "basic-config.h"
|
#include "basic-config.h"
|
||||||
#include "include/secp256k1.h"
|
#include "include/secp256k1.h"
|
||||||
|
#include "util.h"
|
||||||
#include "field_impl.h"
|
#include "field_impl.h"
|
||||||
#include "scalar_impl.h"
|
#include "scalar_impl.h"
|
||||||
#include "group_impl.h"
|
#include "group_impl.h"
|
||||||
@ -26,6 +27,7 @@ static const secp256k1_callback default_error_callback = {
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
secp256k1_ecmult_gen_context ctx;
|
secp256k1_ecmult_gen_context ctx;
|
||||||
|
void *prealloc, *base;
|
||||||
int inner;
|
int inner;
|
||||||
int outer;
|
int outer;
|
||||||
FILE* fp;
|
FILE* fp;
|
||||||
@ -38,15 +40,17 @@ int main(int argc, char **argv) {
|
|||||||
fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n");
|
fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n");
|
fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n");
|
||||||
fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n");
|
fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n");
|
||||||
fprintf(fp, "#include \"src/group.h\"\n");
|
fprintf(fp, "#include \"src/group.h\"\n");
|
||||||
fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n");
|
fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n");
|
||||||
fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n");
|
fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n");
|
||||||
|
|
||||||
|
base = checked_malloc(&default_error_callback, SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE);
|
||||||
|
prealloc = base;
|
||||||
secp256k1_ecmult_gen_context_init(&ctx);
|
secp256k1_ecmult_gen_context_init(&ctx);
|
||||||
secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback);
|
secp256k1_ecmult_gen_context_build(&ctx, &prealloc);
|
||||||
for(outer = 0; outer != 64; outer++) {
|
for(outer = 0; outer != 64; outer++) {
|
||||||
fprintf(fp,"{\n");
|
fprintf(fp,"{\n");
|
||||||
for(inner = 0; inner != 16; inner++) {
|
for(inner = 0; inner != 16; inner++) {
|
||||||
@ -65,10 +69,11 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
fprintf(fp,"};\n");
|
fprintf(fp,"};\n");
|
||||||
secp256k1_ecmult_gen_context_clear(&ctx);
|
secp256k1_ecmult_gen_context_clear(&ctx);
|
||||||
|
free(base);
|
||||||
|
|
||||||
fprintf(fp, "#undef SC\n");
|
fprintf(fp, "#undef SC\n");
|
||||||
fprintf(fp, "#endif\n");
|
fprintf(fp, "#endif\n");
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -92,15 +92,17 @@ size_t secp256k1_context_preallocated_size(unsigned int flags) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
secp256k1_context* secp256k1_context_create(unsigned int flags) {
|
secp256k1_context* secp256k1_context_preallocated_create(void* prealloc, unsigned int flags) {
|
||||||
secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context));
|
void* const base = prealloc;
|
||||||
|
size_t prealloc_size = secp256k1_context_preallocated_size(flags);
|
||||||
|
secp256k1_context* ret = (secp256k1_context*)manual_alloc(&prealloc, sizeof(secp256k1_context), base, prealloc_size);
|
||||||
|
|
||||||
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");
|
||||||
free(ret);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,30 +110,53 @@ secp256k1_context* secp256k1_context_create(unsigned int flags) {
|
|||||||
secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx);
|
secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx);
|
||||||
|
|
||||||
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) {
|
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) {
|
||||||
secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback);
|
secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &prealloc);
|
||||||
}
|
}
|
||||||
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) {
|
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) {
|
||||||
secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback);
|
secp256k1_ecmult_context_build(&ret->ecmult_ctx, &prealloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return (secp256k1_context*) ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
secp256k1_context* secp256k1_context_create(unsigned int flags) {
|
||||||
|
size_t const prealloc_size = secp256k1_context_preallocated_size(flags);
|
||||||
|
secp256k1_context* ctx = (secp256k1_context*)checked_malloc(&default_error_callback, prealloc_size);
|
||||||
|
if (EXPECT(secp256k1_context_preallocated_create(ctx, flags) == NULL, 0)) {
|
||||||
|
free(ctx);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) {
|
secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) {
|
||||||
secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context));
|
secp256k1_context* ret;
|
||||||
ret->illegal_callback = ctx->illegal_callback;
|
size_t prealloc_size = ROUND_TO_ALIGN(sizeof(secp256k1_context));
|
||||||
ret->error_callback = ctx->error_callback;
|
if (secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)) {
|
||||||
secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback);
|
prealloc_size += SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE;
|
||||||
secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback);
|
}
|
||||||
|
if (secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)) {
|
||||||
|
prealloc_size += SECP256K1_ECMULT_CONTEXT_PREALLOCATED_SIZE;
|
||||||
|
}
|
||||||
|
ret = checked_malloc(&ctx->error_callback, prealloc_size);
|
||||||
|
memcpy(ret, ctx, prealloc_size);
|
||||||
|
secp256k1_ecmult_gen_context_finalize_memcpy(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx);
|
||||||
|
secp256k1_ecmult_context_finalize_memcpy(&ret->ecmult_ctx, &ctx->ecmult_ctx);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void secp256k1_context_destroy(secp256k1_context* ctx) {
|
void secp256k1_context_preallocated_destroy(secp256k1_context* ctx) {
|
||||||
CHECK(ctx != secp256k1_context_no_precomp);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void secp256k1_context_destroy(secp256k1_context* ctx) {
|
||||||
|
if (ctx != NULL) {
|
||||||
|
secp256k1_context_preallocated_destroy(ctx);
|
||||||
free(ctx);
|
free(ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -271,10 +271,6 @@ void run_context_tests(void) {
|
|||||||
secp256k1_context_set_illegal_callback(vrfy, NULL, NULL);
|
secp256k1_context_set_illegal_callback(vrfy, NULL, NULL);
|
||||||
secp256k1_context_set_illegal_callback(sign, NULL, NULL);
|
secp256k1_context_set_illegal_callback(sign, NULL, NULL);
|
||||||
|
|
||||||
/* This shouldn't leak memory, due to already-set tests. */
|
|
||||||
secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL);
|
|
||||||
secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL);
|
|
||||||
|
|
||||||
/* obtain a working nonce */
|
/* obtain a working nonce */
|
||||||
do {
|
do {
|
||||||
random_scalar_order_test(&nonce);
|
random_scalar_order_test(&nonce);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user