uECC_HashContext => const uECC_HashContext This is an important piece of "documentation" as it indicates to the caller that a uECC_HashContext can be initialized and subsequently used multiple times (for multiple signatures).
diff --git a/test/test_ecdsa_deterministic.c.example b/test/test_ecdsa_deterministic.c.example index e9c4ef1..df9aa10 100644 --- a/test/test_ecdsa_deterministic.c.example +++ b/test/test_ecdsa_deterministic.c.example
@@ -23,19 +23,19 @@ SHA256_CTX ctx; } SHA256_HashContext; -static void init_SHA256(uECC_HashContext *base) { +static void init_SHA256(const uECC_HashContext *base) { SHA256_HashContext *context = (SHA256_HashContext *)base; SHA256_Init(&context->ctx); } -static void update_SHA256(uECC_HashContext *base, +static void update_SHA256(const uECC_HashContext *base, const uint8_t *message, unsigned message_size) { SHA256_HashContext *context = (SHA256_HashContext *)base; SHA256_Update(&context->ctx, message, message_size); } -static void finish_SHA256(uECC_HashContext *base, uint8_t *hash_result) { +static void finish_SHA256(const uECC_HashContext *base, uint8_t *hash_result) { SHA256_HashContext *context = (SHA256_HashContext *)base; SHA256_Final(hash_result, &context->ctx); }
diff --git a/uECC.c b/uECC.c index bcc2048..26a95a6 100644 --- a/uECC.c +++ b/uECC.c
@@ -1231,7 +1231,7 @@ /* Compute an HMAC using K as a key (as in RFC 6979). Note that K is always the same size as the hash result size. */ -static void HMAC_init(uECC_HashContext *hash_context, const uint8_t *K) { +static void HMAC_init(const uECC_HashContext *hash_context, const uint8_t *K) { uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size; unsigned i; for (i = 0; i < hash_context->result_size; ++i) @@ -1243,13 +1243,15 @@ hash_context->update_hash(hash_context, pad, hash_context->block_size); } -static void HMAC_update(uECC_HashContext *hash_context, +static void HMAC_update(const uECC_HashContext *hash_context, const uint8_t *message, unsigned message_size) { hash_context->update_hash(hash_context, message, message_size); } -static void HMAC_finish(uECC_HashContext *hash_context, const uint8_t *K, uint8_t *result) { +static void HMAC_finish(const uECC_HashContext *hash_context, + const uint8_t *K, + uint8_t *result) { uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size; unsigned i; for (i = 0; i < hash_context->result_size; ++i) @@ -1266,7 +1268,7 @@ } /* V = HMAC_K(V) */ -static void update_V(uECC_HashContext *hash_context, uint8_t *K, uint8_t *V) { +static void update_V(const uECC_HashContext *hash_context, uint8_t *K, uint8_t *V) { HMAC_init(hash_context, K); HMAC_update(hash_context, V, hash_context->result_size); HMAC_finish(hash_context, K, V); @@ -1281,7 +1283,7 @@ int uECC_sign_deterministic(const uint8_t *private_key, const uint8_t *message_hash, unsigned hash_size, - uECC_HashContext *hash_context, + const uECC_HashContext *hash_context, uint8_t *signature, uECC_Curve curve) { uint8_t *K = hash_context->tmp;
diff --git a/uECC.h b/uECC.h index d6ba5ad..f753a51 100644 --- a/uECC.h +++ b/uECC.h
@@ -265,11 +265,11 @@ } */ typedef struct uECC_HashContext { - void (*init_hash)(struct uECC_HashContext *context); - void (*update_hash)(struct uECC_HashContext *context, + void (*init_hash)(const struct uECC_HashContext *context); + void (*update_hash)(const struct uECC_HashContext *context, const uint8_t *message, unsigned message_size); - void (*finish_hash)(struct uECC_HashContext *context, uint8_t *hash_result); + void (*finish_hash)(const struct uECC_HashContext *context, uint8_t *hash_result); unsigned block_size; /* Hash function block size in bytes, eg 64 for SHA-256. */ unsigned result_size; /* Hash function result size in bytes, eg 32 for SHA-256. */ uint8_t *tmp; /* Must point to a buffer of at least (2 * result_size + block_size) bytes. */ @@ -299,7 +299,7 @@ int uECC_sign_deterministic(const uint8_t *private_key, const uint8_t *message_hash, unsigned hash_size, - uECC_HashContext *hash_context, + const uECC_HashContext *hash_context, uint8_t *signature, uECC_Curve curve);