aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2019-05-31 09:27:36 -0400
committerGeorge Kadianakis <desnacked@riseup.net>2019-11-18 19:06:43 +0200
commit48a9f8a63f4d605e9bee5e7131b1f6db1ec95295 (patch)
treefdce4c7ef410ba16e14184fcaf918e8b6afbe623
parentfbc18c8989bae0e2acb5d903f2bd5b0648bad828 (diff)
downloadtor-48a9f8a63f4d605e9bee5e7131b1f6db1ec95295.tar.gz
tor-48a9f8a63f4d605e9bee5e7131b1f6db1ec95295.zip
hs-v3: Function to re-parse unencrypted descriptor
We now keep descriptor that we can't decode due to missing client authorization in the cache. This new function is used when new client authorization are added and to tell the client cache to retry decoding. Part of #30382 Signed-off-by: David Goulet <dgoulet@torproject.org>
-rw-r--r--src/feature/hs/hs_cache.c28
-rw-r--r--src/feature/hs/hs_cache.h2
2 files changed, 30 insertions, 0 deletions
diff --git a/src/feature/hs/hs_cache.c b/src/feature/hs/hs_cache.c
index 59b05d8f0a..49d5ade419 100644
--- a/src/feature/hs/hs_cache.c
+++ b/src/feature/hs/hs_cache.c
@@ -942,6 +942,34 @@ hs_cache_client_intro_state_purge(void)
"cache purged.");
}
+/* This is called when new client authorization was added to the global state.
+ * It attemps to decode the descriptor of the given service identity key.
+ *
+ * Return true if decoding was successful else false. */
+bool
+hs_cache_client_new_auth_parse(const ed25519_public_key_t *service_pk)
+{
+ bool ret = false;
+ hs_cache_client_descriptor_t *cached_desc = NULL;
+
+ tor_assert(service_pk);
+
+ cached_desc = lookup_v3_desc_as_client(service_pk->pubkey);
+ if (cached_desc == NULL || cached_desc->desc != NULL) {
+ /* No entry for that service or the descriptor is already decoded. */
+ goto end;
+ }
+
+ /* Attempt a decode. If we are successful, inform the caller. */
+ if (hs_client_decode_descriptor(cached_desc->encoded_desc, service_pk,
+ &cached_desc->desc) == HS_DESC_DECODE_OK) {
+ ret = true;
+ }
+
+ end:
+ return ret;
+}
+
/**************** Generics *********************************/
/** Do a round of OOM cleanup on all directory caches. Return the amount of
diff --git a/src/feature/hs/hs_cache.h b/src/feature/hs/hs_cache.h
index e7729f2041..4fd9ac5445 100644
--- a/src/feature/hs/hs_cache.h
+++ b/src/feature/hs/hs_cache.h
@@ -99,6 +99,8 @@ const hs_cache_intro_state_t *hs_cache_client_intro_state_find(
void hs_cache_client_intro_state_clean(time_t now);
void hs_cache_client_intro_state_purge(void);
+bool hs_cache_client_new_auth_parse(const ed25519_public_key_t *service_pk);
+
#ifdef HS_CACHE_PRIVATE
#include "lib/crypt_ops/crypto_ed25519.h"