diff options
author | George Kadianakis <desnacked@riseup.net> | 2019-06-03 16:18:32 +0300 |
---|---|---|
committer | George Kadianakis <desnacked@riseup.net> | 2019-11-18 19:21:34 +0200 |
commit | ce422a9d4a6f170b35f54545eface216f87c7089 (patch) | |
tree | 06954d88b9bce089526468bac7a050ee56f77b6f /src/feature/hs | |
parent | 53ac9a9a91a8f2ab45c75550456716074911e685 (diff) | |
download | tor-ce422a9d4a6f170b35f54545eface216f87c7089.tar.gz tor-ce422a9d4a6f170b35f54545eface216f87c7089.zip |
hs-v3: Decrypt pending descriptors when we get new client auth creds.
Diffstat (limited to 'src/feature/hs')
-rw-r--r-- | src/feature/hs/hs_cache.c | 4 | ||||
-rw-r--r-- | src/feature/hs/hs_client.c | 19 | ||||
-rw-r--r-- | src/feature/hs/hs_client.h | 8 |
3 files changed, 25 insertions, 6 deletions
diff --git a/src/feature/hs/hs_cache.c b/src/feature/hs/hs_cache.c index 49d5ade419..9cbef2fa41 100644 --- a/src/feature/hs/hs_cache.c +++ b/src/feature/hs/hs_cache.c @@ -954,6 +954,10 @@ hs_cache_client_new_auth_parse(const ed25519_public_key_t *service_pk) tor_assert(service_pk); + if (!hs_cache_v3_client) { + return false; + } + 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. */ diff --git a/src/feature/hs/hs_client.c b/src/feature/hs/hs_client.c index 9edfd13673..34574e4bd4 100644 --- a/src/feature/hs/hs_client.c +++ b/src/feature/hs/hs_client.c @@ -1453,6 +1453,8 @@ hs_client_register_auth_status_t hs_client_register_auth_credentials(hs_client_service_authorization_t *creds) { ed25519_public_key_t service_identity_pk; + hs_client_service_authorization_t *old_creds = NULL; + hs_client_register_auth_status_t retval = REGISTER_SUCCESS; tor_assert(creds); @@ -1466,13 +1468,22 @@ hs_client_register_auth_credentials(hs_client_service_authorization_t *creds) return REGISTER_FAIL_BAD_ADDRESS; } - if (digest256map_get(client_auths, service_identity_pk.pubkey)) { - client_service_authorization_free(creds); - return REGISTER_FAIL_ALREADY_EXISTS; + old_creds = digest256map_get(client_auths, service_identity_pk.pubkey); + if (old_creds) { + digest256map_remove(client_auths, service_identity_pk.pubkey); + client_service_authorization_free(old_creds); + retval = REGISTER_SUCCESS_ALREADY_EXISTS; } digest256map_set(client_auths, service_identity_pk.pubkey, creds); - return REGISTER_SUCCESS; + + /** Now that we set the new credentials, also try to decrypt any cached + * descriptors. */ + if (hs_cache_client_new_auth_parse(&service_identity_pk)) { + retval = REGISTER_SUCCESS_ALSO_DECRYPTED; + } + + return retval; } /** Remove client auth credentials for the service <b>hs_address</b>. */ diff --git a/src/feature/hs/hs_client.h b/src/feature/hs/hs_client.h index b0122aa14d..a756408e58 100644 --- a/src/feature/hs/hs_client.h +++ b/src/feature/hs/hs_client.h @@ -35,8 +35,12 @@ typedef enum { typedef enum { /* We successfuly registered these credentials */ REGISTER_SUCCESS, - /* We failed to register these credentials, because they already exist. */ - REGISTER_FAIL_ALREADY_EXISTS, + /* We successfully registered these credentials, but had to replace some + * existing ones. */ + REGISTER_SUCCESS_ALREADY_EXISTS, + /* We successfuly registered these credentials, and also decrypted a cached + * descriptor. */ + REGISTER_SUCCESS_ALSO_DECRYPTED, /* We failed to register these credentials, because of a bad HS address. */ REGISTER_FAIL_BAD_ADDRESS, } hs_client_register_auth_status_t; |