X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcrypto%2Fshachain%2Fshachain.c;h=8c9fdcf50fe2de50f72ce64524e2e9c216f1e827;hb=0a76c98f726514245389587c1d361d9281198280;hp=c66196f71d881ce5e19b9bc088d66b9d2fc8b03b;hpb=954082d1b37e2e0be7816f53255965a99dd1b2ee;p=ccan diff --git a/ccan/crypto/shachain/shachain.c b/ccan/crypto/shachain/shachain.c index c66196f7..8c9fdcf5 100644 --- a/ccan/crypto/shachain/shachain.c +++ b/ccan/crypto/shachain/shachain.c @@ -33,7 +33,7 @@ static void derive(shachain_index_t from, shachain_index_t to, for (i = ilog64(branches) - 1; i >= 0; i--) { if (((branches >> i) & 1)) { change_bit(hash->u.u8, i); - sha256(hash, hash, 1); + sha256(hash, hash, sizeof(*hash)); } } } @@ -44,21 +44,34 @@ 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; } -void shachain_add_hash(struct shachain *chain, +bool shachain_add_hash(struct shachain *chain, shachain_index_t index, const struct sha256 *hash) { 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). */ - if (can_derive(index, chain->known[i].index)) + if (can_derive(index, chain->known[i].index)) { + struct sha256 expect; + + /* Make sure the others derive as expected! */ + derive(index, chain->known[i].index, hash, &expect); + if (memcmp(&expect, &chain->known[i].hash, + sizeof(expect)) != 0) + return false; break; + } } /* This can happen if you skip indices! */ @@ -66,6 +79,8 @@ void 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; } bool shachain_get_hash(const struct shachain *chain,