Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/scratch_impl.h
/********************************************************************** | /********************************************************************** | ||||
* Copyright (c) 2017 Andrew Poelstra * | * Copyright (c) 2017 Andrew Poelstra * | ||||
* Distributed under the MIT software license, see the accompanying * | * Distributed under the MIT software license, see the accompanying * | ||||
* file COPYING or http://www.opensource.org/licenses/mit-license.php.* | * file COPYING or http://www.opensource.org/licenses/mit-license.php.* | ||||
**********************************************************************/ | **********************************************************************/ | ||||
#ifndef _SECP256K1_SCRATCH_IMPL_H_ | #ifndef _SECP256K1_SCRATCH_IMPL_H_ | ||||
#define _SECP256K1_SCRATCH_IMPL_H_ | #define _SECP256K1_SCRATCH_IMPL_H_ | ||||
#include "util.h" | |||||
#include "scratch.h" | #include "scratch.h" | ||||
/* Using 16 bytes alignment because common architectures never have alignment | |||||
* requirements above 8 for any of the types we care about. In addition we | |||||
* leave some room because currently we don't care about a few bytes. | |||||
* TODO: Determine this at configure time. */ | |||||
#define ALIGNMENT 16 | |||||
static secp256k1_scratch* secp256k1_scratch_create(const secp256k1_callback* error_callback, size_t max_size) { | static secp256k1_scratch* secp256k1_scratch_create(const secp256k1_callback* error_callback, size_t max_size) { | ||||
secp256k1_scratch* ret = (secp256k1_scratch*)checked_malloc(error_callback, sizeof(*ret)); | secp256k1_scratch* ret = (secp256k1_scratch*)checked_malloc(error_callback, sizeof(*ret)); | ||||
if (ret != NULL) { | if (ret != NULL) { | ||||
memset(ret, 0, sizeof(*ret)); | memset(ret, 0, sizeof(*ret)); | ||||
ret->max_size = max_size; | ret->max_size = max_size; | ||||
ret->error_callback = error_callback; | ret->error_callback = error_callback; | ||||
} | } | ||||
return ret; | return ret; | ||||
Show All 40 Lines | static void secp256k1_scratch_deallocate_frame(secp256k1_scratch* scratch) { | ||||
VERIFY_CHECK(scratch->frame > 0); | VERIFY_CHECK(scratch->frame > 0); | ||||
scratch->frame -= 1; | scratch->frame -= 1; | ||||
free(scratch->data[scratch->frame]); | free(scratch->data[scratch->frame]); | ||||
} | } | ||||
static void *secp256k1_scratch_alloc(secp256k1_scratch* scratch, size_t size) { | static void *secp256k1_scratch_alloc(secp256k1_scratch* scratch, size_t size) { | ||||
void *ret; | void *ret; | ||||
size_t frame = scratch->frame - 1; | size_t frame = scratch->frame - 1; | ||||
size = ((size + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT; | size = ROUND_TO_ALIGN(size); | ||||
if (scratch->frame == 0 || size + scratch->offset[frame] > scratch->frame_size[frame]) { | if (scratch->frame == 0 || size + scratch->offset[frame] > scratch->frame_size[frame]) { | ||||
return NULL; | return NULL; | ||||
} | } | ||||
ret = (void *) ((unsigned char *) scratch->data[frame] + scratch->offset[frame]); | ret = (void *) ((unsigned char *) scratch->data[frame] + scratch->offset[frame]); | ||||
memset(ret, 0, size); | memset(ret, 0, size); | ||||
scratch->offset[frame] += size; | scratch->offset[frame] += size; | ||||
return ret; | return ret; | ||||
} | } | ||||
#endif | #endif |