From 0020bff26ac0ce97ebf057e6c32f294485468830 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 25 May 2015 15:21:08 +0930 Subject: [PATCH] crypto/shachain: enforce that indexes have to be added incrementally. Signed-off-by: Rusty Russell --- ccan/crypto/shachain/shachain.c | 10 ++++++++-- ccan/crypto/shachain/shachain.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ccan/crypto/shachain/shachain.c b/ccan/crypto/shachain/shachain.c index a14d95b8..94d7d646 100644 --- a/ccan/crypto/shachain/shachain.c +++ b/ccan/crypto/shachain/shachain.c @@ -44,9 +44,10 @@ void shachain_from_seed(const struct sha256 *seed, shachain_index_t index, derive((shachain_index_t)-1ULL, index, seed, hash); } -void shachain_init(struct shachain *shachain) +void shachain_init(struct shachain *chain) { - shachain->num_valid = 0; + chain->num_valid = 0; + chain->max_index = 0; } bool shachain_add_hash(struct shachain *chain, @@ -54,6 +55,10 @@ bool shachain_add_hash(struct shachain *chain, { int i; + /* You have to insert them in order! */ + assert(index == chain->max_index + 1 || + (index == 0 && chain->num_valid == 0)); + for (i = 0; i < chain->num_valid; i++) { /* If we could derive this value, we don't need it, * not any others (since they're in order). */ @@ -74,6 +79,7 @@ bool shachain_add_hash(struct shachain *chain, chain->known[i].index = index; chain->known[i].hash = *hash; chain->num_valid = i+1; + chain->max_index = index; return true; } diff --git a/ccan/crypto/shachain/shachain.h b/ccan/crypto/shachain/shachain.h index 39d6f3c4..f3c9ad70 100644 --- a/ccan/crypto/shachain/shachain.h +++ b/ccan/crypto/shachain/shachain.h @@ -15,6 +15,7 @@ void shachain_from_seed(const struct sha256 *seed, shachain_index_t index, struct sha256 *hash); struct shachain { + shachain_index_t max_index; unsigned int num_valid; struct { shachain_index_t index; -- 2.39.2